aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
Diffstat (limited to 'gm')
-rw-r--r--gm/bleed.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index 914da993bc..baef8850d6 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -444,3 +444,68 @@ DEF_GM( return new BleedGM(kUseAlphaBitmap_BleedTest); )
DEF_GM( return new BleedGM(kUseAlphaImage_BleedTest); )
DEF_GM( return new BleedGM(kUseAlphaBitmapShader_BleedTest); )
DEF_GM( return new BleedGM(kUseAlphaImageShader_BleedTest); )
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+#include "SkSurface.h"
+
+sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
+ auto surface = canvas->makeSurface(info);
+ if (!surface) {
+ surface = SkSurface::MakeRaster(info);
+ }
+ return surface;
+}
+
+// Construct an image and return the inner "src" rect. Build the image such that the interior is
+// blue, with a margin of blue (2px) but then an outer margin of red.
+//
+// Show that kFast_SrcRectConstraint sees even the red margin (due to mipmapping) when the image
+// is scaled down far enough.
+//
+static sk_sp<SkImage> make_image(SkCanvas* canvas, SkRect* srcR) {
+ const int N = 9 + 2 + 7 + 2 + 9;
+ SkImageInfo info = SkImageInfo::MakeN32Premul(N, N);
+ auto surface = make_surface(canvas, info);
+ SkCanvas* c = surface->getCanvas();
+ SkRect r = SkRect::MakeIWH(info.width(), info.height());
+ SkPaint paint;
+
+ paint.setColor(SK_ColorRED);
+ c->drawRect(r, paint);
+ r.inset(4, 4);
+ paint.setColor(SK_ColorBLUE);
+ c->drawRect(r, paint);
+
+ *srcR = r.makeInset(2, 2);
+ return surface->makeImageSnapshot();
+}
+
+DEF_SIMPLE_GM(bleed_downscale, canvas, 360, 240) {
+ SkRect src;
+ sk_sp<SkImage> img = make_image(canvas, &src);
+ SkPaint paint;
+
+ canvas->translate(10, 10);
+
+ const SkCanvas::SrcRectConstraint constraints[] = {
+ SkCanvas::kStrict_SrcRectConstraint, SkCanvas::kFast_SrcRectConstraint
+ };
+ const SkFilterQuality qualities[] = {
+ kNone_SkFilterQuality, kLow_SkFilterQuality, kMedium_SkFilterQuality
+ };
+ for (auto constraint : constraints) {
+ canvas->save();
+ for (auto quality : qualities) {
+ paint.setFilterQuality(quality);
+ auto surf = make_surface(canvas, SkImageInfo::MakeN32Premul(1, 1));
+ surf->getCanvas()->drawImageRect(img, src, SkRect::MakeWH(1, 1), &paint, constraint);
+ // now blow up the 1 pixel result
+ canvas->drawImageRect(surf->makeImageSnapshot(), SkRect::MakeWH(100, 100), nullptr);
+ canvas->translate(120, 0);
+ }
+ canvas->restore();
+ canvas->translate(0, 120);
+ }
+}
+
+