| Index: tests/GrShapeTest.cpp
|
| diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp
|
| index 5fa1db9f7e147859e715b7cb3a3f5a5e9c856c43..04e2af636f8a744519d70e5087365eb060d68f38 100644
|
| --- a/tests/GrShapeTest.cpp
|
| +++ b/tests/GrShapeTest.cpp
|
| @@ -281,21 +281,15 @@ void check_equivalence(skiatest::Reporter* r, const GrShape& a, const GrShape& b
|
| a.asPath(&pathA);
|
| b.asPath(&pathB);
|
|
|
| - // Having a fill style or non-dash path effect can prevent 'a' but not 'b' from turning an
|
| - // inverse fill type into a non-inverse fill type.
|
| + // Having a dash path effect can allow 'a' but not 'b' to turn a inverse fill type into a
|
| + // non-inverse fill type (or vice versa).
|
| bool ignoreInversenessDifference = false;
|
| if (pathA.isInverseFillType() != pathB.isInverseFillType()) {
|
| const GrShape* s1 = pathA.isInverseFillType() ? &a : &b;
|
| const GrShape* s2 = pathA.isInverseFillType() ? &b : &a;
|
| - SkStrokeRec::Style style1 = s1->style().strokeRec().getStyle();
|
| - SkStrokeRec::Style style2 = s2->style().strokeRec().getStyle();
|
| - bool canDropInverse1 = !s1->style().hasNonDashPathEffect() &&
|
| - (SkStrokeRec::kStroke_Style == style1 ||
|
| - SkStrokeRec::kHairline_Style == style1);
|
| - bool canDropInverse2 = !s2->style().hasNonDashPathEffect() &&
|
| - (SkStrokeRec::kStroke_Style == style2 ||
|
| - SkStrokeRec::kHairline_Style == style2);
|
| - ignoreInversenessDifference = !canDropInverse1 && canDropInverse2;
|
| + bool canDropInverse1 = s1->style().isDashed();
|
| + bool canDropInverse2 = s2->style().isDashed();
|
| + ignoreInversenessDifference = (canDropInverse1 != canDropInverse2);
|
| }
|
|
|
| if (allowSameRRectButDiffStartAndDir) {
|
| @@ -1094,32 +1088,50 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) {
|
| }
|
| }
|
|
|
| - static const SkPath::Direction kDir = SkPath::kCW_Direction; // arbitrary
|
| - const GrShape& exampleFillCase = shapes[index(false, kDir, 0, kFill, false)];
|
| + // Get the keys for some example shape instances that we'll use for comparision against the
|
| + // rest.
|
| + static constexpr SkPath::Direction kExamplesDir = SkPath::kCW_Direction;
|
| + static constexpr unsigned kExamplesStart = 0;
|
| + const GrShape& exampleFillCase = shapes[index(false, kExamplesDir, kExamplesStart, kFill,
|
| + false)];
|
| Key exampleFillCaseKey;
|
| make_key(&exampleFillCaseKey, exampleFillCase);
|
|
|
| - const GrShape& exampleStrokeAndFillCase = shapes[index(false, kDir, 0, kStrokeAndFill, false)];
|
| + const GrShape& exampleStrokeAndFillCase = shapes[index(false, kExamplesDir, kExamplesStart,
|
| + kStrokeAndFill, false)];
|
| Key exampleStrokeAndFillCaseKey;
|
| make_key(&exampleStrokeAndFillCaseKey, exampleStrokeAndFillCase);
|
|
|
| - const GrShape& exampleInvFillCase = shapes[index(true, kDir, 0, kFill, false)];
|
| + const GrShape& exampleInvFillCase = shapes[index(true, kExamplesDir, kExamplesStart, kFill,
|
| + false)];
|
| Key exampleInvFillCaseKey;
|
| make_key(&exampleInvFillCaseKey, exampleInvFillCase);
|
|
|
| - const GrShape& exampleInvStrokeAndFillCase =
|
| - shapes[index(true, kDir, 0, kStrokeAndFill, false)];
|
| + const GrShape& exampleInvStrokeAndFillCase = shapes[index(true, kExamplesDir, kExamplesStart,
|
| + kStrokeAndFill, false)];
|
| Key exampleInvStrokeAndFillCaseKey;
|
| make_key(&exampleInvStrokeAndFillCaseKey, exampleInvStrokeAndFillCase);
|
|
|
| - const GrShape& exampleStrokeCase = shapes[index(false, kDir, 0, kStroke, false)];
|
| + const GrShape& exampleStrokeCase = shapes[index(false, kExamplesDir, kExamplesStart, kStroke,
|
| + false)];
|
| Key exampleStrokeCaseKey;
|
| make_key(&exampleStrokeCaseKey, exampleStrokeCase);
|
|
|
| - const GrShape& exampleHairlineCase = shapes[index(false, kDir, 0, kHairline, false)];
|
| + const GrShape& exampleInvStrokeCase = shapes[index(true, kExamplesDir, kExamplesStart, kStroke,
|
| + false)];
|
| + Key exampleInvStrokeCaseKey;
|
| + make_key(&exampleInvStrokeCaseKey, exampleInvStrokeCase);
|
| +
|
| + const GrShape& exampleHairlineCase = shapes[index(false, kExamplesDir, kExamplesStart,
|
| + kHairline, false)];
|
| Key exampleHairlineCaseKey;
|
| make_key(&exampleHairlineCaseKey, exampleHairlineCase);
|
|
|
| + const GrShape& exampleInvHairlineCase = shapes[index(true, kExamplesDir, kExamplesStart,
|
| + kHairline, false)];
|
| + Key exampleInvHairlineCaseKey;
|
| + make_key(&exampleInvHairlineCaseKey, exampleInvHairlineCase);
|
| +
|
| // These are dummy initializations to suppress warnings.
|
| SkRRect queryRR = SkRRect::MakeEmpty();
|
| SkPath::Direction queryDir = SkPath::kCW_Direction;
|
| @@ -1160,19 +1172,37 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) {
|
| REPORTER_ASSERT(r, 0 == queryStart);
|
| REPORTER_ASSERT(r, !queryInverted);
|
|
|
| + REPORTER_ASSERT(r, exampleInvHairlineCase.asRRect(&queryRR, &queryDir, &queryStart,
|
| + &queryInverted));
|
| + REPORTER_ASSERT(r, queryRR == rrect);
|
| + REPORTER_ASSERT(r, SkPath::kCW_Direction == queryDir);
|
| + REPORTER_ASSERT(r, 0 == queryStart);
|
| + REPORTER_ASSERT(r, queryInverted);
|
| +
|
| REPORTER_ASSERT(r, exampleStrokeCase.asRRect(&queryRR, &queryDir, &queryStart, &queryInverted));
|
| REPORTER_ASSERT(r, queryRR == rrect);
|
| REPORTER_ASSERT(r, SkPath::kCW_Direction == queryDir);
|
| REPORTER_ASSERT(r, 0 == queryStart);
|
| REPORTER_ASSERT(r, !queryInverted);
|
|
|
| + REPORTER_ASSERT(r, exampleInvStrokeCase.asRRect(&queryRR, &queryDir, &queryStart,
|
| + &queryInverted));
|
| + REPORTER_ASSERT(r, queryRR == rrect);
|
| + REPORTER_ASSERT(r, SkPath::kCW_Direction == queryDir);
|
| + REPORTER_ASSERT(r, 0 == queryStart);
|
| + REPORTER_ASSERT(r, queryInverted);
|
| +
|
| // Remember that the key reflects the geometry before styling is applied.
|
| REPORTER_ASSERT(r, exampleFillCaseKey != exampleInvFillCaseKey);
|
| REPORTER_ASSERT(r, exampleFillCaseKey == exampleStrokeAndFillCaseKey);
|
| REPORTER_ASSERT(r, exampleFillCaseKey != exampleInvStrokeAndFillCaseKey);
|
| REPORTER_ASSERT(r, exampleFillCaseKey == exampleStrokeCaseKey);
|
| + REPORTER_ASSERT(r, exampleFillCaseKey != exampleInvStrokeCaseKey);
|
| REPORTER_ASSERT(r, exampleFillCaseKey == exampleHairlineCaseKey);
|
| + REPORTER_ASSERT(r, exampleFillCaseKey != exampleInvHairlineCaseKey);
|
| REPORTER_ASSERT(r, exampleInvStrokeAndFillCaseKey == exampleInvFillCaseKey);
|
| + REPORTER_ASSERT(r, exampleInvStrokeAndFillCaseKey == exampleInvStrokeCaseKey);
|
| + REPORTER_ASSERT(r, exampleInvStrokeAndFillCaseKey == exampleInvHairlineCaseKey);
|
|
|
| for (bool inverted : {false, true}) {
|
| for (SkPath::Direction dir : {SkPath::kCW_Direction, SkPath::kCCW_Direction}) {
|
| @@ -1204,13 +1234,13 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) {
|
| dash)];
|
|
|
| TestCase e(strokeCase, r);
|
| - TestCase f(exampleStrokeCase, r);
|
| TestCase g(hairlineCase, r);
|
| - TestCase h(exampleHairlineCase, r);
|
|
|
| - // Both hairline and stroke shapes must respect the dashing and both
|
| - // ignore inverseness.
|
| + // Both hairline and stroke shapes must respect the dashing.
|
| if (dash) {
|
| + // Dashing always ignores the inverseness. skbug.com/5421
|
| + TestCase f(exampleStrokeCase, r);
|
| + TestCase h(exampleHairlineCase, r);
|
| unsigned expectedStart = canonicalize_rrect_start(start, rrect);
|
| REPORTER_ASSERT(r, strokeCase.style().pathEffect());
|
| REPORTER_ASSERT(r, hairlineCase.style().pathEffect());
|
| @@ -1238,6 +1268,8 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) {
|
| g.compare(r, h, TestCase::kAllDifferent_ComparisonExpecation);
|
| }
|
| } else {
|
| + TestCase f(inverted ? exampleInvStrokeCase : exampleStrokeCase, r);
|
| + TestCase h(inverted ? exampleInvHairlineCase : exampleHairlineCase, r);
|
| REPORTER_ASSERT(r, !strokeCase.style().pathEffect());
|
| REPORTER_ASSERT(r, !hairlineCase.style().pathEffect());
|
| e.compare(r, f, TestCase::kAllSame_ComparisonExpecation);
|
| @@ -1385,6 +1417,7 @@ DEF_TEST(GrShape, reporter) {
|
| test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStroke);
|
| }
|
| }
|
| +
|
| for (auto testPath : paths) {
|
| const SkPath& path = testPath.fPath;
|
|
|
|
|