Index: tests/GrShapeTest.cpp |
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp |
index 715afcb68aecf5aa1e0017f621e1c7e040b3a966..26224792be6906a0d55ffc8b841302a2344f4deb 100644 |
--- a/tests/GrShapeTest.cpp |
+++ b/tests/GrShapeTest.cpp |
@@ -32,8 +32,8 @@ namespace { |
class TestCase { |
public: |
template <typename GEO> |
- TestCase(const GEO& geo, const SkPaint& paint) : fBase(geo, paint) { |
- this->init(); |
+ TestCase(const GEO& geo, const SkPaint& paint, skiatest::Reporter* r) : fBase(geo, paint) { |
+ this->init(r); |
} |
struct SelfExpectations { |
@@ -64,15 +64,50 @@ public: |
const Key& appliedPathEffectThenStrokeKey() const { return fAppliedPEThenStrokeKey; } |
private: |
- void init() { |
- fAppliedPE = fBase.applyPathEffect(); |
- fAppliedPEThenStroke = fAppliedPE.applyFullStyle(); |
- fAppliedFull = fBase.applyFullStyle(); |
+ void init(skiatest::Reporter* r) { |
+ fAppliedPE = fBase.applyStyle(GrStyle::Apply::kPathEffectOnly); |
+ fAppliedPEThenStroke = fAppliedPE.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec); |
+ fAppliedFull = fBase.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec); |
make_key(&fBaseKey, fBase); |
make_key(&fAppliedPEKey, fAppliedPE); |
make_key(&fAppliedPEThenStrokeKey, fAppliedPEThenStroke); |
make_key(&fAppliedFullKey, fAppliedFull); |
+ |
+ // Applying the path effect and then the stroke should always be the same as applying |
+ // both in one go. |
+ REPORTER_ASSERT(r, fAppliedPEThenStrokeKey == fAppliedFullKey); |
+ SkPath a, b; |
+ fAppliedPEThenStroke.asPath(&a); |
+ fAppliedFull.asPath(&b); |
+ REPORTER_ASSERT(r, a == b); |
+ |
+ // Check that the same path is produced when style is applied by GrShape and GrStyle. |
+ SkPath preStyle; |
+ SkPath postPathEffect; |
+ SkPath postAllStyle; |
+ |
+ fBase.asPath(&preStyle); |
+ SkStrokeRec postPathEffectStrokeRec(SkStrokeRec::kFill_InitStyle); |
+ if (fBase.style().applyPathEffectToPath(&postPathEffect, &postPathEffectStrokeRec, |
+ preStyle)) { |
+ SkPath testPath; |
+ fAppliedPE.asPath(&testPath); |
+ REPORTER_ASSERT(r, testPath == postPathEffect); |
+ REPORTER_ASSERT(r, |
+ postPathEffectStrokeRec.hasEqualEffect(fAppliedPE.style().strokeRec())); |
+ } |
+ SkStrokeRec::InitStyle fillOrHairline; |
+ if (fBase.style().applyToPath(&postAllStyle, &fillOrHairline, preStyle)) { |
+ SkPath testPath; |
+ fAppliedFull.asPath(&testPath); |
+ REPORTER_ASSERT(r, testPath == postAllStyle); |
+ if (fillOrHairline == SkStrokeRec::kFill_InitStyle) { |
+ REPORTER_ASSERT(r, fAppliedFull.style().isSimpleFill()); |
+ } else { |
+ REPORTER_ASSERT(r, fAppliedFull.style().isSimpleHairline()); |
+ } |
+ } |
} |
GrShape fBase; |
@@ -88,13 +123,6 @@ private: |
}; |
void TestCase::testExpectations(skiatest::Reporter* reporter, SelfExpectations expectations) const { |
- // Applying the path effect and then the stroke should always be the same as applying |
- // both in one go. |
- REPORTER_ASSERT(reporter, fAppliedPEThenStrokeKey == fAppliedFullKey); |
- SkPath a, b; |
- fAppliedPEThenStroke.asPath(&a); |
- fAppliedFull.asPath(&b); |
- REPORTER_ASSERT(reporter, a == b); |
// The base's key should always be valid (unless the path is volatile) |
REPORTER_ASSERT(reporter, fBaseKey.count()); |
if (expectations.fPEHasEffect) { |
@@ -108,6 +136,7 @@ void TestCase::testExpectations(skiatest::Reporter* reporter, SelfExpectations e |
} |
} else { |
REPORTER_ASSERT(reporter, fBaseKey == fAppliedPEKey); |
+ SkPath a, b; |
fBase.asPath(&a); |
fAppliedPE.asPath(&b); |
REPORTER_ASSERT(reporter, a == b); |
@@ -183,36 +212,37 @@ static void test_basic(skiatest::Reporter* reporter, const GEO& geo) { |
TestCase::SelfExpectations expectations; |
SkPaint fill; |
- TestCase fillCase(geo, fill); |
+ TestCase fillCase(geo, fill, reporter); |
expectations.fPEHasEffect = false; |
expectations.fPEHasValidKey = false; |
expectations.fStrokeApplies = false; |
fillCase.testExpectations(reporter, expectations); |
// Test that another GrShape instance built from the same primitive is the same. |
- TestCase(geo, fill).compare(reporter, fillCase, TestCase::kAllSame_ComparisonExpecation); |
+ TestCase(geo, fill, reporter).compare(reporter, fillCase, |
+ TestCase::kAllSame_ComparisonExpecation); |
SkPaint stroke2RoundBevel; |
stroke2RoundBevel.setStyle(SkPaint::kStroke_Style); |
stroke2RoundBevel.setStrokeCap(SkPaint::kRound_Cap); |
stroke2RoundBevel.setStrokeJoin(SkPaint::kBevel_Join); |
stroke2RoundBevel.setStrokeWidth(2.f); |
- TestCase stroke2RoundBevelCase(geo, stroke2RoundBevel); |
+ TestCase stroke2RoundBevelCase(geo, stroke2RoundBevel, reporter); |
expectations.fPEHasValidKey = true; |
expectations.fPEHasEffect = false; |
expectations.fStrokeApplies = true; |
stroke2RoundBevelCase.testExpectations(reporter, expectations); |
- TestCase(geo, stroke2RoundBevel).compare(reporter, stroke2RoundBevelCase, |
- TestCase::kAllSame_ComparisonExpecation); |
+ TestCase(geo, stroke2RoundBevel, reporter).compare(reporter, stroke2RoundBevelCase, |
+ TestCase::kAllSame_ComparisonExpecation); |
SkPaint stroke2RoundBevelDash = stroke2RoundBevel; |
stroke2RoundBevelDash.setPathEffect(make_dash()); |
- TestCase stroke2RoundBevelDashCase(geo, stroke2RoundBevelDash); |
+ TestCase stroke2RoundBevelDashCase(geo, stroke2RoundBevelDash, reporter); |
expectations.fPEHasValidKey = true; |
expectations.fPEHasEffect = true; |
expectations.fStrokeApplies = true; |
stroke2RoundBevelDashCase.testExpectations(reporter, expectations); |
- TestCase(geo, stroke2RoundBevelDash).compare(reporter, stroke2RoundBevelDashCase, |
- TestCase::kAllSame_ComparisonExpecation); |
+ TestCase(geo, stroke2RoundBevelDash, reporter).compare(reporter, stroke2RoundBevelDashCase, |
+ TestCase::kAllSame_ComparisonExpecation); |
fillCase.compare(reporter, stroke2RoundBevelCase, |
TestCase::kSameUpToStroke_ComparisonExpecation); |
@@ -224,7 +254,7 @@ static void test_basic(skiatest::Reporter* reporter, const GEO& geo) { |
SkPaint hairline; |
hairline.setStyle(SkPaint::kStroke_Style); |
hairline.setStrokeWidth(0.f); |
- TestCase hairlineCase(geo, hairline); |
+ TestCase hairlineCase(geo, hairline, reporter); |
// Since hairline style doesn't change the SkPath data, it is keyed identically to fill. |
hairlineCase.compare(reporter, fillCase, TestCase::kAllSame_ComparisonExpecation); |
} |
@@ -243,16 +273,16 @@ static void test_stroke_param(skiatest::Reporter* reporter, const GEO& geo, |
strokeB.setStrokeWidth(2.f); |
setter(&strokeB, b); |
- TestCase strokeACase(geo, strokeA); |
- TestCase strokeBCase(geo, strokeB); |
+ TestCase strokeACase(geo, strokeA, reporter); |
+ TestCase strokeBCase(geo, strokeB, reporter); |
strokeACase.compare(reporter, strokeBCase, TestCase::kSameUpToStroke_ComparisonExpecation); |
// Make sure stroking params don't affect fill style. |
SkPaint fillA = strokeA, fillB = strokeB; |
fillA.setStyle(SkPaint::kFill_Style); |
fillB.setStyle(SkPaint::kFill_Style); |
- TestCase fillACase(geo, fillA); |
- TestCase fillBCase(geo, fillB); |
+ TestCase fillACase(geo, fillA, reporter); |
+ TestCase fillBCase(geo, fillB, reporter); |
fillACase.compare(reporter, fillBCase, TestCase::kAllSame_ComparisonExpecation); |
// Make sure just applying the dash but not stroke gives the same key for both stroking |
@@ -260,8 +290,8 @@ static void test_stroke_param(skiatest::Reporter* reporter, const GEO& geo, |
SkPaint dashA = strokeA, dashB = strokeB; |
dashA.setPathEffect(make_dash()); |
dashB.setPathEffect(make_dash()); |
- TestCase dashACase(geo, dashA); |
- TestCase dashBCase(geo, dashB); |
+ TestCase dashACase(geo, dashA, reporter); |
+ TestCase dashBCase(geo, dashB, reporter); |
dashACase.compare(reporter, dashBCase, TestCase::kSameUpToStroke_ComparisonExpecation); |
} |
@@ -277,22 +307,22 @@ static void test_miter_limit(skiatest::Reporter* reporter, const GEO& geo) { |
SkPaint miterB = miterA; |
miterA.setStrokeMiter(0.6f); |
- TestCase miterACase(geo, miterA); |
- TestCase miterBCase(geo, miterB); |
+ TestCase miterACase(geo, miterA, reporter); |
+ TestCase miterBCase(geo, miterB, reporter); |
miterACase.compare(reporter, miterBCase, TestCase::kSameUpToStroke_ComparisonExpecation); |
SkPaint noMiterA = miterA, noMiterB = miterB; |
noMiterA.setStrokeJoin(SkPaint::kRound_Join); |
noMiterB.setStrokeJoin(SkPaint::kRound_Join); |
- TestCase noMiterACase(geo, noMiterA); |
- TestCase noMiterBCase(geo, noMiterB); |
+ TestCase noMiterACase(geo, noMiterA, reporter); |
+ TestCase noMiterBCase(geo, noMiterB, reporter); |
noMiterACase.compare(reporter, noMiterBCase, TestCase::kAllSame_ComparisonExpecation); |
SkPaint fillA = miterA, fillB = miterB; |
fillA.setStyle(SkPaint::kFill_Style); |
fillB.setStyle(SkPaint::kFill_Style); |
- TestCase fillACase(geo, fillA); |
- TestCase fillBCase(geo, fillB); |
+ TestCase fillACase(geo, fillA, reporter); |
+ TestCase fillBCase(geo, fillB, reporter); |
fillACase.compare(reporter, fillBCase, TestCase::kAllSame_ComparisonExpecation); |
} |
@@ -303,9 +333,9 @@ static void test_dash_fill(skiatest::Reporter* reporter, const GEO& geo) { |
for (DashFactoryFn md : {&make_dash, &make_null_dash}) { |
SkPaint dashFill; |
dashFill.setPathEffect((*md)()); |
- TestCase dashFillCase(geo, dashFill); |
+ TestCase dashFillCase(geo, dashFill, reporter); |
- TestCase fillCase(geo, SkPaint()); |
+ TestCase fillCase(geo, SkPaint(), reporter); |
dashFillCase.compare(reporter, fillCase, TestCase::kAllSame_ComparisonExpecation); |
} |
} |
@@ -325,10 +355,10 @@ void test_null_dash(skiatest::Reporter* reporter, const GEO& geo) { |
nullDash.setStrokeWidth(1.f); |
nullDash.setPathEffect(make_null_dash()); |
- TestCase fillCase(geo, fill); |
- TestCase strokeCase(geo, stroke); |
- TestCase dashCase(geo, dash); |
- TestCase nullDashCase(geo, nullDash); |
+ TestCase fillCase(geo, fill, reporter); |
+ TestCase strokeCase(geo, stroke, reporter); |
+ TestCase dashCase(geo, dash, reporter); |
+ TestCase nullDashCase(geo, nullDash, reporter); |
nullDashCase.compare(reporter, fillCase, TestCase::kSameUpToStroke_ComparisonExpecation); |
nullDashCase.compare(reporter, strokeCase, TestCase::kAllSame_ComparisonExpecation); |
@@ -365,27 +395,27 @@ void test_path_effect_makes_rrect(skiatest::Reporter* reporter, const GEO& geo) |
}; |
SkPaint fill; |
- TestCase fillGeoCase(geo, fill); |
+ TestCase fillGeoCase(geo, fill, reporter); |
SkPaint pe; |
pe.setPathEffect(RRectPathEffect::Make()); |
- TestCase geoPECase(geo, pe); |
+ TestCase geoPECase(geo, pe, reporter); |
SkPaint peStroke; |
peStroke.setPathEffect(RRectPathEffect::Make()); |
peStroke.setStrokeWidth(2.f); |
peStroke.setStyle(SkPaint::kStroke_Style); |
- TestCase geoPEStrokeCase(geo, peStroke); |
+ TestCase geoPEStrokeCase(geo, peStroke, reporter); |
fillGeoCase.compare(reporter, geoPECase, TestCase::kSameUpToPE_ComparisonExpecation); |
fillGeoCase.compare(reporter, geoPEStrokeCase, TestCase::kSameUpToPE_ComparisonExpecation); |
geoPECase.compare(reporter, geoPEStrokeCase, |
TestCase::kSameUpToStroke_ComparisonExpecation); |
- TestCase rrectFillCase(RRectPathEffect::RRect(), fill); |
+ TestCase rrectFillCase(RRectPathEffect::RRect(), fill, reporter); |
SkPaint stroke = peStroke; |
stroke.setPathEffect(nullptr); |
- TestCase rrectStrokeCase(RRectPathEffect::RRect(), stroke); |
+ TestCase rrectStrokeCase(RRectPathEffect::RRect(), stroke, reporter); |
SkRRect rrect; |
// Applying the path effect should make a SkRRect shape. There is no further stroking in the |
@@ -441,7 +471,7 @@ void test_unknown_path_effect(skiatest::Reporter* reporter, const GEO& geo) { |
peStroke.setPathEffect(AddLineTosPathEffect::Make()); |
peStroke.setStrokeWidth(2.f); |
peStroke.setStyle(SkPaint::kStroke_Style); |
- TestCase geoPEStrokeCase(geo, peStroke); |
+ TestCase geoPEStrokeCase(geo, peStroke, reporter); |
TestCase::SelfExpectations expectations; |
expectations.fPEHasEffect = true; |
expectations.fPEHasValidKey = false; |
@@ -462,13 +492,13 @@ void test_volatile_path(skiatest::Reporter* reporter, const SkPath& path, |
dashAndStroke.setPathEffect(make_dash()); |
dashAndStroke.setStrokeWidth(2.f); |
dashAndStroke.setStyle(SkPaint::kStroke_Style); |
- TestCase volatileCase(vPath, dashAndStroke); |
+ TestCase volatileCase(vPath, dashAndStroke, reporter); |
// We expect a shape made from a volatile path to have a key iff the shape is recognized |
// as a specialized geometry. |
if (isNonPath) { |
REPORTER_ASSERT(reporter, SkToBool(volatileCase.baseKey().count())); |
// In this case all the keys should be identical to the non-volatile case. |
- TestCase nonVolatileCase(path, dashAndStroke); |
+ TestCase nonVolatileCase(path, dashAndStroke, reporter); |
volatileCase.compare(reporter, nonVolatileCase, TestCase::kAllSame_ComparisonExpecation); |
} else { |
// None of the keys should be valid. |
@@ -508,7 +538,7 @@ void test_path_effect_makes_empty_shape(skiatest::Reporter* reporter, const GEO& |
SkPaint pe; |
pe.setPathEffect(EmptyPathEffect::Make()); |
- TestCase geoCase(geo, pe); |
+ TestCase geoCase(geo, pe, reporter); |
REPORTER_ASSERT(reporter, geoCase.appliedFullStyleKey() == emptyKey); |
REPORTER_ASSERT(reporter, geoCase.appliedPathEffectKey() == emptyKey); |
REPORTER_ASSERT(reporter, geoCase.appliedPathEffectThenStrokeKey() == emptyKey); |
@@ -517,7 +547,7 @@ void test_path_effect_makes_empty_shape(skiatest::Reporter* reporter, const GEO& |
peStroke.setPathEffect(EmptyPathEffect::Make()); |
peStroke.setStrokeWidth(2.f); |
peStroke.setStyle(SkPaint::kStroke_Style); |
- TestCase geoPEStrokeCase(geo, peStroke); |
+ TestCase geoPEStrokeCase(geo, peStroke, reporter); |
REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedFullStyleKey() == emptyKey); |
REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectKey() == emptyKey); |
REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectThenStrokeKey() == emptyKey); |
@@ -526,7 +556,7 @@ void test_path_effect_makes_empty_shape(skiatest::Reporter* reporter, const GEO& |
void test_empty_shape(skiatest::Reporter* reporter) { |
SkPath emptyPath; |
SkPaint fill; |
- TestCase fillEmptyCase(emptyPath, fill); |
+ TestCase fillEmptyCase(emptyPath, fill, reporter); |
Key emptyKey(fillEmptyCase.baseKey()); |
REPORTER_ASSERT(reporter, emptyKey.count()); |
@@ -541,7 +571,7 @@ void test_empty_shape(skiatest::Reporter* reporter) { |
SkPaint stroke; |
stroke.setStrokeWidth(2.f); |
stroke.setStyle(SkPaint::kStroke_Style); |
- TestCase strokeEmptyCase(emptyPath2, stroke); |
+ TestCase strokeEmptyCase(emptyPath2, stroke, reporter); |
strokeEmptyCase.compare(reporter, fillEmptyCase, TestCase::kAllSame_ComparisonExpecation); |
// Dashing and stroking an empty path should have no effect |
@@ -550,20 +580,20 @@ void test_empty_shape(skiatest::Reporter* reporter) { |
dashAndStroke.setPathEffect(make_dash()); |
dashAndStroke.setStrokeWidth(2.f); |
dashAndStroke.setStyle(SkPaint::kStroke_Style); |
- TestCase dashAndStrokeEmptyCase(emptyPath3, dashAndStroke); |
+ TestCase dashAndStrokeEmptyCase(emptyPath3, dashAndStroke, reporter); |
dashAndStrokeEmptyCase.compare(reporter, fillEmptyCase, |
TestCase::kAllSame_ComparisonExpecation); |
// A shape made from an empty rrect should behave the same as an empty path. |
SkRRect emptyRRect = SkRRect::MakeRect(SkRect::MakeEmpty()); |
REPORTER_ASSERT(reporter, emptyRRect.getType() == SkRRect::kEmpty_Type); |
- TestCase dashAndStrokeEmptyRRectCase(emptyRRect, dashAndStroke); |
+ TestCase dashAndStrokeEmptyRRectCase(emptyRRect, dashAndStroke, reporter); |
dashAndStrokeEmptyRRectCase.compare(reporter, fillEmptyCase, |
TestCase::kAllSame_ComparisonExpecation); |
// Same for a rect. |
SkRect emptyRect = SkRect::MakeEmpty(); |
- TestCase dashAndStrokeEmptyRectCase(emptyRect, dashAndStroke); |
+ TestCase dashAndStrokeEmptyRectCase(emptyRect, dashAndStroke, reporter); |
dashAndStrokeEmptyRectCase.compare(reporter, fillEmptyCase, |
TestCase::kAllSame_ComparisonExpecation); |
} |
@@ -658,25 +688,25 @@ DEF_TEST(GrShape, reporter) { |
test_path_effect_makes_empty_shape(reporter, path); |
SkPaint fillPaint; |
- TestCase fillPathCase(path, fillPaint); |
+ TestCase fillPathCase(path, fillPaint, reporter); |
SkRRect rrect; |
REPORTER_ASSERT(reporter, testPath.fIsRRectForFill == |
fillPathCase.baseShape().asRRect(&rrect)); |
if (testPath.fIsRRectForFill) { |
REPORTER_ASSERT(reporter, rrect == testPath.fRRect); |
- TestCase fillRRectCase(rrect, fillPaint); |
+ TestCase fillRRectCase(rrect, fillPaint, reporter); |
fillPathCase.compare(reporter, fillRRectCase, TestCase::kAllSame_ComparisonExpecation); |
} |
SkPaint strokePaint; |
strokePaint.setStrokeWidth(3.f); |
strokePaint.setStyle(SkPaint::kStroke_Style); |
- TestCase strokePathCase(path, strokePaint); |
+ TestCase strokePathCase(path, strokePaint, reporter); |
REPORTER_ASSERT(reporter, testPath.fIsRRectForStroke == |
strokePathCase.baseShape().asRRect(&rrect)); |
if (testPath.fIsRRectForStroke) { |
REPORTER_ASSERT(reporter, rrect == testPath.fRRect); |
- TestCase strokeRRectCase(rrect, strokePaint); |
+ TestCase strokeRRectCase(rrect, strokePaint, reporter); |
strokePathCase.compare(reporter, strokeRRectCase, |
TestCase::kAllSame_ComparisonExpecation); |
} |