Fix radii scaling bug in SkRRect::setNinePatch
authorrobertphillips <robertphillips@google.com>
Tue, 24 Feb 2015 19:18:48 +0000 (11:18 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 24 Feb 2015 19:18:48 +0000 (11:18 -0800)
BUG=skia:3466

Review URL: https://codereview.chromium.org/951323004

src/core/SkRRect.cpp
tests/RoundRectTest.cpp

index 788bf1d..f292764 100644 (file)
@@ -69,7 +69,7 @@ void SkRRect::setNinePatch(const SkRect& rect, SkScalar leftRad, SkScalar topRad
         scale = SkScalarDiv(rect.width(), leftRad + rightRad);
     }
     if (topRad + bottomRad > rect.height()) {
-        scale = SkMinScalar(scale, SkScalarDiv(rect.width(), leftRad + rightRad));
+        scale = SkMinScalar(scale, SkScalarDiv(rect.height(), topRad + bottomRad));
     }
 
     if (scale < SK_Scalar1) {
index cff3e8f..9920d10 100644 (file)
@@ -54,6 +54,32 @@ static void test_inset(skiatest::Reporter* reporter) {
     REPORTER_ASSERT(reporter, rr2.isRect());
 }
 
+
+static void test_9patch_rrect(skiatest::Reporter* reporter,
+                              const SkRect& rect,
+                              SkScalar l, SkScalar t, SkScalar r, SkScalar b,
+                              bool checkRadii) {
+    SkRRect rr;
+    rr.setNinePatch(rect, l, t, r, b);
+
+    REPORTER_ASSERT(reporter, SkRRect::kNinePatch_Type == rr.type());
+    REPORTER_ASSERT(reporter, rr.rect() == rect);
+
+    if (checkRadii) {
+        // This test doesn't hold if the radii will be rescaled by SkRRect
+        SkRect ninePatchRadii = { l, t, r, b };
+        SkPoint rquad[4];
+        ninePatchRadii.toQuad(rquad);
+        for (int i = 0; i < 4; ++i) {
+            REPORTER_ASSERT(reporter, rquad[i] == rr.radii((SkRRect::Corner) i));
+        }
+    }
+    SkRRect rr2; // construct the same RR using the most general set function
+    SkVector radii[4] = { { l, t }, { r, t }, { r, b }, { l, b } };
+    rr2.setRectRadii(rect, radii);
+    REPORTER_ASSERT(reporter, rr2 == rr && rr2.getType() == rr.getType());
+}
+
 // Test out the basic API entry points
 static void test_round_rect_basic(skiatest::Reporter* reporter) {
     // Test out initialization methods
@@ -130,24 +156,17 @@ static void test_round_rect_basic(skiatest::Reporter* reporter) {
     REPORTER_ASSERT(reporter, rr3_3 == rr3 && rr3_3.getType() == rr3.getType());
 
     //----
-    SkRect ninePatchRadii = { 10, 9, 8, 7 };
-
-    SkRRect rr4;
-    rr4.setNinePatch(rect, ninePatchRadii.fLeft, ninePatchRadii.fTop, ninePatchRadii.fRight,
-                     ninePatchRadii.fBottom);
+    test_9patch_rrect(reporter, rect, 10, 9, 8, 7, true);
 
-    REPORTER_ASSERT(reporter, SkRRect::kNinePatch_Type == rr4.type());
-    REPORTER_ASSERT(reporter, rr4.rect() == rect);
+    {
+        // Test out the rrect from skia:3466
+        SkRect rect2 = SkRect::MakeLTRB(0.358211994f, 0.755430222f, 0.872866154f, 0.806214333f);
 
-    SkPoint rquad[4];
-    ninePatchRadii.toQuad(rquad);
-    for (int i = 0; i < 4; ++i) {
-        REPORTER_ASSERT(reporter, rquad[i] == rr4.radii((SkRRect::Corner) i));
+        test_9patch_rrect(reporter,
+                          rect2,
+                          0.926942348f, 0.642850280f, 0.529063463f, 0.587844372f,
+                          false);
     }
-    SkRRect rr4_2; // construct the same RR using the most general set function
-    SkVector rr4_2_radii[4] = { { 10, 9 }, { 8, 9 }, {8, 7 }, { 10, 7 } };
-    rr4_2.setRectRadii(rect, rr4_2_radii);
-    REPORTER_ASSERT(reporter, rr4_2 == rr4 && rr4_2.getType() == rr4.getType());
 
     //----
     SkPoint radii2[4] = { { 0, 0 }, { 0, 0 }, { 50, 50 }, { 20, 50 } };
@@ -164,8 +183,7 @@ static void test_round_rect_basic(skiatest::Reporter* reporter) {
 
     // Test out == & !=
     REPORTER_ASSERT(reporter, empty != rr3);
-    REPORTER_ASSERT(reporter, rr3 != rr4);
-    REPORTER_ASSERT(reporter, rr4 != rr5);
+    REPORTER_ASSERT(reporter, rr3 != rr5);
 }
 
 // Test out the cases when the RR degenerates to a rect