Index: tests/GrShapeTest.cpp |
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp |
index f0173de2a46d86a50839a33eb456c763c64dfb6c..75f27eda35173912e465b23dcaed07529f0e81a5 100644 |
--- a/tests/GrShapeTest.cpp |
+++ b/tests/GrShapeTest.cpp |
@@ -32,8 +32,9 @@ namespace { |
class TestCase { |
public: |
template <typename GEO> |
- TestCase(const GEO& geo, const SkPaint& paint, skiatest::Reporter* r) : fBase(geo, paint) { |
- this->init(r); |
+ TestCase(const GEO& geo, const SkPaint& paint, skiatest::Reporter* r, |
+ SkScalar scale = SK_Scalar1) : fBase(geo, paint) { |
+ this->init(r, scale); |
} |
struct SelfExpectations { |
@@ -64,10 +65,11 @@ public: |
const Key& appliedPathEffectThenStrokeKey() const { return fAppliedPEThenStrokeKey; } |
private: |
- void init(skiatest::Reporter* r) { |
- fAppliedPE = fBase.applyStyle(GrStyle::Apply::kPathEffectOnly); |
- fAppliedPEThenStroke = fAppliedPE.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec); |
- fAppliedFull = fBase.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec); |
+ void init(skiatest::Reporter* r, SkScalar scale) { |
+ fAppliedPE = fBase.applyStyle(GrStyle::Apply::kPathEffectOnly, scale); |
+ fAppliedPEThenStroke = fAppliedPE.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, |
+ scale); |
+ fAppliedFull = fBase.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, scale); |
make_key(&fBaseKey, fBase); |
make_key(&fAppliedPEKey, fAppliedPE); |
@@ -89,7 +91,8 @@ private: |
fBase.asPath(&preStyle); |
SkStrokeRec postPEStrokeRec(SkStrokeRec::kFill_InitStyle); |
- if (fBase.style().applyPathEffectToPath(&postPathEffect, &postPEStrokeRec, preStyle)) { |
+ if (fBase.style().applyPathEffectToPath(&postPathEffect, &postPEStrokeRec, preStyle, |
+ scale)) { |
// run postPathEffect through GrShape to get any geometry reductions that would have |
// occurred to fAppliedPE. |
GrShape(postPathEffect, GrStyle(postPEStrokeRec, nullptr)).asPath(&postPathEffect); |
@@ -100,7 +103,7 @@ private: |
REPORTER_ASSERT(r, postPEStrokeRec.hasEqualEffect(fAppliedPE.style().strokeRec())); |
} |
SkStrokeRec::InitStyle fillOrHairline; |
- if (fBase.style().applyToPath(&postAllStyle, &fillOrHairline, preStyle)) { |
+ if (fBase.style().applyToPath(&postAllStyle, &fillOrHairline, preStyle, scale)) { |
// run postPathEffect through GrShape to get any reductions that would have occurred |
// to fAppliedFull. |
GrShape(postAllStyle, GrStyle(fillOrHairline)).asPath(&postAllStyle); |
@@ -125,7 +128,6 @@ private: |
Key fAppliedPEKey; |
Key fAppliedPEThenStrokeKey; |
Key fAppliedFullKey; |
- |
}; |
void TestCase::testExpectations(skiatest::Reporter* reporter, SelfExpectations expectations) const { |
@@ -296,6 +298,70 @@ static void test_basic(skiatest::Reporter* reporter, const GEO& geo) { |
REPORTER_ASSERT(reporter, hairlineCase.appliedPathEffectShape().style().isSimpleHairline()); |
} |
+template<typename GEO> |
+static void test_scale(skiatest::Reporter* reporter, const GEO& geo) { |
+ sk_sp<SkPathEffect> dashPE = make_dash(); |
+ |
+ static const SkScalar kS1 = 1.f; |
+ static const SkScalar kS2 = 2.f; |
+ |
+ SkPaint fill; |
+ TestCase fillCase1(geo, fill, reporter, kS1); |
+ TestCase fillCase2(geo, fill, reporter, kS2); |
+ // Scale doesn't affect fills. |
+ fillCase1.compare(reporter, fillCase2, TestCase::kAllSame_ComparisonExpecation); |
+ |
+ SkPaint hairline; |
+ hairline.setStyle(SkPaint::kStroke_Style); |
+ hairline.setStrokeWidth(0.f); |
+ TestCase hairlineCase1(geo, hairline, reporter, kS1); |
+ TestCase hairlineCase2(geo, hairline, reporter, kS2); |
+ // Scale doesn't affect hairlines. |
+ hairlineCase1.compare(reporter, hairlineCase2, TestCase::kAllSame_ComparisonExpecation); |
+ |
+ SkPaint stroke; |
+ stroke.setStyle(SkPaint::kStroke_Style); |
+ stroke.setStrokeWidth(2.f); |
+ TestCase strokeCase1(geo, stroke, reporter, kS1); |
+ TestCase strokeCase2(geo, stroke, reporter, kS2); |
+ // Scale affects the stroke. |
+ strokeCase1.compare(reporter, strokeCase2, TestCase::kSameUpToStroke_ComparisonExpecation); |
+ |
+ SkPaint strokeDash = stroke; |
+ strokeDash.setPathEffect(make_dash()); |
+ TestCase strokeDashCase1(geo, strokeDash, reporter, kS1); |
+ TestCase strokeDashCase2(geo, strokeDash, reporter, kS2); |
+ // Scale affects the dash and the stroke. |
+ strokeDashCase1.compare(reporter, strokeDashCase2, TestCase::kSameUpToPE_ComparisonExpecation); |
+ |
+ // Stroke and fill cases |
+ SkPaint strokeAndFill = stroke; |
+ strokeAndFill.setStyle(SkPaint::kStrokeAndFill_Style); |
+ TestCase strokeAndFillCase1(geo, strokeAndFill, reporter, kS1); |
+ TestCase strokeAndFillCase2(geo, strokeAndFill, reporter, kS2); |
+ // Scale affects the stroke. Though, this can wind up creating a rect when the input is a rect. |
+ // In that case we wind up with a pure geometry key and the geometries are the same. |
+ SkRRect rrect; |
+ if (strokeAndFillCase1.appliedFullStyleShape().asRRect(&rrect)) { |
+ // We currently only expect to get here in the rect->rect case. |
+ REPORTER_ASSERT(reporter, rrect.isRect()); |
+ REPORTER_ASSERT(reporter, strokeAndFillCase1.baseShape().asRRect(&rrect) && rrect.isRect()); |
+ strokeAndFillCase1.compare(reporter, strokeAndFillCase2, |
+ TestCase::kAllSame_ComparisonExpecation); |
+ } else { |
+ strokeAndFillCase1.compare(reporter, strokeAndFillCase2, |
+ TestCase::kSameUpToStroke_ComparisonExpecation); |
+ } |
+ |
+ SkPaint strokeAndFillDash = strokeDash; |
+ strokeAndFillDash.setStyle(SkPaint::kStrokeAndFill_Style); |
+ TestCase strokeAndFillDashCase1(geo, strokeAndFillDash, reporter, kS1); |
+ TestCase strokeAndFillDashCase2(geo, strokeAndFillDash, reporter, kS2); |
+ // Scale affects the path effect and stroke. |
+ strokeAndFillDashCase1.compare(reporter, strokeAndFillDashCase2, |
+ TestCase::kSameUpToPE_ComparisonExpecation); |
+} |
+ |
template <typename GEO, typename T> |
static void test_stroke_param_impl(skiatest::Reporter* reporter, const GEO& geo, |
std::function<void(SkPaint*, T)> setter, T a, T b, |
@@ -748,6 +814,7 @@ DEF_TEST(GrShape, reporter) { |
for (auto rr : { SkRRect::MakeRect(SkRect::MakeWH(10, 10)), |
SkRRect::MakeRectXY(SkRect::MakeWH(10, 10), 3, 4)}) { |
test_basic(reporter, rr); |
+ test_scale(reporter, rr); |
test_dash_fill(reporter, rr); |
test_null_dash(reporter, rr); |
// Test modifying various stroke params. |
@@ -809,6 +876,7 @@ DEF_TEST(GrShape, reporter) { |
test_null_dash(reporter, path); |
test_path_effect_makes_rrect(reporter, path); |
} |
+ test_scale(reporter, path); |
// This test uses a stroking paint, hence use of fIsRRectForStroke |
test_volatile_path(reporter, path, testPath.fIsRRectForStroke); |
test_dash_fill(reporter, path); |