aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/Matrix44Test.cpp
diff options
context:
space:
mode:
authorGravatar vmpstr <vmpstr@chromium.org>2015-06-30 13:36:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-06-30 13:36:04 -0700
commita8d4559fd6fb4f8ed213e201bb738dbc7b3c3512 (patch)
treef2899ace478cde5439ba144c1fb832294485c8d5 /tests/Matrix44Test.cpp
parent7f6283bdf8926f72b886389588e3e2d3bc0ea066 (diff)
Fix infinite matrix during an invert.
This patch ensures that when inverting a SkMatrix44, we handle small floats properly. When inverted these can cause infinite values, but still evaluate to true in an if condition. BUG=chromium:498516 Review URL: https://codereview.chromium.org/1209763002
Diffstat (limited to 'tests/Matrix44Test.cpp')
-rw-r--r--tests/Matrix44Test.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index cd11a7da2d..9208ed13ad 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -426,6 +426,31 @@ static void test_invert(skiatest::Reporter* reporter) {
0, 0, -1, 1};
expected.setRowMajord(expectedInverseAffineAndPerspective);
REPORTER_ASSERT(reporter, nearly_equal(expected, inverse));
+
+ SkMatrix44 tinyScale(SkMatrix44::kIdentity_Constructor);
+ tinyScale.setDouble(0, 0, 1e-39);
+ REPORTER_ASSERT(reporter, tinyScale.getType() == SkMatrix44::kScale_Mask);
+ REPORTER_ASSERT(reporter, !tinyScale.invert(NULL));
+ REPORTER_ASSERT(reporter, !tinyScale.invert(&inverse));
+
+ SkMatrix44 tinyScaleTranslate(SkMatrix44::kIdentity_Constructor);
+ tinyScaleTranslate.setDouble(0, 0, 1e-38);
+ REPORTER_ASSERT(reporter, tinyScaleTranslate.invert(NULL));
+ tinyScaleTranslate.setDouble(0, 3, 10);
+ REPORTER_ASSERT(
+ reporter, tinyScaleTranslate.getType() ==
+ (SkMatrix44::kScale_Mask | SkMatrix44::kTranslate_Mask));
+ REPORTER_ASSERT(reporter, !tinyScaleTranslate.invert(NULL));
+ REPORTER_ASSERT(reporter, !tinyScaleTranslate.invert(&inverse));
+
+ SkMatrix44 tinyScalePerspective(SkMatrix44::kIdentity_Constructor);
+ tinyScalePerspective.setDouble(0, 0, 1e-39);
+ tinyScalePerspective.setDouble(3, 2, -1);
+ REPORTER_ASSERT(reporter, (tinyScalePerspective.getType() &
+ SkMatrix44::kPerspective_Mask) ==
+ SkMatrix44::kPerspective_Mask);
+ REPORTER_ASSERT(reporter, !tinyScalePerspective.invert(NULL));
+ REPORTER_ASSERT(reporter, !tinyScalePerspective.invert(&inverse));
}
static void test_transpose(skiatest::Reporter* reporter) {