Must pass filtering to picture shader
Change-Id: I820867df80daa1594d6202cad5e8e95c060293fe
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/386838
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/gm/bug6643.cpp b/gm/bug6643.cpp
index 42debb5..ceebdc1 100644
--- a/gm/bug6643.cpp
+++ b/gm/bug6643.cpp
@@ -30,7 +30,8 @@
recorder.beginRecording(200, 200)->drawPaint(p);
p.setShader(recorder.finishRecordingAsPicture()->makeShader(
- SkTileMode::kRepeat, SkTileMode::kRepeat));
+ SkTileMode::kRepeat, SkTileMode::kRepeat,
+ SkFilterMode::kNearest, nullptr, nullptr));
canvas->drawColor(SK_ColorWHITE);
canvas->drawPaint(p);
}
diff --git a/gm/gradients.cpp b/gm/gradients.cpp
index 904a67f..c5a3e07 100644
--- a/gm/gradients.cpp
+++ b/gm/gradients.cpp
@@ -922,8 +922,8 @@
SkMatrix m = SkMatrix::I();
m.preRotate(45);
return recorder.finishRecordingAsPicture()->makeShader(
- SkTileMode::kRepeat,
- SkTileMode::kRepeat, &m, nullptr);
+ SkTileMode::kRepeat, SkTileMode::kRepeat,
+ SkFilterMode::kNearest, &m, nullptr);
});
draw_circle_shader(canvas, 400, 150, 100, []() -> sk_sp<SkShader> {
@@ -944,7 +944,7 @@
return recorder.finishRecordingAsPicture()->makeShader(
SkTileMode::kRepeat,
- SkTileMode::kRepeat);
+ SkTileMode::kRepeat, SkFilterMode::kNearest);
});
draw_circle_shader(canvas, 650, 150, 100, []() -> sk_sp<SkShader> {
diff --git a/gm/pictureshader.cpp b/gm/pictureshader.cpp
index 9306e80..db3f39c 100644
--- a/gm/pictureshader.cpp
+++ b/gm/pictureshader.cpp
@@ -163,6 +163,7 @@
auto pictureShader = fPicture->makeShader(kTileConfigs[tileMode].tmx,
kTileConfigs[tileMode].tmy,
+ SkFilterMode::kNearest,
fUseLocalMatrixWrapper ? nullptr : &localMatrix,
nullptr);
paint.setShader(fUseLocalMatrixWrapper
@@ -222,70 +223,7 @@
p.setColor(0xFFB6B6B6); // gray
canvas->drawPaint(p);
- p.setShader(picture->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat));
+ p.setShader(picture->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
+ SkFilterMode::kNearest));
canvas->drawPaint(p);
}
-
-#ifdef SK_SUPPORT_LEGACY_SETFILTERQUALITY
-/*
- Test picture-shader's filtering (after the tile is created.
- The GM draws a 2x2 grid of tiled images (circle, square, X)
-
- Column 0 should be hard-edged
- Column 1 should be filtered
-
- Row 0 deduces this from the paint (legacy behavior)
- Row 1 takes this as an explicit parameter (SkFilterMode)
- */
-DEF_SIMPLE_GM(picture_shader_filter, canvas, 230, 230) {
- auto pic = [&] {
- SkRect r = SkRect::MakeWH(100, 100);
- SkPictureRecorder recorder;
- SkCanvas* c = recorder.beginRecording(r);
- SkPaint paint;
- paint.setStroke(true);
- c->drawRect({5, 5, 95, 95}, paint);
- c->drawCircle(50, 50, 30, paint);
- c->drawLine(5, 1, 95,95, paint);
- c->drawLine(5,95, 95, 1, paint);
- return recorder.finishRecordingAsPicture();
- }();
-
- struct {
- SkPoint fLoc;
- SkFilterMode fFilter;
- bool fInheritFromPaint;
-
- void setup(SkPaint* paint, sk_sp<SkPicture> pic) const {
- SkTileMode tm = SkTileMode::kRepeat;
- sk_sp<SkShader> sh;
- if (fInheritFromPaint) {
- sh = pic->makeShader(tm, tm, nullptr, nullptr);
- paint->setFilterQuality(fFilter == SkFilterMode::kNearest ? kNone_SkFilterQuality
- : kLow_SkFilterQuality);
- } else {
- sh = pic->makeShader(tm, tm, fFilter, nullptr, nullptr);
- // the draw should ignore paint's filterquality,
- // but we'll set it to something wacky just to be test that
- paint->setFilterQuality(kHigh_SkFilterQuality);
- }
- paint->setShader(sh);
- }
- } recs[] = {
- { {0, 0}, SkFilterMode::kNearest, true },
- { {1, 0}, SkFilterMode::kLinear, true },
- { {0, 1}, SkFilterMode::kNearest, false },
- { {1, 1}, SkFilterMode::kLinear, false },
- };
-
- canvas->translate(10, 10);
- canvas->scale(1.0f/3, 1.0f/3);
- for (const auto& r : recs) {
- SkAutoCanvasRestore acr(canvas, true);
- canvas->translate(r.fLoc.fX * 330, r.fLoc.fY * 330);
- SkPaint paint;
- r.setup(&paint, pic);
- canvas->drawRect({0, 0, 300, 300}, paint);
- }
-}
-#endif
diff --git a/gm/pictureshadercache.cpp b/gm/pictureshadercache.cpp
index a21c276..b560a0c 100644
--- a/gm/pictureshadercache.cpp
+++ b/gm/pictureshadercache.cpp
@@ -67,7 +67,8 @@
void onDraw(SkCanvas* canvas) override {
SkPaint paint;
- paint.setShader(fPicture->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat));
+ paint.setShader(fPicture->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
+ SkFilterMode::kNearest));
{
// Render in a funny color space that converts green to yellow.
diff --git a/gm/pictureshadertile.cpp b/gm/pictureshadertile.cpp
index ea2ba4d..f878c2a 100644
--- a/gm/pictureshadertile.cpp
+++ b/gm/pictureshadertile.cpp
@@ -135,7 +135,7 @@
}
fShaders[i] = pictureRef->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
- &localMatrix, tilePtr);
+ SkFilterMode::kNearest, &localMatrix, tilePtr);
}
}