| Index: src/utils/SkMatrix44.cpp
|
| diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp
|
| index 25052fd0f3c1d585fedbece4d54c92715381ec0f..82b171ba2d75814c098e804bb41b0debf9b687c6 100644
|
| --- a/src/utils/SkMatrix44.cpp
|
| +++ b/src/utils/SkMatrix44.cpp
|
| @@ -491,55 +491,34 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
|
| return false;
|
| }
|
|
|
| - double a00 = fMat[0][0];
|
| - double a11 = fMat[1][1];
|
| - double a22 = fMat[2][2];
|
| - double a30 = fMat[3][0];
|
| - double a31 = fMat[3][1];
|
| - double a32 = fMat[3][2];
|
| -
|
| - double b00 = a00 * a11;
|
| - double b07 = -a22 * a30;
|
| - double b09 = -a22 * a31;
|
| - double b11 = a22;
|
| -
|
| - // Calculate the determinant
|
| - double det = b00 * b11;
|
| -
|
| - double invdet = 1.0 / det;
|
| - // If det is zero, we want to return false. However, we also want to return false
|
| - // if 1/det overflows to infinity (i.e. det is denormalized). Both of these are
|
| - // handled by checking that 1/det is finite.
|
| - if (!sk_float_isfinite(invdet)) {
|
| - return false;
|
| - }
|
| - if (NULL == inverse) {
|
| - return true;
|
| + if (inverse) {
|
| + double invXScale = 1 / fMat[0][0];
|
| + double invYScale = 1 / fMat[1][1];
|
| + double invZScale = 1 / fMat[2][2];
|
| +
|
| + inverse->fMat[0][0] = invXScale;
|
| + inverse->fMat[0][1] = 0;
|
| + inverse->fMat[0][2] = 0;
|
| + inverse->fMat[0][3] = 0;
|
| +
|
| + inverse->fMat[1][0] = 0;
|
| + inverse->fMat[1][1] = invYScale;
|
| + inverse->fMat[1][2] = 0;
|
| + inverse->fMat[1][3] = 0;
|
| +
|
| + inverse->fMat[2][0] = 0;
|
| + inverse->fMat[2][1] = 0;
|
| + inverse->fMat[2][2] = invZScale;
|
| + inverse->fMat[2][3] = 0;
|
| +
|
| + 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[3][3] = 1;
|
| +
|
| + inverse->setTypeMask(this->getType());
|
| }
|
|
|
| - b00 *= invdet;
|
| - b07 *= invdet;
|
| - b09 *= invdet;
|
| - b11 *= invdet;
|
| -
|
| - inverse->fMat[0][0] = SkDoubleToMScalar(a11 * b11);
|
| - inverse->fMat[0][1] = 0;
|
| - inverse->fMat[0][2] = 0;
|
| - inverse->fMat[0][3] = 0;
|
| - inverse->fMat[1][0] = 0;
|
| - inverse->fMat[1][1] = SkDoubleToMScalar(a00 * b11);
|
| - inverse->fMat[1][2] = 0;
|
| - inverse->fMat[1][3] = 0;
|
| - inverse->fMat[2][0] = 0;
|
| - inverse->fMat[2][1] = 0;
|
| - inverse->fMat[2][2] = SkDoubleToMScalar(b00);
|
| - inverse->fMat[2][3] = 0;
|
| - inverse->fMat[3][0] = SkDoubleToMScalar(a11 * b07);
|
| - inverse->fMat[3][1] = SkDoubleToMScalar(a00 * b09);
|
| - inverse->fMat[3][2] = SkDoubleToMScalar(-a32 * b00);
|
| - inverse->fMat[3][3] = 1;
|
| -
|
| - inverse->setTypeMask(this->getType());
|
| return true;
|
| }
|
|
|
|
|