blob: a5925ef1e712436cf3151d5449e4b9988031647f [file] [log] [blame]
schenney@chromium.org4da06ab2011-12-20 15:14:18 +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/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkColor.h"
11#include "include/core/SkFont.h"
12#include "include/core/SkMatrix.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkPaint.h"
14#include "include/core/SkPath.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkPoint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkScalar.h"
18#include "include/core/SkSize.h"
19#include "include/core/SkString.h"
20#include "include/core/SkTypeface.h"
21#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "include/utils/SkRandom.h"
23#include "tools/ToolUtils.h"
schenney@chromium.org4da06ab2011-12-20 15:14:18 +000024
halcanary6950de62015-11-07 05:29:00 -080025// https://bug.skia.org/1316 shows that this cubic, when slightly clipped, creates big
reed@google.com22999c62013-05-23 19:30:48 +000026// (incorrect) changes to its control points.
27class ClippedCubicGM : public skiagm::GM {
28public:
29 ClippedCubicGM() {}
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000030
reed@google.com22999c62013-05-23 19:30:48 +000031protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000032
reed@google.com22999c62013-05-23 19:30:48 +000033 SkString onShortName() {
reed@google.com03ca64b2013-05-23 19:39:15 +000034 return SkString("clippedcubic");
reed@google.com22999c62013-05-23 19:30:48 +000035 }
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000036
reed@google.com22999c62013-05-23 19:30:48 +000037 SkISize onISize() { return SkISize::Make(1240, 390); }
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000038
reed@google.com22999c62013-05-23 19:30:48 +000039 virtual void onDraw(SkCanvas* canvas) {
40 SkPath path;
41 path.moveTo(0, 0);
42 path.cubicTo(140, 150, 40, 10, 170, 150);
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000043
reed@google.com22999c62013-05-23 19:30:48 +000044 SkPaint paint;
45 SkRect bounds = path.getBounds();
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000046
reed@google.com0f8990c2013-05-23 19:47:05 +000047 for (SkScalar dy = -1; dy <= 1; dy += 1) {
reed@google.com22999c62013-05-23 19:30:48 +000048 canvas->save();
reed@google.com0f8990c2013-05-23 19:47:05 +000049 for (SkScalar dx = -1; dx <= 1; dx += 1) {
reed@google.com22999c62013-05-23 19:30:48 +000050 canvas->save();
51 canvas->clipRect(bounds);
52 canvas->translate(dx, dy);
53 canvas->drawPath(path, paint);
54 canvas->restore();
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000055
reed@google.com22999c62013-05-23 19:30:48 +000056 canvas->translate(bounds.width(), 0);
57 }
58 canvas->restore();
59 canvas->translate(0, bounds.height());
60 }
61 }
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +000062
reed@google.com22999c62013-05-23 19:30:48 +000063private:
64 typedef skiagm::GM INHERITED;
65};
66
caryclark7d173402015-08-20 08:23:52 -070067
68class ClippedCubic2GM : public skiagm::GM {
69public:
70 ClippedCubic2GM() {}
71
72protected:
73
caryclark02833bf2015-08-20 10:53:13 -070074 SkString onShortName() override {
caryclark7d173402015-08-20 08:23:52 -070075 return SkString("clippedcubic2");
76 }
77
caryclark02833bf2015-08-20 10:53:13 -070078 SkISize onISize() override { return SkISize::Make(1240, 390); }
caryclark7d173402015-08-20 08:23:52 -070079
80 void onDraw(SkCanvas* canvas) override {
81 canvas->save();
caryclark05424f72015-08-20 10:35:43 -070082 canvas->translate(-2, 120);
caryclark7d173402015-08-20 08:23:52 -070083 drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 150));
84 canvas->translate(0, 170);
85 drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 100));
86 canvas->translate(0, 170);
87 drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 30, 150));
88 canvas->translate(0, 170);
89 drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 10, 150));
90 canvas->restore();
caryclark05424f72015-08-20 10:35:43 -070091 canvas->save();
92 canvas->translate(20, -2);
93 drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 80));
94 canvas->translate(170, 0);
95 drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 100, 80));
96 canvas->translate(170, 0);
97 drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 30));
98 canvas->translate(170, 0);
99 drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 10));
100 canvas->restore();
caryclark7d173402015-08-20 08:23:52 -0700101 }
102
103 void drawOne(SkCanvas* canvas, const SkPath& path, const SkRect& clip) {
104 SkPaint framePaint, fillPaint;
105 framePaint.setStyle(SkPaint::kStroke_Style);
106 canvas->drawRect(clip, framePaint);
107 canvas->drawPath(path, framePaint);
108 canvas->save();
109 canvas->clipRect(clip);
110 canvas->drawPath(path, fillPaint);
111 canvas->restore();
112 }
113
114 void onOnceBeforeDraw() override {
115 fPath.moveTo(69.7030518991886f, 0);
116 fPath.cubicTo( 69.7030518991886f, 21.831149999999997f,
117 58.08369508178456f, 43.66448333333333f, 34.8449814469765f, 65.5f);
118 fPath.cubicTo( 11.608591683531916f, 87.33115f, -0.010765133872116195f, 109.16448333333332f,
119 -0.013089005235602302f, 131);
120 fPath.close();
caryclark05424f72015-08-20 10:35:43 -0700121 fFlipped = fPath;
122 SkMatrix matrix;
123 matrix.reset();
124 matrix.setScaleX(0);
125 matrix.setScaleY(0);
126 matrix.setSkewX(1);
127 matrix.setSkewY(1);
128 fFlipped.transform(matrix);
caryclark7d173402015-08-20 08:23:52 -0700129 }
130
131 SkPath fPath;
caryclark05424f72015-08-20 10:35:43 -0700132 SkPath fFlipped;
caryclark7d173402015-08-20 08:23:52 -0700133private:
134 typedef skiagm::GM INHERITED;
135};
136
137
reed@google.com27b90fa2013-03-08 18:44:01 +0000138class CubicPathGM : public skiagm::GM {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000139public:
140 CubicPathGM() {}
141
142protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000143
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000144 SkString onShortName() {
145 return SkString("cubicpath");
146 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000147
reed@google.com27b90fa2013-03-08 18:44:01 +0000148 SkISize onISize() { return SkISize::Make(1240, 390); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000149
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000150 void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
151 const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
152 SkPaint::Style style, SkPath::FillType fill,
153 SkScalar strokeWidth) {
154 path.setFillType(fill);
155 SkPaint paint;
156 paint.setStrokeCap(cap);
157 paint.setStrokeWidth(strokeWidth);
158 paint.setStrokeJoin(join);
159 paint.setColor(color);
160 paint.setStyle(style);
161 canvas->save();
162 canvas->clipRect(clip);
163 canvas->drawPath(path, paint);
164 canvas->restore();
165 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000166
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000167 virtual void onDraw(SkCanvas* canvas) {
168 struct FillAndName {
169 SkPath::FillType fFill;
170 const char* fName;
171 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700172 constexpr FillAndName gFills[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000173 {SkPath::kWinding_FillType, "Winding"},
174 {SkPath::kEvenOdd_FillType, "Even / Odd"},
175 {SkPath::kInverseWinding_FillType, "Inverse Winding"},
176 {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
177 };
178 struct StyleAndName {
179 SkPaint::Style fStyle;
180 const char* fName;
181 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700182 constexpr StyleAndName gStyles[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000183 {SkPaint::kFill_Style, "Fill"},
184 {SkPaint::kStroke_Style, "Stroke"},
185 {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
186 };
187 struct CapAndName {
188 SkPaint::Cap fCap;
189 SkPaint::Join fJoin;
190 const char* fName;
191 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700192 constexpr CapAndName gCaps[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000193 {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
194 {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
195 {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
196 };
197 struct PathAndName {
198 SkPath fPath;
199 const char* fName;
200 };
201 PathAndName path;
202 path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
203 path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1,
204 60*SK_Scalar1, 20*SK_Scalar1,
205 75*SK_Scalar1, 10*SK_Scalar1);
206 path.fName = "moveTo-cubic";
207
208 SkPaint titlePaint;
209 titlePaint.setColor(SK_ColorBLACK);
210 titlePaint.setAntiAlias(true);
Mike Kleinea3f0142019-03-20 11:12:10 -0500211 SkFont font(ToolUtils::create_portable_typeface(), 15);
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000212 const char title[] = "Cubic Drawn Into Rectangle Clips With "
213 "Indicated Style, Fill and Linecaps, with stroke width 10";
Mike Reed1af9b482019-01-07 11:01:57 -0500214 canvas->drawString(title, 20, 20, font, titlePaint);
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000215
scroggof9d61012014-12-15 12:54:51 -0800216 SkRandom rand;
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000217 SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
218 canvas->save();
219 canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
220 canvas->save();
221 for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
222 if (0 < cap) {
223 canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
224 }
225 canvas->save();
226 for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
227 if (0 < fill) {
228 canvas->translate(0, rect.height() + 40 * SK_Scalar1);
229 }
230 canvas->save();
231 for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
232 if (0 < style) {
233 canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
234 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000235
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000236 SkColor color = 0xff007000;
237 this->drawPath(path.fPath, canvas, color, rect,
238 gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
239 gFills[fill].fFill, SK_Scalar1*10);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000240
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000241 SkPaint rectPaint;
242 rectPaint.setColor(SK_ColorBLACK);
243 rectPaint.setStyle(SkPaint::kStroke_Style);
244 rectPaint.setStrokeWidth(-1);
245 rectPaint.setAntiAlias(true);
246 canvas->drawRect(rect, rectPaint);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000247
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000248 SkPaint labelPaint;
249 labelPaint.setColor(color);
Mike Reed1af9b482019-01-07 11:01:57 -0500250 font.setSize(10);
251 canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint);
252 canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint);
253 canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint);
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000254 }
255 canvas->restore();
256 }
257 canvas->restore();
258 }
259 canvas->restore();
260 canvas->restore();
261 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000262
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000263private:
reed@google.com27b90fa2013-03-08 18:44:01 +0000264 typedef skiagm::GM INHERITED;
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000265};
266
reed@google.com27b90fa2013-03-08 18:44:01 +0000267class CubicClosePathGM : public skiagm::GM {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000268public:
269 CubicClosePathGM() {}
270
271protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000272
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000273 SkString onShortName() {
274 return SkString("cubicclosepath");
275 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000276
reed@google.com27b90fa2013-03-08 18:44:01 +0000277 SkISize onISize() { return SkISize::Make(1240, 390); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000278
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000279 void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
280 const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
281 SkPaint::Style style, SkPath::FillType fill,
282 SkScalar strokeWidth) {
283 path.setFillType(fill);
284 SkPaint paint;
285 paint.setStrokeCap(cap);
286 paint.setStrokeWidth(strokeWidth);
287 paint.setStrokeJoin(join);
288 paint.setColor(color);
289 paint.setStyle(style);
290 canvas->save();
291 canvas->clipRect(clip);
292 canvas->drawPath(path, paint);
293 canvas->restore();
294 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000295
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000296 virtual void onDraw(SkCanvas* canvas) {
297 struct FillAndName {
298 SkPath::FillType fFill;
299 const char* fName;
300 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700301 constexpr FillAndName gFills[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000302 {SkPath::kWinding_FillType, "Winding"},
303 {SkPath::kEvenOdd_FillType, "Even / Odd"},
304 {SkPath::kInverseWinding_FillType, "Inverse Winding"},
305 {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
306 };
307 struct StyleAndName {
308 SkPaint::Style fStyle;
309 const char* fName;
310 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700311 constexpr StyleAndName gStyles[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000312 {SkPaint::kFill_Style, "Fill"},
313 {SkPaint::kStroke_Style, "Stroke"},
314 {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
315 };
316 struct CapAndName {
317 SkPaint::Cap fCap;
318 SkPaint::Join fJoin;
319 const char* fName;
320 };
mtkleindbfd7ab2016-09-01 11:24:54 -0700321 constexpr CapAndName gCaps[] = {
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000322 {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
323 {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
324 {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
325 };
326 struct PathAndName {
327 SkPath fPath;
328 const char* fName;
329 };
330 PathAndName path;
331 path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
332 path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1,
333 60*SK_Scalar1, 20*SK_Scalar1,
334 75*SK_Scalar1, 10*SK_Scalar1);
335 path.fPath.close();
336 path.fName = "moveTo-cubic-close";
337
338 SkPaint titlePaint;
339 titlePaint.setColor(SK_ColorBLACK);
340 titlePaint.setAntiAlias(true);
Mike Kleinea3f0142019-03-20 11:12:10 -0500341 SkFont font(ToolUtils::create_portable_typeface(), 15);
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000342 const char title[] = "Cubic Closed Drawn Into Rectangle Clips With "
343 "Indicated Style, Fill and Linecaps, with stroke width 10";
Mike Reed1af9b482019-01-07 11:01:57 -0500344 canvas->drawString(title, 20, 20, font, titlePaint);
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000345
scroggof9d61012014-12-15 12:54:51 -0800346 SkRandom rand;
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000347 SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
348 canvas->save();
349 canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
350 canvas->save();
351 for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
352 if (0 < cap) {
353 canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
354 }
355 canvas->save();
356 for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
357 if (0 < fill) {
358 canvas->translate(0, rect.height() + 40 * SK_Scalar1);
359 }
360 canvas->save();
361 for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
362 if (0 < style) {
363 canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
364 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000365
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000366 SkColor color = 0xff007000;
367 this->drawPath(path.fPath, canvas, color, rect,
368 gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
369 gFills[fill].fFill, SK_Scalar1*10);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000370
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000371 SkPaint rectPaint;
372 rectPaint.setColor(SK_ColorBLACK);
373 rectPaint.setStyle(SkPaint::kStroke_Style);
374 rectPaint.setStrokeWidth(-1);
375 rectPaint.setAntiAlias(true);
376 canvas->drawRect(rect, rectPaint);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000377
schenney@chromium.org45cbfdd2011-12-20 21:48:14 +0000378 SkPaint labelPaint;
379 labelPaint.setColor(color);
380 labelPaint.setAntiAlias(true);
Mike Reed1af9b482019-01-07 11:01:57 -0500381 font.setSize(10);
382 canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint);
383 canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint);
384 canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint);
schenney@chromium.org4da06ab2011-12-20 15:14:18 +0000385 }
386 canvas->restore();
387 }
388 canvas->restore();
389 }
390 canvas->restore();
391 canvas->restore();
392 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000393
schenney@chromium.org4da06ab2011-12-20 15:14:18 +0000394private:
reed@google.com27b90fa2013-03-08 18:44:01 +0000395 typedef skiagm::GM INHERITED;
schenney@chromium.org4da06ab2011-12-20 15:14:18 +0000396};
397
caryclark4693a172016-04-06 08:54:06 -0700398DEF_SIMPLE_GM(bug5099, canvas, 50, 50) {
399 SkPaint p;
400 p.setColor(SK_ColorRED);
401 p.setAntiAlias(true);
402 p.setStyle(SkPaint::kStroke_Style);
403 p.setStrokeWidth(10);
404
405 SkPath path;
406 path.moveTo(6, 27);
407 path.cubicTo(31.5f, 1.5f, 3.5f, 4.5f, 29, 29);
408 canvas->drawPath(path, p);
409}
410
Cary Clarkd4631982017-01-05 12:08:38 -0500411DEF_SIMPLE_GM(bug6083, canvas, 100, 50) {
Ben Wagner29380bd2017-10-09 14:43:00 -0400412 SkPaint p;
413 p.setColor(SK_ColorRED);
414 p.setAntiAlias(true);
415 p.setStyle(SkPaint::kStroke_Style);
416 p.setStrokeWidth(15);
417 canvas->translate(-500, -130);
418 SkPath path;
419 path.moveTo(500.988f, 155.200f);
420 path.lineTo(526.109f, 155.200f);
421 SkPoint p1 = { 526.109f, 155.200f };
422 SkPoint p2 = { 525.968f, 212.968f };
423 SkPoint p3 = { 526.109f, 241.840f };
424 path.cubicTo(p1, p2, p3);
425 canvas->drawPath(path, p);
426 canvas->translate(50, 0);
427 path.reset();
428 p2.set(525.968f, 213.172f);
429 path.moveTo(500.988f, 155.200f);
430 path.lineTo(526.109f, 155.200f);
431 path.cubicTo(p1, p2, p3);
432 canvas->drawPath(path, p);
Cary Clarkd4631982017-01-05 12:08:38 -0500433}
434
schenney@chromium.org4da06ab2011-12-20 15:14:18 +0000435//////////////////////////////////////////////////////////////////////////////
436
reed@google.com27b90fa2013-03-08 18:44:01 +0000437DEF_GM( return new CubicPathGM; )
438DEF_GM( return new CubicClosePathGM; )
reed@google.com22999c62013-05-23 19:30:48 +0000439DEF_GM( return new ClippedCubicGM; )
caryclark7d173402015-08-20 08:23:52 -0700440DEF_GM( return new ClippedCubic2GM; )