aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/utils/SkMatrix44.cpp8
-rw-r--r--tests/Matrix44Test.cpp27
2 files changed, 3 insertions, 32 deletions
diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp
index 9ceecbdf2a..92c8715faa 100644
--- a/src/utils/SkMatrix44.cpp
+++ b/src/utils/SkMatrix44.cpp
@@ -529,16 +529,13 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
// Calculate the determinant
double det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
- 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)) {
+ if (dabs(det) < TOO_SMALL_FOR_DETERMINANT) {
return false;
}
if (NULL == inverse) {
return true;
}
+ double invdet = 1.0 / det;
b00 *= invdet;
b01 *= invdet;
@@ -571,6 +568,7 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b00);
inverse->dirtyTypeMask();
+ inverse->dirtyTypeMask();
return true;
}
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index 6783ba0275..b2c7071b79 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -403,33 +403,6 @@ static void TestMatrix44(skiatest::Reporter* reporter) {
iden2.setConcat(inverse, mat);
REPORTER_ASSERT(reporter, is_identity(iden2));
- // test tiny-valued matrix inverse
- mat.reset();
- mat.setScale(1.0e-12, 1.0e-12, 1.0e-12);
- rot.setRotateDegreesAbout(0, 0, -1, 90);
- mat.postConcat(rot);
- mat.postTranslate(1.0e-12, 1.0e-12, 1.0e-12);
- REPORTER_ASSERT(reporter, mat.invert(NULL));
- mat.invert(&inverse);
- iden1.setConcat(mat, inverse);
- REPORTER_ASSERT(reporter, is_identity(iden1));
-
- // test mixed-valued matrix inverse
- mat.reset();
- mat.setScale(1.0e-12, 3.0, 1.0e+12);
- rot.setRotateDegreesAbout(0, 0, -1, 90);
- mat.postConcat(rot);
- mat.postTranslate(1.0e+12, 3.0, 1.0e-12);
- REPORTER_ASSERT(reporter, mat.invert(NULL));
- mat.invert(&inverse);
- iden1.setConcat(mat, inverse);
- REPORTER_ASSERT(reporter, is_identity(iden1));
-
- // test degenerate matrix
- mat.reset();
- mat.set3x3(1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0);
- REPORTER_ASSERT(reporter, !mat.invert(NULL));
-
// test rol/col Major getters
{
mat.setTranslate(2, 3, 4);