xref: /aosp_15_r20/external/skia/gm/pathfill.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2011 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/SkPaint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathBuilder.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathUtils.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/SkSize.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker namespace {
22*c8dee2aaSAndroid Build Coastguard Worker struct PathDY {
23*c8dee2aaSAndroid Build Coastguard Worker     SkPath   path;
24*c8dee2aaSAndroid Build Coastguard Worker     SkScalar dy;
25*c8dee2aaSAndroid Build Coastguard Worker };
26*c8dee2aaSAndroid Build Coastguard Worker }
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker typedef PathDY (*MakePathProc)();
29*c8dee2aaSAndroid Build Coastguard Worker 
make_frame()30*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_frame() {
31*c8dee2aaSAndroid Build Coastguard Worker     SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
32*c8dee2aaSAndroid Build Coastguard Worker                  SkIntToScalar(630), SkIntToScalar(470) };
33*c8dee2aaSAndroid Build Coastguard Worker     SkPath path = SkPath::RRect(SkRRect::MakeRectXY(r, 15, 15));
34*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
35*c8dee2aaSAndroid Build Coastguard Worker     paint.setStyle(SkPaint::kStroke_Style);
36*c8dee2aaSAndroid Build Coastguard Worker     paint.setStrokeWidth(SkIntToScalar(5));
37*c8dee2aaSAndroid Build Coastguard Worker     skpathutils::FillPathWithPaint(path, paint, &path);
38*c8dee2aaSAndroid Build Coastguard Worker     return {path, 15};
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker 
make_triangle()41*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_triangle() {
42*c8dee2aaSAndroid Build Coastguard Worker     constexpr int gCoord[] = {
43*c8dee2aaSAndroid Build Coastguard Worker         10, 20, 15, 5, 30, 30
44*c8dee2aaSAndroid Build Coastguard Worker     };
45*c8dee2aaSAndroid Build Coastguard Worker     return {
46*c8dee2aaSAndroid Build Coastguard Worker         SkPathBuilder().moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]))
47*c8dee2aaSAndroid Build Coastguard Worker                        .lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]))
48*c8dee2aaSAndroid Build Coastguard Worker                        .lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]))
49*c8dee2aaSAndroid Build Coastguard Worker                        .close()
50*c8dee2aaSAndroid Build Coastguard Worker                        .offset(10, 0)
51*c8dee2aaSAndroid Build Coastguard Worker                        .detach(),
52*c8dee2aaSAndroid Build Coastguard Worker         30
53*c8dee2aaSAndroid Build Coastguard Worker     };
54*c8dee2aaSAndroid Build Coastguard Worker }
55*c8dee2aaSAndroid Build Coastguard Worker 
make_rect()56*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_rect() {
57*c8dee2aaSAndroid Build Coastguard Worker     SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
58*c8dee2aaSAndroid Build Coastguard Worker                  SkIntToScalar(30), SkIntToScalar(30) };
59*c8dee2aaSAndroid Build Coastguard Worker     return {
60*c8dee2aaSAndroid Build Coastguard Worker         SkPathBuilder().addRect(r).offset(10, 0).detach(),
61*c8dee2aaSAndroid Build Coastguard Worker         30
62*c8dee2aaSAndroid Build Coastguard Worker     };
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker 
make_oval()65*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_oval() {
66*c8dee2aaSAndroid Build Coastguard Worker     SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
67*c8dee2aaSAndroid Build Coastguard Worker                  SkIntToScalar(30), SkIntToScalar(30) };
68*c8dee2aaSAndroid Build Coastguard Worker     return {
69*c8dee2aaSAndroid Build Coastguard Worker         SkPathBuilder().addOval(r).offset(10, 0).detach(),
70*c8dee2aaSAndroid Build Coastguard Worker         30
71*c8dee2aaSAndroid Build Coastguard Worker     };
72*c8dee2aaSAndroid Build Coastguard Worker }
73*c8dee2aaSAndroid Build Coastguard Worker 
make_sawtooth(int teeth)74*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_sawtooth(int teeth) {
75*c8dee2aaSAndroid Build Coastguard Worker     SkScalar x = SkIntToScalar(20);
76*c8dee2aaSAndroid Build Coastguard Worker     SkScalar y = SkIntToScalar(20);
77*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar x0 = x;
78*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar dx = SkIntToScalar(5);
79*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar dy = SkIntToScalar(10);
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder builder;
82*c8dee2aaSAndroid Build Coastguard Worker     builder.moveTo(x, y);
83*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < teeth; i++) {
84*c8dee2aaSAndroid Build Coastguard Worker         x += dx;
85*c8dee2aaSAndroid Build Coastguard Worker         builder.lineTo(x, y - dy);
86*c8dee2aaSAndroid Build Coastguard Worker         x += dx;
87*c8dee2aaSAndroid Build Coastguard Worker         builder.lineTo(x, y + dy);
88*c8dee2aaSAndroid Build Coastguard Worker     }
89*c8dee2aaSAndroid Build Coastguard Worker     builder.lineTo(x, y + (2 * dy));
90*c8dee2aaSAndroid Build Coastguard Worker     builder.lineTo(x0, y + (2 * dy));
91*c8dee2aaSAndroid Build Coastguard Worker     builder.close();
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     return {builder.detach(), 30};
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker 
make_sawtooth_3()96*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_sawtooth_3() { return make_sawtooth(3); }
make_sawtooth_32()97*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_sawtooth_32() { return make_sawtooth(32); }
98*c8dee2aaSAndroid Build Coastguard Worker 
make_house()99*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_house() {
100*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder builder;
101*c8dee2aaSAndroid Build Coastguard Worker     builder.addPolygon({
102*c8dee2aaSAndroid Build Coastguard Worker             {21, 23},
103*c8dee2aaSAndroid Build Coastguard Worker             {21, 11.534f},
104*c8dee2aaSAndroid Build Coastguard Worker             {22.327f, 12.741f},
105*c8dee2aaSAndroid Build Coastguard Worker             {23.673f, 11.261f},
106*c8dee2aaSAndroid Build Coastguard Worker             {12, 0.648f},
107*c8dee2aaSAndroid Build Coastguard Worker             {8, 4.285f},
108*c8dee2aaSAndroid Build Coastguard Worker             {8, 2},
109*c8dee2aaSAndroid Build Coastguard Worker             {4, 2},
110*c8dee2aaSAndroid Build Coastguard Worker             {4, 7.921f},
111*c8dee2aaSAndroid Build Coastguard Worker             {0.327f, 11.26f},
112*c8dee2aaSAndroid Build Coastguard Worker             {1.673f, 12.74f},
113*c8dee2aaSAndroid Build Coastguard Worker             {3, 11.534f},
114*c8dee2aaSAndroid Build Coastguard Worker             {3, 23},
115*c8dee2aaSAndroid Build Coastguard Worker             {11, 23},
116*c8dee2aaSAndroid Build Coastguard Worker             {11, 18},
117*c8dee2aaSAndroid Build Coastguard Worker             {13, 18},
118*c8dee2aaSAndroid Build Coastguard Worker             {13, 23},
119*c8dee2aaSAndroid Build Coastguard Worker             {21, 23}}, true)
120*c8dee2aaSAndroid Build Coastguard Worker         .polylineTo({
121*c8dee2aaSAndroid Build Coastguard Worker             {9, 16},
122*c8dee2aaSAndroid Build Coastguard Worker             {9, 21},
123*c8dee2aaSAndroid Build Coastguard Worker             {5, 21},
124*c8dee2aaSAndroid Build Coastguard Worker             {5, 9.715f},
125*c8dee2aaSAndroid Build Coastguard Worker             {12, 3.351f},
126*c8dee2aaSAndroid Build Coastguard Worker             {19, 9.715f},
127*c8dee2aaSAndroid Build Coastguard Worker             {19, 21},
128*c8dee2aaSAndroid Build Coastguard Worker             {15, 21},
129*c8dee2aaSAndroid Build Coastguard Worker             {15, 16},
130*c8dee2aaSAndroid Build Coastguard Worker             {9, 16}})
131*c8dee2aaSAndroid Build Coastguard Worker         .close()
132*c8dee2aaSAndroid Build Coastguard Worker         .offset(20, 0);
133*c8dee2aaSAndroid Build Coastguard Worker     return {builder.detach(), 30};
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker 
make_star(int n)136*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_star(int n) {
137*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar c = SkIntToScalar(45);
138*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar r = SkIntToScalar(20);
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     SkScalar rad = -SK_ScalarPI / 2;
141*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder builder;
144*c8dee2aaSAndroid Build Coastguard Worker     builder.moveTo(c, c - r);
145*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 1; i < n; i++) {
146*c8dee2aaSAndroid Build Coastguard Worker         rad += drad;
147*c8dee2aaSAndroid Build Coastguard Worker         builder.lineTo(c + SkScalarCos(rad) * r, c + SkScalarSin(rad) * r);
148*c8dee2aaSAndroid Build Coastguard Worker     }
149*c8dee2aaSAndroid Build Coastguard Worker     builder.close();
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker     return {builder.detach(), r * 2 * 6 / 5};
152*c8dee2aaSAndroid Build Coastguard Worker }
153*c8dee2aaSAndroid Build Coastguard Worker 
make_star_5()154*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_star_5()  { return make_star(5); }
make_star_13()155*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_star_13() { return make_star(13); }
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker // We don't expect any output from this path.
make_line()158*c8dee2aaSAndroid Build Coastguard Worker static PathDY make_line() {
159*c8dee2aaSAndroid Build Coastguard Worker     return {
160*c8dee2aaSAndroid Build Coastguard Worker         SkPathBuilder().moveTo(30, 30)
161*c8dee2aaSAndroid Build Coastguard Worker                        .lineTo(120, 40)
162*c8dee2aaSAndroid Build Coastguard Worker                        .close()
163*c8dee2aaSAndroid Build Coastguard Worker                        .moveTo(150, 30)
164*c8dee2aaSAndroid Build Coastguard Worker                        .lineTo(150, 30)
165*c8dee2aaSAndroid Build Coastguard Worker                        .lineTo(300, 40)
166*c8dee2aaSAndroid Build Coastguard Worker                        .close()
167*c8dee2aaSAndroid Build Coastguard Worker                        .detach(),
168*c8dee2aaSAndroid Build Coastguard Worker         40
169*c8dee2aaSAndroid Build Coastguard Worker     };
170*c8dee2aaSAndroid Build Coastguard Worker }
171*c8dee2aaSAndroid Build Coastguard Worker 
make_info()172*c8dee2aaSAndroid Build Coastguard Worker static SkPath make_info() {
173*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder path;
174*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(24, 4);
175*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(12.94999980926514f, 4,
176*c8dee2aaSAndroid Build Coastguard Worker                  4, 12.94999980926514f,
177*c8dee2aaSAndroid Build Coastguard Worker                  4, 24);
178*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(4, 35.04999923706055f,
179*c8dee2aaSAndroid Build Coastguard Worker                  12.94999980926514f, 44,
180*c8dee2aaSAndroid Build Coastguard Worker                  24, 44);
181*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(35.04999923706055f, 44,
182*c8dee2aaSAndroid Build Coastguard Worker                  44, 35.04999923706055f,
183*c8dee2aaSAndroid Build Coastguard Worker                  44, 24);
184*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(44, 12.95000076293945f,
185*c8dee2aaSAndroid Build Coastguard Worker                  35.04999923706055f, 4,
186*c8dee2aaSAndroid Build Coastguard Worker                  24, 4);
187*c8dee2aaSAndroid Build Coastguard Worker     path.close();
188*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(26, 34);
189*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(22, 34);
190*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(22, 22);
191*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(26, 22);
192*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(26, 34);
193*c8dee2aaSAndroid Build Coastguard Worker     path.close();
194*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(26, 18);
195*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(22, 18);
196*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(22, 14);
197*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(26, 14);
198*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(26, 18);
199*c8dee2aaSAndroid Build Coastguard Worker     path.close();
200*c8dee2aaSAndroid Build Coastguard Worker     return path.detach();
201*c8dee2aaSAndroid Build Coastguard Worker }
202*c8dee2aaSAndroid Build Coastguard Worker 
make_accessibility()203*c8dee2aaSAndroid Build Coastguard Worker static SkPath make_accessibility() {
204*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder path;
205*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(12, 2);
206*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(13.10000038146973f, 2,
207*c8dee2aaSAndroid Build Coastguard Worker                  14, 2.900000095367432f,
208*c8dee2aaSAndroid Build Coastguard Worker                  14, 4);
209*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(14, 5.099999904632568f,
210*c8dee2aaSAndroid Build Coastguard Worker                  13.10000038146973f, 6,
211*c8dee2aaSAndroid Build Coastguard Worker                  12, 6);
212*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(10.89999961853027f, 6,
213*c8dee2aaSAndroid Build Coastguard Worker                  10, 5.099999904632568f,
214*c8dee2aaSAndroid Build Coastguard Worker                  10, 4);
215*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(10, 2.900000095367432f,
216*c8dee2aaSAndroid Build Coastguard Worker                  10.89999961853027f, 2,
217*c8dee2aaSAndroid Build Coastguard Worker                  12, 2);
218*c8dee2aaSAndroid Build Coastguard Worker     path.close();
219*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(21, 9);
220*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(15, 9);
221*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(15, 22);
222*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(13, 22);
223*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(13, 16);
224*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(11, 16);
225*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(11, 22);
226*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(9, 22);
227*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(9, 9);
228*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(3, 9);
229*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(3, 7);
230*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(21, 7);
231*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(21, 9);
232*c8dee2aaSAndroid Build Coastguard Worker     path.close();
233*c8dee2aaSAndroid Build Coastguard Worker     return path.detach();
234*c8dee2aaSAndroid Build Coastguard Worker }
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker // test case for http://crbug.com/695196
make_visualizer()237*c8dee2aaSAndroid Build Coastguard Worker static SkPath make_visualizer() {
238*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder path;
239*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(1.9520f, 2.0000f);
240*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(1.5573f, 1.9992f, 1.2782f, 2.2782f, 0.9235f);
241*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(0.9992f, 2.5573f, 1.0000f, 2.9520f, 0.9235f);
242*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(1.0000f, 5.4300f);
243*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(17.0000f, 5.4300f);
244*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(17.0000f, 2.9520f);
245*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(17.0008f, 2.5573f, 16.7218f, 2.2782f, 0.9235f);
246*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(16.4427f, 1.9992f, 16.0480f, 2.0000f, 0.9235f);
247*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(1.9520f, 2.0000f);
248*c8dee2aaSAndroid Build Coastguard Worker     path.close();
249*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(2.7140f, 3.1430f);
250*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(3.0547f, 3.1287f, 3.2292f, 3.4216f, 0.8590f);
251*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(3.4038f, 3.7145f, 3.2292f, 4.0074f, 0.8590f);
252*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(3.0547f, 4.3003f, 2.7140f, 4.2860f, 0.8590f);
253*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(2.1659f, 4.2631f, 2.1659f, 3.7145f, 0.7217f);
254*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(2.1659f, 3.1659f, 2.7140f, 3.1430f, 0.7217f);
255*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(2.7140f, 3.1430f);
256*c8dee2aaSAndroid Build Coastguard Worker     path.close();
257*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(5.0000f, 3.1430f);
258*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(5.3407f, 3.1287f, 5.5152f, 3.4216f, 0.8590f);
259*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(5.6898f, 3.7145f, 5.5152f, 4.0074f, 0.8590f);
260*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(5.3407f, 4.3003f, 5.0000f, 4.2860f, 0.8590f);
261*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(4.4519f, 4.2631f, 4.4519f, 3.7145f, 0.7217f);
262*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(4.4519f, 3.1659f, 5.0000f, 3.1430f, 0.7217f);
263*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(5.0000f, 3.1430f);
264*c8dee2aaSAndroid Build Coastguard Worker     path.close();
265*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(7.2860f, 3.1430f);
266*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(7.6267f, 3.1287f, 7.8012f, 3.4216f, 0.8590f);
267*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(7.9758f, 3.7145f, 7.8012f, 4.0074f, 0.8590f);
268*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(7.6267f, 4.3003f, 7.2860f, 4.2860f, 0.8590f);
269*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(6.7379f, 4.2631f, 6.7379f, 3.7145f, 0.7217f);
270*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(6.7379f, 3.1659f, 7.2860f, 3.1430f, 0.7217f);
271*c8dee2aaSAndroid Build Coastguard Worker     path.close();
272*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(1.0000f, 6.1900f);
273*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(1.0000f, 14.3810f);
274*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(0.9992f, 14.7757f, 1.2782f, 15.0548f, 0.9235f);
275*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(1.5573f, 15.3338f, 1.9520f, 15.3330f, 0.9235f);
276*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(16.0480f, 15.3330f);
277*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(16.4427f, 15.3338f, 16.7218f, 15.0548f, 0.9235f);
278*c8dee2aaSAndroid Build Coastguard Worker     path.conicTo(17.0008f, 14.7757f, 17.0000f, 14.3810f, 0.9235f);
279*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(17.0000f, 6.1910f);
280*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(1.0000f, 6.1910f);
281*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(1.0000f, 6.1900f);
282*c8dee2aaSAndroid Build Coastguard Worker     path.close();
283*c8dee2aaSAndroid Build Coastguard Worker     return path.detach();
284*c8dee2aaSAndroid Build Coastguard Worker }
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker constexpr MakePathProc gProcs[] = {
287*c8dee2aaSAndroid Build Coastguard Worker     make_frame,
288*c8dee2aaSAndroid Build Coastguard Worker     make_triangle,
289*c8dee2aaSAndroid Build Coastguard Worker     make_rect,
290*c8dee2aaSAndroid Build Coastguard Worker     make_oval,
291*c8dee2aaSAndroid Build Coastguard Worker     make_sawtooth_32,
292*c8dee2aaSAndroid Build Coastguard Worker     make_star_5,
293*c8dee2aaSAndroid Build Coastguard Worker     make_star_13,
294*c8dee2aaSAndroid Build Coastguard Worker     make_line,
295*c8dee2aaSAndroid Build Coastguard Worker     make_house,
296*c8dee2aaSAndroid Build Coastguard Worker     make_sawtooth_3,
297*c8dee2aaSAndroid Build Coastguard Worker };
298*c8dee2aaSAndroid Build Coastguard Worker 
299*c8dee2aaSAndroid Build Coastguard Worker #define N   std::size(gProcs)
300*c8dee2aaSAndroid Build Coastguard Worker 
301*c8dee2aaSAndroid Build Coastguard Worker class PathFillGM : public skiagm::GM {
302*c8dee2aaSAndroid Build Coastguard Worker     SkPath  fPath[N];
303*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fDY[N];
304*c8dee2aaSAndroid Build Coastguard Worker     SkPath  fInfoPath;
305*c8dee2aaSAndroid Build Coastguard Worker     SkPath  fAccessibilityPath;
306*c8dee2aaSAndroid Build Coastguard Worker     SkPath  fVisualizerPath;
307*c8dee2aaSAndroid Build Coastguard Worker protected:
onOnceBeforeDraw()308*c8dee2aaSAndroid Build Coastguard Worker     void onOnceBeforeDraw() override {
309*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < N; i++) {
310*c8dee2aaSAndroid Build Coastguard Worker             auto [path, dy] = gProcs[i]();
311*c8dee2aaSAndroid Build Coastguard Worker             fPath[i] = path;
312*c8dee2aaSAndroid Build Coastguard Worker             fDY[i] = dy;
313*c8dee2aaSAndroid Build Coastguard Worker         }
314*c8dee2aaSAndroid Build Coastguard Worker 
315*c8dee2aaSAndroid Build Coastguard Worker         fInfoPath = make_info();
316*c8dee2aaSAndroid Build Coastguard Worker         fAccessibilityPath = make_accessibility();
317*c8dee2aaSAndroid Build Coastguard Worker         fVisualizerPath = make_visualizer();
318*c8dee2aaSAndroid Build Coastguard Worker     }
319*c8dee2aaSAndroid Build Coastguard Worker 
getName() const320*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("pathfill"); }
321*c8dee2aaSAndroid Build Coastguard Worker 
getISize()322*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(640, 480); }
323*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)324*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
325*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
326*c8dee2aaSAndroid Build Coastguard Worker         paint.setAntiAlias(true);
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < N; i++) {
329*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawPath(fPath[i], paint);
330*c8dee2aaSAndroid Build Coastguard Worker             canvas->translate(SkIntToScalar(0), fDY[i]);
331*c8dee2aaSAndroid Build Coastguard Worker         }
332*c8dee2aaSAndroid Build Coastguard Worker 
333*c8dee2aaSAndroid Build Coastguard Worker         canvas->save();
334*c8dee2aaSAndroid Build Coastguard Worker         canvas->scale(0.300000011920929f, 0.300000011920929f);
335*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(50, 50);
336*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(fInfoPath, paint);
337*c8dee2aaSAndroid Build Coastguard Worker         canvas->restore();
338*c8dee2aaSAndroid Build Coastguard Worker 
339*c8dee2aaSAndroid Build Coastguard Worker         canvas->scale(2, 2);
340*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(5, 15);
341*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(fAccessibilityPath, paint);
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker         canvas->scale(0.5f, 0.5f);
344*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(5, 50);
345*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(fVisualizerPath, paint);
346*c8dee2aaSAndroid Build Coastguard Worker     }
347*c8dee2aaSAndroid Build Coastguard Worker 
348*c8dee2aaSAndroid Build Coastguard Worker private:
349*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = skiagm::GM;
350*c8dee2aaSAndroid Build Coastguard Worker };
351*c8dee2aaSAndroid Build Coastguard Worker 
352*c8dee2aaSAndroid Build Coastguard Worker // test inverse-fill w/ a clip that completely excludes the geometry
353*c8dee2aaSAndroid Build Coastguard Worker class PathInverseFillGM : public skiagm::GM {
354*c8dee2aaSAndroid Build Coastguard Worker     SkPath  fPath[N];
355*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fDY[N];
356*c8dee2aaSAndroid Build Coastguard Worker protected:
onOnceBeforeDraw()357*c8dee2aaSAndroid Build Coastguard Worker     void onOnceBeforeDraw() override {
358*c8dee2aaSAndroid Build Coastguard Worker         for (size_t i = 0; i < N; i++) {
359*c8dee2aaSAndroid Build Coastguard Worker             auto [path, dy] = gProcs[i]();
360*c8dee2aaSAndroid Build Coastguard Worker             fPath[i] = path;
361*c8dee2aaSAndroid Build Coastguard Worker             fDY[i] = dy;
362*c8dee2aaSAndroid Build Coastguard Worker         }
363*c8dee2aaSAndroid Build Coastguard Worker     }
364*c8dee2aaSAndroid Build Coastguard Worker 
getName() const365*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("pathinvfill"); }
366*c8dee2aaSAndroid Build Coastguard Worker 
getISize()367*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(450, 220); }
368*c8dee2aaSAndroid Build Coastguard Worker 
show(SkCanvas * canvas,const SkPath & path,const SkPaint & paint,const SkRect * clip,SkScalar top,const SkScalar bottom)369*c8dee2aaSAndroid Build Coastguard Worker     static void show(SkCanvas* canvas, const SkPath& path, const SkPaint& paint,
370*c8dee2aaSAndroid Build Coastguard Worker                      const SkRect* clip, SkScalar top, const SkScalar bottom) {
371*c8dee2aaSAndroid Build Coastguard Worker         canvas->save();
372*c8dee2aaSAndroid Build Coastguard Worker         if (clip) {
373*c8dee2aaSAndroid Build Coastguard Worker             SkRect r = *clip;
374*c8dee2aaSAndroid Build Coastguard Worker             r.fTop = top;
375*c8dee2aaSAndroid Build Coastguard Worker             r.fBottom = bottom;
376*c8dee2aaSAndroid Build Coastguard Worker             canvas->clipRect(r);
377*c8dee2aaSAndroid Build Coastguard Worker         }
378*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(path, paint);
379*c8dee2aaSAndroid Build Coastguard Worker         canvas->restore();
380*c8dee2aaSAndroid Build Coastguard Worker     }
381*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)382*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
383*c8dee2aaSAndroid Build Coastguard Worker         SkPath path = SkPathBuilder().addCircle(50, 50, 40)
384*c8dee2aaSAndroid Build Coastguard Worker                                      .toggleInverseFillType()
385*c8dee2aaSAndroid Build Coastguard Worker                                      .detach();
386*c8dee2aaSAndroid Build Coastguard Worker 
387*c8dee2aaSAndroid Build Coastguard Worker         SkRect clipR = {0, 0, 100, 200};
388*c8dee2aaSAndroid Build Coastguard Worker 
389*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(10, 10);
390*c8dee2aaSAndroid Build Coastguard Worker 
391*c8dee2aaSAndroid Build Coastguard Worker         for (int doclip = 0; doclip <= 1; ++doclip) {
392*c8dee2aaSAndroid Build Coastguard Worker             for (int aa = 0; aa <= 1; ++aa) {
393*c8dee2aaSAndroid Build Coastguard Worker                 SkPaint paint;
394*c8dee2aaSAndroid Build Coastguard Worker                 paint.setAntiAlias(SkToBool(aa));
395*c8dee2aaSAndroid Build Coastguard Worker 
396*c8dee2aaSAndroid Build Coastguard Worker                 canvas->save();
397*c8dee2aaSAndroid Build Coastguard Worker                 canvas->clipRect(clipR);
398*c8dee2aaSAndroid Build Coastguard Worker 
399*c8dee2aaSAndroid Build Coastguard Worker                 const SkRect* clipPtr = doclip ? &clipR : nullptr;
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker                 show(canvas, path, paint, clipPtr, clipR.fTop, clipR.centerY());
402*c8dee2aaSAndroid Build Coastguard Worker                 show(canvas, path, paint, clipPtr, clipR.centerY(), clipR.fBottom);
403*c8dee2aaSAndroid Build Coastguard Worker 
404*c8dee2aaSAndroid Build Coastguard Worker                 canvas->restore();
405*c8dee2aaSAndroid Build Coastguard Worker                 canvas->translate(SkIntToScalar(110), 0);
406*c8dee2aaSAndroid Build Coastguard Worker             }
407*c8dee2aaSAndroid Build Coastguard Worker         }
408*c8dee2aaSAndroid Build Coastguard Worker     }
409*c8dee2aaSAndroid Build Coastguard Worker 
410*c8dee2aaSAndroid Build Coastguard Worker private:
411*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = skiagm::GM;
412*c8dee2aaSAndroid Build Coastguard Worker };
413*c8dee2aaSAndroid Build Coastguard Worker 
414*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(rotatedcubicpath, canvas, 200, 200) {
415*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
416*c8dee2aaSAndroid Build Coastguard Worker     p.setAntiAlias(true);
417*c8dee2aaSAndroid Build Coastguard Worker     p.setStyle(SkPaint::kFill_Style);
418*c8dee2aaSAndroid Build Coastguard Worker 
419*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(50, 50);
420*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
421*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(48,-23);
422*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(48,-29.5, 6,-30, 6,-30);
423*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(6,-30, 2,0, 2,0);
424*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(2,0, 44,-21.5, 48,-23);
425*c8dee2aaSAndroid Build Coastguard Worker     path.close();
426*c8dee2aaSAndroid Build Coastguard Worker 
427*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(SK_ColorBLUE);
428*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
429*c8dee2aaSAndroid Build Coastguard Worker 
430*c8dee2aaSAndroid Build Coastguard Worker     // Rotated path, which is not antialiased on GPU
431*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(SK_ColorRED);
432*c8dee2aaSAndroid Build Coastguard Worker     canvas->rotate(90);
433*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
434*c8dee2aaSAndroid Build Coastguard Worker }
435*c8dee2aaSAndroid Build Coastguard Worker 
436*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
437*c8dee2aaSAndroid Build Coastguard Worker 
438*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new PathFillGM; )
DEF_GM(return new PathInverseFillGM;)439*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new PathInverseFillGM; )
440*c8dee2aaSAndroid Build Coastguard Worker 
441*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(bug7792, canvas, 800, 800) {
442*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792 bug description
443*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
444*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
445*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(10, 10);
446*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
447*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
448*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
449*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
450*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
451*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c3
452*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
453*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
454*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 50);
455*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(100, 75);
456*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
457*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
458*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
459*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 50);
460*c8dee2aaSAndroid Build Coastguard Worker     path.close();
461*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
462*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c9
463*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
464*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
465*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(10, 10);
466*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
467*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
468*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
469*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
470*c8dee2aaSAndroid Build Coastguard Worker     path.close();
471*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
472*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c11
473*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(-200 * 2, 200);
474*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
475*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 150);
476*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
477*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
478*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
479*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
480*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 150);
481*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
482*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c14
483*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
484*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
485*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(250, 75);
486*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(250, 75);
487*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(250, 75);
488*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(100, 75);
489*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
490*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
491*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
492*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
493*c8dee2aaSAndroid Build Coastguard Worker     path.close();
494*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(0, 0);
495*c8dee2aaSAndroid Build Coastguard Worker     path.close();
496*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
497*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c15
498*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
499*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
500*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
501*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
502*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
503*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
504*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(250, 75);
505*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
506*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c17
507*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(-200 * 2, 200);
508*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
509*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 10);
510*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
511*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
512*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
513*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
514*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 10);
515*c8dee2aaSAndroid Build Coastguard Worker     path.close();
516*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
517*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c19
518*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
519*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
520*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
521*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
522*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
523*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
524*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
525*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
526*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
527*c8dee2aaSAndroid Build Coastguard Worker     path.close();
528*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(10, 10);
529*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(30, 10);
530*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(10, 30);
531*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
532*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c23
533*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
534*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
535*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
536*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
537*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
538*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
539*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
540*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
541*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
542*c8dee2aaSAndroid Build Coastguard Worker     path.close();
543*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
544*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c29
545*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(-200 * 2, 200);
546*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
547*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
548*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
549*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
550*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
551*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 250);
552*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
553*c8dee2aaSAndroid Build Coastguard Worker     path.close();
554*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
555*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c31
556*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
557*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
558*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
559*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
560*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
561*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
562*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 10);
563*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
564*c8dee2aaSAndroid Build Coastguard Worker     path.close();
565*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
566*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c36
567*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, 0);
568*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
569*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
570*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
571*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
572*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(10, 150);
573*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
574*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
575*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
576*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c39
577*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(200, -200 * 3);
578*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
579*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(150, 75);
580*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
581*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
582*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 100);
583*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
584*c8dee2aaSAndroid Build Coastguard Worker     // from zero_length_paths_aa
585*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(0, 200);
586*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
587*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(150, 100);
588*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 100);
589*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
590*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 150);
591*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 100);
592*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(75, 75);
593*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
594*c8dee2aaSAndroid Build Coastguard Worker     path.close();
595*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
596*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c41
597*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(0, 200);
598*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
599*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
600*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
601*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
602*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(140, 150);
603*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(140, 75);
604*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
605*c8dee2aaSAndroid Build Coastguard Worker     path.close();
606*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
607*c8dee2aaSAndroid Build Coastguard Worker     // from skbug.com/7792#c53
608*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(0, 200);
609*c8dee2aaSAndroid Build Coastguard Worker     path.reset();
610*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
611*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 75);
612*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(150, 150);
613*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(140, 150);
614*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(140, 75);
615*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(75, 75);
616*c8dee2aaSAndroid Build Coastguard Worker     path.close();
617*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
618*c8dee2aaSAndroid Build Coastguard Worker }
619*c8dee2aaSAndroid Build Coastguard Worker 
620*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
621*c8dee2aaSAndroid Build Coastguard Worker 
622*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(path_stroke_clip_crbug1070835, canvas, 25, 50) {
623*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* orig = canvas;
624*c8dee2aaSAndroid Build Coastguard Worker     auto surf = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(25, 25));
625*c8dee2aaSAndroid Build Coastguard Worker     canvas = surf->getCanvas();
626*c8dee2aaSAndroid Build Coastguard Worker 
627*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
628*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(SK_ColorRED);
629*c8dee2aaSAndroid Build Coastguard Worker     p.setAntiAlias(true);
630*c8dee2aaSAndroid Build Coastguard Worker     p.setStyle(SkPaint::kStroke_Style);
631*c8dee2aaSAndroid Build Coastguard Worker     p.setStrokeWidth(2);
632*c8dee2aaSAndroid Build Coastguard Worker 
633*c8dee2aaSAndroid Build Coastguard Worker     canvas->scale(4.16666651f/2, 4.16666651f/2);
634*c8dee2aaSAndroid Build Coastguard Worker 
635*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
636*c8dee2aaSAndroid Build Coastguard Worker 
637*c8dee2aaSAndroid Build Coastguard Worker     SkPoint pts[] = {
638*c8dee2aaSAndroid Build Coastguard Worker     {11, 12},
639*c8dee2aaSAndroid Build Coastguard Worker     {11, 18.0751324f},
640*c8dee2aaSAndroid Build Coastguard Worker     {6.07513189f, 23},
641*c8dee2aaSAndroid Build Coastguard Worker     {-4.80825292E-7f, 23},
642*c8dee2aaSAndroid Build Coastguard Worker     {-6.07513332f, 23},
643*c8dee2aaSAndroid Build Coastguard Worker     {-11, 18.0751324f},
644*c8dee2aaSAndroid Build Coastguard Worker     {-11, 11.999999f},
645*c8dee2aaSAndroid Build Coastguard Worker     {-10.999999f, 5.92486763f},
646*c8dee2aaSAndroid Build Coastguard Worker     {-6.07513189f, 1},
647*c8dee2aaSAndroid Build Coastguard Worker     {1.31173692E-7f, 1},
648*c8dee2aaSAndroid Build Coastguard Worker     {6.07513141f, 1},
649*c8dee2aaSAndroid Build Coastguard Worker     {10.9999981f, 5.92486572f},
650*c8dee2aaSAndroid Build Coastguard Worker     {11, 11.9999971f},
651*c8dee2aaSAndroid Build Coastguard Worker     };
652*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(pts[0]).cubicTo(pts[1], pts[2], pts[3])
653*c8dee2aaSAndroid Build Coastguard Worker                        .cubicTo(pts[4], pts[5], pts[6])
654*c8dee2aaSAndroid Build Coastguard Worker                        .cubicTo(pts[7], pts[8], pts[9])
655*c8dee2aaSAndroid Build Coastguard Worker                        .cubicTo(pts[10],pts[11],pts[12]);
656*c8dee2aaSAndroid Build Coastguard Worker 
657*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, p);
658*c8dee2aaSAndroid Build Coastguard Worker 
659*c8dee2aaSAndroid Build Coastguard Worker     surf->draw(orig, 0, 0);
660*c8dee2aaSAndroid Build Coastguard Worker }
661*c8dee2aaSAndroid Build Coastguard Worker 
662*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(path_arcto_skbug_9077, canvas, 200, 200) {
663*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
664*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(SK_ColorRED);
665*c8dee2aaSAndroid Build Coastguard Worker     p.setAntiAlias(true);
666*c8dee2aaSAndroid Build Coastguard Worker     p.setStyle(SkPaint::kStroke_Style);
667*c8dee2aaSAndroid Build Coastguard Worker     p.setStrokeWidth(2);
668*c8dee2aaSAndroid Build Coastguard Worker 
669*c8dee2aaSAndroid Build Coastguard Worker     SkPathBuilder path;
670*c8dee2aaSAndroid Build Coastguard Worker     SkPoint pts[] = { {20, 20}, {100, 20}, {100, 60}, {130, 150}, {180, 160} };
671*c8dee2aaSAndroid Build Coastguard Worker     SkScalar radius = 60;
672*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(pts[0]);
673*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(pts[1]);
674*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(pts[2]);
675*c8dee2aaSAndroid Build Coastguard Worker     path.close();
676*c8dee2aaSAndroid Build Coastguard Worker     path.arcTo(pts[3], pts[4], radius);
677*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path.detach(), p);
678*c8dee2aaSAndroid Build Coastguard Worker }
679*c8dee2aaSAndroid Build Coastguard Worker 
680*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(path_skbug_11859, canvas, 512, 512) {
681*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
682*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorRED);
683*c8dee2aaSAndroid Build Coastguard Worker     paint.setAntiAlias(true);
684*c8dee2aaSAndroid Build Coastguard Worker 
685*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
686*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(258, -2);
687*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(258, 258);
688*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(237, 258);
689*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(240, -2);
690*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(258, -2);
691*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(-2, -2);
692*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(240, -2);
693*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(238, 131);
694*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(-2, 131);
695*c8dee2aaSAndroid Build Coastguard Worker     path.lineTo(-2, -2);
696*c8dee2aaSAndroid Build Coastguard Worker 
697*c8dee2aaSAndroid Build Coastguard Worker     canvas->scale(2, 2);
698*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, paint);
699*c8dee2aaSAndroid Build Coastguard Worker }
700*c8dee2aaSAndroid Build Coastguard Worker 
701*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(path_skbug_11886, canvas, 256, 256) {
702*c8dee2aaSAndroid Build Coastguard Worker     SkPoint m = {0.f, 770.f};
703*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
704*c8dee2aaSAndroid Build Coastguard Worker     path.moveTo(m);
705*c8dee2aaSAndroid Build Coastguard Worker     path.cubicTo(m + SkPoint{0.f, 1.f}, m + SkPoint{20.f, -750.f}, m + SkPoint{83.f, -746.f});
706*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
707*c8dee2aaSAndroid Build Coastguard Worker     paint.setAntiAlias(true);
708*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(path, paint);
709*c8dee2aaSAndroid Build Coastguard Worker }
710