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/SkFont.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker // https://bug.skia.org/1316 shows that this cubic, when slightly clipped, creates big 28*c8dee2aaSAndroid Build Coastguard Worker // (incorrect) changes to its control points. 29*c8dee2aaSAndroid Build Coastguard Worker class ClippedCubicGM : public skiagm::GM { getName() const30*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("clippedcubic"); } 31*c8dee2aaSAndroid Build Coastguard Worker getISize()32*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1240, 390}; } 33*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)34*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 35*c8dee2aaSAndroid Build Coastguard Worker SkPath path; 36*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(0, 0); 37*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(140, 150, 40, 10, 170, 150); 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 40*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds = path.getBounds(); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker for (SkScalar dy = -1; dy <= 1; dy += 1) { 43*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 44*c8dee2aaSAndroid Build Coastguard Worker for (SkScalar dx = -1; dx <= 1; dx += 1) { 45*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 46*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(bounds); 47*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(dx, dy); 48*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 49*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(bounds.width(), 0); 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 54*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, bounds.height()); 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker }; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker class ClippedCubic2GM : public skiagm::GM { getName() const61*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("clippedcubic2"); } 62*c8dee2aaSAndroid Build Coastguard Worker getISize()63*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1240, 390}; } 64*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)65*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 66*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 67*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-2, 120); 68*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 150)); 69*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 170); 70*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 80, 100)); 71*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 170); 72*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 30, 150)); 73*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 170); 74*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fPath, SkRect::MakeLTRB(0, 0, 10, 150)); 75*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 76*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 77*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(20, -2); 78*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 80)); 79*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(170, 0); 80*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 100, 80)); 81*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(170, 0); 82*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 30)); 83*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(170, 0); 84*c8dee2aaSAndroid Build Coastguard Worker drawOne(canvas, fFlipped, SkRect::MakeLTRB(0, 0, 150, 10)); 85*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker drawOne(SkCanvas * canvas,const SkPath & path,const SkRect & clip)88*c8dee2aaSAndroid Build Coastguard Worker void drawOne(SkCanvas* canvas, const SkPath& path, const SkRect& clip) { 89*c8dee2aaSAndroid Build Coastguard Worker SkPaint framePaint, fillPaint; 90*c8dee2aaSAndroid Build Coastguard Worker framePaint.setStyle(SkPaint::kStroke_Style); 91*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(clip, framePaint); 92*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, framePaint); 93*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 94*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 95*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, fillPaint); 96*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker onOnceBeforeDraw()99*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 100*c8dee2aaSAndroid Build Coastguard Worker fPath.moveTo(69.7030518991886f, 0); 101*c8dee2aaSAndroid Build Coastguard Worker fPath.cubicTo( 69.7030518991886f, 21.831149999999997f, 102*c8dee2aaSAndroid Build Coastguard Worker 58.08369508178456f, 43.66448333333333f, 34.8449814469765f, 65.5f); 103*c8dee2aaSAndroid Build Coastguard Worker fPath.cubicTo( 11.608591683531916f, 87.33115f, -0.010765133872116195f, 109.16448333333332f, 104*c8dee2aaSAndroid Build Coastguard Worker -0.013089005235602302f, 131); 105*c8dee2aaSAndroid Build Coastguard Worker fPath.close(); 106*c8dee2aaSAndroid Build Coastguard Worker fFlipped = fPath; 107*c8dee2aaSAndroid Build Coastguard Worker SkMatrix matrix; 108*c8dee2aaSAndroid Build Coastguard Worker matrix.reset(); 109*c8dee2aaSAndroid Build Coastguard Worker matrix.setScaleX(0); 110*c8dee2aaSAndroid Build Coastguard Worker matrix.setScaleY(0); 111*c8dee2aaSAndroid Build Coastguard Worker matrix.setSkewX(1); 112*c8dee2aaSAndroid Build Coastguard Worker matrix.setSkewY(1); 113*c8dee2aaSAndroid Build Coastguard Worker fFlipped.transform(matrix); 114*c8dee2aaSAndroid Build Coastguard Worker } 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 117*c8dee2aaSAndroid Build Coastguard Worker SkPath fFlipped; 118*c8dee2aaSAndroid Build Coastguard Worker private: 119*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM; 120*c8dee2aaSAndroid Build Coastguard Worker }; 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker class CubicPathGM : public skiagm::GM { getName() const123*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("cubicpath"); } 124*c8dee2aaSAndroid Build Coastguard Worker getISize()125*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1240, 390}; } 126*c8dee2aaSAndroid Build Coastguard Worker drawPath(SkPath & path,SkCanvas * canvas,SkColor color,const SkRect & clip,SkPaint::Cap cap,SkPaint::Join join,SkPaint::Style style,SkPathFillType fill,SkScalar strokeWidth)127*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 128*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 129*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 130*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 131*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 132*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 133*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 134*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 135*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 136*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 137*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 138*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 139*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 140*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 141*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 142*c8dee2aaSAndroid Build Coastguard Worker } 143*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)144*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 145*c8dee2aaSAndroid Build Coastguard Worker struct FillAndName { 146*c8dee2aaSAndroid Build Coastguard Worker SkPathFillType fFill; 147*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 148*c8dee2aaSAndroid Build Coastguard Worker }; 149*c8dee2aaSAndroid Build Coastguard Worker constexpr FillAndName gFills[] = { 150*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kWinding, "Winding"}, 151*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kEvenOdd, "Even / Odd"}, 152*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseWinding, "Inverse Winding"}, 153*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 154*c8dee2aaSAndroid Build Coastguard Worker }; 155*c8dee2aaSAndroid Build Coastguard Worker struct StyleAndName { 156*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 157*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 158*c8dee2aaSAndroid Build Coastguard Worker }; 159*c8dee2aaSAndroid Build Coastguard Worker constexpr StyleAndName gStyles[] = { 160*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kFill_Style, "Fill"}, 161*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStroke_Style, "Stroke"}, 162*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 163*c8dee2aaSAndroid Build Coastguard Worker }; 164*c8dee2aaSAndroid Build Coastguard Worker struct CapAndName { 165*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Cap fCap; 166*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 167*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 168*c8dee2aaSAndroid Build Coastguard Worker }; 169*c8dee2aaSAndroid Build Coastguard Worker constexpr CapAndName gCaps[] = { 170*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 171*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 172*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 173*c8dee2aaSAndroid Build Coastguard Worker }; 174*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 175*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 176*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 177*c8dee2aaSAndroid Build Coastguard Worker }; 178*c8dee2aaSAndroid Build Coastguard Worker PathAndName path; 179*c8dee2aaSAndroid Build Coastguard Worker path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 180*c8dee2aaSAndroid Build Coastguard Worker path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 181*c8dee2aaSAndroid Build Coastguard Worker 60*SK_Scalar1, 20*SK_Scalar1, 182*c8dee2aaSAndroid Build Coastguard Worker 75*SK_Scalar1, 10*SK_Scalar1); 183*c8dee2aaSAndroid Build Coastguard Worker path.fName = "moveTo-cubic"; 184*c8dee2aaSAndroid Build Coastguard Worker 185*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 186*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setColor(SK_ColorBLACK); 187*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setAntiAlias(true); 188*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 189*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Cubic Drawn Into Rectangle Clips With " 190*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, with stroke width 10"; 191*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20, 20, font, titlePaint); 192*c8dee2aaSAndroid Build Coastguard Worker 193*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 194*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 195*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 196*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 197*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 198*c8dee2aaSAndroid Build Coastguard Worker for (size_t cap = 0; cap < std::size(gCaps); ++cap) { 199*c8dee2aaSAndroid Build Coastguard Worker if (0 < cap) { 200*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((rect.width() + 40 * SK_Scalar1) * std::size(gStyles), 0); 201*c8dee2aaSAndroid Build Coastguard Worker } 202*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 203*c8dee2aaSAndroid Build Coastguard Worker for (size_t fill = 0; fill < std::size(gFills); ++fill) { 204*c8dee2aaSAndroid Build Coastguard Worker if (0 < fill) { 205*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 40 * SK_Scalar1); 206*c8dee2aaSAndroid Build Coastguard Worker } 207*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 208*c8dee2aaSAndroid Build Coastguard Worker for (size_t style = 0; style < std::size(gStyles); ++style) { 209*c8dee2aaSAndroid Build Coastguard Worker if (0 < style) { 210*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 211*c8dee2aaSAndroid Build Coastguard Worker } 212*c8dee2aaSAndroid Build Coastguard Worker 213*c8dee2aaSAndroid Build Coastguard Worker SkColor color = 0xff007000; 214*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.fPath, canvas, color, rect, 215*c8dee2aaSAndroid Build Coastguard Worker gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 216*c8dee2aaSAndroid Build Coastguard Worker gFills[fill].fFill, SK_Scalar1*10); 217*c8dee2aaSAndroid Build Coastguard Worker 218*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 219*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 220*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 221*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 222*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 223*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 226*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 227*c8dee2aaSAndroid Build Coastguard Worker font.setSize(10); 228*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint); 229*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint); 230*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint); 231*c8dee2aaSAndroid Build Coastguard Worker } 232*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 233*c8dee2aaSAndroid Build Coastguard Worker } 234*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 235*c8dee2aaSAndroid Build Coastguard Worker } 236*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 237*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 238*c8dee2aaSAndroid Build Coastguard Worker } 239*c8dee2aaSAndroid Build Coastguard Worker }; 240*c8dee2aaSAndroid Build Coastguard Worker 241*c8dee2aaSAndroid Build Coastguard Worker class CubicClosePathGM : public skiagm::GM { getName() const242*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("cubicclosepath"); } 243*c8dee2aaSAndroid Build Coastguard Worker getISize()244*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1240, 390}; } 245*c8dee2aaSAndroid Build Coastguard Worker drawPath(SkPath & path,SkCanvas * canvas,SkColor color,const SkRect & clip,SkPaint::Cap cap,SkPaint::Join join,SkPaint::Style style,SkPathFillType fill,SkScalar strokeWidth)246*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 247*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 248*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 249*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 250*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 251*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 252*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 253*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 254*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 255*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 256*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 257*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 258*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 259*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 260*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 261*c8dee2aaSAndroid Build Coastguard Worker } 262*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)263*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 264*c8dee2aaSAndroid Build Coastguard Worker struct FillAndName { 265*c8dee2aaSAndroid Build Coastguard Worker SkPathFillType fFill; 266*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 267*c8dee2aaSAndroid Build Coastguard Worker }; 268*c8dee2aaSAndroid Build Coastguard Worker constexpr FillAndName gFills[] = { 269*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kWinding, "Winding"}, 270*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kEvenOdd, "Even / Odd"}, 271*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseWinding, "Inverse Winding"}, 272*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 273*c8dee2aaSAndroid Build Coastguard Worker }; 274*c8dee2aaSAndroid Build Coastguard Worker struct StyleAndName { 275*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 276*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 277*c8dee2aaSAndroid Build Coastguard Worker }; 278*c8dee2aaSAndroid Build Coastguard Worker constexpr StyleAndName gStyles[] = { 279*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kFill_Style, "Fill"}, 280*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStroke_Style, "Stroke"}, 281*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 282*c8dee2aaSAndroid Build Coastguard Worker }; 283*c8dee2aaSAndroid Build Coastguard Worker struct CapAndName { 284*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Cap fCap; 285*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 286*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 287*c8dee2aaSAndroid Build Coastguard Worker }; 288*c8dee2aaSAndroid Build Coastguard Worker constexpr CapAndName gCaps[] = { 289*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 290*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 291*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 292*c8dee2aaSAndroid Build Coastguard Worker }; 293*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 294*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 295*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 296*c8dee2aaSAndroid Build Coastguard Worker }; 297*c8dee2aaSAndroid Build Coastguard Worker PathAndName path; 298*c8dee2aaSAndroid Build Coastguard Worker path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 299*c8dee2aaSAndroid Build Coastguard Worker path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 300*c8dee2aaSAndroid Build Coastguard Worker 60*SK_Scalar1, 20*SK_Scalar1, 301*c8dee2aaSAndroid Build Coastguard Worker 75*SK_Scalar1, 10*SK_Scalar1); 302*c8dee2aaSAndroid Build Coastguard Worker path.fPath.close(); 303*c8dee2aaSAndroid Build Coastguard Worker path.fName = "moveTo-cubic-close"; 304*c8dee2aaSAndroid Build Coastguard Worker 305*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 306*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setColor(SK_ColorBLACK); 307*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setAntiAlias(true); 308*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 309*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Cubic Closed Drawn Into Rectangle Clips With " 310*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, with stroke width 10"; 311*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20, 20, font, titlePaint); 312*c8dee2aaSAndroid Build Coastguard Worker 313*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 314*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 315*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 316*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 317*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 318*c8dee2aaSAndroid Build Coastguard Worker for (size_t cap = 0; cap < std::size(gCaps); ++cap) { 319*c8dee2aaSAndroid Build Coastguard Worker if (0 < cap) { 320*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((rect.width() + 40 * SK_Scalar1) * std::size(gStyles), 0); 321*c8dee2aaSAndroid Build Coastguard Worker } 322*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 323*c8dee2aaSAndroid Build Coastguard Worker for (size_t fill = 0; fill < std::size(gFills); ++fill) { 324*c8dee2aaSAndroid Build Coastguard Worker if (0 < fill) { 325*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 40 * SK_Scalar1); 326*c8dee2aaSAndroid Build Coastguard Worker } 327*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 328*c8dee2aaSAndroid Build Coastguard Worker for (size_t style = 0; style < std::size(gStyles); ++style) { 329*c8dee2aaSAndroid Build Coastguard Worker if (0 < style) { 330*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 331*c8dee2aaSAndroid Build Coastguard Worker } 332*c8dee2aaSAndroid Build Coastguard Worker 333*c8dee2aaSAndroid Build Coastguard Worker SkColor color = 0xff007000; 334*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.fPath, canvas, color, rect, 335*c8dee2aaSAndroid Build Coastguard Worker gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 336*c8dee2aaSAndroid Build Coastguard Worker gFills[fill].fFill, SK_Scalar1*10); 337*c8dee2aaSAndroid Build Coastguard Worker 338*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 339*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 340*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 341*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 342*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 343*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 344*c8dee2aaSAndroid Build Coastguard Worker 345*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 346*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 347*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setAntiAlias(true); 348*c8dee2aaSAndroid Build Coastguard Worker font.setSize(10); 349*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint); 350*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint); 351*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint); 352*c8dee2aaSAndroid Build Coastguard Worker } 353*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 354*c8dee2aaSAndroid Build Coastguard Worker } 355*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 356*c8dee2aaSAndroid Build Coastguard Worker } 357*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 358*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 359*c8dee2aaSAndroid Build Coastguard Worker } 360*c8dee2aaSAndroid Build Coastguard Worker }; 361*c8dee2aaSAndroid Build Coastguard Worker 362*c8dee2aaSAndroid Build Coastguard Worker class CubicPathShaderGM : public skiagm::GM { getName() const363*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("cubicpath_shader"); } 364*c8dee2aaSAndroid Build Coastguard Worker getISize()365*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1240, 390}; } 366*c8dee2aaSAndroid Build Coastguard Worker drawPath(SkPath & path,SkCanvas * canvas,const SkRect & clip,SkPaint::Cap cap,SkPaint::Join join,SkPaint::Style style,SkPathFillType fill,SkScalar strokeWidth)367*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath& path,SkCanvas* canvas, 368*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 369*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 370*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 371*c8dee2aaSAndroid Build Coastguard Worker const SkScalar s = 50.f; 372*c8dee2aaSAndroid Build Coastguard Worker const SkPoint kPts[] = { { 0, 0 }, { s, s } }; 373*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; 374*c8dee2aaSAndroid Build Coastguard Worker const SkColor kColors[] = {0x80F00080, 0xF0F08000, 0x800080F0 }; 375*c8dee2aaSAndroid Build Coastguard Worker 376*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 377*c8dee2aaSAndroid Build Coastguard Worker 378*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 379*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 380*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 381*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 382*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(SkGradientShader::MakeLinear(kPts, kColors, kPos, 383*c8dee2aaSAndroid Build Coastguard Worker std::size(kColors), SkTileMode::kClamp)); 384*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 385*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 386*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 387*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 388*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 389*c8dee2aaSAndroid Build Coastguard Worker } 390*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)391*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 392*c8dee2aaSAndroid Build Coastguard Worker struct FillAndName { 393*c8dee2aaSAndroid Build Coastguard Worker SkPathFillType fFill; 394*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 395*c8dee2aaSAndroid Build Coastguard Worker }; 396*c8dee2aaSAndroid Build Coastguard Worker constexpr FillAndName gFills[] = { 397*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kWinding, "Winding"}, 398*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kEvenOdd, "Even / Odd"}, 399*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseWinding, "Inverse Winding"}, 400*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 401*c8dee2aaSAndroid Build Coastguard Worker }; 402*c8dee2aaSAndroid Build Coastguard Worker struct StyleAndName { 403*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 404*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 405*c8dee2aaSAndroid Build Coastguard Worker }; 406*c8dee2aaSAndroid Build Coastguard Worker constexpr StyleAndName gStyles[] = { 407*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kFill_Style, "Fill"}, 408*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStroke_Style, "Stroke"}, 409*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 410*c8dee2aaSAndroid Build Coastguard Worker }; 411*c8dee2aaSAndroid Build Coastguard Worker struct CapAndName { 412*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Cap fCap; 413*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 414*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 415*c8dee2aaSAndroid Build Coastguard Worker }; 416*c8dee2aaSAndroid Build Coastguard Worker constexpr CapAndName gCaps[] = { 417*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 418*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 419*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 420*c8dee2aaSAndroid Build Coastguard Worker }; 421*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 422*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 423*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 424*c8dee2aaSAndroid Build Coastguard Worker }; 425*c8dee2aaSAndroid Build Coastguard Worker PathAndName path; 426*c8dee2aaSAndroid Build Coastguard Worker path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 427*c8dee2aaSAndroid Build Coastguard Worker path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 428*c8dee2aaSAndroid Build Coastguard Worker 60*SK_Scalar1, 20*SK_Scalar1, 429*c8dee2aaSAndroid Build Coastguard Worker 75*SK_Scalar1, 10*SK_Scalar1); 430*c8dee2aaSAndroid Build Coastguard Worker path.fName = "moveTo-cubic"; 431*c8dee2aaSAndroid Build Coastguard Worker 432*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 433*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setColor(SK_ColorBLACK); 434*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setAntiAlias(true); 435*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 436*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Cubic Drawn Into Rectangle Clips With " 437*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, with stroke width 10"; 438*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20, 20, font, titlePaint); 439*c8dee2aaSAndroid Build Coastguard Worker 440*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 441*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 442*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 443*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 444*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 445*c8dee2aaSAndroid Build Coastguard Worker for (size_t cap = 0; cap < std::size(gCaps); ++cap) { 446*c8dee2aaSAndroid Build Coastguard Worker if (0 < cap) { 447*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((rect.width() + 40 * SK_Scalar1) * std::size(gStyles), 0); 448*c8dee2aaSAndroid Build Coastguard Worker } 449*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 450*c8dee2aaSAndroid Build Coastguard Worker for (size_t fill = 0; fill < std::size(gFills); ++fill) { 451*c8dee2aaSAndroid Build Coastguard Worker if (0 < fill) { 452*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 40 * SK_Scalar1); 453*c8dee2aaSAndroid Build Coastguard Worker } 454*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 455*c8dee2aaSAndroid Build Coastguard Worker for (size_t style = 0; style < std::size(gStyles); ++style) { 456*c8dee2aaSAndroid Build Coastguard Worker if (0 < style) { 457*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 458*c8dee2aaSAndroid Build Coastguard Worker } 459*c8dee2aaSAndroid Build Coastguard Worker 460*c8dee2aaSAndroid Build Coastguard Worker SkColor color = 0xff007000; 461*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.fPath, canvas, rect, 462*c8dee2aaSAndroid Build Coastguard Worker gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 463*c8dee2aaSAndroid Build Coastguard Worker gFills[fill].fFill, SK_Scalar1*10); 464*c8dee2aaSAndroid Build Coastguard Worker 465*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 466*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 467*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 468*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 469*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 470*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 471*c8dee2aaSAndroid Build Coastguard Worker 472*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 473*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 474*c8dee2aaSAndroid Build Coastguard Worker font.setSize(10); 475*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gStyles[style].fName, 0, rect.height() + 12, font, labelPaint); 476*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gFills[fill].fName, 0, rect.height() + 24, font, labelPaint); 477*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36, font, labelPaint); 478*c8dee2aaSAndroid Build Coastguard Worker } 479*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 480*c8dee2aaSAndroid Build Coastguard Worker } 481*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 482*c8dee2aaSAndroid Build Coastguard Worker } 483*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 484*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 485*c8dee2aaSAndroid Build Coastguard Worker } 486*c8dee2aaSAndroid Build Coastguard Worker }; 487*c8dee2aaSAndroid Build Coastguard Worker 488*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(bug5099, canvas, 50, 50) { 489*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 490*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorRED); 491*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 492*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style); 493*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(10); 494*c8dee2aaSAndroid Build Coastguard Worker 495*c8dee2aaSAndroid Build Coastguard Worker SkPath path; 496*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(6, 27); 497*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(31.5f, 1.5f, 3.5f, 4.5f, 29, 29); 498*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p); 499*c8dee2aaSAndroid Build Coastguard Worker } 500*c8dee2aaSAndroid Build Coastguard Worker 501*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(bug6083, canvas, 100, 50) { 502*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 503*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorRED); 504*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 505*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style); 506*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(15); 507*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-500, -130); 508*c8dee2aaSAndroid Build Coastguard Worker SkPath path; 509*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(500.988f, 155.200f); 510*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(526.109f, 155.200f); 511*c8dee2aaSAndroid Build Coastguard Worker SkPoint p1 = { 526.109f, 155.200f }; 512*c8dee2aaSAndroid Build Coastguard Worker SkPoint p2 = { 525.968f, 212.968f }; 513*c8dee2aaSAndroid Build Coastguard Worker SkPoint p3 = { 526.109f, 241.840f }; 514*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(p1, p2, p3); 515*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p); 516*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(50, 0); 517*c8dee2aaSAndroid Build Coastguard Worker path.reset(); 518*c8dee2aaSAndroid Build Coastguard Worker p2.set(525.968f, 213.172f); 519*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(500.988f, 155.200f); 520*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(526.109f, 155.200f); 521*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(p1, p2, p3); 522*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p); 523*c8dee2aaSAndroid Build Coastguard Worker } 524*c8dee2aaSAndroid Build Coastguard Worker 525*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 526*c8dee2aaSAndroid Build Coastguard Worker 527*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new CubicPathGM; ) 528*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new CubicPathShaderGM; ) 529*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new CubicClosePathGM; ) 530*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ClippedCubicGM; ) 531*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ClippedCubic2GM; ) 532