1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "gm.h"
9 #include "SkColor.h"
10 #include "SkImageSource.h"
11 #include "SkRefCnt.h"
12 #include "SkSurface.h"
13
14 namespace skiagm {
15
16 class ResizeGM : public GM {
17 public:
ResizeGM()18 ResizeGM() {
19 this->setBGColor(0x00000000);
20 }
21
22 protected:
onShortName()23 virtual SkString onShortName() {
24 return SkString("resizeimagefilter");
25 }
26
draw(SkCanvas * canvas,const SkRect & rect,const SkSize & deviceSize,SkFilterQuality filterQuality,SkImageFilter * input=nullptr)27 void draw(SkCanvas* canvas,
28 const SkRect& rect,
29 const SkSize& deviceSize,
30 SkFilterQuality filterQuality,
31 SkImageFilter* input = nullptr) {
32 SkRect dstRect;
33 canvas->getTotalMatrix().mapRect(&dstRect, rect);
34 canvas->save();
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());
40 SkMatrix matrix;
41 matrix.setScale(SkScalarInvert(deviceScaleX),
42 SkScalarInvert(deviceScaleY));
43 SkAutoTUnref<SkImageFilter> imageFilter(
44 SkImageFilter::CreateMatrixFilter(matrix, filterQuality, input));
45 SkPaint filteredPaint;
46 filteredPaint.setImageFilter(imageFilter.get());
47 canvas->saveLayer(&rect, &filteredPaint);
48 SkPaint paint;
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
54 canvas->restore();
55 }
56
onISize()57 virtual SkISize onISize() {
58 return SkISize::Make(520, 100);
59 }
60
onDraw(SkCanvas * canvas)61 virtual void onDraw(SkCanvas* canvas) {
62 canvas->clear(SK_ColorBLACK);
63
64 SkRect srcRect = SkRect::MakeWH(96, 96);
65
66 SkSize deviceSize = SkSize::Make(16, 16);
67 draw(canvas,
68 srcRect,
69 deviceSize,
70 kNone_SkFilterQuality);
71
72 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
73 draw(canvas,
74 srcRect,
75 deviceSize,
76 kLow_SkFilterQuality);
77
78 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
79 draw(canvas,
80 srcRect,
81 deviceSize,
82 kMedium_SkFilterQuality);
83
84 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
85 draw(canvas,
86 srcRect,
87 deviceSize,
88 kHigh_SkFilterQuality);
89
90 SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(16, 16));
91 SkCanvas* surfaceCanvas = surface->getCanvas();
92 surfaceCanvas->clear(0x000000);
93 {
94 SkPaint paint;
95 paint.setColor(0xFF00FF00);
96 SkRect ovalRect = SkRect::MakeWH(16, 16);
97 ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3);
98 surfaceCanvas->drawOval(ovalRect, paint);
99 }
100 SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
101 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
102 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
103 SkAutoTUnref<SkImageFilter> source(
104 SkImageSource::Create(image, inRect, outRect, kHigh_SkFilterQuality));
105 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
106 draw(canvas,
107 srcRect,
108 deviceSize,
109 kHigh_SkFilterQuality,
110 source.get());
111 }
112
113 private:
114 typedef GM INHERITED;
115 };
116
117 //////////////////////////////////////////////////////////////////////////////
118
MyFactory(void *)119 static GM* MyFactory(void*) { return new ResizeGM; }
120 static GMRegistry reg(MyFactory);
121
122 }
123