diff options
author | bsalomon <bsalomon@google.com> | 2016-06-23 11:48:26 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-06-23 11:48:26 -0700 |
commit | a4817afe5095b67a68c907ff2e48e3e07907140c (patch) | |
tree | c5f5540ad63b6ee99b7a8e79bad2a9d676ead766 /tests/GrShapeTest.cpp | |
parent | 42a41499de94ff9201ca3c56554d7b92ce32b247 (diff) |
Canonicalize path fill types for stroked paths in GrShape.
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2085913003
Review-Url: https://codereview.chromium.org/2085913003
Diffstat (limited to 'tests/GrShapeTest.cpp')
-rw-r--r-- | tests/GrShapeTest.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp index 39cc8da933..348676be30 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(); + 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()); |