| Index: src/utils/SkMatrix44.cpp
|
| ===================================================================
|
| --- src/utils/SkMatrix44.cpp (revision 10791)
|
| +++ src/utils/SkMatrix44.cpp (working copy)
|
| @@ -482,13 +482,17 @@
|
| if (inverse) {
|
| sk_bzero(inverse->fMat, sizeof(inverse->fMat));
|
|
|
| - inverse->fMat[3][0] = -fMat[3][0] / fMat[0][0];
|
| - inverse->fMat[3][1] = -fMat[3][1] / fMat[1][1];
|
| - inverse->fMat[3][2] = -fMat[3][2] / fMat[2][2];
|
| + double invXScale = 1 / fMat[0][0];
|
| + double invYScale = 1 / fMat[1][1];
|
| + double invZScale = 1 / fMat[2][2];
|
|
|
| - inverse->fMat[0][0] = 1 / fMat[0][0];
|
| - inverse->fMat[1][1] = 1 / fMat[1][1];
|
| - inverse->fMat[2][2] = 1 / fMat[2][2];
|
| + inverse->fMat[3][0] = -fMat[3][0] * invXScale;
|
| + inverse->fMat[3][1] = -fMat[3][1] * invYScale;
|
| + inverse->fMat[3][2] = -fMat[3][2] * invZScale;
|
| +
|
| + inverse->fMat[0][0] = invXScale;
|
| + inverse->fMat[1][1] = invYScale;
|
| + inverse->fMat[2][2] = invZScale;
|
| inverse->fMat[3][3] = 1;
|
|
|
| inverse->setTypeMask(this->getType());
|
| @@ -553,21 +557,30 @@
|
| inverse->fMat[0][0] = SkDoubleToMScalar(a11 * b11 - a12 * b10 + a13 * b09);
|
| inverse->fMat[0][1] = SkDoubleToMScalar(a02 * b10 - a01 * b11 - a03 * b09);
|
| inverse->fMat[0][2] = SkDoubleToMScalar(a31 * b05 - a32 * b04 + a33 * b03);
|
| - inverse->fMat[0][3] = SkDoubleToMScalar(a22 * b04 - a21 * b05 - a23 * b03);
|
| inverse->fMat[1][0] = SkDoubleToMScalar(a12 * b08 - a10 * b11 - a13 * b07);
|
| inverse->fMat[1][1] = SkDoubleToMScalar(a00 * b11 - a02 * b08 + a03 * b07);
|
| inverse->fMat[1][2] = SkDoubleToMScalar(a32 * b02 - a30 * b05 - a33 * b01);
|
| - inverse->fMat[1][3] = SkDoubleToMScalar(a20 * b05 - a22 * b02 + a23 * b01);
|
| inverse->fMat[2][0] = SkDoubleToMScalar(a10 * b10 - a11 * b08 + a13 * b06);
|
| inverse->fMat[2][1] = SkDoubleToMScalar(a01 * b08 - a00 * b10 - a03 * b06);
|
| inverse->fMat[2][2] = SkDoubleToMScalar(a30 * b04 - a31 * b02 + a33 * b00);
|
| - inverse->fMat[2][3] = SkDoubleToMScalar(a21 * b02 - a20 * b04 - a23 * b00);
|
| inverse->fMat[3][0] = SkDoubleToMScalar(a11 * b07 - a10 * b09 - a12 * b06);
|
| inverse->fMat[3][1] = SkDoubleToMScalar(a00 * b09 - a01 * b07 + a02 * b06);
|
| inverse->fMat[3][2] = SkDoubleToMScalar(a31 * b01 - a30 * b03 - a32 * b00);
|
| - inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b00);
|
| - inverse->dirtyTypeMask();
|
|
|
| +
|
| + if (this->getType() & kPerspective_Mask) {
|
| + inverse->fMat[0][3] = SkDoubleToMScalar(a22 * b04 - a21 * b05 - a23 * b03);
|
| + inverse->fMat[1][3] = SkDoubleToMScalar(a20 * b05 - a22 * b02 + a23 * b01);
|
| + inverse->fMat[2][3] = SkDoubleToMScalar(a21 * b02 - a20 * b04 - a23 * b00);
|
| + inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b00);
|
| + }
|
| + else {
|
| + inverse->fMat[0][3] = 0;
|
| + inverse->fMat[1][3] = 0;
|
| + inverse->fMat[2][3] = 0;
|
| + inverse->fMat[3][3] = 1;
|
| + }
|
| +
|
| inverse->dirtyTypeMask();
|
| return true;
|
| }
|
|
|