1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 11cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 12cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 15cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 17cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 18cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 19cb93a386Sopenharmony_ci#include "include/core/SkString.h" 20cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 21cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 22cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 23cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci// https://bug.skia.org/1316 shows that this cubic, when slightly clipped, creates big 26cb93a386Sopenharmony_ci// (incorrect) changes to its control points. 27cb93a386Sopenharmony_ciclass ClippedCubicGM : public skiagm::GM { 28cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("clippedcubic"); } 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci SkISize onISize() override { return {1240, 390}; } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 33cb93a386Sopenharmony_ci SkPath path; 34cb93a386Sopenharmony_ci path.moveTo(0, 0); 35cb93a386Sopenharmony_ci path.cubicTo(140, 150, 40, 10, 170, 150); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci SkPaint paint; 38cb93a386Sopenharmony_ci SkRect bounds = path.getBounds(); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci for (SkScalar dy = -1; dy <= 1; dy += 1) { 41cb93a386Sopenharmony_ci canvas->save(); 42cb93a386Sopenharmony_ci for (SkScalar dx = -1; dx <= 1; dx += 1) { 43cb93a386Sopenharmony_ci canvas->save(); 44cb93a386Sopenharmony_ci canvas->clipRect(bounds); 45cb93a386Sopenharmony_ci canvas->translate(dx, dy); 46cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 47cb93a386Sopenharmony_ci canvas->restore(); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci canvas->translate(bounds.width(), 0); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci canvas->restore(); 52cb93a386Sopenharmony_ci canvas->translate(0, bounds.height()); 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci}; 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciclass ClippedCubic2GM : public skiagm::GM { 59cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("clippedcubic2"); } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci SkISize onISize() override { return {1240, 390}; } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 64cb93a386Sopenharmony_ci canvas->save(); 65cb93a386Sopenharmony_ci canvas->translate(-2, 120); 66cb93a386Sopenharmony_ci drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 150)); 67cb93a386Sopenharmony_ci canvas->translate(0, 170); 68cb93a386Sopenharmony_ci drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 100)); 69cb93a386Sopenharmony_ci canvas->translate(0, 170); 70cb93a386Sopenharmony_ci drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 30, 150)); 71cb93a386Sopenharmony_ci canvas->translate(0, 170); 72cb93a386Sopenharmony_ci drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 10, 150)); 73cb93a386Sopenharmony_ci canvas->restore(); 74cb93a386Sopenharmony_ci canvas->save(); 75cb93a386Sopenharmony_ci canvas->translate(20, -2); 76cb93a386Sopenharmony_ci drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 80)); 77cb93a386Sopenharmony_ci canvas->translate(170, 0); 78cb93a386Sopenharmony_ci drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 100, 80)); 79cb93a386Sopenharmony_ci canvas->translate(170, 0); 80cb93a386Sopenharmony_ci drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 30)); 81cb93a386Sopenharmony_ci canvas->translate(170, 0); 82cb93a386Sopenharmony_ci drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 10)); 83cb93a386Sopenharmony_ci canvas->restore(); 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci void drawOne(SkCanvas* canvas, const SkPath& path, const SkRect& clip) { 87cb93a386Sopenharmony_ci SkPaint framePaint, fillPaint; 88cb93a386Sopenharmony_ci framePaint.setStyle(SkPaint::kStroke_Style); 89cb93a386Sopenharmony_ci canvas->drawRect(clip, framePaint); 90cb93a386Sopenharmony_ci canvas->drawPath(path, framePaint); 91cb93a386Sopenharmony_ci canvas->save(); 92cb93a386Sopenharmony_ci canvas->clipRect(clip); 93cb93a386Sopenharmony_ci canvas->drawPath(path, fillPaint); 94cb93a386Sopenharmony_ci canvas->restore(); 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 98cb93a386Sopenharmony_ci fPath.moveTo(69.7030518991886f, 0); 99cb93a386Sopenharmony_ci fPath.cubicTo( 69.7030518991886f, 21.831149999999997f, 100cb93a386Sopenharmony_ci 58.08369508178456f, 43.66448333333333f, 34.8449814469765f, 65.5f); 101cb93a386Sopenharmony_ci fPath.cubicTo( 11.608591683531916f, 87.33115f, -0.010765133872116195f, 109.16448333333332f, 102cb93a386Sopenharmony_ci -0.013089005235602302f, 131); 103cb93a386Sopenharmony_ci fPath.close(); 104cb93a386Sopenharmony_ci fFlipped = fPath; 105cb93a386Sopenharmony_ci SkMatrix matrix; 106cb93a386Sopenharmony_ci matrix.reset(); 107cb93a386Sopenharmony_ci matrix.setScaleX(0); 108cb93a386Sopenharmony_ci matrix.setScaleY(0); 109cb93a386Sopenharmony_ci matrix.setSkewX(1); 110cb93a386Sopenharmony_ci matrix.setSkewY(1); 111cb93a386Sopenharmony_ci fFlipped.transform(matrix); 112cb93a386Sopenharmony_ci } 113cb93a386Sopenharmony_ci 114cb93a386Sopenharmony_ci SkPath fPath; 115cb93a386Sopenharmony_ci SkPath fFlipped; 116cb93a386Sopenharmony_ciprivate: 117cb93a386Sopenharmony_ci using INHERITED = skiagm::GM; 118cb93a386Sopenharmony_ci}; 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ciclass CubicPathGM : public skiagm::GM { 122cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("cubicpath"); } 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci SkISize onISize() override { return {1240, 390}; } 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_ci void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 127cb93a386Sopenharmony_ci const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 128cb93a386Sopenharmony_ci SkPaint::Style style, SkPathFillType fill, 129cb93a386Sopenharmony_ci SkScalar strokeWidth) { 130cb93a386Sopenharmony_ci path.setFillType(fill); 131cb93a386Sopenharmony_ci SkPaint paint; 132cb93a386Sopenharmony_ci paint.setStrokeCap(cap); 133cb93a386Sopenharmony_ci paint.setStrokeWidth(strokeWidth); 134cb93a386Sopenharmony_ci paint.setStrokeJoin(join); 135cb93a386Sopenharmony_ci paint.setColor(color); 136cb93a386Sopenharmony_ci paint.setStyle(style); 137cb93a386Sopenharmony_ci canvas->save(); 138cb93a386Sopenharmony_ci canvas->clipRect(clip); 139cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 140cb93a386Sopenharmony_ci canvas->restore(); 141cb93a386Sopenharmony_ci } 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 144cb93a386Sopenharmony_ci struct FillAndName { 145cb93a386Sopenharmony_ci SkPathFillType fFill; 146cb93a386Sopenharmony_ci const char* fName; 147cb93a386Sopenharmony_ci }; 148cb93a386Sopenharmony_ci constexpr FillAndName gFills[] = { 149cb93a386Sopenharmony_ci {SkPathFillType::kWinding, "Winding"}, 150cb93a386Sopenharmony_ci {SkPathFillType::kEvenOdd, "Even / Odd"}, 151cb93a386Sopenharmony_ci {SkPathFillType::kInverseWinding, "Inverse Winding"}, 152cb93a386Sopenharmony_ci {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 153cb93a386Sopenharmony_ci }; 154cb93a386Sopenharmony_ci struct StyleAndName { 155cb93a386Sopenharmony_ci SkPaint::Style fStyle; 156cb93a386Sopenharmony_ci const char* fName; 157cb93a386Sopenharmony_ci }; 158cb93a386Sopenharmony_ci constexpr StyleAndName gStyles[] = { 159cb93a386Sopenharmony_ci {SkPaint::kFill_Style, "Fill"}, 160cb93a386Sopenharmony_ci {SkPaint::kStroke_Style, "Stroke"}, 161cb93a386Sopenharmony_ci {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 162cb93a386Sopenharmony_ci }; 163cb93a386Sopenharmony_ci struct CapAndName { 164cb93a386Sopenharmony_ci SkPaint::Cap fCap; 165cb93a386Sopenharmony_ci SkPaint::Join fJoin; 166cb93a386Sopenharmony_ci const char* fName; 167cb93a386Sopenharmony_ci }; 168cb93a386Sopenharmony_ci constexpr CapAndName gCaps[] = { 169cb93a386Sopenharmony_ci {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 170cb93a386Sopenharmony_ci {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 171cb93a386Sopenharmony_ci {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 172cb93a386Sopenharmony_ci }; 173cb93a386Sopenharmony_ci struct PathAndName { 174cb93a386Sopenharmony_ci SkPath fPath; 175cb93a386Sopenharmony_ci const char* fName; 176cb93a386Sopenharmony_ci }; 177cb93a386Sopenharmony_ci PathAndName path; 178cb93a386Sopenharmony_ci path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 179cb93a386Sopenharmony_ci path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 180cb93a386Sopenharmony_ci 60*SK_Scalar1, 20*SK_Scalar1, 181cb93a386Sopenharmony_ci 75*SK_Scalar1, 10*SK_Scalar1); 182cb93a386Sopenharmony_ci path.fName = "moveTo-cubic"; 183cb93a386Sopenharmony_ci 184cb93a386Sopenharmony_ci SkPaint titlePaint; 185cb93a386Sopenharmony_ci titlePaint.setColor(SK_ColorBLACK); 186cb93a386Sopenharmony_ci titlePaint.setAntiAlias(true); 187cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), 15); 188cb93a386Sopenharmony_ci const char title[] = "Cubic Drawn Into Rectangle Clips With " 189cb93a386Sopenharmony_ci "Indicated Style, Fill and Linecaps, with stroke width 10"; 190cb93a386Sopenharmony_ci canvas->drawString(title, 20, 20, font, titlePaint); 191cb93a386Sopenharmony_ci 192cb93a386Sopenharmony_ci SkRandom rand; 193cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 194cb93a386Sopenharmony_ci canvas->save(); 195cb93a386Sopenharmony_ci canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 196cb93a386Sopenharmony_ci canvas->save(); 197cb93a386Sopenharmony_ci for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) { 198cb93a386Sopenharmony_ci if (0 < cap) { 199cb93a386Sopenharmony_ci canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0); 200cb93a386Sopenharmony_ci } 201cb93a386Sopenharmony_ci canvas->save(); 202cb93a386Sopenharmony_ci for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 203cb93a386Sopenharmony_ci if (0 < fill) { 204cb93a386Sopenharmony_ci canvas->translate(0, rect.height() + 40 * SK_Scalar1); 205cb93a386Sopenharmony_ci } 206cb93a386Sopenharmony_ci canvas->save(); 207cb93a386Sopenharmony_ci for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 208cb93a386Sopenharmony_ci if (0 < style) { 209cb93a386Sopenharmony_ci canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 210cb93a386Sopenharmony_ci } 211cb93a386Sopenharmony_ci 212cb93a386Sopenharmony_ci SkColor color = 0xff007000; 213cb93a386Sopenharmony_ci this->drawPath(path.fPath, canvas, color, rect, 214cb93a386Sopenharmony_ci gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 215cb93a386Sopenharmony_ci gFills[fill].fFill, SK_Scalar1*10); 216cb93a386Sopenharmony_ci 217cb93a386Sopenharmony_ci SkPaint rectPaint; 218cb93a386Sopenharmony_ci rectPaint.setColor(SK_ColorBLACK); 219cb93a386Sopenharmony_ci rectPaint.setStyle(SkPaint::kStroke_Style); 220cb93a386Sopenharmony_ci rectPaint.setStrokeWidth(-1); 221cb93a386Sopenharmony_ci rectPaint.setAntiAlias(true); 222cb93a386Sopenharmony_ci canvas->drawRect(rect, rectPaint); 223cb93a386Sopenharmony_ci 224cb93a386Sopenharmony_ci SkPaint labelPaint; 225cb93a386Sopenharmony_ci labelPaint.setColor(color); 226cb93a386Sopenharmony_ci font.setSize(10); 227cb93a386Sopenharmony_ci canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint); 228cb93a386Sopenharmony_ci canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint); 229cb93a386Sopenharmony_ci canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint); 230cb93a386Sopenharmony_ci } 231cb93a386Sopenharmony_ci canvas->restore(); 232cb93a386Sopenharmony_ci } 233cb93a386Sopenharmony_ci canvas->restore(); 234cb93a386Sopenharmony_ci } 235cb93a386Sopenharmony_ci canvas->restore(); 236cb93a386Sopenharmony_ci canvas->restore(); 237cb93a386Sopenharmony_ci } 238cb93a386Sopenharmony_ci}; 239cb93a386Sopenharmony_ci 240cb93a386Sopenharmony_ciclass CubicClosePathGM : public skiagm::GM { 241cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("cubicclosepath"); } 242cb93a386Sopenharmony_ci 243cb93a386Sopenharmony_ci SkISize onISize() override { return {1240, 390}; } 244cb93a386Sopenharmony_ci 245cb93a386Sopenharmony_ci void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 246cb93a386Sopenharmony_ci const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 247cb93a386Sopenharmony_ci SkPaint::Style style, SkPathFillType fill, 248cb93a386Sopenharmony_ci SkScalar strokeWidth) { 249cb93a386Sopenharmony_ci path.setFillType(fill); 250cb93a386Sopenharmony_ci SkPaint paint; 251cb93a386Sopenharmony_ci paint.setStrokeCap(cap); 252cb93a386Sopenharmony_ci paint.setStrokeWidth(strokeWidth); 253cb93a386Sopenharmony_ci paint.setStrokeJoin(join); 254cb93a386Sopenharmony_ci paint.setColor(color); 255cb93a386Sopenharmony_ci paint.setStyle(style); 256cb93a386Sopenharmony_ci canvas->save(); 257cb93a386Sopenharmony_ci canvas->clipRect(clip); 258cb93a386Sopenharmony_ci canvas->drawPath(path, paint); 259cb93a386Sopenharmony_ci canvas->restore(); 260cb93a386Sopenharmony_ci } 261cb93a386Sopenharmony_ci 262cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 263cb93a386Sopenharmony_ci struct FillAndName { 264cb93a386Sopenharmony_ci SkPathFillType fFill; 265cb93a386Sopenharmony_ci const char* fName; 266cb93a386Sopenharmony_ci }; 267cb93a386Sopenharmony_ci constexpr FillAndName gFills[] = { 268cb93a386Sopenharmony_ci {SkPathFillType::kWinding, "Winding"}, 269cb93a386Sopenharmony_ci {SkPathFillType::kEvenOdd, "Even / Odd"}, 270cb93a386Sopenharmony_ci {SkPathFillType::kInverseWinding, "Inverse Winding"}, 271cb93a386Sopenharmony_ci {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 272cb93a386Sopenharmony_ci }; 273cb93a386Sopenharmony_ci struct StyleAndName { 274cb93a386Sopenharmony_ci SkPaint::Style fStyle; 275cb93a386Sopenharmony_ci const char* fName; 276cb93a386Sopenharmony_ci }; 277cb93a386Sopenharmony_ci constexpr StyleAndName gStyles[] = { 278cb93a386Sopenharmony_ci {SkPaint::kFill_Style, "Fill"}, 279cb93a386Sopenharmony_ci {SkPaint::kStroke_Style, "Stroke"}, 280cb93a386Sopenharmony_ci {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 281cb93a386Sopenharmony_ci }; 282cb93a386Sopenharmony_ci struct CapAndName { 283cb93a386Sopenharmony_ci SkPaint::Cap fCap; 284cb93a386Sopenharmony_ci SkPaint::Join fJoin; 285cb93a386Sopenharmony_ci const char* fName; 286cb93a386Sopenharmony_ci }; 287cb93a386Sopenharmony_ci constexpr CapAndName gCaps[] = { 288cb93a386Sopenharmony_ci {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 289cb93a386Sopenharmony_ci {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 290cb93a386Sopenharmony_ci {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 291cb93a386Sopenharmony_ci }; 292cb93a386Sopenharmony_ci struct PathAndName { 293cb93a386Sopenharmony_ci SkPath fPath; 294cb93a386Sopenharmony_ci const char* fName; 295cb93a386Sopenharmony_ci }; 296cb93a386Sopenharmony_ci PathAndName path; 297cb93a386Sopenharmony_ci path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 298cb93a386Sopenharmony_ci path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 299cb93a386Sopenharmony_ci 60*SK_Scalar1, 20*SK_Scalar1, 300cb93a386Sopenharmony_ci 75*SK_Scalar1, 10*SK_Scalar1); 301cb93a386Sopenharmony_ci path.fPath.close(); 302cb93a386Sopenharmony_ci path.fName = "moveTo-cubic-close"; 303cb93a386Sopenharmony_ci 304cb93a386Sopenharmony_ci SkPaint titlePaint; 305cb93a386Sopenharmony_ci titlePaint.setColor(SK_ColorBLACK); 306cb93a386Sopenharmony_ci titlePaint.setAntiAlias(true); 307cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), 15); 308cb93a386Sopenharmony_ci const char title[] = "Cubic Closed Drawn Into Rectangle Clips With " 309cb93a386Sopenharmony_ci "Indicated Style, Fill and Linecaps, with stroke width 10"; 310cb93a386Sopenharmony_ci canvas->drawString(title, 20, 20, font, titlePaint); 311cb93a386Sopenharmony_ci 312cb93a386Sopenharmony_ci SkRandom rand; 313cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 314cb93a386Sopenharmony_ci canvas->save(); 315cb93a386Sopenharmony_ci canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 316cb93a386Sopenharmony_ci canvas->save(); 317cb93a386Sopenharmony_ci for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) { 318cb93a386Sopenharmony_ci if (0 < cap) { 319cb93a386Sopenharmony_ci canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0); 320cb93a386Sopenharmony_ci } 321cb93a386Sopenharmony_ci canvas->save(); 322cb93a386Sopenharmony_ci for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 323cb93a386Sopenharmony_ci if (0 < fill) { 324cb93a386Sopenharmony_ci canvas->translate(0, rect.height() + 40 * SK_Scalar1); 325cb93a386Sopenharmony_ci } 326cb93a386Sopenharmony_ci canvas->save(); 327cb93a386Sopenharmony_ci for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 328cb93a386Sopenharmony_ci if (0 < style) { 329cb93a386Sopenharmony_ci canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 330cb93a386Sopenharmony_ci } 331cb93a386Sopenharmony_ci 332cb93a386Sopenharmony_ci SkColor color = 0xff007000; 333cb93a386Sopenharmony_ci this->drawPath(path.fPath, canvas, color, rect, 334cb93a386Sopenharmony_ci gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 335cb93a386Sopenharmony_ci gFills[fill].fFill, SK_Scalar1*10); 336cb93a386Sopenharmony_ci 337cb93a386Sopenharmony_ci SkPaint rectPaint; 338cb93a386Sopenharmony_ci rectPaint.setColor(SK_ColorBLACK); 339cb93a386Sopenharmony_ci rectPaint.setStyle(SkPaint::kStroke_Style); 340cb93a386Sopenharmony_ci rectPaint.setStrokeWidth(-1); 341cb93a386Sopenharmony_ci rectPaint.setAntiAlias(true); 342cb93a386Sopenharmony_ci canvas->drawRect(rect, rectPaint); 343cb93a386Sopenharmony_ci 344cb93a386Sopenharmony_ci SkPaint labelPaint; 345cb93a386Sopenharmony_ci labelPaint.setColor(color); 346cb93a386Sopenharmony_ci labelPaint.setAntiAlias(true); 347cb93a386Sopenharmony_ci font.setSize(10); 348cb93a386Sopenharmony_ci canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint); 349cb93a386Sopenharmony_ci canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint); 350cb93a386Sopenharmony_ci canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint); 351cb93a386Sopenharmony_ci } 352cb93a386Sopenharmony_ci canvas->restore(); 353cb93a386Sopenharmony_ci } 354cb93a386Sopenharmony_ci canvas->restore(); 355cb93a386Sopenharmony_ci } 356cb93a386Sopenharmony_ci canvas->restore(); 357cb93a386Sopenharmony_ci canvas->restore(); 358cb93a386Sopenharmony_ci } 359cb93a386Sopenharmony_ci}; 360cb93a386Sopenharmony_ci 361cb93a386Sopenharmony_ciDEF_SIMPLE_GM(bug5099, canvas, 50, 50) { 362cb93a386Sopenharmony_ci SkPaint p; 363cb93a386Sopenharmony_ci p.setColor(SK_ColorRED); 364cb93a386Sopenharmony_ci p.setAntiAlias(true); 365cb93a386Sopenharmony_ci p.setStyle(SkPaint::kStroke_Style); 366cb93a386Sopenharmony_ci p.setStrokeWidth(10); 367cb93a386Sopenharmony_ci 368cb93a386Sopenharmony_ci SkPath path; 369cb93a386Sopenharmony_ci path.moveTo(6, 27); 370cb93a386Sopenharmony_ci path.cubicTo(31.5f, 1.5f, 3.5f, 4.5f, 29, 29); 371cb93a386Sopenharmony_ci canvas->drawPath(path, p); 372cb93a386Sopenharmony_ci} 373cb93a386Sopenharmony_ci 374cb93a386Sopenharmony_ciDEF_SIMPLE_GM(bug6083, canvas, 100, 50) { 375cb93a386Sopenharmony_ci SkPaint p; 376cb93a386Sopenharmony_ci p.setColor(SK_ColorRED); 377cb93a386Sopenharmony_ci p.setAntiAlias(true); 378cb93a386Sopenharmony_ci p.setStyle(SkPaint::kStroke_Style); 379cb93a386Sopenharmony_ci p.setStrokeWidth(15); 380cb93a386Sopenharmony_ci canvas->translate(-500, -130); 381cb93a386Sopenharmony_ci SkPath path; 382cb93a386Sopenharmony_ci path.moveTo(500.988f, 155.200f); 383cb93a386Sopenharmony_ci path.lineTo(526.109f, 155.200f); 384cb93a386Sopenharmony_ci SkPoint p1 = { 526.109f, 155.200f }; 385cb93a386Sopenharmony_ci SkPoint p2 = { 525.968f, 212.968f }; 386cb93a386Sopenharmony_ci SkPoint p3 = { 526.109f, 241.840f }; 387cb93a386Sopenharmony_ci path.cubicTo(p1, p2, p3); 388cb93a386Sopenharmony_ci canvas->drawPath(path, p); 389cb93a386Sopenharmony_ci canvas->translate(50, 0); 390cb93a386Sopenharmony_ci path.reset(); 391cb93a386Sopenharmony_ci p2.set(525.968f, 213.172f); 392cb93a386Sopenharmony_ci path.moveTo(500.988f, 155.200f); 393cb93a386Sopenharmony_ci path.lineTo(526.109f, 155.200f); 394cb93a386Sopenharmony_ci path.cubicTo(p1, p2, p3); 395cb93a386Sopenharmony_ci canvas->drawPath(path, p); 396cb93a386Sopenharmony_ci} 397cb93a386Sopenharmony_ci 398cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 399cb93a386Sopenharmony_ci 400cb93a386Sopenharmony_ciDEF_GM( return new CubicPathGM; ) 401cb93a386Sopenharmony_ciDEF_GM( return new CubicClosePathGM; ) 402cb93a386Sopenharmony_ciDEF_GM( return new ClippedCubicGM; ) 403cb93a386Sopenharmony_ciDEF_GM( return new ClippedCubic2GM; ) 404