Add fixes & test for isConfigTexturable and isConfigRenderable
[platform/upstream/libSkiaSharp.git] / gm / perspshaders.cpp
1 /*
2  * Copyright 2015 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 "sk_tool_utils.h"
10 #include "SkGradientShader.h"
11 #include "SkImage.h"
12 #include "SkPath.h"
13 #include "SkSurface.h"
14
15 static sk_sp<SkImage> make_image(SkCanvas* origCanvas, int w, int h) {
16     SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
17     auto surface(origCanvas->makeSurface(info));
18     if (nullptr == surface) {
19         surface = SkSurface::MakeRaster(info);
20     }
21     SkCanvas* canvas = surface->getCanvas();
22
23     sk_tool_utils::draw_checkerboard(canvas, SK_ColorRED, SK_ColorGREEN, w/10);
24     return surface->makeImageSnapshot();
25 }
26
27 namespace skiagm {
28
29 class PerspShadersGM : public GM {
30 public:
31     PerspShadersGM(bool doAA) : fDoAA(doAA) { }
32
33 protected:
34     SkString onShortName() override {
35         SkString name;
36         name.printf("persp_shaders_%s",
37                      fDoAA ? "aa" : "bw");
38         return name;
39     }
40
41     SkISize onISize() override {
42         return SkISize::Make(kCellSize*kNumCols, kCellSize*kNumRows);
43     }
44
45     void onOnceBeforeDraw() override {
46         fBitmap = sk_tool_utils::create_checkerboard_bitmap(kCellSize, kCellSize,
47                                                             SK_ColorBLUE, SK_ColorYELLOW,
48                                                             kCellSize/10);
49
50         fBitmapShader = SkShader::MakeBitmapShader(fBitmap, SkShader::kClamp_TileMode,
51                                                    SkShader::kClamp_TileMode);
52         SkPoint pts1[] = {
53             { 0, 0 },
54             { SkIntToScalar(kCellSize), SkIntToScalar(kCellSize) }
55         };
56         SkPoint pts2[] = {
57             { 0, 0 },
58             { 0, SkIntToScalar(kCellSize) }
59         };
60         constexpr SkColor colors[] = {
61             SK_ColorRED, SK_ColorGREEN, SK_ColorRED, SK_ColorGREEN, SK_ColorRED
62         };
63         constexpr SkScalar pos[] = { 0, 0.25f, 0.5f, 0.75f, SK_Scalar1 };
64
65         fLinearGrad1 = SkGradientShader::MakeLinear(pts1, colors, pos, SK_ARRAY_COUNT(colors),
66                                                     SkShader::kClamp_TileMode);
67         fLinearGrad2 = SkGradientShader::MakeLinear(pts2, colors, pos, SK_ARRAY_COUNT(colors),
68                                                     SkShader::kClamp_TileMode);
69
70         fPerspMatrix.reset();
71         fPerspMatrix.setPerspY(SK_Scalar1 / 50);
72
73         fPath.moveTo(0, 0);
74         fPath.lineTo(0, SkIntToScalar(kCellSize));
75         fPath.lineTo(kCellSize/2.0f, kCellSize/2.0f);
76         fPath.lineTo(SkIntToScalar(kCellSize), SkIntToScalar(kCellSize));
77         fPath.lineTo(SkIntToScalar(kCellSize), 0);
78         fPath.close();
79     }
80
81     void drawRow(SkCanvas* canvas, SkFilterQuality filterQ) {
82         SkPaint filterPaint;
83         filterPaint.setFilterQuality(filterQ);
84         filterPaint.setAntiAlias(fDoAA);
85
86         SkPaint pathPaint;
87         pathPaint.setShader(fBitmapShader);
88         pathPaint.setFilterQuality(filterQ);
89         pathPaint.setAntiAlias(fDoAA);
90
91         SkPaint gradPaint1;
92         gradPaint1.setShader(fLinearGrad1);
93         gradPaint1.setAntiAlias(fDoAA);
94         SkPaint gradPaint2;
95         gradPaint2.setShader(fLinearGrad2);
96         gradPaint2.setAntiAlias(fDoAA);
97
98         SkRect r = SkRect::MakeWH(SkIntToScalar(kCellSize), SkIntToScalar(kCellSize));
99
100         canvas->save();
101
102         canvas->save();
103         canvas->concat(fPerspMatrix);
104         canvas->drawBitmapRect(fBitmap, r, &filterPaint);
105         canvas->restore();
106
107         canvas->translate(SkIntToScalar(kCellSize), 0);
108         canvas->save();
109         canvas->concat(fPerspMatrix);
110         canvas->drawImage(fImage.get(), 0, 0, &filterPaint);
111         canvas->restore();
112
113         canvas->translate(SkIntToScalar(kCellSize), 0);
114         canvas->save();
115         canvas->concat(fPerspMatrix);
116         canvas->drawRect(r, pathPaint);
117         canvas->restore();
118
119         canvas->translate(SkIntToScalar(kCellSize), 0);
120         canvas->save();
121         canvas->concat(fPerspMatrix);
122         canvas->drawPath(fPath, pathPaint);
123         canvas->restore();
124
125         canvas->translate(SkIntToScalar(kCellSize), 0);
126         canvas->save();
127         canvas->concat(fPerspMatrix);
128         canvas->drawRect(r, gradPaint1);
129         canvas->restore();
130
131         canvas->translate(SkIntToScalar(kCellSize), 0);
132         canvas->save();
133         canvas->concat(fPerspMatrix);
134         canvas->drawPath(fPath, gradPaint2);
135         canvas->restore();
136
137         canvas->restore();
138     }
139
140     void onDraw(SkCanvas* canvas) override {
141         if (!fImage) {
142             fImage = make_image(canvas, kCellSize, kCellSize);
143         }
144
145         this->drawRow(canvas, kNone_SkFilterQuality);
146         canvas->translate(0, SkIntToScalar(kCellSize));
147         this->drawRow(canvas, kLow_SkFilterQuality);
148         canvas->translate(0, SkIntToScalar(kCellSize));
149         this->drawRow(canvas, kMedium_SkFilterQuality);
150         canvas->translate(0, SkIntToScalar(kCellSize));
151         this->drawRow(canvas, kHigh_SkFilterQuality);
152         canvas->translate(0, SkIntToScalar(kCellSize));
153     }
154 private:
155     static constexpr int kCellSize = 50;
156     static constexpr int kNumRows = 4;
157     static constexpr int kNumCols = 6;
158
159     bool            fDoAA;
160     SkPath          fPath;
161     sk_sp<SkShader> fBitmapShader;
162     sk_sp<SkShader> fLinearGrad1;
163     sk_sp<SkShader> fLinearGrad2;
164     SkMatrix        fPerspMatrix;
165     sk_sp<SkImage>  fImage;
166     SkBitmap        fBitmap;
167
168     typedef GM INHERITED;
169 };
170
171 //////////////////////////////////////////////////////////////////////////////
172
173 DEF_GM(return new PerspShadersGM(true);)
174 DEF_GM(return new PerspShadersGM(false);)
175 }