blob: 17caae5b98ccab588d8fc23b90cc440ffbb51519 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
bungemand3ebb482015-08-05 13:57:49 -07007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkPath.h"
reed@google.comc2807002011-04-11 13:57:04 +000010
11typedef SkScalar (*MakePathProc)(SkPath*);
12
13static SkScalar make_frame(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000014 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
15 SkIntToScalar(630), SkIntToScalar(470) };
16 path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15));
rmistry@google.comd6176b02012-08-23 18:14:13 +000017
reed@google.comc2807002011-04-11 13:57:04 +000018 SkPaint paint;
19 paint.setStyle(SkPaint::kStroke_Style);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000020 paint.setStrokeWidth(SkIntToScalar(5));
reed@google.comc2807002011-04-11 13:57:04 +000021 paint.getFillPath(*path, path);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000022 return SkIntToScalar(15);
reed@google.comc2807002011-04-11 13:57:04 +000023}
24
25static SkScalar make_triangle(SkPath* path) {
mtkleindbfd7ab2016-09-01 11:24:54 -070026 constexpr int gCoord[] = {
reed@google.comc2807002011-04-11 13:57:04 +000027 10, 20, 15, 5, 30, 30
28 };
29 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
30 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
31 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
32 path->close();
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000033 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000034 return SkIntToScalar(30);
35}
36
37static SkScalar make_rect(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000038 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
39 SkIntToScalar(30), SkIntToScalar(30) };
reed@google.comc2807002011-04-11 13:57:04 +000040 path->addRect(r);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000041 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000042 return SkIntToScalar(30);
43}
44
45static SkScalar make_oval(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000046 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
47 SkIntToScalar(30), SkIntToScalar(30) };
reed@google.comc2807002011-04-11 13:57:04 +000048 path->addOval(r);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000049 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000050 return SkIntToScalar(30);
51}
52
Jim Van Verthecdb6862016-12-13 18:17:47 -050053static SkScalar make_sawtooth(SkPath* path, int teeth) {
reed@google.comc2807002011-04-11 13:57:04 +000054 SkScalar x = SkIntToScalar(20);
55 SkScalar y = SkIntToScalar(20);
56 const SkScalar x0 = x;
Jim Van Verthecdb6862016-12-13 18:17:47 -050057 const SkScalar dx = SkIntToScalar(5);
58 const SkScalar dy = SkIntToScalar(10);
rmistry@google.comd6176b02012-08-23 18:14:13 +000059
reed@google.comc2807002011-04-11 13:57:04 +000060 path->moveTo(x, y);
Jim Van Verthecdb6862016-12-13 18:17:47 -050061 for (int i = 0; i < teeth; i++) {
reed@google.comc2807002011-04-11 13:57:04 +000062 x += dx;
63 path->lineTo(x, y - dy);
64 x += dx;
65 path->lineTo(x, y + dy);
66 }
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000067 path->lineTo(x, y + (2 * dy));
68 path->lineTo(x0, y + (2 * dy));
reed@google.comc2807002011-04-11 13:57:04 +000069 path->close();
70 return SkIntToScalar(30);
71}
72
Jim Van Verthecdb6862016-12-13 18:17:47 -050073static SkScalar make_sawtooth_3(SkPath* path) { return make_sawtooth(path, 3); }
74static SkScalar make_sawtooth_32(SkPath* path) { return make_sawtooth(path, 32); }
75
76static SkScalar make_house(SkPath* path) {
77 path->moveTo(21, 23);
78 path->lineTo(21, 11.534f);
79 path->lineTo(22.327f, 12.741f);
80 path->lineTo(23.673f, 11.261f);
81 path->lineTo(12, 0.648f);
82 path->lineTo(8, 4.285f);
83 path->lineTo(8, 2);
84 path->lineTo(4, 2);
85 path->lineTo(4, 7.921f);
86 path->lineTo(0.327f, 11.26f);
87 path->lineTo(1.673f, 12.74f);
88 path->lineTo(3, 11.534f);
89 path->lineTo(3, 23);
90 path->lineTo(11, 23);
91 path->lineTo(11, 18);
92 path->lineTo(13, 18);
93 path->lineTo(13, 23);
94 path->lineTo(21, 23);
95 path->close();
96 path->lineTo(9, 16);
97 path->lineTo(9, 21);
98 path->lineTo(5, 21);
99 path->lineTo(5, 9.715f);
100 path->lineTo(12, 3.351f);
101 path->lineTo(19, 9.715f);
102 path->lineTo(19, 21);
103 path->lineTo(15, 21);
104 path->lineTo(15, 16);
105 path->lineTo(9, 16);
106 path->close();
107 path->offset(20, 0);
108 return SkIntToScalar(30);
109}
110
reed@google.comc2807002011-04-11 13:57:04 +0000111static SkScalar make_star(SkPath* path, int n) {
112 const SkScalar c = SkIntToScalar(45);
113 const SkScalar r = SkIntToScalar(20);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000114
reed@google.comc2807002011-04-11 13:57:04 +0000115 SkScalar rad = -SK_ScalarPI / 2;
116 const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000117
reed@google.comc2807002011-04-11 13:57:04 +0000118 path->moveTo(c, c - r);
119 for (int i = 1; i < n; i++) {
120 rad += drad;
Brian Osman4428f2c2019-04-02 10:59:28 -0400121 path->lineTo(c + SkScalarCos(rad) * r, c + SkScalarSin(rad) * r);
reed@google.comc2807002011-04-11 13:57:04 +0000122 }
123 path->close();
124 return r * 2 * 6 / 5;
125}
126
127static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
128static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
129
vandebo@chromium.org683001c2012-05-09 17:17:51 +0000130// We don't expect any output from this path.
131static SkScalar make_line(SkPath* path) {
132 path->moveTo(SkIntToScalar(30), SkIntToScalar(30));
133 path->lineTo(SkIntToScalar(120), SkIntToScalar(40));
134 path->close();
135 path->moveTo(SkIntToScalar(150), SkIntToScalar(30));
136 path->lineTo(SkIntToScalar(150), SkIntToScalar(30));
137 path->lineTo(SkIntToScalar(300), SkIntToScalar(40));
138 path->close();
139 return SkIntToScalar(40);
140}
141
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500142static void make_info(SkPath* path) {
Jim Van Verth77047542017-01-11 14:17:00 -0500143 path->moveTo(24, 4);
144 path->cubicTo(12.94999980926514f,
145 4,
146 4,
147 12.94999980926514f,
148 4,
149 24);
150 path->cubicTo(4,
151 35.04999923706055f,
152 12.94999980926514f,
153 44,
154 24,
155 44);
156 path->cubicTo(35.04999923706055f,
157 44,
158 44,
159 35.04999923706055f,
160 44,
161 24);
162 path->cubicTo(44,
163 12.95000076293945f,
164 35.04999923706055f,
165 4,
166 24,
167 4);
168 path->close();
169 path->moveTo(26, 34);
170 path->lineTo(22, 34);
171 path->lineTo(22, 22);
172 path->lineTo(26, 22);
173 path->lineTo(26, 34);
174 path->close();
175 path->moveTo(26, 18);
176 path->lineTo(22, 18);
177 path->lineTo(22, 14);
178 path->lineTo(26, 14);
179 path->lineTo(26, 18);
180 path->close();
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500181}
Jim Van Verth77047542017-01-11 14:17:00 -0500182
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500183static void make_accessibility(SkPath* path) {
184 path->moveTo(12, 2);
185 path->cubicTo(13.10000038146973f,
186 2,
187 14,
188 2.900000095367432f,
189 14,
190 4);
191 path->cubicTo(14,
192 5.099999904632568f,
193 13.10000038146973f,
194 6,
195 12,
196 6);
197 path->cubicTo(10.89999961853027f,
198 6,
199 10,
200 5.099999904632568f,
201 10,
202 4);
203 path->cubicTo(10,
204 2.900000095367432f,
205 10.89999961853027f,
206 2,
207 12,
208 2);
209 path->close();
210 path->moveTo(21, 9);
211 path->lineTo(15, 9);
212 path->lineTo(15, 22);
213 path->lineTo(13, 22);
214 path->lineTo(13, 16);
215 path->lineTo(11, 16);
216 path->lineTo(11, 22);
217 path->lineTo(9, 22);
218 path->lineTo(9, 9);
219 path->lineTo(3, 9);
220 path->lineTo(3, 7);
221 path->lineTo(21, 7);
222 path->lineTo(21, 9);
223 path->close();
Jim Van Verth77047542017-01-11 14:17:00 -0500224}
225
Jim Van Verth33632d82017-02-28 10:24:39 -0500226// test case for http://crbug.com/695196
227static void make_visualizer(SkPath* path) {
228 path->moveTo(1.9520f, 2.0000f);
229 path->conicTo(1.5573f, 1.9992f, 1.2782f, 2.2782f, 0.9235f);
230 path->conicTo(0.9992f, 2.5573f, 1.0000f, 2.9520f, 0.9235f);
231 path->lineTo(1.0000f, 5.4300f);
232 path->lineTo(17.0000f, 5.4300f);
233 path->lineTo(17.0000f, 2.9520f);
234 path->conicTo(17.0008f, 2.5573f, 16.7218f, 2.2782f, 0.9235f);
235 path->conicTo(16.4427f, 1.9992f, 16.0480f, 2.0000f, 0.9235f);
236 path->lineTo(1.9520f, 2.0000f);
237 path->close();
238 path->moveTo(2.7140f, 3.1430f);
239 path->conicTo(3.0547f, 3.1287f, 3.2292f, 3.4216f, 0.8590f);
240 path->conicTo(3.4038f, 3.7145f, 3.2292f, 4.0074f, 0.8590f);
241 path->conicTo(3.0547f, 4.3003f, 2.7140f, 4.2860f, 0.8590f);
242 path->conicTo(2.1659f, 4.2631f, 2.1659f, 3.7145f, 0.7217f);
243 path->conicTo(2.1659f, 3.1659f, 2.7140f, 3.1430f, 0.7217f);
244 path->lineTo(2.7140f, 3.1430f);
245 path->close();
246 path->moveTo(5.0000f, 3.1430f);
247 path->conicTo(5.3407f, 3.1287f, 5.5152f, 3.4216f, 0.8590f);
248 path->conicTo(5.6898f, 3.7145f, 5.5152f, 4.0074f, 0.8590f);
249 path->conicTo(5.3407f, 4.3003f, 5.0000f, 4.2860f, 0.8590f);
250 path->conicTo(4.4519f, 4.2631f, 4.4519f, 3.7145f, 0.7217f);
251 path->conicTo(4.4519f, 3.1659f, 5.0000f, 3.1430f, 0.7217f);
252 path->lineTo(5.0000f, 3.1430f);
253 path->close();
254 path->moveTo(7.2860f, 3.1430f);
255 path->conicTo(7.6267f, 3.1287f, 7.8012f, 3.4216f, 0.8590f);
256 path->conicTo(7.9758f, 3.7145f, 7.8012f, 4.0074f, 0.8590f);
257 path->conicTo(7.6267f, 4.3003f, 7.2860f, 4.2860f, 0.8590f);
258 path->conicTo(6.7379f, 4.2631f, 6.7379f, 3.7145f, 0.7217f);
259 path->conicTo(6.7379f, 3.1659f, 7.2860f, 3.1430f, 0.7217f);
260 path->close();
261 path->moveTo(1.0000f, 6.1900f);
262 path->lineTo(1.0000f, 14.3810f);
263 path->conicTo(0.9992f, 14.7757f, 1.2782f, 15.0548f, 0.9235f);
264 path->conicTo(1.5573f, 15.3338f, 1.9520f, 15.3330f, 0.9235f);
265 path->lineTo(16.0480f, 15.3330f);
266 path->conicTo(16.4427f, 15.3338f, 16.7218f, 15.0548f, 0.9235f);
267 path->conicTo(17.0008f, 14.7757f, 17.0000f, 14.3810f, 0.9235f);
268 path->lineTo(17.0000f, 6.1910f);
269 path->lineTo(1.0000f, 6.1910f);
270 path->lineTo(1.0000f, 6.1900f);
271 path->close();
272}
273
mtkleindbfd7ab2016-09-01 11:24:54 -0700274constexpr MakePathProc gProcs[] = {
reed@google.comc2807002011-04-11 13:57:04 +0000275 make_frame,
276 make_triangle,
277 make_rect,
278 make_oval,
Jim Van Verthecdb6862016-12-13 18:17:47 -0500279 make_sawtooth_32,
reed@google.comc2807002011-04-11 13:57:04 +0000280 make_star_5,
vandebo@chromium.org683001c2012-05-09 17:17:51 +0000281 make_star_13,
282 make_line,
Jim Van Verthecdb6862016-12-13 18:17:47 -0500283 make_house,
284 make_sawtooth_3,
reed@google.comc2807002011-04-11 13:57:04 +0000285};
286
287#define N SK_ARRAY_COUNT(gProcs)
288
reed@google.com5ee64912012-06-11 17:30:33 +0000289class PathFillGM : public skiagm::GM {
reed@google.comc2807002011-04-11 13:57:04 +0000290 SkPath fPath[N];
291 SkScalar fDY[N];
Jim Van Verth77047542017-01-11 14:17:00 -0500292 SkPath fInfoPath;
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500293 SkPath fAccessibilityPath;
Jim Van Verth33632d82017-02-28 10:24:39 -0500294 SkPath fVisualizerPath;
caryclark88c748a2015-02-18 10:56:00 -0800295protected:
mtklein36352bf2015-03-25 18:17:31 -0700296 void onOnceBeforeDraw() override {
reed@google.comc2807002011-04-11 13:57:04 +0000297 for (size_t i = 0; i < N; i++) {
298 fDY[i] = gProcs[i](&fPath[i]);
299 }
Jim Van Verth77047542017-01-11 14:17:00 -0500300
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500301 make_info(&fInfoPath);
302 make_accessibility(&fAccessibilityPath);
Jim Van Verth33632d82017-02-28 10:24:39 -0500303 make_visualizer(&fVisualizerPath);
reed@google.comc2807002011-04-11 13:57:04 +0000304 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000305
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000306
mtklein36352bf2015-03-25 18:17:31 -0700307 SkString onShortName() override {
reed@google.comc2807002011-04-11 13:57:04 +0000308 return SkString("pathfill");
309 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000310
mtklein36352bf2015-03-25 18:17:31 -0700311 SkISize onISize() override {
reed@google.com5ee64912012-06-11 17:30:33 +0000312 return SkISize::Make(640, 480);
reed@google.comc2807002011-04-11 13:57:04 +0000313 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000314
mtklein36352bf2015-03-25 18:17:31 -0700315 void onDraw(SkCanvas* canvas) override {
reed@google.comc2807002011-04-11 13:57:04 +0000316 SkPaint paint;
317 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000318
reed@google.comc2807002011-04-11 13:57:04 +0000319 for (size_t i = 0; i < N; i++) {
320 canvas->drawPath(fPath[i], paint);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +0000321 canvas->translate(SkIntToScalar(0), fDY[i]);
reed@google.comc2807002011-04-11 13:57:04 +0000322 }
Jim Van Verth77047542017-01-11 14:17:00 -0500323
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500324 canvas->save();
Jim Van Verth77047542017-01-11 14:17:00 -0500325 canvas->scale(0.300000011920929f, 0.300000011920929f);
326 canvas->translate(50, 50);
327 canvas->drawPath(fInfoPath, paint);
Jim Van Verthf9e678d2017-02-15 15:46:52 -0500328 canvas->restore();
329
330 canvas->scale(2, 2);
331 canvas->translate(5, 15);
332 canvas->drawPath(fAccessibilityPath, paint);
Jim Van Verth33632d82017-02-28 10:24:39 -0500333
334 canvas->scale(0.5f, 0.5f);
335 canvas->translate(5, 50);
336 canvas->drawPath(fVisualizerPath, paint);
reed@google.comc2807002011-04-11 13:57:04 +0000337 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000338
reed@google.comc2807002011-04-11 13:57:04 +0000339private:
reed@google.com5ee64912012-06-11 17:30:33 +0000340 typedef skiagm::GM INHERITED;
341};
342
343// test inverse-fill w/ a clip that completely excludes the geometry
344class PathInverseFillGM : public skiagm::GM {
345 SkPath fPath[N];
346 SkScalar fDY[N];
caryclark88c748a2015-02-18 10:56:00 -0800347protected:
mtklein36352bf2015-03-25 18:17:31 -0700348 void onOnceBeforeDraw() override {
reed@google.com5ee64912012-06-11 17:30:33 +0000349 for (size_t i = 0; i < N; i++) {
350 fDY[i] = gProcs[i](&fPath[i]);
351 }
352 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000353
mtklein36352bf2015-03-25 18:17:31 -0700354 SkString onShortName() override {
reed@google.com5ee64912012-06-11 17:30:33 +0000355 return SkString("pathinvfill");
356 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000357
mtklein36352bf2015-03-25 18:17:31 -0700358 SkISize onISize() override {
reed@google.com5ee64912012-06-11 17:30:33 +0000359 return SkISize::Make(450, 220);
360 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000361
reed@google.com5ee64912012-06-11 17:30:33 +0000362 static void show(SkCanvas* canvas, const SkPath& path, const SkPaint& paint,
363 const SkRect* clip, SkScalar top, const SkScalar bottom) {
364 canvas->save();
365 if (clip) {
366 SkRect r = *clip;
367 r.fTop = top;
368 r.fBottom = bottom;
369 canvas->clipRect(r);
370 }
371 canvas->drawPath(path, paint);
372 canvas->restore();
373 }
374
mtklein36352bf2015-03-25 18:17:31 -0700375 void onDraw(SkCanvas* canvas) override {
reed@google.com5ee64912012-06-11 17:30:33 +0000376 SkPath path;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000377
reed@google.com5ee64912012-06-11 17:30:33 +0000378 path.addCircle(SkIntToScalar(50), SkIntToScalar(50), SkIntToScalar(40));
379 path.toggleInverseFillType();
380
381 SkRect clipR = { 0, 0, SkIntToScalar(100), SkIntToScalar(200) };
382
383 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
384
385 for (int doclip = 0; doclip <= 1; ++doclip) {
386 for (int aa = 0; aa <= 1; ++aa) {
387 SkPaint paint;
388 paint.setAntiAlias(SkToBool(aa));
389
390 canvas->save();
391 canvas->clipRect(clipR);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000392
halcanary96fcdcc2015-08-27 07:41:13 -0700393 const SkRect* clipPtr = doclip ? &clipR : nullptr;
reed@google.com5ee64912012-06-11 17:30:33 +0000394
395 show(canvas, path, paint, clipPtr, clipR.fTop, clipR.centerY());
396 show(canvas, path, paint, clipPtr, clipR.centerY(), clipR.fBottom);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000397
reed@google.com5ee64912012-06-11 17:30:33 +0000398 canvas->restore();
399 canvas->translate(SkIntToScalar(110), 0);
400 }
401 }
402 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000403
reed@google.com5ee64912012-06-11 17:30:33 +0000404private:
405 typedef skiagm::GM INHERITED;
reed@google.comc2807002011-04-11 13:57:04 +0000406};
407
caryclarke3e8c722016-03-01 09:42:03 -0800408DEF_SIMPLE_GM(rotatedcubicpath, canvas, 200, 200) {
409 SkPaint p;
410 p.setAntiAlias(true);
411 p.setStyle(SkPaint::kFill_Style);
412
413 canvas->translate(50, 50);
414 SkPath path;
415 path.moveTo(48,-23);
416 path.cubicTo(48,-29.5, 6,-30, 6,-30);
417 path.cubicTo(6,-30, 2,0, 2,0);
418 path.cubicTo(2,0, 44,-21.5, 48,-23);
419 path.close();
420
421 p.setColor(SK_ColorBLUE);
422 canvas->drawPath(path, p);
423
424 // Rotated path, which is not antialiased on GPU
425 p.setColor(SK_ColorRED);
426 canvas->rotate(90);
427 canvas->drawPath(path, p);
428}
429
reed@google.comc2807002011-04-11 13:57:04 +0000430///////////////////////////////////////////////////////////////////////////////
431
scroggo96f16e82015-12-10 13:31:59 -0800432DEF_GM( return new PathFillGM; )
433DEF_GM( return new PathInverseFillGM; )
Cary Clark8540e112018-04-11 14:30:27 -0400434
Cary Clark4eb6f7a2018-04-17 13:34:37 -0400435DEF_SIMPLE_GM(bug7792, canvas, 800, 800) {
Cary Clark8540e112018-04-11 14:30:27 -0400436 // from skbug.com/7792 bug description
437 SkPaint p;
438 SkPath path;
439 path.moveTo(10, 10);
440 path.moveTo(75, 75);
441 path.lineTo(150, 75);
442 path.lineTo(150, 150);
443 path.lineTo(75, 150);
444 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400445 // from skbug.com/7792#c3
Cary Clark8540e112018-04-11 14:30:27 -0400446 canvas->translate(200, 0);
447 path.reset();
448 path.moveTo(75, 50);
449 path.moveTo(100, 75);
450 path.lineTo(150, 75);
451 path.lineTo(150, 150);
452 path.lineTo(75, 150);
453 path.lineTo(75, 50);
454 path.close();
455 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400456 // from skbug.com/7792#c9
Cary Clark8540e112018-04-11 14:30:27 -0400457 canvas->translate(200, 0);
458 path.reset();
459 path.moveTo(10, 10);
460 path.moveTo(75, 75);
461 path.lineTo(150, 75);
462 path.lineTo(150, 150);
463 path.lineTo(75, 150);
464 path.close();
465 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400466 // from skbug.com/7792#c11
Cary Clark8540e112018-04-11 14:30:27 -0400467 canvas->translate(-200 * 2, 200);
468 path.reset();
469 path.moveTo(75, 150);
470 path.lineTo(75, 75);
471 path.lineTo(150, 75);
472 path.lineTo(150, 150);
473 path.lineTo(75, 150);
474 path.moveTo(75, 150);
475 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400476 // from skbug.com/7792#c14
Cary Clark8540e112018-04-11 14:30:27 -0400477 canvas->translate(200, 0);
478 path.reset();
479 path.moveTo(250, 75);
480 path.moveTo(250, 75);
481 path.moveTo(250, 75);
482 path.moveTo(100, 75);
483 path.lineTo(150, 75);
484 path.lineTo(150, 150);
485 path.lineTo(75, 150);
486 path.lineTo(75, 75);
487 path.close();
488 path.lineTo(0, 0);
489 path.close();
490 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400491 // from skbug.com/7792#c15
Cary Clark8540e112018-04-11 14:30:27 -0400492 canvas->translate(200, 0);
493 path.reset();
494 path.moveTo(75, 75);
495 path.lineTo(150, 75);
496 path.lineTo(150, 150);
497 path.lineTo(75, 150);
498 path.moveTo(250, 75);
499 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400500 // from skbug.com/7792#c17
Cary Clark31608c02018-04-12 10:29:46 -0400501 canvas->translate(-200 * 2, 200);
502 path.reset();
503 path.moveTo(75, 10);
504 path.moveTo(75, 75);
505 path.lineTo(150, 75);
506 path.lineTo(150, 150);
507 path.lineTo(75, 150);
508 path.lineTo(75, 10);
509 path.close();
510 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400511 // from skbug.com/7792#c19
Cary Clark88ba9712018-04-12 14:00:24 -0400512 canvas->translate(200, 0);
513 path.reset();
514 path.moveTo(75, 75);
515 path.lineTo(75, 75);
516 path.lineTo(75, 75);
517 path.lineTo(75, 75);
518 path.lineTo(150, 75);
519 path.lineTo(150, 150);
520 path.lineTo(75, 150);
521 path.close();
522 path.moveTo(10, 10);
523 path.lineTo(30, 10);
524 path.lineTo(10, 30);
525 canvas->drawPath(path, p);
Cary Clarkd4228472018-04-13 07:07:04 -0400526 // from skbug.com/7792#c23
527 canvas->translate(200, 0);
528 path.reset();
529 path.moveTo(75, 75);
530 path.lineTo(75, 75);
531 path.moveTo(75, 75);
532 path.lineTo(75, 75);
533 path.lineTo(150, 75);
534 path.lineTo(150, 150);
535 path.lineTo(75, 150);
536 path.close();
537 canvas->drawPath(path, p);
Cary Clark48c464a2018-04-16 12:06:07 -0400538 // from skbug.com/7792#c29
539 canvas->translate(-200 * 2, 200);
540 path.reset();
541 path.moveTo(75, 75);
542 path.lineTo(150, 75);
543 path.lineTo(150, 150);
544 path.lineTo(75, 150);
545 path.lineTo(75, 250);
546 path.moveTo(75, 75);
547 path.close();
548 canvas->drawPath(path, p);
Cary Clarka7651562018-04-17 09:30:14 -0400549 // from skbug.com/7792#c31
550 canvas->translate(200, 0);
551 path.reset();
552 path.moveTo(75, 75);
553 path.lineTo(150, 75);
554 path.lineTo(150, 150);
555 path.lineTo(75, 150);
556 path.lineTo(75, 10);
557 path.moveTo(75, 75);
558 path.close();
559 canvas->drawPath(path, p);
Cary Clark1cd60982018-04-17 11:53:34 -0400560 // from skbug.com/7792#c36
561 canvas->translate(200, 0);
562 path.reset();
563 path.moveTo(75, 75);
564 path.lineTo(150, 75);
565 path.lineTo(150, 150);
566 path.lineTo(10, 150);
567 path.moveTo(75, 75);
568 path.lineTo(75, 75);
569 canvas->drawPath(path, p);
Cary Clark4eb6f7a2018-04-17 13:34:37 -0400570 // from skbug.com/7792#c39
571 canvas->translate(200, -200 * 3);
572 path.reset();
573 path.moveTo(150, 75);
574 path.lineTo(150, 150);
575 path.lineTo(75, 150);
576 path.lineTo(75, 100);
577 canvas->drawPath(path, p);
Cary Clarkb120e922018-04-18 12:25:08 -0400578 // from zero_length_paths_aa
579 canvas->translate(0, 200);
580 path.reset();
581 path.moveTo(150, 100);
582 path.lineTo(150, 100);
583 path.lineTo(150, 150);
584 path.lineTo(75, 150);
585 path.lineTo(75, 100);
586 path.lineTo(75, 75);
587 path.lineTo(150, 75);
588 path.close();
589 canvas->drawPath(path, p);
Cary Clarkdbc59ba2018-04-19 07:37:29 -0400590 // from skbug.com/7792#c41
591 canvas->translate(0, 200);
592 path.reset();
593 path.moveTo(75, 75);
594 path.lineTo(150, 75);
595 path.lineTo(150, 150);
596 path.lineTo(140, 150);
597 path.lineTo(140, 75);
598 path.moveTo(75, 75);
599 path.close();
600 canvas->drawPath(path, p);
601 // from skbug.com/7792#c53
602 canvas->translate(0, 200);
603 path.reset();
604 path.moveTo(75, 75);
605 path.lineTo(150, 75);
606 path.lineTo(150, 150);
607 path.lineTo(140, 150);
608 path.lineTo(140, 75);
609 path.moveTo(75, 75);
610 path.close();
611 canvas->drawPath(path, p);
Cary Clark8540e112018-04-11 14:30:27 -0400612}