Index: tests/RoundRectTest.cpp |
diff --git a/tests/RoundRectTest.cpp b/tests/RoundRectTest.cpp |
index 0a528a65357f8f83fb4e18036b63841f49bf4a93..261ec67ca0963cc313db4d1c178bec6505d69e47 100644 |
--- a/tests/RoundRectTest.cpp |
+++ b/tests/RoundRectTest.cpp |
@@ -582,6 +582,35 @@ static void test_round_rect_transform(skiatest::Reporter* reporter) { |
} |
} |
+// Test out the case where an oval already off in space is translated/scaled |
+// further off into space - yielding numerical issues when the rect & radii |
+// are transformed separatly |
+// BUG=skia:2696 |
+static void test_issue_2696(skiatest::Reporter* reporter) { |
+ SkRRect rrect; |
+ SkRect r = { 28443.8594f, 53.1428604f, 28446.7148f, 56.0000038f }; |
+ rrect.setOval(r); |
+ |
+ SkMatrix xform; |
+ xform.setAll(2.44f, 0.0f, 485411.7f, |
+ 0.0f, 2.44f, -438.7f, |
+ 0.0f, 0.0f, 1.0f); |
+ SkRRect dst; |
+ |
+ bool success = rrect.transform(xform, &dst); |
+ REPORTER_ASSERT(reporter, success); |
+ |
+ SkScalar halfWidth = SkScalarHalf(dst.width()); |
+ SkScalar halfHeight = SkScalarHalf(dst.height()); |
+ |
+ for (int i = 0; i < 4; ++i) { |
+ REPORTER_ASSERT(reporter, |
+ SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fX, halfWidth)); |
+ REPORTER_ASSERT(reporter, |
+ SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fY, halfHeight)); |
+ } |
+} |
+ |
DEF_TEST(RoundRect, reporter) { |
test_round_rect_basic(reporter); |
test_round_rect_rects(reporter); |
@@ -591,4 +620,5 @@ DEF_TEST(RoundRect, reporter) { |
test_inset(reporter); |
test_round_rect_contains_rect(reporter); |
test_round_rect_transform(reporter); |
+ test_issue_2696(reporter); |
} |