Add fixes & test for isConfigTexturable and isConfigRenderable
[platform/upstream/libSkiaSharp.git] / gm / resizeimagefilter.cpp
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:
18     ResizeGM() {
19         this->setBGColor(0x00000000);
20     }
21
22 protected:
23     SkString onShortName() override {
24         return SkString("resizeimagefilter");
25     }
26
27     void draw(SkCanvas* canvas,
28               const SkRect& rect,
29               const SkSize& deviceSize,
30               SkFilterQuality filterQuality,
31               sk_sp<SkImageFilter> input) {
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), SkScalarInvert(deviceScaleY));
42         sk_sp<SkImageFilter> filter(SkImageFilter::MakeMatrixFilter(matrix,
43                                                                     filterQuality,
44                                                                     std::move(input)));
45         SkPaint filteredPaint;
46         filteredPaint.setImageFilter(std::move(filter));
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
57     SkISize onISize() override {
58         return SkISize::Make(520, 100);
59     }
60
61     void onDraw(SkCanvas* canvas) override {
62         canvas->clear(SK_ColorBLACK);
63
64         SkRect srcRect = SkRect::MakeWH(96, 96);
65
66         SkSize deviceSize = SkSize::Make(16, 16);
67         this->draw(canvas,
68                    srcRect,
69                    deviceSize,
70                    kNone_SkFilterQuality,
71                    nullptr);
72
73         canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
74         this->draw(canvas,
75                    srcRect,
76                    deviceSize,
77                    kLow_SkFilterQuality,
78                    nullptr);
79
80         canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
81         this->draw(canvas,
82                    srcRect,
83                    deviceSize,
84                    kMedium_SkFilterQuality,
85                    nullptr);
86
87         canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
88         this->draw(canvas,
89                    srcRect,
90                    deviceSize,
91                    kHigh_SkFilterQuality,
92                    nullptr);
93
94         sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(16, 16));
95         SkCanvas* surfaceCanvas = surface->getCanvas();
96         surfaceCanvas->clear(0x000000);
97         {
98             SkPaint paint;
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);
103         }
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);
110         this->draw(canvas,
111                    srcRect,
112                    deviceSize,
113                    kHigh_SkFilterQuality,
114                    std::move(source));
115     }
116
117 private:
118     typedef GM INHERITED;
119 };
120
121 //////////////////////////////////////////////////////////////////////////////
122
123 DEF_GM(return new ResizeGM; )
124
125 }