xref: /aosp_15_r20/external/skia/gm/roundrects.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm {
30*c8dee2aaSAndroid Build Coastguard Worker 
gen_color(SkRandom * rand)31*c8dee2aaSAndroid Build Coastguard Worker static SkColor gen_color(SkRandom* rand) {
32*c8dee2aaSAndroid Build Coastguard Worker     SkScalar hsv[3];
33*c8dee2aaSAndroid Build Coastguard Worker     hsv[0] = rand->nextRangeF(0.0f, 360.0f);
34*c8dee2aaSAndroid Build Coastguard Worker     hsv[1] = rand->nextRangeF(0.75f, 1.0f);
35*c8dee2aaSAndroid Build Coastguard Worker     hsv[2] = rand->nextRangeF(0.75f, 1.0f);
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     return ToolUtils::color_to_565(SkHSVToColor(hsv));
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker class RoundRectGM : public GM {
41*c8dee2aaSAndroid Build Coastguard Worker public:
RoundRectGM()42*c8dee2aaSAndroid Build Coastguard Worker     RoundRectGM() {
43*c8dee2aaSAndroid Build Coastguard Worker         this->setBGColor(0xFF000000);
44*c8dee2aaSAndroid Build Coastguard Worker         this->makePaints();
45*c8dee2aaSAndroid Build Coastguard Worker         this->makeMatrices();
46*c8dee2aaSAndroid Build Coastguard Worker     }
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const49*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("roundrects"); }
50*c8dee2aaSAndroid Build Coastguard Worker 
getISize()51*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(1200, 900); }
52*c8dee2aaSAndroid Build Coastguard Worker 
makePaints()53*c8dee2aaSAndroid Build Coastguard Worker     void makePaints() {
54*c8dee2aaSAndroid Build Coastguard Worker         {
55*c8dee2aaSAndroid Build Coastguard Worker             // no AA
56*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
57*c8dee2aaSAndroid Build Coastguard Worker             fPaints.push_back(p);
58*c8dee2aaSAndroid Build Coastguard Worker         }
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker         {
61*c8dee2aaSAndroid Build Coastguard Worker             // AA
62*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
63*c8dee2aaSAndroid Build Coastguard Worker             p.setAntiAlias(true);
64*c8dee2aaSAndroid Build Coastguard Worker             fPaints.push_back(p);
65*c8dee2aaSAndroid Build Coastguard Worker         }
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker         {
68*c8dee2aaSAndroid Build Coastguard Worker             // AA with stroke style
69*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
70*c8dee2aaSAndroid Build Coastguard Worker             p.setAntiAlias(true);
71*c8dee2aaSAndroid Build Coastguard Worker             p.setStyle(SkPaint::kStroke_Style);
72*c8dee2aaSAndroid Build Coastguard Worker             p.setStrokeWidth(SkIntToScalar(5));
73*c8dee2aaSAndroid Build Coastguard Worker             fPaints.push_back(p);
74*c8dee2aaSAndroid Build Coastguard Worker         }
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker         {
77*c8dee2aaSAndroid Build Coastguard Worker             // AA with stroke style, width = 0
78*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
79*c8dee2aaSAndroid Build Coastguard Worker             p.setAntiAlias(true);
80*c8dee2aaSAndroid Build Coastguard Worker             p.setStyle(SkPaint::kStroke_Style);
81*c8dee2aaSAndroid Build Coastguard Worker             fPaints.push_back(p);
82*c8dee2aaSAndroid Build Coastguard Worker         }
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker         {
85*c8dee2aaSAndroid Build Coastguard Worker             // AA with stroke and fill style
86*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
87*c8dee2aaSAndroid Build Coastguard Worker             p.setAntiAlias(true);
88*c8dee2aaSAndroid Build Coastguard Worker             p.setStyle(SkPaint::kStrokeAndFill_Style);
89*c8dee2aaSAndroid Build Coastguard Worker             p.setStrokeWidth(SkIntToScalar(3));
90*c8dee2aaSAndroid Build Coastguard Worker             fPaints.push_back(p);
91*c8dee2aaSAndroid Build Coastguard Worker         }
92*c8dee2aaSAndroid Build Coastguard Worker     }
93*c8dee2aaSAndroid Build Coastguard Worker 
makeMatrices()94*c8dee2aaSAndroid Build Coastguard Worker     void makeMatrices() {
95*c8dee2aaSAndroid Build Coastguard Worker         {
96*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
97*c8dee2aaSAndroid Build Coastguard Worker             m.setIdentity();
98*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
99*c8dee2aaSAndroid Build Coastguard Worker         }
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker         {
102*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
103*c8dee2aaSAndroid Build Coastguard Worker             m.setScale(SkIntToScalar(3), SkIntToScalar(2));
104*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
105*c8dee2aaSAndroid Build Coastguard Worker         }
106*c8dee2aaSAndroid Build Coastguard Worker 
107*c8dee2aaSAndroid Build Coastguard Worker         {
108*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
109*c8dee2aaSAndroid Build Coastguard Worker             m.setScale(SkIntToScalar(2), SkIntToScalar(2));
110*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
111*c8dee2aaSAndroid Build Coastguard Worker         }
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker         {
114*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
115*c8dee2aaSAndroid Build Coastguard Worker             m.setScale(SkIntToScalar(1), SkIntToScalar(2));
116*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
117*c8dee2aaSAndroid Build Coastguard Worker         }
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker         {
120*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
121*c8dee2aaSAndroid Build Coastguard Worker             m.setScale(SkIntToScalar(4), SkIntToScalar(1));
122*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
123*c8dee2aaSAndroid Build Coastguard Worker         }
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker         {
126*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
127*c8dee2aaSAndroid Build Coastguard Worker             m.setRotate(SkIntToScalar(90));
128*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
129*c8dee2aaSAndroid Build Coastguard Worker         }
130*c8dee2aaSAndroid Build Coastguard Worker 
131*c8dee2aaSAndroid Build Coastguard Worker         {
132*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
133*c8dee2aaSAndroid Build Coastguard Worker             m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
134*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
135*c8dee2aaSAndroid Build Coastguard Worker         }
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker         {
138*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix m;
139*c8dee2aaSAndroid Build Coastguard Worker             m.setRotate(SkIntToScalar(60));
140*c8dee2aaSAndroid Build Coastguard Worker             fMatrices.push_back(m);
141*c8dee2aaSAndroid Build Coastguard Worker         }
142*c8dee2aaSAndroid Build Coastguard Worker     }
143*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)144*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
145*c8dee2aaSAndroid Build Coastguard Worker         SkRandom rand(1);
146*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
147*c8dee2aaSAndroid Build Coastguard Worker         const SkRect kRect = SkRect::MakeLTRB(-20, -30, 20, 30);
148*c8dee2aaSAndroid Build Coastguard Worker         SkRRect circleRRect;
149*c8dee2aaSAndroid Build Coastguard Worker         circleRRect.setRectXY(kRect, 5, 5);
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker         const SkScalar kXStart = 60.0f;
152*c8dee2aaSAndroid Build Coastguard Worker         const SkScalar kYStart = 80.0f;
153*c8dee2aaSAndroid Build Coastguard Worker         const int kXStep = 150;
154*c8dee2aaSAndroid Build Coastguard Worker         const int kYStep = 160;
155*c8dee2aaSAndroid Build Coastguard Worker         int maxX = fMatrices.size();
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker         SkPaint rectPaint;
158*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setAntiAlias(true);
159*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setStyle(SkPaint::kStroke_Style);
160*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setStrokeWidth(SkIntToScalar(0));
161*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setColor(SK_ColorLTGRAY);
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker         int testCount = 0;
164*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
165*c8dee2aaSAndroid Build Coastguard Worker             for (int j = 0; j < fMatrices.size(); ++j) {
166*c8dee2aaSAndroid Build Coastguard Worker                 canvas->save();
167*c8dee2aaSAndroid Build Coastguard Worker                 SkMatrix mat = fMatrices[j];
168*c8dee2aaSAndroid Build Coastguard Worker                 // position the roundrect, and make it at off-integer coords.
169*c8dee2aaSAndroid Build Coastguard Worker                 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
170*c8dee2aaSAndroid Build Coastguard Worker                                   SK_Scalar1 / 4,
171*c8dee2aaSAndroid Build Coastguard Worker                                   kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
172*c8dee2aaSAndroid Build Coastguard Worker                                   3 * SK_Scalar1 / 4);
173*c8dee2aaSAndroid Build Coastguard Worker                 canvas->concat(mat);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker                 SkColor color = gen_color(&rand);
176*c8dee2aaSAndroid Build Coastguard Worker                 fPaints[i].setColor(color);
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(kRect, rectPaint);
179*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRRect(circleRRect, fPaints[i]);
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker                 canvas->restore();
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker                 ++testCount;
184*c8dee2aaSAndroid Build Coastguard Worker             }
185*c8dee2aaSAndroid Build Coastguard Worker         }
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker         // special cases
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker         // non-scaled tall and skinny roundrect
190*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
191*c8dee2aaSAndroid Build Coastguard Worker             SkRect rect = SkRect::MakeLTRB(-20, -60, 20, 60);
192*c8dee2aaSAndroid Build Coastguard Worker             SkRRect ellipseRect;
193*c8dee2aaSAndroid Build Coastguard Worker             ellipseRect.setRectXY(rect, 5, 10);
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
196*c8dee2aaSAndroid Build Coastguard Worker             // position the roundrect, and make it at off-integer coords.
197*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
198*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
201*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
202*c8dee2aaSAndroid Build Coastguard Worker 
203*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(rect, rectPaint);
204*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(ellipseRect, fPaints[i]);
205*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
206*c8dee2aaSAndroid Build Coastguard Worker         }
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker         // non-scaled wide and short roundrect
209*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
210*c8dee2aaSAndroid Build Coastguard Worker             SkRect rect = SkRect::MakeLTRB(-80, -30, 80, 30);
211*c8dee2aaSAndroid Build Coastguard Worker             SkRRect ellipseRect;
212*c8dee2aaSAndroid Build Coastguard Worker             ellipseRect.setRectXY(rect, 20, 5);
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
215*c8dee2aaSAndroid Build Coastguard Worker             // position the roundrect, and make it at off-integer coords.
216*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
217*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
218*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
221*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(rect, rectPaint);
224*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(ellipseRect, fPaints[i]);
225*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
226*c8dee2aaSAndroid Build Coastguard Worker         }
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker         // super skinny roundrect
229*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
230*c8dee2aaSAndroid Build Coastguard Worker             SkRect rect = SkRect::MakeLTRB(0, -60, 1, 60);
231*c8dee2aaSAndroid Build Coastguard Worker             SkRRect circleRect;
232*c8dee2aaSAndroid Build Coastguard Worker             circleRect.setRectXY(rect, 5, 5);
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
235*c8dee2aaSAndroid Build Coastguard Worker             // position the roundrect, and make it at off-integer coords.
236*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
237*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
240*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(circleRect, fPaints[i]);
243*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
244*c8dee2aaSAndroid Build Coastguard Worker         }
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker         // super short roundrect
247*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
248*c8dee2aaSAndroid Build Coastguard Worker             SkRect rect = SkRect::MakeLTRB(-80, -1, 80, 0);
249*c8dee2aaSAndroid Build Coastguard Worker             SkRRect circleRect;
250*c8dee2aaSAndroid Build Coastguard Worker             circleRect.setRectXY(rect, 5, 5);
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
253*c8dee2aaSAndroid Build Coastguard Worker             // position the roundrect, and make it at off-integer coords.
254*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
255*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
256*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
257*c8dee2aaSAndroid Build Coastguard Worker 
258*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
259*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(circleRect, fPaints[i]);
262*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
263*c8dee2aaSAndroid Build Coastguard Worker         }
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker         // radial gradient
266*c8dee2aaSAndroid Build Coastguard Worker         SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
267*c8dee2aaSAndroid Build Coastguard Worker         SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
268*c8dee2aaSAndroid Build Coastguard Worker         SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
269*c8dee2aaSAndroid Build Coastguard Worker         auto shader = SkGradientShader::MakeRadial(center, 20, colors, pos, std::size(colors),
270*c8dee2aaSAndroid Build Coastguard Worker                                                    SkTileMode::kClamp);
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
273*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
274*c8dee2aaSAndroid Build Coastguard Worker             // position the path, and make it at off-integer coords.
275*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
276*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
277*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
278*c8dee2aaSAndroid Build Coastguard Worker 
279*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
280*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
281*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setShader(shader);
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(kRect, rectPaint);
284*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(circleRRect, fPaints[i]);
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setShader(nullptr);
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
289*c8dee2aaSAndroid Build Coastguard Worker         }
290*c8dee2aaSAndroid Build Coastguard Worker 
291*c8dee2aaSAndroid Build Coastguard Worker         // strokes and radii
292*c8dee2aaSAndroid Build Coastguard Worker         {
293*c8dee2aaSAndroid Build Coastguard Worker             SkScalar radii[][2] = {
294*c8dee2aaSAndroid Build Coastguard Worker                 {10,10},
295*c8dee2aaSAndroid Build Coastguard Worker                 {5,15},
296*c8dee2aaSAndroid Build Coastguard Worker                 {5,15},
297*c8dee2aaSAndroid Build Coastguard Worker                 {5,15}
298*c8dee2aaSAndroid Build Coastguard Worker             };
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker             SkScalar strokeWidths[] = {
301*c8dee2aaSAndroid Build Coastguard Worker                 20, 10, 20, 40
302*c8dee2aaSAndroid Build Coastguard Worker             };
303*c8dee2aaSAndroid Build Coastguard Worker 
304*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < 4; ++i) {
305*c8dee2aaSAndroid Build Coastguard Worker                 SkRRect circleRect;
306*c8dee2aaSAndroid Build Coastguard Worker                 circleRect.setRectXY(kRect, radii[i][0], radii[i][1]);
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker                 canvas->save();
309*c8dee2aaSAndroid Build Coastguard Worker                 // position the roundrect, and make it at off-integer coords.
310*c8dee2aaSAndroid Build Coastguard Worker                 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
311*c8dee2aaSAndroid Build Coastguard Worker                                   kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
312*c8dee2aaSAndroid Build Coastguard Worker                                   SK_ScalarHalf * kYStep);
313*c8dee2aaSAndroid Build Coastguard Worker 
314*c8dee2aaSAndroid Build Coastguard Worker                 SkColor color = gen_color(&rand);
315*c8dee2aaSAndroid Build Coastguard Worker 
316*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint p;
317*c8dee2aaSAndroid Build Coastguard Worker                 p.setAntiAlias(true);
318*c8dee2aaSAndroid Build Coastguard Worker                 p.setStyle(SkPaint::kStroke_Style);
319*c8dee2aaSAndroid Build Coastguard Worker                 p.setStrokeWidth(strokeWidths[i]);
320*c8dee2aaSAndroid Build Coastguard Worker                 p.setColor(color);
321*c8dee2aaSAndroid Build Coastguard Worker 
322*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRRect(circleRect, p);
323*c8dee2aaSAndroid Build Coastguard Worker                 canvas->restore();
324*c8dee2aaSAndroid Build Coastguard Worker             }
325*c8dee2aaSAndroid Build Coastguard Worker         }
326*c8dee2aaSAndroid Build Coastguard Worker 
327*c8dee2aaSAndroid Build Coastguard Worker         // test old entry point ( https://bug.skia.org/3786 )
328*c8dee2aaSAndroid Build Coastguard Worker         {
329*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
332*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * 4 + SK_Scalar1 / 4 +
333*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
334*c8dee2aaSAndroid Build Coastguard Worker 
335*c8dee2aaSAndroid Build Coastguard Worker             const SkColor color = gen_color(&rand);
336*c8dee2aaSAndroid Build Coastguard Worker 
337*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
338*c8dee2aaSAndroid Build Coastguard Worker             p.setColor(color);
339*c8dee2aaSAndroid Build Coastguard Worker 
340*c8dee2aaSAndroid Build Coastguard Worker             const SkRect oooRect = { 20, 30, -20, -30 };     // intentionally out of order
341*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRoundRect(oooRect, 10, 10, p);
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
344*c8dee2aaSAndroid Build Coastguard Worker         }
345*c8dee2aaSAndroid Build Coastguard Worker 
346*c8dee2aaSAndroid Build Coastguard Worker         // rrect with stroke > radius/2
347*c8dee2aaSAndroid Build Coastguard Worker         {
348*c8dee2aaSAndroid Build Coastguard Worker             SkRect smallRect = { -30, -20, 30, 20 };
349*c8dee2aaSAndroid Build Coastguard Worker             SkRRect circleRect;
350*c8dee2aaSAndroid Build Coastguard Worker             circleRect.setRectXY(smallRect, 5, 5);
351*c8dee2aaSAndroid Build Coastguard Worker 
352*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
353*c8dee2aaSAndroid Build Coastguard Worker             // position the roundrect, and make it at off-integer coords.
354*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
355*c8dee2aaSAndroid Build Coastguard Worker                               kYStart - SK_Scalar1 * kYStep + 73 * SK_Scalar1 / 4 +
356*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
357*c8dee2aaSAndroid Build Coastguard Worker 
358*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = gen_color(&rand);
359*c8dee2aaSAndroid Build Coastguard Worker 
360*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
361*c8dee2aaSAndroid Build Coastguard Worker             p.setAntiAlias(true);
362*c8dee2aaSAndroid Build Coastguard Worker             p.setStyle(SkPaint::kStroke_Style);
363*c8dee2aaSAndroid Build Coastguard Worker             p.setStrokeWidth(25);
364*c8dee2aaSAndroid Build Coastguard Worker             p.setColor(color);
365*c8dee2aaSAndroid Build Coastguard Worker 
366*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRRect(circleRect, p);
367*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
368*c8dee2aaSAndroid Build Coastguard Worker         }
369*c8dee2aaSAndroid Build Coastguard Worker     }
370*c8dee2aaSAndroid Build Coastguard Worker 
371*c8dee2aaSAndroid Build Coastguard Worker private:
372*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkPaint> fPaints;
373*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkMatrix> fMatrices;
374*c8dee2aaSAndroid Build Coastguard Worker 
375*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GM;
376*c8dee2aaSAndroid Build Coastguard Worker };
377*c8dee2aaSAndroid Build Coastguard Worker 
378*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
379*c8dee2aaSAndroid Build Coastguard Worker 
380*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new RoundRectGM; )
381*c8dee2aaSAndroid Build Coastguard Worker 
382*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiagm
383