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