Index: tests/GrShapeTest.cpp |
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp |
index 26224792be6906a0d55ffc8b841302a2344f4deb..aa46cd981c2c315238d33893e20d146c65248ec1 100644 |
--- a/tests/GrShapeTest.cpp |
+++ b/tests/GrShapeTest.cpp |
@@ -257,6 +257,9 @@ static void test_basic(skiatest::Reporter* reporter, const GEO& geo) { |
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); |
+ REPORTER_ASSERT(reporter, hairlineCase.baseShape().style().isSimpleHairline()); |
+ REPORTER_ASSERT(reporter, hairlineCase.appliedFullStyleShape().style().isSimpleHairline()); |
+ REPORTER_ASSERT(reporter, hairlineCase.appliedPathEffectShape().style().isSimpleHairline()); |
} |
template <typename GEO, typename T> |
@@ -464,7 +467,7 @@ void test_unknown_path_effect(skiatest::Reporter* reporter, const GEO& geo) { |
AddLineTosPathEffect() {} |
}; |
- // This path effect should make the keys invalid when it is applied. We only produce a pathe |
+ // This path effect should make the keys invalid when it is applied. We only produce a path |
// effect key for dash path effects. So the only way another arbitrary path effect can produce |
// a styled result with a key is to produce a non-path shape that has a purely geometric key. |
SkPaint peStroke; |
@@ -479,6 +482,52 @@ void test_unknown_path_effect(skiatest::Reporter* reporter, const GEO& geo) { |
geoPEStrokeCase.testExpectations(reporter, expectations); |
} |
+template <typename GEO> |
+void test_make_hairline_path_effect(skiatest::Reporter* reporter, const GEO& geo, bool isNonPath) { |
+ /** |
+ * This path effect just changes the stroke rec to hairline. |
+ */ |
+ class MakeHairlinePathEffect : SkPathEffect { |
+ public: |
+ bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* strokeRec, |
+ const SkRect* cullR) const override { |
+ *dst = src; |
+ strokeRec->setHairlineStyle(); |
+ return true; |
+ } |
+ void computeFastBounds(SkRect* dst, const SkRect& src) const override { *dst = src; } |
+ static sk_sp<SkPathEffect> Make() { |
+ return sk_sp<SkPathEffect>(new MakeHairlinePathEffect); |
+ } |
+ Factory getFactory() const override { return nullptr; } |
+ void toString(SkString*) const override {} |
+ private: |
+ MakeHairlinePathEffect() {} |
+ }; |
+ |
+ SkPaint fill; |
+ SkPaint pe; |
+ pe.setPathEffect(MakeHairlinePathEffect::Make()); |
+ |
+ TestCase peCase(geo, pe, reporter); |
+ |
+ SkPath a, b; |
+ peCase.baseShape().asPath(&a); |
+ peCase.appliedPathEffectShape().asPath(&b); |
+ REPORTER_ASSERT(reporter, a == b); |
+ peCase.appliedFullStyleShape().asPath(&b); |
+ REPORTER_ASSERT(reporter, a == b); |
+ REPORTER_ASSERT(reporter, peCase.appliedPathEffectShape().style().isSimpleHairline()); |
+ REPORTER_ASSERT(reporter, peCase.appliedFullStyleShape().style().isSimpleHairline()); |
+ if (isNonPath) { |
+ REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey() == peCase.baseKey()); |
+ REPORTER_ASSERT(reporter, peCase.appliedFullStyleKey() == peCase.baseKey()); |
+ } else { |
+ REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey().empty()); |
+ REPORTER_ASSERT(reporter, peCase.appliedFullStyleKey().empty()); |
+ } |
+} |
+ |
/** |
* isNonPath indicates whether the initial shape made from the path is expected to be recognized |
* as a simpler shape type (e.g. rrect) |
@@ -623,6 +672,7 @@ DEF_TEST(GrShape, reporter) { |
test_path_effect_makes_rrect(reporter, rr); |
test_unknown_path_effect(reporter, rr); |
test_path_effect_makes_empty_shape(reporter, rr); |
+ test_make_hairline_path_effect(reporter, rr, true); |
} |
struct TestPath { |
@@ -686,6 +736,7 @@ DEF_TEST(GrShape, reporter) { |
test_miter_limit(reporter, path); |
test_unknown_path_effect(reporter, path); |
test_path_effect_makes_empty_shape(reporter, path); |
+ test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStroke); |
SkPaint fillPaint; |
TestCase fillPathCase(path, fillPaint, reporter); |