10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* libs/graphics/effects/SkCamera.cpp 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Copyright 2006, The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** you may not use this file except in compliance with the License. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** You may obtain a copy of the License at 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** See the License for the specific language governing permissions and 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** limitations under the License. 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCamera.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkScalar SkScalarDotDiv(int count, const SkScalar a[], int step_a, 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar b[], int step_b, 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar denom) 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SCALAR_IS_FLOAT 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project float prod = 0; 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < count; i++) 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod += a[0] * b[0]; 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a += step_a; 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b += step_b; 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return prod / denom; 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sk64 prod, tmp; 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod.set(0); 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < count; i++) 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.setMul(a[0], b[0]); 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod.add(tmp); 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a += step_a; 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b += step_b; 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod.div(denom, Sk64::kRound_DivOption); 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return prod.get32(); 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkScalar SkScalarDot(int count, const SkScalar a[], int step_a, 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar b[], int step_b) 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SCALAR_IS_FLOAT 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project float prod = 0; 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < count; i++) 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod += a[0] * b[0]; 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a += step_a; 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b += step_b; 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return prod; 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sk64 prod, tmp; 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod.set(0); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < count; i++) 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.setMul(a[0], b[0]); 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project prod.add(tmp); 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a += step_a; 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b += step_b; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return prod.getFixed(); 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////////////// 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkUnitScalar SkPoint3D::normalize(SkUnit3D* unit) const 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SCALAR_IS_FLOAT 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project float mag = sk_float_sqrt(fX*fX + fY*fY + fZ*fZ); 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (mag) 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project float scale = 1.0f / mag; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fX = fX * scale; 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fY = fY * scale; 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fZ = fZ * scale; 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Sk64 tmp1, tmp2; 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp1.setMul(fX, fX); 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp2.setMul(fY, fY); 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp1.add(tmp2); 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp2.setMul(fZ, fZ); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp1.add(tmp2); 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed mag = tmp1.getSqrt(); 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (mag) 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // what if mag < SK_Fixed1 ??? we will underflow the fixdiv 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed scale = SkFixedDiv(SK_Fract1, mag); 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fX = SkFixedMul(fX, scale); 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fY = SkFixedMul(fY, scale); 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unit->fZ = SkFixedMul(fZ, scale); 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return mag; 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkUnitScalar SkUnit3D::Dot(const SkUnit3D& a, const SkUnit3D& b) 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkUnitScalarMul(a.fX, b.fX) + 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkUnitScalarMul(a.fY, b.fY) + 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkUnitScalarMul(a.fZ, b.fZ); 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkUnit3D::Cross(const SkUnit3D& a, const SkUnit3D& b, SkUnit3D* cross) 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(cross); 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // use x,y,z, in case &a == cross or &b == cross 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar x = SkUnitScalarMul(a.fY, b.fZ) - SkUnitScalarMul(a.fZ, b.fY); 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y = SkUnitScalarMul(a.fZ, b.fX) - SkUnitScalarMul(a.fX, b.fY); 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar z = SkUnitScalarMul(a.fX, b.fY) - SkUnitScalarMul(a.fY, b.fX); 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project cross->set(x, y, z); 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////// 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPatch3D::SkPatch3D() 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->reset(); 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPatch3D::reset() 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOrigin.set(0, 0, 0); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fU.set(SK_Scalar1, 0, 0); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fV.set(0, -SK_Scalar1, 0); 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPatch3D::transform(const SkMatrix3D& m, SkPatch3D* dst) const 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (dst == NULL) 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst = (SkPatch3D*)this; 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.mapVector(fU, &dst->fU); 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.mapVector(fV, &dst->fV); 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.mapPoint(fOrigin, &dst->fOrigin); 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkPatch3D::dotWith(SkScalar dx, SkScalar dy, SkScalar dz) const 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar cx = SkScalarMul(fU.fY, fV.fZ) - SkScalarMul(fU.fZ, fV.fY); 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar cy = SkScalarMul(fU.fZ, fV.fX) - SkScalarMul(fU.fX, fV.fY); 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar cz = SkScalarMul(fU.fX, fV.fY) - SkScalarMul(fU.fY, fV.fX); 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SkScalarMul(cx, dx) + SkScalarMul(cy, dy) + SkScalarMul(cz, dz); 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////// 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::reset() 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memset(fMat, 0, sizeof(fMat)); 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMat[0][0] = fMat[1][1] = fMat[2][2] = SK_Scalar1; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::setTranslate(SkScalar x, SkScalar y, SkScalar z) 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memset(fMat, 0, sizeof(fMat)); 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMat[0][0] = x; 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMat[1][1] = y; 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMat[2][2] = z; 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::setRotateX(SkScalar degX) 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar s, c; 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s = SkScalarSinCos(SkDegreesToRadians(degX), &c); 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(0, SK_Scalar1, 0, 0); 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(1, 0, c, -s); 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(2, 0, s, c); 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::setRotateY(SkScalar degY) 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar s, c; 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s = SkScalarSinCos(SkDegreesToRadians(degY), &c); 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(0, c, 0, -s); 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(1, 0, SK_Scalar1, 0); 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(2, s, 0, c); 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::setRotateZ(SkScalar degZ) 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar s, c; 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s = SkScalarSinCos(SkDegreesToRadians(degZ), &c); 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(0, c, -s, 0); 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(1, s, c, 0); 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setRow(2, 0, 0, SK_Scalar1); 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::preTranslate(SkScalar x, SkScalar y, SkScalar z) 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar col[3] = { x, y, z}; 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < 3; i++) 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMat[i][3] += SkScalarDot(3, &fMat[i][0], 1, col, 1); 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::preRotateX(SkScalar degX) 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix3D m; 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.setRotateX(degX); 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setConcat(*this, m); 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::preRotateY(SkScalar degY) 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix3D m; 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.setRotateY(degY); 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setConcat(*this, m); 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::preRotateZ(SkScalar degZ) 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix3D m; 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m.setRotateZ(degZ); 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->setConcat(*this, m); 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::setConcat(const SkMatrix3D& a, const SkMatrix3D& b) 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix3D tmp; 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix3D* c = this; 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this == &a || this == &b) 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project c = &tmp; 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < 3; i++) { 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int j = 0; j < 3; j++) 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project c->fMat[i][j] = SkScalarDot(3, &a.fMat[i][0], 1, &b.fMat[0][j], 4); 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project c->fMat[i][3] = SkScalarDot(3, &a.fMat[i][0], 1, &b.fMat[0][3], 4) + a.fMat[i][3]; 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (c == &tmp) 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *this = tmp; 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::mapPoint(const SkPoint3D& src, SkPoint3D* dst) const 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar x = SkScalarDot(3, &fMat[0][0], 1, &src.fX, 1) + fMat[0][3]; 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y = SkScalarDot(3, &fMat[1][0], 1, &src.fX, 1) + fMat[1][3]; 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar z = SkScalarDot(3, &fMat[2][0], 1, &src.fX, 1) + fMat[2][3]; 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst->set(x, y, z); 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMatrix3D::mapVector(const SkVector3D& src, SkVector3D* dst) const 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar x = SkScalarDot(3, &fMat[0][0], 1, &src.fX, 1); 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y = SkScalarDot(3, &fMat[1][0], 1, &src.fX, 1); 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar z = SkScalarDot(3, &fMat[2][0], 1, &src.fX, 1); 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dst->set(x, y, z); 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////// 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkCamera3D::SkCamera3D() 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->reset(); 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkCamera3D::reset() 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fLocation.set(0, 0, -SkIntToScalar(576)); // 8 inches backward 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fAxis.set(0, 0, SK_Scalar1); // forward 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fZenith.set(0, -SK_Scalar1, 0); // up 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fObserver.set(0, 0, fLocation.fZ); 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fNeedToUpdate = true; 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkCamera3D::update() 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fNeedToUpdate = true; 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkCamera3D::doUpdate() const 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkUnit3D axis, zenith, cross; 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fAxis.normalize(&axis); 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar dot = SkUnit3D::Dot(*(const SkUnit3D*)(const void*)&fZenith, axis); 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project zenith.fX = fZenith.fX - SkUnitScalarMul(dot, axis.fX); 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project zenith.fY = fZenith.fY - SkUnitScalarMul(dot, axis.fY); 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project zenith.fZ = fZenith.fZ - SkUnitScalarMul(dot, axis.fZ); 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (void)((SkPoint3D*)(void*)&zenith)->normalize(&zenith); 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkUnit3D::Cross(axis, zenith, &cross); 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix* orien = &fOrientation; 3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar x = fObserver.fX; 3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar y = fObserver.fY; 3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar z = fObserver.fZ; 3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMScaleX, SkUnitScalarMul(x, axis.fX) - SkUnitScalarMul(z, cross.fX)); 3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMSkewX, SkUnitScalarMul(x, axis.fY) - SkUnitScalarMul(z, cross.fY)); 3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMTransX, SkUnitScalarMul(x, axis.fZ) - SkUnitScalarMul(z, cross.fZ)); 3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMSkewY, SkUnitScalarMul(y, axis.fX) - SkUnitScalarMul(z, zenith.fX)); 3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMScaleY, SkUnitScalarMul(y, axis.fY) - SkUnitScalarMul(z, zenith.fY)); 3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMTransY, SkUnitScalarMul(y, axis.fZ) - SkUnitScalarMul(z, zenith.fZ)); 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMPersp0, axis.fX); 3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMPersp1, axis.fY); 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project orien->set(SkMatrix::kMPersp2, axis.fZ); 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkCamera3D::patchToMatrix(const SkPatch3D& quilt, SkMatrix* matrix) const 3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fNeedToUpdate) 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->doUpdate(); 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fNeedToUpdate = false; 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar* mapPtr = (const SkScalar*)(const void*)&fOrientation; 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar* patchPtr; 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint3D diff; 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar dot; 3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project diff.fX = quilt.fOrigin.fX - fLocation.fX; 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project diff.fY = quilt.fOrigin.fY - fLocation.fY; 3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project diff.fZ = quilt.fOrigin.fZ - fLocation.fZ; 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dot = SkUnit3D::Dot(*(const SkUnit3D*)(const void*)&diff, 3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *(const SkUnit3D*)(((const SkScalar*)(const void*)&fOrientation) + 6)); 3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project patchPtr = (const SkScalar*)&quilt; 3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMScaleX, SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot)); 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMSkewY, SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot)); 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMPersp0, SkScalarDotDiv(3, patchPtr, 1, mapPtr+6, 1, dot)); 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project patchPtr += 3; 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMSkewX, SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot)); 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMScaleY, SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot)); 3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMPersp1, SkScalarDotDiv(3, patchPtr, 1, mapPtr+6, 1, dot)); 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project patchPtr = (const SkScalar*)(const void*)&diff; 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMTransX, SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot)); 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMTransY, SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot)); 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project matrix->set(SkMatrix::kMPersp2, SK_UnitScalar1); 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////////////////////// 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSk3DView::Sk3DView() 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInitialRec.fMatrix.reset(); 3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec = &fInitialRec; 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSk3DView::~Sk3DView() 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Rec* rec = fRec; 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (rec != &fInitialRec) { 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Rec* next = rec->fNext; 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDELETE(rec); 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project rec = next; 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::save() 3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Rec* rec = SkNEW(Rec); 3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project rec->fNext = fRec; 3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project rec->fMatrix = fRec->fMatrix; 3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec = rec; 3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::restore() 3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(fRec != &fInitialRec); 3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Rec* next = fRec->fNext; 3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDELETE(fRec); 4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec = next; 4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::translate(SkScalar x, SkScalar y, SkScalar z) 4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec->fMatrix.preTranslate(x, y, z); 4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::rotateX(SkScalar deg) 4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec->fMatrix.preRotateX(deg); 4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::rotateY(SkScalar deg) 4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec->fMatrix.preRotateY(deg); 4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::rotateZ(SkScalar deg) 4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRec->fMatrix.preRotateZ(deg); 4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar Sk3DView::dotWithNormal(SkScalar x, SkScalar y, SkScalar z) const 4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPatch3D patch; 4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project patch.transform(fRec->fMatrix); 4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return patch.dotWith(x, y, z); 4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::getMatrix(SkMatrix* matrix) const 4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (matrix != NULL) 4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPatch3D patch; 4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project patch.transform(fRec->fMatrix); 4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCamera.patchToMatrix(patch, matrix); 4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid Sk3DView::applyToCanvas(SkCanvas* canvas) const 4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix matrix; 4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->getMatrix(&matrix); 4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project canvas->concat(matrix); 4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 450