SkMatrix44.cpp revision deb4c169690c777acb27ee8ce67d70d3f6eb2a2c
18260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 78260a895869beaa4cab9f8b915e457728f41e561reed@google.com */ 88260a895869beaa4cab9f8b915e457728f41e561reed@google.com 98260a895869beaa4cab9f8b915e457728f41e561reed@google.com 10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 118260a895869beaa4cab9f8b915e457728f41e561reed@google.com#include "SkMatrix44.h" 128260a895869beaa4cab9f8b915e457728f41e561reed@google.com 138260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44::SkMatrix44() { 148260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->setIdentity(); 158260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 168260a895869beaa4cab9f8b915e457728f41e561reed@google.com 178260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44::SkMatrix44(const SkMatrix44& src) { 188260a895869beaa4cab9f8b915e457728f41e561reed@google.com memcpy(this, &src, sizeof(src)); 198260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 208260a895869beaa4cab9f8b915e457728f41e561reed@google.com 218260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44::SkMatrix44(const SkMatrix44& a, const SkMatrix44& b) { 228260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->setConcat(a, b); 238260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 248260a895869beaa4cab9f8b915e457728f41e561reed@google.com 25631940c8c44e92939fc95d305b87be64eb9b886ereed@google.combool SkMatrix44::operator==(const SkMatrix44& other) const { 26deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org if (fIdentity && other.fIdentity) 27deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org return true; 28deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org 29631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com const SkMScalar* a = &fMat[0][0]; 30631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com const SkMScalar* b = &other.fMat[0][0]; 31631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com for (int i = 0; i < 16; ++i) { 32631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com if (a[i] != b[i]) { 33631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com return false; 34631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com } 35631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com } 36631940c8c44e92939fc95d305b87be64eb9b886ereed@google.com return true; 378260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 388260a895869beaa4cab9f8b915e457728f41e561reed@google.com 398260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 408260a895869beaa4cab9f8b915e457728f41e561reed@google.com 41da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.comvoid SkMatrix44::asColMajorf(float dst[]) const { 42da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com const SkMScalar* src = &fMat[0][0]; 43da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com#ifdef SK_MSCALAR_IS_DOUBLE 44da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com for (int i = 0; i < 16; ++i) { 45da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[i] = SkMScalarToFloat(src[i]); 46da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com } 475596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#elif defined SK_MSCALAR_IS_FLOAT 48da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com memcpy(dst, src, 16 * sizeof(float)); 49da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com#endif 50da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com} 51da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com 52da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.comvoid SkMatrix44::asColMajord(double dst[]) const { 53da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com const SkMScalar* src = &fMat[0][0]; 54da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com#ifdef SK_MSCALAR_IS_DOUBLE 55da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com memcpy(dst, src, 16 * sizeof(double)); 565596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#elif defined SK_MSCALAR_IS_FLOAT 57da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com for (int i = 0; i < 16; ++i) { 58da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[i] = SkMScalarToDouble(src[i]); 59da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com } 60da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com#endif 61da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com} 62da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com 63da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.comvoid SkMatrix44::asRowMajorf(float dst[]) const { 64da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com const SkMScalar* src = &fMat[0][0]; 65da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com for (int i = 0; i < 4; ++i) { 66da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[0] = SkMScalarToFloat(src[0]); 67da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[4] = SkMScalarToFloat(src[1]); 68da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[8] = SkMScalarToFloat(src[2]); 69da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[12] = SkMScalarToFloat(src[3]); 70da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com src += 4; 71da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst += 1; 72da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com } 73da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com} 74da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com 75da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.comvoid SkMatrix44::asRowMajord(double dst[]) const { 76da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com const SkMScalar* src = &fMat[0][0]; 77da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com for (int i = 0; i < 4; ++i) { 78da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[0] = SkMScalarToDouble(src[0]); 79da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[4] = SkMScalarToDouble(src[1]); 80f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[8] = SkMScalarToDouble(src[2]); 81f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[12] = SkMScalarToDouble(src[3]); 82f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org src += 4; 83f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst += 1; 84f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org } 85f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org} 86f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org 87f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.orgvoid SkMatrix44::setColMajorf(const float src[]) { 88f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org SkMScalar* dst = &fMat[0][0]; 89f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#ifdef SK_MSCALAR_IS_DOUBLE 90f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org for (int i = 0; i < 16; ++i) { 91f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[i] = SkMScalarToFloat(src[i]); 92f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org } 93f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#elif defined SK_MSCALAR_IS_FLOAT 94f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org memcpy(dst, src, 16 * sizeof(float)); 95f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#endif 96deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 97f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org} 98f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org 99f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.orgvoid SkMatrix44::setColMajord(const double src[]) { 100f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org SkMScalar* dst = &fMat[0][0]; 101f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#ifdef SK_MSCALAR_IS_DOUBLE 102f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org memcpy(dst, src, 16 * sizeof(double)); 103f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#elif defined SK_MSCALAR_IS_FLOAT 104f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org for (int i = 0; i < 16; ++i) { 105f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[i] = SkMScalarToDouble(src[i]); 106f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org } 107f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org#endif 108deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 109f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org} 110f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org 111f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.orgvoid SkMatrix44::setRowMajorf(const float src[]) { 112f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org SkMScalar* dst = &fMat[0][0]; 113f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org for (int i = 0; i < 4; ++i) { 114f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[0] = SkMScalarToFloat(src[0]); 115f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[4] = SkMScalarToFloat(src[1]); 116f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[8] = SkMScalarToFloat(src[2]); 117f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[12] = SkMScalarToFloat(src[3]); 118f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org src += 4; 119f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst += 1; 120f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org } 121deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 122f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org} 123f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org 124f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.orgvoid SkMatrix44::setRowMajord(const double src[]) { 125f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org SkMScalar* dst = &fMat[0][0]; 126f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org for (int i = 0; i < 4; ++i) { 127f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[0] = SkMScalarToDouble(src[0]); 128f11cf9ff885c81e29f55283174ca34ce2fc5fd23vollick@chromium.org dst[4] = SkMScalarToDouble(src[1]); 129da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[8] = SkMScalarToDouble(src[2]); 130da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst[12] = SkMScalarToDouble(src[3]); 131da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com src += 4; 132da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com dst += 1; 133da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com } 134deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 135da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com} 136da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com 137da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com/////////////////////////////////////////////////////////////////////////////// 138da9fac0aa13d1445f8b58a75d9390638845c814dreed@google.com 1398260a895869beaa4cab9f8b915e457728f41e561reed@google.combool SkMatrix44::isIdentity() const { 140deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org if (fIdentity) 141deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org return true; 142deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org 1433e05f291167a265ae749b4dd9d13ec0407161082digit@google.com static const SkMScalar sIdentityMat[4][4] = { 1443e05f291167a265ae749b4dd9d13ec0407161082digit@google.com { 1, 0, 0, 0 }, 1453e05f291167a265ae749b4dd9d13ec0407161082digit@google.com { 0, 1, 0, 0 }, 1463e05f291167a265ae749b4dd9d13ec0407161082digit@google.com { 0, 0, 1, 0 }, 1473e05f291167a265ae749b4dd9d13ec0407161082digit@google.com { 0, 0, 0, 1 }, 1483e05f291167a265ae749b4dd9d13ec0407161082digit@google.com }; 1493e05f291167a265ae749b4dd9d13ec0407161082digit@google.com return !memcmp(fMat, sIdentityMat, sizeof(fMat)); 1508260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1518260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1528260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 1538260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1548260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setIdentity() { 1558260a895869beaa4cab9f8b915e457728f41e561reed@google.com sk_bzero(fMat, sizeof(fMat)); 1568260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][0] = fMat[1][1] = fMat[2][2] = fMat[3][3] = 1; 157deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = true; 1588260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1598260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1608260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::set3x3(SkMScalar m00, SkMScalar m01, SkMScalar m02, 1618260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar m10, SkMScalar m11, SkMScalar m12, 1628260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar m20, SkMScalar m21, SkMScalar m22) { 1638260a895869beaa4cab9f8b915e457728f41e561reed@google.com sk_bzero(fMat, sizeof(fMat)); 1648260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][0] = m00; fMat[0][1] = m01; fMat[0][2] = m02; fMat[0][3] = 0; 1658260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[1][0] = m10; fMat[1][1] = m11; fMat[1][2] = m12; fMat[1][3] = 0; 1668260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][0] = m20; fMat[2][1] = m21; fMat[2][2] = m22; fMat[2][3] = 0; 1678260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][0] = 0; fMat[3][1] = 0; fMat[3][2] = 0; fMat[3][3] = 1; 168deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 1698260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1708260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1718260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 1728260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1738260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setTranslate(SkMScalar tx, SkMScalar ty, SkMScalar tz) { 1748260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->setIdentity(); 1758260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][0] = tx; 1768260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][1] = ty; 1778260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][2] = tz; 1788260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][3] = 1; 179deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 1808260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1818260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1828260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::preTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz) { 1838260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMatrix44 mat; 1848260a895869beaa4cab9f8b915e457728f41e561reed@google.com mat.setTranslate(dx, dy, dz); 1858260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->preConcat(mat); 1868260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1878260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1888260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::postTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz) { 1898260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][0] += dx; 1908260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][1] += dy; 1918260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][2] += dz; 192deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 1938260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 1948260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1958260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 1968260a895869beaa4cab9f8b915e457728f41e561reed@google.com 1978260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setScale(SkMScalar sx, SkMScalar sy, SkMScalar sz) { 1988260a895869beaa4cab9f8b915e457728f41e561reed@google.com sk_bzero(fMat, sizeof(fMat)); 1998260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][0] = sx; 2008260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[1][1] = sy; 2018260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][2] = sz; 2028260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][3] = 1; 203deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 2048260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2058260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2068260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::preScale(SkMScalar sx, SkMScalar sy, SkMScalar sz) { 2078260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMatrix44 tmp; 2088260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp.setScale(sx, sy, sz); 2098260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->preConcat(tmp); 2108260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2118260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2128260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::postScale(SkMScalar sx, SkMScalar sy, SkMScalar sz) { 2138260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int i = 0; i < 4; i++) { 2148260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[i][0] *= sx; 2158260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[i][1] *= sy; 2168260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[i][2] *= sz; 2178260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 218deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 2198260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2208260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2218260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 2228260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2238260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setRotateAbout(SkMScalar x, SkMScalar y, SkMScalar z, 2248260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar radians) { 2258260a895869beaa4cab9f8b915e457728f41e561reed@google.com double len2 = x * x + y * y + z * z; 2268260a895869beaa4cab9f8b915e457728f41e561reed@google.com if (len2 != 1) { 2278260a895869beaa4cab9f8b915e457728f41e561reed@google.com if (len2 == 0) { 2288260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->setIdentity(); 2298260a895869beaa4cab9f8b915e457728f41e561reed@google.com return; 2308260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 2318260a895869beaa4cab9f8b915e457728f41e561reed@google.com double scale = 1 / sqrt(len2); 2329d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com x = SkDoubleToMScalar(x * scale); 2339d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com y = SkDoubleToMScalar(y * scale); 2349d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com z = SkDoubleToMScalar(z * scale); 2358260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 2368260a895869beaa4cab9f8b915e457728f41e561reed@google.com this->setRotateAboutUnit(x, y, z, radians); 2378260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2388260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2398260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setRotateAboutUnit(SkMScalar x, SkMScalar y, SkMScalar z, 2408260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar radians) { 2418260a895869beaa4cab9f8b915e457728f41e561reed@google.com double c = cos(radians); 2428260a895869beaa4cab9f8b915e457728f41e561reed@google.com double s = sin(radians); 2438260a895869beaa4cab9f8b915e457728f41e561reed@google.com double C = 1 - c; 2448260a895869beaa4cab9f8b915e457728f41e561reed@google.com double xs = x * s; 2458260a895869beaa4cab9f8b915e457728f41e561reed@google.com double ys = y * s; 2468260a895869beaa4cab9f8b915e457728f41e561reed@google.com double zs = z * s; 2478260a895869beaa4cab9f8b915e457728f41e561reed@google.com double xC = x * C; 2488260a895869beaa4cab9f8b915e457728f41e561reed@google.com double yC = y * C; 2498260a895869beaa4cab9f8b915e457728f41e561reed@google.com double zC = z * C; 2508260a895869beaa4cab9f8b915e457728f41e561reed@google.com double xyC = x * yC; 2518260a895869beaa4cab9f8b915e457728f41e561reed@google.com double yzC = y * zC; 2528260a895869beaa4cab9f8b915e457728f41e561reed@google.com double zxC = z * xC; 2538260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2548260a895869beaa4cab9f8b915e457728f41e561reed@google.com // if you're looking at wikipedia, remember that we're column major. 2559d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com this->set3x3(SkDoubleToMScalar(x * xC + c), // scale x 2569d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(xyC + zs), // skew x 2579d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(zxC - ys), // trans x 2589d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 2599d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(xyC - zs), // skew y 2609d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(y * yC + c), // scale y 2619d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(yzC + xs), // trans y 2629d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 2639d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(zxC + ys), // persp x 2649d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(yzC - xs), // persp y 2659d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com SkDoubleToMScalar(z * zC + c)); // persp 2 2668260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2678260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2688260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 2698260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2708260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::setConcat(const SkMatrix44& a, const SkMatrix44& b) { 2718260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar result[4][4]; 2728260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int i = 0; i < 4; i++) { 2738260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int j = 0; j < 4; j++) { 2748260a895869beaa4cab9f8b915e457728f41e561reed@google.com double value = 0; 2758260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int k = 0; k < 4; k++) { 2768260a895869beaa4cab9f8b915e457728f41e561reed@google.com value += SkMScalarToDouble(a.fMat[k][i]) * b.fMat[j][k]; 2778260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 2788260a895869beaa4cab9f8b915e457728f41e561reed@google.com result[j][i] = SkDoubleToMScalar(value); 2798260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 2808260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 2818260a895869beaa4cab9f8b915e457728f41e561reed@google.com memcpy(fMat, result, sizeof(result)); 282deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = false; 2838260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2848260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2858260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 2868260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2878260a895869beaa4cab9f8b915e457728f41e561reed@google.comstatic inline SkMScalar det2x2(double m00, double m01, double m10, double m11) { 2889d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return SkDoubleToMScalar(m00 * m11 - m10 * m01); 2898260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2908260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2918260a895869beaa4cab9f8b915e457728f41e561reed@google.comstatic inline double det3x3(double m00, double m01, double m02, 2928260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m10, double m11, double m12, 2938260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m20, double m21, double m22) { 2948260a895869beaa4cab9f8b915e457728f41e561reed@google.com return m00 * det2x2(m11, m12, m21, m22) - 2958260a895869beaa4cab9f8b915e457728f41e561reed@google.com m10 * det2x2(m01, m02, m21, m22) + 2968260a895869beaa4cab9f8b915e457728f41e561reed@google.com m20 * det2x2(m01, m02, m11, m12); 2978260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 2988260a895869beaa4cab9f8b915e457728f41e561reed@google.com 2998260a895869beaa4cab9f8b915e457728f41e561reed@google.com/** We always perform the calculation in doubles, to avoid prematurely losing 3008260a895869beaa4cab9f8b915e457728f41e561reed@google.com precision along the way. This relies on the compiler automatically 3018260a895869beaa4cab9f8b915e457728f41e561reed@google.com promoting our SkMScalar values to double (if needed). 3028260a895869beaa4cab9f8b915e457728f41e561reed@google.com */ 3038260a895869beaa4cab9f8b915e457728f41e561reed@google.comdouble SkMatrix44::determinant() const { 3048260a895869beaa4cab9f8b915e457728f41e561reed@google.com return fMat[0][0] * det3x3(fMat[1][1], fMat[1][2], fMat[1][3], 3058260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][1], fMat[2][2], fMat[2][3], 3068260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][1], fMat[3][2], fMat[3][3]) - 3078260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[1][0] * det3x3(fMat[0][1], fMat[0][2], fMat[0][3], 3088260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][1], fMat[2][2], fMat[2][3], 3098260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][1], fMat[3][2], fMat[3][3]) + 3108260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][0] * det3x3(fMat[0][1], fMat[0][2], fMat[0][3], 3118260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[1][1], fMat[1][2], fMat[1][3], 3128260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][1], fMat[3][2], fMat[3][3]) - 3138260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[3][0] * det3x3(fMat[0][1], fMat[0][2], fMat[0][3], 3148260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[1][1], fMat[1][2], fMat[1][3], 3158260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[2][1], fMat[2][2], fMat[2][3]); 3168260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 3178260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3188260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 3198260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3208260a895869beaa4cab9f8b915e457728f41e561reed@google.com// just picked a small value. not sure how to pick the "right" one 3218260a895869beaa4cab9f8b915e457728f41e561reed@google.com#define TOO_SMALL_FOR_DETERMINANT (1.e-8) 3228260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3238260a895869beaa4cab9f8b915e457728f41e561reed@google.comstatic inline double dabs(double x) { 3248260a895869beaa4cab9f8b915e457728f41e561reed@google.com if (x < 0) { 3258260a895869beaa4cab9f8b915e457728f41e561reed@google.com x = -x; 3268260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 3278260a895869beaa4cab9f8b915e457728f41e561reed@google.com return x; 3288260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 3298260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3308260a895869beaa4cab9f8b915e457728f41e561reed@google.combool SkMatrix44::invert(SkMatrix44* inverse) const { 3318260a895869beaa4cab9f8b915e457728f41e561reed@google.com double det = this->determinant(); 3328260a895869beaa4cab9f8b915e457728f41e561reed@google.com if (dabs(det) < TOO_SMALL_FOR_DETERMINANT) { 3338260a895869beaa4cab9f8b915e457728f41e561reed@google.com return false; 3348260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 3358260a895869beaa4cab9f8b915e457728f41e561reed@google.com if (NULL == inverse) { 3368260a895869beaa4cab9f8b915e457728f41e561reed@google.com return true; 3378260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 3388260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3398260a895869beaa4cab9f8b915e457728f41e561reed@google.com // we explicitly promote to doubles to keep the intermediate values in 3408260a895869beaa4cab9f8b915e457728f41e561reed@google.com // higher precision (assuming SkMScalar isn't already a double) 3418260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m00 = fMat[0][0]; 3428260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m01 = fMat[0][1]; 3438260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m02 = fMat[0][2]; 3448260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m03 = fMat[0][3]; 3458260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m10 = fMat[1][0]; 3468260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m11 = fMat[1][1]; 3478260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m12 = fMat[1][2]; 3488260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m13 = fMat[1][3]; 3498260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m20 = fMat[2][0]; 3508260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m21 = fMat[2][1]; 3518260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m22 = fMat[2][2]; 3528260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m23 = fMat[2][3]; 3538260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m30 = fMat[3][0]; 3548260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m31 = fMat[3][1]; 3558260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m32 = fMat[3][2]; 3568260a895869beaa4cab9f8b915e457728f41e561reed@google.com double m33 = fMat[3][3]; 3578260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3588260a895869beaa4cab9f8b915e457728f41e561reed@google.com double tmp[4][4]; 3598260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3608260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[0][0] = m12*m23*m31 - m13*m22*m31 + m13*m21*m32 - m11*m23*m32 - m12*m21*m33 + m11*m22*m33; 3618260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[0][1] = m03*m22*m31 - m02*m23*m31 - m03*m21*m32 + m01*m23*m32 + m02*m21*m33 - m01*m22*m33; 3628260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[0][2] = m02*m13*m31 - m03*m12*m31 + m03*m11*m32 - m01*m13*m32 - m02*m11*m33 + m01*m12*m33; 3638260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[0][3] = m03*m12*m21 - m02*m13*m21 - m03*m11*m22 + m01*m13*m22 + m02*m11*m23 - m01*m12*m23; 3648260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[1][0] = m13*m22*m30 - m12*m23*m30 - m13*m20*m32 + m10*m23*m32 + m12*m20*m33 - m10*m22*m33; 3658260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[1][1] = m02*m23*m30 - m03*m22*m30 + m03*m20*m32 - m00*m23*m32 - m02*m20*m33 + m00*m22*m33; 3668260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[1][2] = m03*m12*m30 - m02*m13*m30 - m03*m10*m32 + m00*m13*m32 + m02*m10*m33 - m00*m12*m33; 3678260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[1][3] = m02*m13*m20 - m03*m12*m20 + m03*m10*m22 - m00*m13*m22 - m02*m10*m23 + m00*m12*m23; 3688260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[2][0] = m11*m23*m30 - m13*m21*m30 + m13*m20*m31 - m10*m23*m31 - m11*m20*m33 + m10*m21*m33; 3698260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[2][1] = m03*m21*m30 - m01*m23*m30 - m03*m20*m31 + m00*m23*m31 + m01*m20*m33 - m00*m21*m33; 3708260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[2][2] = m01*m13*m30 - m03*m11*m30 + m03*m10*m31 - m00*m13*m31 - m01*m10*m33 + m00*m11*m33; 3718260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[2][3] = m03*m11*m20 - m01*m13*m20 - m03*m10*m21 + m00*m13*m21 + m01*m10*m23 - m00*m11*m23; 3728260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[3][0] = m12*m21*m30 - m11*m22*m30 - m12*m20*m31 + m10*m22*m31 + m11*m20*m32 - m10*m21*m32; 3738260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[3][1] = m01*m22*m30 - m02*m21*m30 + m02*m20*m31 - m00*m22*m31 - m01*m20*m32 + m00*m21*m32; 3748260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[3][2] = m02*m11*m30 - m01*m12*m30 - m02*m10*m31 + m00*m12*m31 + m01*m10*m32 - m00*m11*m32; 3758260a895869beaa4cab9f8b915e457728f41e561reed@google.com tmp[3][3] = m01*m12*m20 - m02*m11*m20 + m02*m10*m21 - m00*m12*m21 - m01*m10*m22 + m00*m11*m22; 3768260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3778260a895869beaa4cab9f8b915e457728f41e561reed@google.com double invDet = 1.0 / det; 3788260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int i = 0; i < 4; i++) { 3798260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int j = 0; j < 4; j++) { 3808260a895869beaa4cab9f8b915e457728f41e561reed@google.com inverse->fMat[i][j] = SkDoubleToMScalar(tmp[i][j] * invDet); 3818260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 3828260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 383deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org inverse->fIdentity = false; 3848260a895869beaa4cab9f8b915e457728f41e561reed@google.com return true; 3858260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 3868260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3878260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 3888260a895869beaa4cab9f8b915e457728f41e561reed@google.com 3899b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.orgvoid SkMatrix44::transpose() { 3909b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[0][1], fMat[1][0]); 3919b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[0][2], fMat[2][0]); 3929b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[0][3], fMat[3][0]); 3939b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[1][2], fMat[2][1]); 3949b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[1][3], fMat[3][1]); 3959b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org SkTSwap(fMat[2][3], fMat[3][2]); 3969b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org} 3979b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org 3989b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org/////////////////////////////////////////////////////////////////////////////// 3999b21c25e742d6a8b69bee8b049e79877f93b5936vollick@chromium.org 4001ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.comvoid SkMatrix44::mapScalars(const SkScalar src[4], SkScalar dst[4]) const { 4018260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkScalar result[4]; 4028260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int i = 0; i < 4; i++) { 4038260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMScalar value = 0; 4048260a895869beaa4cab9f8b915e457728f41e561reed@google.com for (int j = 0; j < 4; j++) { 4058260a895869beaa4cab9f8b915e457728f41e561reed@google.com value += fMat[j][i] * src[j]; 4068260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 40772e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com result[i] = SkMScalarToScalar(value); 4088260a895869beaa4cab9f8b915e457728f41e561reed@google.com } 4098260a895869beaa4cab9f8b915e457728f41e561reed@google.com memcpy(dst, result, sizeof(result)); 4108260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 4118260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4121ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com#ifdef SK_MSCALAR_IS_DOUBLE 4131ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.comvoid SkMatrix44::mapMScalars(const SkMScalar src[4], SkMScalar dst[4]) const { 4141ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com SkMScalar result[4]; 4151ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com for (int i = 0; i < 4; i++) { 4161ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com SkMScalar value = 0; 4171ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com for (int j = 0; j < 4; j++) { 4181ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com value += fMat[j][i] * src[j]; 4191ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com } 4201ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com result[i] = SkMScalarToScalar(value); 4211ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com } 4221ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com memcpy(dst, result, sizeof(result)); 4231ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com} 4241ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com#endif 4251ea95be560b38a71e3f24749c4e5e3d3564e4c6creed@google.com 4268260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 4278260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4288260a895869beaa4cab9f8b915e457728f41e561reed@google.comvoid SkMatrix44::dump() const { 4299ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com static const char* format = 4309ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com "[%g %g %g %g][%g %g %g %g][%g %g %g %g][%g %g %g %g]\n"; 4318260a895869beaa4cab9f8b915e457728f41e561reed@google.com#if 0 4329ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com SkDebugf(format, 4338260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][0], fMat[1][0], fMat[2][0], fMat[3][0], 4348260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][1], fMat[1][1], fMat[2][1], fMat[3][1], 4358260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][2], fMat[1][2], fMat[2][2], fMat[3][2], 4368260a895869beaa4cab9f8b915e457728f41e561reed@google.com fMat[0][3], fMat[1][3], fMat[2][3], fMat[3][3]); 4379ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com#else 4389ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com SkDebugf(format, 4399ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com fMat[0][0], fMat[0][1], fMat[0][2], fMat[0][3], 4409ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com fMat[1][0], fMat[1][1], fMat[1][2], fMat[1][3], 4419ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com fMat[2][0], fMat[2][1], fMat[2][2], fMat[2][3], 4429ac4a89d35df3d581886a84df421161418707fd6tomhudson@google.com fMat[3][0], fMat[3][1], fMat[3][2], fMat[3][3]); 4438260a895869beaa4cab9f8b915e457728f41e561reed@google.com#endif 4448260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 4458260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4468260a895869beaa4cab9f8b915e457728f41e561reed@google.com/////////////////////////////////////////////////////////////////////////////// 4478260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4488260a895869beaa4cab9f8b915e457728f41e561reed@google.comstatic void initFromMatrix(SkMScalar dst[4][4], const SkMatrix& src) { 4498260a895869beaa4cab9f8b915e457728f41e561reed@google.com sk_bzero(dst, 16 * sizeof(SkMScalar)); 45072e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[0][0] = SkScalarToMScalar(src[SkMatrix::kMScaleX]); 45172e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[1][0] = SkScalarToMScalar(src[SkMatrix::kMSkewX]); 45272e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[3][0] = SkScalarToMScalar(src[SkMatrix::kMTransX]); 45372e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[0][1] = SkScalarToMScalar(src[SkMatrix::kMSkewY]); 45472e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[1][1] = SkScalarToMScalar(src[SkMatrix::kMScaleY]); 45572e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[3][1] = SkScalarToMScalar(src[SkMatrix::kMTransY]); 4568260a895869beaa4cab9f8b915e457728f41e561reed@google.com dst[2][2] = dst[3][3] = 1; 4578260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 4588260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4598260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44::SkMatrix44(const SkMatrix& src) { 4608260a895869beaa4cab9f8b915e457728f41e561reed@google.com initFromMatrix(fMat, src); 4618260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 4628260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4638260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44& SkMatrix44::operator=(const SkMatrix& src) { 4648260a895869beaa4cab9f8b915e457728f41e561reed@google.com initFromMatrix(fMat, src); 465deb4c169690c777acb27ee8ce67d70d3f6eb2a2cjamesr@chromium.org fIdentity = src.isIdentity(); 4668260a895869beaa4cab9f8b915e457728f41e561reed@google.com return *this; 4678260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 4688260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4698260a895869beaa4cab9f8b915e457728f41e561reed@google.comSkMatrix44::operator SkMatrix() const { 4708260a895869beaa4cab9f8b915e457728f41e561reed@google.com SkMatrix dst; 4718260a895869beaa4cab9f8b915e457728f41e561reed@google.com dst.reset(); // setup our perspective correctly for identity 4728260a895869beaa4cab9f8b915e457728f41e561reed@google.com 47372e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); 47472e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); 47572e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); 4768260a895869beaa4cab9f8b915e457728f41e561reed@google.com 47772e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); 47872e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); 47972e49b8982586a5d8b0425f16d909c05a36ea8c3bsalomon@google.com dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); 4808260a895869beaa4cab9f8b915e457728f41e561reed@google.com 4818260a895869beaa4cab9f8b915e457728f41e561reed@google.com return dst; 4828260a895869beaa4cab9f8b915e457728f41e561reed@google.com} 483