Index: tests/GrShapeTest.cpp |
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp |
index 6c23d6754886e401dcd72e8b20a790ae8984c05c..2edfd1276eba571f7140bc2034daf9c47e12ec9f 100644 |
--- a/tests/GrShapeTest.cpp |
+++ b/tests/GrShapeTest.cpp |
@@ -1042,7 +1042,7 @@ unsigned canonicalize_rrect_start(int s, const SkRRect& rrect) { |
} |
void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
- enum { |
+ enum Style { |
kFill, |
kStroke, |
kHairline, |
@@ -1058,21 +1058,30 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
strokeRecs[kStrokeAndFill].setStrokeStyle(3.f, true); |
sk_sp<SkPathEffect> dashEffect = make_dash(); |
- GrShape shapes[2 /* inverted */] |
- [2 /* direction */] |
- [8 /* start index */] |
- [SK_ARRAY_COUNT(strokeRecs)] |
- [2 /* dash */]; |
- for (int inverted = 0; inverted < 2; ++inverted) { |
- for (int ccw = 0; ccw < 2; ++ccw) { |
- for (unsigned s = 0; s < 8; ++s) { |
- for (size_t style = 0; style < SK_ARRAY_COUNT(strokeRecs); ++style) { |
- for (int dash = 0; dash < 2; ++dash) { |
- SkPath::Direction dir = ccw ? SkPath::kCCW_Direction |
- : SkPath::kCW_Direction; |
+ static constexpr Style kStyleCnt = static_cast<Style>(SK_ARRAY_COUNT(strokeRecs)); |
+ |
+ auto index = [](bool inverted, |
+ SkPath::Direction dir, |
+ unsigned start, |
+ Style style, |
+ bool dash) -> int { |
+ return inverted * (2 * 8 * kStyleCnt * 2) + |
+ dir * ( 8 * kStyleCnt * 2) + |
+ start * ( kStyleCnt * 2) + |
+ style * ( 2) + |
+ dash; |
+ }; |
+ static const SkPath::Direction kSecondDirection = static_cast<SkPath::Direction>(1); |
+ const int cnt = index(true, kSecondDirection, 7, static_cast<Style>(kStyleCnt - 1), true) + 1; |
+ SkAutoTArray<GrShape> shapes(cnt); |
+ for (bool inverted : {false, true}) { |
+ for (SkPath::Direction dir : {SkPath::kCW_Direction, SkPath::kCCW_Direction}) { |
+ for (unsigned start = 0; start < 8; ++start) { |
+ for (Style style : {kFill, kStroke, kHairline, kStrokeAndFill}) { |
+ for (bool dash : {false, true}) { |
SkPathEffect* pe = dash ? dashEffect.get() : nullptr; |
- shapes[inverted][ccw][s][style][dash] = |
- GrShape(rrect, dir, s, SkToBool(inverted), |
+ shapes[index(inverted, dir, start, style, dash)] = |
+ GrShape(rrect, dir, start, SkToBool(inverted), |
GrStyle(strokeRecs[style], pe)); |
} |
} |
@@ -1080,71 +1089,77 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
} |
} |
- const GrShape& exampleFillCase = shapes[0][0][0][kFill][0]; |
+ static const SkPath::Direction kDir = SkPath::kCW_Direction; // arbitrary |
+ const GrShape& exampleFillCase = shapes[index(false, kDir, 0, kFill, false)]; |
Key exampleFillCaseKey; |
make_key(&exampleFillCaseKey, exampleFillCase); |
- const GrShape& exampleStrokeAndFillCase = shapes[0][0][0][kStrokeAndFill][0]; |
+ const GrShape& exampleStrokeAndFillCase = shapes[index(false, kDir, 0, kStrokeAndFill, false)]; |
Key exampleStrokeAndFillCaseKey; |
make_key(&exampleStrokeAndFillCaseKey, exampleStrokeAndFillCase); |
- const GrShape& exampleInvFillCase = shapes[1][0][0][kFill][0]; |
+ const GrShape& exampleInvFillCase = shapes[index(true, kDir, 0, kFill, false)]; |
Key exampleInvFillCaseKey; |
make_key(&exampleInvFillCaseKey, exampleInvFillCase); |
- const GrShape& exampleInvStrokeAndFillCase = shapes[1][0][0][kStrokeAndFill][0]; |
+ const GrShape& exampleInvStrokeAndFillCase = |
+ shapes[index(true, kDir, 0, kStrokeAndFill, false)]; |
Key exampleInvStrokeAndFillCaseKey; |
make_key(&exampleInvStrokeAndFillCaseKey, exampleInvStrokeAndFillCase); |
- const GrShape& exampleStrokeCase = shapes[0][0][0][kStroke][0]; |
+ const GrShape& exampleStrokeCase = shapes[index(false, kDir, 0, kStroke, false)]; |
Key exampleStrokeCaseKey; |
make_key(&exampleStrokeCaseKey, exampleStrokeCase); |
- const GrShape& exampleHairlineCase = shapes[0][0][0][kHairline][0]; |
+ const GrShape& exampleHairlineCase = shapes[index(false, kDir, 0, kHairline, false)]; |
Key exampleHairlineCaseKey; |
make_key(&exampleHairlineCaseKey, exampleHairlineCase); |
// These are dummy initializations to suppress warnings. |
- SkRRect rr = SkRRect::MakeEmpty(); |
- SkPath::Direction dir = SkPath::kCW_Direction; |
- unsigned start = ~0U; |
- bool inv = true; |
- |
- REPORTER_ASSERT(r, exampleFillCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, !inv); |
- |
- REPORTER_ASSERT(r, exampleInvFillCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, inv); |
- |
- REPORTER_ASSERT(r, exampleStrokeAndFillCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, !inv); |
- |
- REPORTER_ASSERT(r, exampleInvStrokeAndFillCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, inv); |
- |
- REPORTER_ASSERT(r, exampleHairlineCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, !inv); |
- |
- REPORTER_ASSERT(r, exampleStrokeCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, SkPath::kCW_Direction == dir); |
- REPORTER_ASSERT(r, 0 == start); |
- REPORTER_ASSERT(r, !inv); |
+ SkRRect queryRR = SkRRect::MakeEmpty(); |
+ SkPath::Direction queryDir = SkPath::kCW_Direction; |
+ unsigned queryStart = ~0U; |
+ bool queryInverted = true; |
+ |
+ REPORTER_ASSERT(r, exampleFillCase.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, exampleInvFillCase.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, exampleStrokeAndFillCase.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, exampleInvStrokeAndFillCase.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, exampleHairlineCase.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); |
// Remember that the key reflects the geometry before styling is applied. |
REPORTER_ASSERT(r, exampleFillCaseKey != exampleInvFillCaseKey); |
@@ -1154,16 +1169,16 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
REPORTER_ASSERT(r, exampleFillCaseKey == exampleHairlineCaseKey); |
REPORTER_ASSERT(r, exampleInvStrokeAndFillCaseKey == exampleInvFillCaseKey); |
- for (int inverted = 0; inverted < 2; ++inverted) { |
- for (int ccw = 0; ccw < 2; ++ccw) { |
- for (unsigned s = 0; s < 8; ++s) { |
- for (int dash = 0; dash < 2; ++dash) { |
- const GrShape& fillCase = shapes[inverted][ccw][s][kFill][dash]; |
+ for (bool inverted : {false, true}) { |
+ for (SkPath::Direction dir : {SkPath::kCW_Direction, SkPath::kCCW_Direction}) { |
+ for (unsigned start = 0; start < 8; ++start) { |
+ for (bool dash : {false, true}) { |
+ const GrShape& fillCase = shapes[index(inverted, dir, start, kFill, dash)]; |
Key fillCaseKey; |
make_key(&fillCaseKey, fillCase); |
- const GrShape& strokeAndFillCase = |
- shapes[inverted][ccw][s][kStrokeAndFill][dash]; |
+ const GrShape& strokeAndFillCase = shapes[index(inverted, dir, start, |
+ kStrokeAndFill, dash)]; |
Key strokeAndFillCaseKey; |
make_key(&strokeAndFillCaseKey, strokeAndFillCase); |
@@ -1179,8 +1194,9 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
a.compare(r, b, TestCase::kAllSame_ComparisonExpecation); |
c.compare(r, d, TestCase::kAllSame_ComparisonExpecation); |
- const GrShape& strokeCase = shapes[inverted][ccw][s][kStroke][dash]; |
- const GrShape& hairlineCase = shapes[inverted][ccw][s][kHairline][dash]; |
+ const GrShape& strokeCase = shapes[index(inverted, dir, start, kStroke, dash)]; |
+ const GrShape& hairlineCase = shapes[index(inverted, dir, start, kHairline, |
+ dash)]; |
TestCase e(strokeCase, r); |
TestCase f(exampleStrokeCase, r); |
@@ -1190,24 +1206,26 @@ void test_rrect(skiatest::Reporter* r, const SkRRect& rrect) { |
// Both hairline and stroke shapes must respect the dashing and both |
// ignore inverseness. |
if (dash) { |
- unsigned expectedStart = canonicalize_rrect_start(s, rrect); |
+ unsigned expectedStart = canonicalize_rrect_start(start, rrect); |
REPORTER_ASSERT(r, strokeCase.style().pathEffect()); |
REPORTER_ASSERT(r, hairlineCase.style().pathEffect()); |
- REPORTER_ASSERT(r, strokeCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, (SkPath::kCCW_Direction == dir) == ccw); |
- REPORTER_ASSERT(r, start == expectedStart); |
- REPORTER_ASSERT(r, !inv); |
- REPORTER_ASSERT(r, hairlineCase.asRRect(&rr, &dir, &start, &inv)); |
- REPORTER_ASSERT(r, rr == rrect); |
- REPORTER_ASSERT(r, (SkPath::kCCW_Direction == dir) == ccw); |
- REPORTER_ASSERT(r, start == expectedStart); |
- REPORTER_ASSERT(r, !inv); |
+ REPORTER_ASSERT(r, strokeCase.asRRect(&queryRR, &queryDir, &queryStart, |
+ &queryInverted)); |
+ REPORTER_ASSERT(r, queryRR == rrect); |
+ REPORTER_ASSERT(r, queryDir == dir); |
+ REPORTER_ASSERT(r, queryStart == expectedStart); |
+ REPORTER_ASSERT(r, !queryInverted); |
+ REPORTER_ASSERT(r, hairlineCase.asRRect(&queryRR, &queryDir, &queryStart, |
+ &queryInverted)); |
+ REPORTER_ASSERT(r, queryRR == rrect); |
+ REPORTER_ASSERT(r, queryDir == dir); |
+ REPORTER_ASSERT(r, queryStart == expectedStart); |
+ REPORTER_ASSERT(r, !queryInverted); |
// The pre-style case for the dash will match the non-dash example iff the |
// dir and start match (dir=cw, start=0). |
- if (0 == expectedStart && 0 == ccw) { |
+ if (0 == expectedStart && SkPath::kCW_Direction == dir) { |
e.compare(r, f, TestCase::kSameUpToPE_ComparisonExpecation); |
g.compare(r, h, TestCase::kSameUpToPE_ComparisonExpecation); |
} else { |