2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkImageSource.h"
12 #include "SkSurface.h"
16 class ResizeGM : public GM {
19 this->setBGColor(0x00000000);
23 SkString onShortName() override {
24 return SkString("resizeimagefilter");
27 void draw(SkCanvas* canvas,
29 const SkSize& deviceSize,
30 SkFilterQuality filterQuality,
31 sk_sp<SkImageFilter> input) {
33 canvas->getTotalMatrix().mapRect(&dstRect, rect);
35 SkScalar deviceScaleX = deviceSize.width() / dstRect.width();
36 SkScalar deviceScaleY = deviceSize.height() / dstRect.height();
37 canvas->translate(rect.x(), rect.y());
38 canvas->scale(deviceScaleX, deviceScaleY);
39 canvas->translate(-rect.x(), -rect.y());
41 matrix.setScale(SkScalarInvert(deviceScaleX), SkScalarInvert(deviceScaleY));
42 sk_sp<SkImageFilter> filter(SkImageFilter::MakeMatrixFilter(matrix,
45 SkPaint filteredPaint;
46 filteredPaint.setImageFilter(std::move(filter));
47 canvas->saveLayer(&rect, &filteredPaint);
49 paint.setColor(0xFF00FF00);
50 SkRect ovalRect = rect;
51 ovalRect.inset(SkIntToScalar(4), SkIntToScalar(4));
52 canvas->drawOval(ovalRect, paint);
53 canvas->restore(); // for saveLayer
57 SkISize onISize() override {
58 return SkISize::Make(520, 100);
61 void onDraw(SkCanvas* canvas) override {
62 canvas->clear(SK_ColorBLACK);
64 SkRect srcRect = SkRect::MakeWH(96, 96);
66 SkSize deviceSize = SkSize::Make(16, 16);
70 kNone_SkFilterQuality,
73 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
80 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
84 kMedium_SkFilterQuality,
87 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
91 kHigh_SkFilterQuality,
94 sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(16, 16));
95 SkCanvas* surfaceCanvas = surface->getCanvas();
96 surfaceCanvas->clear(0x000000);
99 paint.setColor(0xFF00FF00);
100 SkRect ovalRect = SkRect::MakeWH(16, 16);
101 ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3);
102 surfaceCanvas->drawOval(ovalRect, paint);
104 sk_sp<SkImage> image(surface->makeImageSnapshot());
105 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
106 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
107 sk_sp<SkImageFilter> source(
108 SkImageSource::Make(std::move(image), inRect, outRect, kHigh_SkFilterQuality));
109 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
113 kHigh_SkFilterQuality,
118 typedef GM INHERITED;
121 //////////////////////////////////////////////////////////////////////////////
123 DEF_GM(return new ResizeGM; )