diff options
author | vmpstr <vmpstr@chromium.org> | 2015-06-30 13:36:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-30 13:36:04 -0700 |
commit | a8d4559fd6fb4f8ed213e201bb738dbc7b3c3512 (patch) | |
tree | f2899ace478cde5439ba144c1fb832294485c8d5 /tests/Matrix44Test.cpp | |
parent | 7f6283bdf8926f72b886389588e3e2d3bc0ea066 (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.cpp | 25 |
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) { |