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