diff options
-rw-r--r-- | include/utils/SkMatrix44.h | 4 | ||||
-rw-r--r-- | tests/Matrix44Test.cpp | 35 |
2 files changed, 37 insertions, 2 deletions
diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h index cff0d04a3d..8c6d0350dd 100644 --- a/include/utils/SkMatrix44.h +++ b/include/utils/SkMatrix44.h @@ -219,6 +219,8 @@ public: void dump() const; + double determinant() const; + private: /* Stored in the same order as opengl: [3][0] = tx @@ -226,8 +228,6 @@ private: [3][2] = tz */ SkMScalar fMat[4][4]; - - double determinant() const; }; #endif diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp index 086321c1cf..af10e00d71 100644 --- a/tests/Matrix44Test.cpp +++ b/tests/Matrix44Test.cpp @@ -8,6 +8,14 @@ #include "Test.h" #include "SkMatrix44.h" +static bool nearly_equal_double(double a, double b) { + const double tolerance = 1e-7; + double diff = a - b; + if (diff < 0) + diff = -diff; + return diff <= tolerance; +} + static bool nearly_equal_scalar(SkMScalar a, SkMScalar b) { // Note that we get more compounded error for multiple operations when // SK_SCALAR_IS_FIXED. @@ -114,6 +122,31 @@ static void test_concat(skiatest::Reporter* reporter) { } } +static void test_determinant(skiatest::Reporter* reporter) { + SkMatrix44 a; + REPORTER_ASSERT(reporter, nearly_equal_double(1, a.determinant())); + a.set(1, 1, SkFloatToMScalar(2)); + REPORTER_ASSERT(reporter, nearly_equal_double(2, a.determinant())); + SkMatrix44 b; + REPORTER_ASSERT(reporter, a.invert(&b)); + REPORTER_ASSERT(reporter, nearly_equal_double(0.5, b.determinant())); + SkMatrix44 c = b = a; + c.set(0, 1, SkFloatToMScalar(4)); + b.set(1, 0, SkFloatToMScalar(4)); + REPORTER_ASSERT(reporter, + nearly_equal_double(a.determinant(), + b.determinant())); + SkMatrix44 d = a; + d.set(0, 0, SkFloatToMScalar(8)); + REPORTER_ASSERT(reporter, nearly_equal_double(16, d.determinant())); + + SkMatrix44 e = a; + e.postConcat(d); + REPORTER_ASSERT(reporter, nearly_equal_double(32, e.determinant())); + e.set(0, 0, SkFloatToMScalar(0)); + REPORTER_ASSERT(reporter, nearly_equal_double(0, e.determinant())); +} + static void TestMatrix44(skiatest::Reporter* reporter) { #ifdef SK_SCALAR_IS_FLOAT SkMatrix44 mat, inverse, iden1, iden2, rot; @@ -182,6 +215,8 @@ static void TestMatrix44(skiatest::Reporter* reporter) { if (false) { // avoid bit rot, suppress warning (working on making this pass) test_common_angles(reporter); } + + test_determinant(reporter); #endif } |