xref: /aosp_15_r20/external/skia/gm/ovals.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/SkRect.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm {
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker class OvalGM : public GM {
31*c8dee2aaSAndroid Build Coastguard Worker public:
OvalGM()32*c8dee2aaSAndroid Build Coastguard Worker     OvalGM() {
33*c8dee2aaSAndroid Build Coastguard Worker         this->setBGColor(0xFF000000);
34*c8dee2aaSAndroid Build Coastguard Worker         this->makePaints();
35*c8dee2aaSAndroid Build Coastguard Worker         this->makeMatrices();
36*c8dee2aaSAndroid Build Coastguard Worker     }
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const39*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("ovals"); }
40*c8dee2aaSAndroid Build Coastguard Worker 
getISize()41*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(1200, 900); }
42*c8dee2aaSAndroid Build Coastguard Worker 
makePaints()43*c8dee2aaSAndroid Build Coastguard Worker     void makePaints() {
44*c8dee2aaSAndroid Build Coastguard Worker         {
45*c8dee2aaSAndroid Build Coastguard Worker         // no AA
46*c8dee2aaSAndroid Build Coastguard Worker         SkPaint p;
47*c8dee2aaSAndroid Build Coastguard Worker         fPaints.push_back(p);
48*c8dee2aaSAndroid Build Coastguard Worker         }
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker         {
51*c8dee2aaSAndroid Build Coastguard Worker         // AA
52*c8dee2aaSAndroid Build Coastguard Worker         SkPaint p;
53*c8dee2aaSAndroid Build Coastguard Worker         p.setAntiAlias(true);
54*c8dee2aaSAndroid Build Coastguard Worker         fPaints.push_back(p);
55*c8dee2aaSAndroid Build Coastguard Worker         }
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker         {
58*c8dee2aaSAndroid Build Coastguard Worker         // AA with stroke style
59*c8dee2aaSAndroid Build Coastguard Worker         SkPaint p;
60*c8dee2aaSAndroid Build Coastguard Worker         p.setAntiAlias(true);
61*c8dee2aaSAndroid Build Coastguard Worker         p.setStyle(SkPaint::kStroke_Style);
62*c8dee2aaSAndroid Build Coastguard Worker         p.setStrokeWidth(SkIntToScalar(5));
63*c8dee2aaSAndroid Build Coastguard Worker         fPaints.push_back(p);
64*c8dee2aaSAndroid Build Coastguard Worker         }
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker         {
67*c8dee2aaSAndroid Build Coastguard Worker         // AA with stroke style, width = 0
68*c8dee2aaSAndroid Build Coastguard Worker         SkPaint p;
69*c8dee2aaSAndroid Build Coastguard Worker         p.setAntiAlias(true);
70*c8dee2aaSAndroid Build Coastguard Worker         p.setStyle(SkPaint::kStroke_Style);
71*c8dee2aaSAndroid Build Coastguard Worker         fPaints.push_back(p);
72*c8dee2aaSAndroid Build Coastguard Worker         }
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker         {
75*c8dee2aaSAndroid Build Coastguard Worker         // AA with stroke and fill style
76*c8dee2aaSAndroid Build Coastguard Worker         SkPaint p;
77*c8dee2aaSAndroid Build Coastguard Worker         p.setAntiAlias(true);
78*c8dee2aaSAndroid Build Coastguard Worker         p.setStyle(SkPaint::kStrokeAndFill_Style);
79*c8dee2aaSAndroid Build Coastguard Worker         p.setStrokeWidth(SkIntToScalar(3));
80*c8dee2aaSAndroid Build Coastguard Worker         fPaints.push_back(p);
81*c8dee2aaSAndroid Build Coastguard Worker         }
82*c8dee2aaSAndroid Build Coastguard Worker     }
83*c8dee2aaSAndroid Build Coastguard Worker 
makeMatrices()84*c8dee2aaSAndroid Build Coastguard Worker     void makeMatrices() {
85*c8dee2aaSAndroid Build Coastguard Worker         {
86*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
87*c8dee2aaSAndroid Build Coastguard Worker         m.setIdentity();
88*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
89*c8dee2aaSAndroid Build Coastguard Worker         }
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker         {
92*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
93*c8dee2aaSAndroid Build Coastguard Worker         m.setScale(SkIntToScalar(3), SkIntToScalar(2));
94*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
95*c8dee2aaSAndroid Build Coastguard Worker         }
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker         {
98*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
99*c8dee2aaSAndroid Build Coastguard Worker         m.setScale(SkIntToScalar(2), SkIntToScalar(2));
100*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
101*c8dee2aaSAndroid Build Coastguard Worker         }
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker         {
104*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
105*c8dee2aaSAndroid Build Coastguard Worker         m.setScale(SkIntToScalar(1), SkIntToScalar(2));
106*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
107*c8dee2aaSAndroid Build Coastguard Worker         }
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker         {
110*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
111*c8dee2aaSAndroid Build Coastguard Worker         m.setScale(SkIntToScalar(4), SkIntToScalar(1));
112*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
113*c8dee2aaSAndroid Build Coastguard Worker         }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker         {
116*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
117*c8dee2aaSAndroid Build Coastguard Worker         m.setRotate(SkIntToScalar(90));
118*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
119*c8dee2aaSAndroid Build Coastguard Worker         }
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker         {
122*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
123*c8dee2aaSAndroid Build Coastguard Worker         m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
124*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
125*c8dee2aaSAndroid Build Coastguard Worker         }
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker         {
128*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix m;
129*c8dee2aaSAndroid Build Coastguard Worker         m.setRotate(SkIntToScalar(60));
130*c8dee2aaSAndroid Build Coastguard Worker         fMatrices.push_back(m);
131*c8dee2aaSAndroid Build Coastguard Worker         }
132*c8dee2aaSAndroid Build Coastguard Worker     }
133*c8dee2aaSAndroid Build Coastguard Worker 
genColor(SkRandom * rand)134*c8dee2aaSAndroid Build Coastguard Worker     SkColor genColor(SkRandom* rand) {
135*c8dee2aaSAndroid Build Coastguard Worker         SkScalar hsv[3];
136*c8dee2aaSAndroid Build Coastguard Worker         hsv[0] = rand->nextRangeF(0.0f, 360.0f);
137*c8dee2aaSAndroid Build Coastguard Worker         hsv[1] = rand->nextRangeF(0.75f, 1.0f);
138*c8dee2aaSAndroid Build Coastguard Worker         hsv[2] = rand->nextRangeF(0.75f, 1.0f);
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker         return ToolUtils::color_to_565(SkHSVToColor(hsv));
141*c8dee2aaSAndroid Build Coastguard Worker     }
142*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)143*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
144*c8dee2aaSAndroid Build Coastguard Worker         SkRandom rand(1);
145*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
146*c8dee2aaSAndroid Build Coastguard Worker         const SkRect kOval = SkRect::MakeLTRB(-20, -30, 20, 30);
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker         const SkScalar kXStart = 60.0f;
149*c8dee2aaSAndroid Build Coastguard Worker         const SkScalar kYStart = 80.0f;
150*c8dee2aaSAndroid Build Coastguard Worker         const int kXStep = 150;
151*c8dee2aaSAndroid Build Coastguard Worker         const int kYStep = 160;
152*c8dee2aaSAndroid Build Coastguard Worker         int maxX = fMatrices.size();
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker         SkPaint rectPaint;
155*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setAntiAlias(true);
156*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setStyle(SkPaint::kStroke_Style);
157*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setStrokeWidth(SkIntToScalar(0));
158*c8dee2aaSAndroid Build Coastguard Worker         rectPaint.setColor(SK_ColorLTGRAY);
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker         int testCount = 0;
161*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
162*c8dee2aaSAndroid Build Coastguard Worker             for (int j = 0; j < fMatrices.size(); ++j) {
163*c8dee2aaSAndroid Build Coastguard Worker                 canvas->save();
164*c8dee2aaSAndroid Build Coastguard Worker                 SkMatrix mat = fMatrices[j];
165*c8dee2aaSAndroid Build Coastguard Worker                 // position the oval, and make it at off-integer coords.
166*c8dee2aaSAndroid Build Coastguard Worker                 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
167*c8dee2aaSAndroid Build Coastguard Worker                                   SK_Scalar1 / 4,
168*c8dee2aaSAndroid Build Coastguard Worker                                   kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
169*c8dee2aaSAndroid Build Coastguard Worker                                   3 * SK_Scalar1 / 4);
170*c8dee2aaSAndroid Build Coastguard Worker                 canvas->concat(mat);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker                 SkColor color = genColor(&rand);
173*c8dee2aaSAndroid Build Coastguard Worker                 fPaints[i].setColor(color);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawRect(kOval, rectPaint);
176*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawOval(kOval, fPaints[i]);
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker                 canvas->restore();
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker                 ++testCount;
181*c8dee2aaSAndroid Build Coastguard Worker             }
182*c8dee2aaSAndroid Build Coastguard Worker         }
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker         // special cases
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker         // non-scaled tall and skinny oval
187*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
188*c8dee2aaSAndroid Build Coastguard Worker             SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60);
189*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
190*c8dee2aaSAndroid Build Coastguard Worker             // position the oval, and make it at off-integer coords.
191*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
192*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
195*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
196*c8dee2aaSAndroid Build Coastguard Worker 
197*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(oval, rectPaint);
198*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(oval, fPaints[i]);
199*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
200*c8dee2aaSAndroid Build Coastguard Worker         }
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker         // non-scaled wide and short oval
203*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
204*c8dee2aaSAndroid Build Coastguard Worker             SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30);
205*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
206*c8dee2aaSAndroid Build Coastguard Worker             // position the oval, and make it at off-integer coords.
207*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
208*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
209*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
212*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(oval, rectPaint);
215*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(oval, fPaints[i]);
216*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
217*c8dee2aaSAndroid Build Coastguard Worker         }
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker         // super skinny oval
220*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
221*c8dee2aaSAndroid Build Coastguard Worker             SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60);
222*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
223*c8dee2aaSAndroid Build Coastguard Worker             // position the oval, and make it at off-integer coords.
224*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
225*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
228*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(oval, fPaints[i]);
231*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
232*c8dee2aaSAndroid Build Coastguard Worker         }
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker         // super short oval
235*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
236*c8dee2aaSAndroid Build Coastguard Worker             SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0);
237*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
238*c8dee2aaSAndroid Build Coastguard Worker             // position the oval, and make it at off-integer coords.
239*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
240*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
241*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
242*c8dee2aaSAndroid Build Coastguard Worker 
243*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
244*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(oval, fPaints[i]);
247*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
248*c8dee2aaSAndroid Build Coastguard Worker         }
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker         // radial gradient
251*c8dee2aaSAndroid Build Coastguard Worker         SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
252*c8dee2aaSAndroid Build Coastguard Worker         SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
253*c8dee2aaSAndroid Build Coastguard Worker         SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
254*c8dee2aaSAndroid Build Coastguard Worker         auto shader = SkGradientShader::MakeRadial(center, 20, colors, pos, std::size(colors),
255*c8dee2aaSAndroid Build Coastguard Worker                                                    SkTileMode::kClamp);
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
258*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
259*c8dee2aaSAndroid Build Coastguard Worker             // position the path, and make it at off-integer coords.
260*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
261*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
262*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
265*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
266*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setShader(shader);
267*c8dee2aaSAndroid Build Coastguard Worker 
268*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(kOval, rectPaint);
269*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(kOval, fPaints[i]);
270*c8dee2aaSAndroid Build Coastguard Worker 
271*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setShader(nullptr);
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
274*c8dee2aaSAndroid Build Coastguard Worker         }
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker         // reflected oval
277*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < fPaints.size(); ++i) {
278*c8dee2aaSAndroid Build Coastguard Worker             SkRect oval = SkRect::MakeLTRB(-30, -30, 30, 30);
279*c8dee2aaSAndroid Build Coastguard Worker             canvas->save();
280*c8dee2aaSAndroid Build Coastguard Worker             // position the oval, and make it at off-integer coords.
281*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
282*c8dee2aaSAndroid Build Coastguard Worker                               kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
283*c8dee2aaSAndroid Build Coastguard Worker                               SK_ScalarHalf * kYStep);
284*c8dee2aaSAndroid Build Coastguard Worker             canvas->rotate(90);
285*c8dee2aaSAndroid Build Coastguard Worker             canvas->scale(1, -1);
286*c8dee2aaSAndroid Build Coastguard Worker             canvas->scale(1, 0.66f);
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker             SkColor color = genColor(&rand);
289*c8dee2aaSAndroid Build Coastguard Worker             fPaints[i].setColor(color);
290*c8dee2aaSAndroid Build Coastguard Worker 
291*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(oval, rectPaint);
292*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawOval(oval, fPaints[i]);
293*c8dee2aaSAndroid Build Coastguard Worker             canvas->restore();
294*c8dee2aaSAndroid Build Coastguard Worker         }
295*c8dee2aaSAndroid Build Coastguard Worker     }
296*c8dee2aaSAndroid Build Coastguard Worker 
297*c8dee2aaSAndroid Build Coastguard Worker private:
298*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkPaint> fPaints;
299*c8dee2aaSAndroid Build Coastguard Worker     TArray<SkMatrix> fMatrices;
300*c8dee2aaSAndroid Build Coastguard Worker 
301*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GM;
302*c8dee2aaSAndroid Build Coastguard Worker };
303*c8dee2aaSAndroid Build Coastguard Worker 
304*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
305*c8dee2aaSAndroid Build Coastguard Worker 
306*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new OvalGM; )
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiagm
309