Fix SkStrokeRec == to report true for all fills
authorkkinnunen <kkinnunen@nvidia.com>
Wed, 13 May 2015 07:02:26 +0000 (00:02 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 13 May 2015 07:02:26 +0000 (00:02 -0700)
Fix SkStrokeRec == to report true for all fills, regardless
of the stale stroking data the object might contain.

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

include/core/SkStrokeRec.h
src/gpu/GrPath.h
tests/StrokeTest.cpp

index 00b1fc1..b56dacb 100644 (file)
@@ -95,12 +95,20 @@ public:
      */
     void applyToPaint(SkPaint* paint) const;
 
-    bool operator==(const SkStrokeRec& other) const {
-            return fWidth == other.fWidth &&
-                   fMiterLimit == other.fMiterLimit &&
-                   fCap == other.fCap &&
-                   fJoin == other.fJoin &&
-                   fStrokeAndFill == other.fStrokeAndFill;
+    /**
+     * Compare if two SkStrokeRecs have an equal effect on a path.
+     * Equal SkStrokeRecs produce equal paths. Equality of produced
+     * paths does not take the ResScale parameter into account.
+     */
+    bool hasEqualEffect(const SkStrokeRec& other) const {
+        if (!this->needToApply()) {
+            return this->getStyle() == other.getStyle();
+        }
+        return fWidth == other.fWidth &&
+               fMiterLimit == other.fMiterLimit &&
+               fCap == other.fCap &&
+               fJoin == other.fJoin &&
+               fStrokeAndFill == other.fStrokeAndFill;
     }
 
 private:
index 27bbdc0..ab8c51f 100644 (file)
@@ -31,7 +31,7 @@ public:
     static uint64_t ComputeStrokeKey(const SkStrokeRec&);
 
     bool isEqualTo(const SkPath& path, const SkStrokeRec& stroke) {
-        return fSkPath == path && fStroke == stroke;
+        return fSkPath == path && fStroke.hasEqualEffect(stroke);
     }
 
     const SkRect& getBounds() const { return fBounds; }
index b8abbd3..43b293f 100644 (file)
@@ -9,6 +9,7 @@
 #include "SkPath.h"
 #include "SkRect.h"
 #include "SkStroke.h"
+#include "SkStrokeRec.h"
 #include "Test.h"
 
 static bool equal(const SkRect& a, const SkRect& b) {
@@ -84,7 +85,83 @@ static void test_strokerect(skiatest::Reporter* reporter) {
     }
 }
 
+static void test_strokerec_equality(skiatest::Reporter* reporter) {
+    {
+        SkStrokeRec s1(SkStrokeRec::kFill_InitStyle);
+        SkStrokeRec s2(SkStrokeRec::kFill_InitStyle);
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+
+        // Test that style mismatch is detected.
+        s2.setHairlineStyle();
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+
+        s1.setHairlineStyle();
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+
+        // ResScale is not part of equality.
+        s1.setResScale(2.1f);
+        s2.setResScale(1.2f);
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+        s1.setFillStyle();
+        s2.setFillStyle();
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+        s1.setStrokeStyle(1.0f, false);
+        s2.setStrokeStyle(1.0f, false);
+        s1.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.9f);
+        s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.9f);
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+    }
+
+    // Stroke parameters on fill or hairline style are not part of equality.
+    {
+        SkStrokeRec s1(SkStrokeRec::kFill_InitStyle);
+        SkStrokeRec s2(SkStrokeRec::kFill_InitStyle);
+        for (int i = 0; i < 2; ++i) {
+            s1.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.9f);
+            s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.1f);
+            REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+            s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kBevel_Join, 2.9f);
+            REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+            s2.setStrokeParams(SkPaint::kRound_Cap, SkPaint::kRound_Join, 2.9f);
+            REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+            s1.setHairlineStyle();
+            s2.setHairlineStyle();
+        }
+    }
+
+    // Stroke parameters on stroke style are part of equality.
+    {
+        SkStrokeRec s1(SkStrokeRec::kFill_InitStyle);
+        SkStrokeRec s2(SkStrokeRec::kFill_InitStyle);
+        s1.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.9f);
+        s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.9f);
+        s1.setStrokeStyle(1.0f, false);
+
+        s2.setStrokeStyle(1.0f, true);
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+
+        s2.setStrokeStyle(2.1f, false);
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+
+        s2.setStrokeStyle(1.0f, false);
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+
+        s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2.1f);
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+        s2.setStrokeParams(SkPaint::kButt_Cap, SkPaint::kBevel_Join, 2.9f);
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+        s2.setStrokeParams(SkPaint::kRound_Cap, SkPaint::kRound_Join, 2.9f);
+        REPORTER_ASSERT(reporter, !s1.hasEqualEffect(s2));
+
+        // Sets fill.
+        s1.setStrokeStyle(0.0f, true);
+        s2.setStrokeStyle(0.0f, true);
+        REPORTER_ASSERT(reporter, s1.hasEqualEffect(s2));
+    }
+}
+
 DEF_TEST(Stroke, reporter) {
     test_strokecubic(reporter);
     test_strokerect(reporter);
+    test_strokerec_equality(reporter);
 }