Index: tests/GrShapeTest.cpp |
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp |
index 39cc8da9336d6589e10e8831db1ebe76e2a0eb45..348676be302a080f030e833e917213757e735f52 100644 |
--- a/tests/GrShapeTest.cpp |
+++ b/tests/GrShapeTest.cpp |
@@ -299,7 +299,23 @@ void check_equivalence(skiatest::Reporter* r, const GrShape& a, const GrShape& b |
bool canDropInverse2 = s2->style().isDashed(); |
ignoreInversenessDifference = (canDropInverse1 != canDropInverse2); |
} |
- |
+ bool ignoreWindingVsEvenOdd = false; |
+ if (SkPath::ConvertToNonInverseFillType(pathA.getFillType()) != |
+ SkPath::ConvertToNonInverseFillType(pathB.getFillType())) { |
+ const SkStrokeRec::Style strokeRecStyleA = a.style().strokeRec().getStyle(); |
+ const SkStrokeRec::Style strokeRecStyleB = b.style().strokeRec().getStyle(); |
robertphillips
2016/06/23 18:47:54
add a "static bool can_change(const GrStyle, const
|
+ bool aCanChange = !a.style().hasNonDashPathEffect() && |
+ (strokeRecStyleA == SkStrokeRec::kStroke_Style || |
+ strokeRecStyleA == SkStrokeRec::kHairline_Style || |
+ (a.style().isSimpleFill() && pathA.isConvex())); |
+ bool bCanChange = !b.style().hasNonDashPathEffect() && |
+ (strokeRecStyleB == SkStrokeRec::kStroke_Style || |
+ strokeRecStyleB == SkStrokeRec::kHairline_Style || |
+ (b.style().isSimpleFill() && pathB.isConvex())); |
+ if (aCanChange != bCanChange) { |
+ ignoreWindingVsEvenOdd = true; |
+ } |
+ } |
if (allowSameRRectButDiffStartAndDir) { |
REPORTER_ASSERT(r, rrectA == rrectB); |
REPORTER_ASSERT(r, paths_fill_same(pathA, pathB)); |
@@ -310,9 +326,17 @@ void check_equivalence(skiatest::Reporter* r, const GrShape& a, const GrShape& b |
if (ignoreInversenessDifference) { |
pA.setFillType(SkPath::ConvertToNonInverseFillType(pathA.getFillType())); |
pB.setFillType(SkPath::ConvertToNonInverseFillType(pathB.getFillType())); |
- REPORTER_ASSERT(r, keyA != keyB); |
- } else { |
+ } |
+ if (ignoreWindingVsEvenOdd) { |
+ pA.setFillType(pA.isInverseFillType() ? SkPath::kInverseEvenOdd_FillType |
+ : SkPath::kEvenOdd_FillType); |
+ pB.setFillType(pB.isInverseFillType() ? SkPath::kInverseEvenOdd_FillType |
+ : SkPath::kEvenOdd_FillType); |
+ } |
+ if (!ignoreInversenessDifference && !ignoreWindingVsEvenOdd) { |
REPORTER_ASSERT(r, keyA == keyB); |
+ } else { |
+ REPORTER_ASSERT(r, keyA != keyB); |
} |
if (a.style().isSimpleFill() != b.style().isSimpleFill()) { |
// GrShape will close paths with simple fill style. Make the non-filled path closed |
@@ -842,6 +866,11 @@ void test_make_hairline_path_effect(skiatest::Reporter* reporter, const GEO& geo |
REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
REPORTER_ASSERT(reporter, paths_fill_same(a, c)); |
} else { |
+ // The base shape cannot perform canonicalization on the path's fill type because of an |
+ // unknown path effect. However, after the path effect is applied the resulting hairline |
+ // shape will canonicalize the path fill type since hairlines (and stroking in general) |
+ // don't distinguish between even/odd and non-zero winding. |
+ a.setFillType(b.getFillType()); |
REPORTER_ASSERT(reporter, a == b); |
REPORTER_ASSERT(reporter, a == c); |
REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey().empty()); |