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/SkPaint.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathBuilder.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class DegenerateSegmentsGM : public GM { 28*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 29*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 30*c8dee2aaSAndroid Build Coastguard Worker const char* fName1; 31*c8dee2aaSAndroid Build Coastguard Worker const char* fName2; 32*c8dee2aaSAndroid Build Coastguard Worker }; 33*c8dee2aaSAndroid Build Coastguard Worker getName() const34*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("degeneratesegments"); } 35*c8dee2aaSAndroid Build Coastguard Worker getISize()36*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {896, 930}; } 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker typedef SkPoint (*AddSegmentFunc)(SkPathBuilder&, SkPoint&); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // We need to use explicit commands here, instead of addPath, because we 41*c8dee2aaSAndroid Build Coastguard Worker // do not want the moveTo that is added at the beginning of a path to 42*c8dee2aaSAndroid Build Coastguard Worker // appear in the appended path. AddMove(SkPathBuilder & path,SkPoint & startPt)43*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMove(SkPathBuilder& path, SkPoint& startPt) { 44*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 45*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 46*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker AddMoveClose(SkPathBuilder & path,SkPoint & startPt)49*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveClose(SkPathBuilder& path, SkPoint& startPt) { 50*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 51*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 52*c8dee2aaSAndroid Build Coastguard Worker path.close(); 53*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker AddDegenLine(SkPathBuilder & path,SkPoint & startPt)56*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddDegenLine(SkPathBuilder& path, SkPoint& startPt) { 57*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(startPt); 58*c8dee2aaSAndroid Build Coastguard Worker return startPt; 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenLine(SkPathBuilder & path,SkPoint & startPt)61*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenLine(SkPathBuilder& path, SkPoint& startPt) { 62*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 63*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 64*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(moveToPt); 65*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenLineClose(SkPathBuilder & path,SkPoint & startPt)68*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenLineClose(SkPathBuilder& path, SkPoint& startPt) { 69*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 70*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 71*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(moveToPt); 72*c8dee2aaSAndroid Build Coastguard Worker path.close(); 73*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker AddDegenQuad(SkPathBuilder & path,SkPoint & startPt)76*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddDegenQuad(SkPathBuilder& path, SkPoint& startPt) { 77*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(startPt, startPt); 78*c8dee2aaSAndroid Build Coastguard Worker return startPt; 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenQuad(SkPathBuilder & path,SkPoint & startPt)81*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenQuad(SkPathBuilder& path, SkPoint& startPt) { 82*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 83*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 84*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(moveToPt, moveToPt); 85*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenQuadClose(SkPathBuilder & path,SkPoint & startPt)88*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenQuadClose(SkPathBuilder& path, SkPoint& startPt) { 89*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 90*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 91*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(moveToPt, moveToPt); 92*c8dee2aaSAndroid Build Coastguard Worker path.close(); 93*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker AddDegenCubic(SkPathBuilder & path,SkPoint & startPt)96*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddDegenCubic(SkPathBuilder& path, SkPoint& startPt) { 97*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(startPt, startPt, startPt); 98*c8dee2aaSAndroid Build Coastguard Worker return startPt; 99*c8dee2aaSAndroid Build Coastguard Worker } 100*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenCubic(SkPathBuilder & path,SkPoint & startPt)101*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenCubic(SkPathBuilder& path, SkPoint& startPt) { 102*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 103*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 104*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(moveToPt, moveToPt, moveToPt); 105*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 106*c8dee2aaSAndroid Build Coastguard Worker } 107*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenCubicClose(SkPathBuilder & path,SkPoint & startPt)108*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveDegenCubicClose(SkPathBuilder& path, SkPoint& startPt) { 109*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 110*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 111*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(moveToPt, moveToPt, moveToPt); 112*c8dee2aaSAndroid Build Coastguard Worker path.close(); 113*c8dee2aaSAndroid Build Coastguard Worker return moveToPt; 114*c8dee2aaSAndroid Build Coastguard Worker } 115*c8dee2aaSAndroid Build Coastguard Worker AddClose(SkPathBuilder & path,SkPoint & startPt)116*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddClose(SkPathBuilder& path, SkPoint& startPt) { 117*c8dee2aaSAndroid Build Coastguard Worker path.close(); 118*c8dee2aaSAndroid Build Coastguard Worker return startPt; 119*c8dee2aaSAndroid Build Coastguard Worker } 120*c8dee2aaSAndroid Build Coastguard Worker AddLine(SkPathBuilder & path,SkPoint & startPt)121*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddLine(SkPathBuilder& path, SkPoint& startPt) { 122*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0); 123*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(endPt); 124*c8dee2aaSAndroid Build Coastguard Worker return endPt; 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker AddMoveLine(SkPathBuilder & path,SkPoint & startPt)127*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveLine(SkPathBuilder& path, SkPoint& startPt) { 128*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 129*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 130*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 131*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(endPt); 132*c8dee2aaSAndroid Build Coastguard Worker return endPt; 133*c8dee2aaSAndroid Build Coastguard Worker } 134*c8dee2aaSAndroid Build Coastguard Worker AddMoveLineClose(SkPathBuilder & path,SkPoint & startPt)135*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveLineClose(SkPathBuilder& path, SkPoint& startPt) { 136*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 137*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 138*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 139*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(endPt); 140*c8dee2aaSAndroid Build Coastguard Worker path.close(); 141*c8dee2aaSAndroid Build Coastguard Worker return endPt; 142*c8dee2aaSAndroid Build Coastguard Worker } 143*c8dee2aaSAndroid Build Coastguard Worker AddQuad(SkPathBuilder & path,SkPoint & startPt)144*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddQuad(SkPathBuilder& path, SkPoint& startPt) { 145*c8dee2aaSAndroid Build Coastguard Worker SkPoint midPt = startPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1); 146*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0); 147*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(midPt, endPt); 148*c8dee2aaSAndroid Build Coastguard Worker return endPt; 149*c8dee2aaSAndroid Build Coastguard Worker } 150*c8dee2aaSAndroid Build Coastguard Worker AddMoveQuad(SkPathBuilder & path,SkPoint & startPt)151*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveQuad(SkPathBuilder& path, SkPoint& startPt) { 152*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 153*c8dee2aaSAndroid Build Coastguard Worker SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1); 154*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 155*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 156*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(midPt, endPt); 157*c8dee2aaSAndroid Build Coastguard Worker return endPt; 158*c8dee2aaSAndroid Build Coastguard Worker } 159*c8dee2aaSAndroid Build Coastguard Worker AddMoveQuadClose(SkPathBuilder & path,SkPoint & startPt)160*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveQuadClose(SkPathBuilder& path, SkPoint& startPt) { 161*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 162*c8dee2aaSAndroid Build Coastguard Worker SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1); 163*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 164*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 165*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(midPt, endPt); 166*c8dee2aaSAndroid Build Coastguard Worker path.close(); 167*c8dee2aaSAndroid Build Coastguard Worker return endPt; 168*c8dee2aaSAndroid Build Coastguard Worker } 169*c8dee2aaSAndroid Build Coastguard Worker AddCubic(SkPathBuilder & path,SkPoint & startPt)170*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddCubic(SkPathBuilder& path, SkPoint& startPt) { 171*c8dee2aaSAndroid Build Coastguard Worker SkPoint t1Pt = startPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1); 172*c8dee2aaSAndroid Build Coastguard Worker SkPoint t2Pt = startPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1); 173*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0); 174*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(t1Pt, t2Pt, endPt); 175*c8dee2aaSAndroid Build Coastguard Worker return endPt; 176*c8dee2aaSAndroid Build Coastguard Worker } 177*c8dee2aaSAndroid Build Coastguard Worker AddMoveCubic(SkPathBuilder & path,SkPoint & startPt)178*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveCubic(SkPathBuilder& path, SkPoint& startPt) { 179*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 180*c8dee2aaSAndroid Build Coastguard Worker SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1); 181*c8dee2aaSAndroid Build Coastguard Worker SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1); 182*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 183*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 184*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(t1Pt, t2Pt, endPt); 185*c8dee2aaSAndroid Build Coastguard Worker return endPt; 186*c8dee2aaSAndroid Build Coastguard Worker } 187*c8dee2aaSAndroid Build Coastguard Worker AddMoveCubicClose(SkPathBuilder & path,SkPoint & startPt)188*c8dee2aaSAndroid Build Coastguard Worker static SkPoint AddMoveCubicClose(SkPathBuilder& path, SkPoint& startPt) { 189*c8dee2aaSAndroid Build Coastguard Worker SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1); 190*c8dee2aaSAndroid Build Coastguard Worker SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1); 191*c8dee2aaSAndroid Build Coastguard Worker SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1); 192*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0); 193*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(moveToPt); 194*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(t1Pt, t2Pt, endPt); 195*c8dee2aaSAndroid Build Coastguard Worker path.close(); 196*c8dee2aaSAndroid Build Coastguard Worker return endPt; 197*c8dee2aaSAndroid Build Coastguard Worker } 198*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)199*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath path, SkCanvas* canvas, SkColor color, 200*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip, SkPaint::Cap cap, SkPaint::Join join, 201*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 202*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 203*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 204*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 205*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 206*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 207*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 208*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 209*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 210*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 211*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 212*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 213*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 214*c8dee2aaSAndroid Build Coastguard Worker } 215*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)216*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 217*c8dee2aaSAndroid Build Coastguard Worker constexpr AddSegmentFunc gSegmentFunctions[] = { 218*c8dee2aaSAndroid Build Coastguard Worker AddMove, 219*c8dee2aaSAndroid Build Coastguard Worker AddMoveClose, 220*c8dee2aaSAndroid Build Coastguard Worker AddDegenLine, 221*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenLine, 222*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenLineClose, 223*c8dee2aaSAndroid Build Coastguard Worker AddDegenQuad, 224*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenQuad, 225*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenQuadClose, 226*c8dee2aaSAndroid Build Coastguard Worker AddDegenCubic, 227*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenCubic, 228*c8dee2aaSAndroid Build Coastguard Worker AddMoveDegenCubicClose, 229*c8dee2aaSAndroid Build Coastguard Worker AddClose, 230*c8dee2aaSAndroid Build Coastguard Worker AddLine, 231*c8dee2aaSAndroid Build Coastguard Worker AddMoveLine, 232*c8dee2aaSAndroid Build Coastguard Worker AddMoveLineClose, 233*c8dee2aaSAndroid Build Coastguard Worker AddQuad, 234*c8dee2aaSAndroid Build Coastguard Worker AddMoveQuad, 235*c8dee2aaSAndroid Build Coastguard Worker AddMoveQuadClose, 236*c8dee2aaSAndroid Build Coastguard Worker AddCubic, 237*c8dee2aaSAndroid Build Coastguard Worker AddMoveCubic, 238*c8dee2aaSAndroid Build Coastguard Worker AddMoveCubicClose 239*c8dee2aaSAndroid Build Coastguard Worker }; 240*c8dee2aaSAndroid Build Coastguard Worker const char* gSegmentNames[] = { 241*c8dee2aaSAndroid Build Coastguard Worker "Move", 242*c8dee2aaSAndroid Build Coastguard Worker "MoveClose", 243*c8dee2aaSAndroid Build Coastguard Worker "DegenLine", 244*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenLine", 245*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenLineClose", 246*c8dee2aaSAndroid Build Coastguard Worker "DegenQuad", 247*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenQuad", 248*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenQuadClose", 249*c8dee2aaSAndroid Build Coastguard Worker "DegenCubic", 250*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenCubic", 251*c8dee2aaSAndroid Build Coastguard Worker "MoveDegenCubicClose", 252*c8dee2aaSAndroid Build Coastguard Worker "Close", 253*c8dee2aaSAndroid Build Coastguard Worker "Line", 254*c8dee2aaSAndroid Build Coastguard Worker "MoveLine", 255*c8dee2aaSAndroid Build Coastguard Worker "MoveLineClose", 256*c8dee2aaSAndroid Build Coastguard Worker "Quad", 257*c8dee2aaSAndroid Build Coastguard Worker "MoveQuad", 258*c8dee2aaSAndroid Build Coastguard Worker "MoveQuadClose", 259*c8dee2aaSAndroid Build Coastguard Worker "Cubic", 260*c8dee2aaSAndroid Build Coastguard Worker "MoveCubic", 261*c8dee2aaSAndroid Build Coastguard Worker "MoveCubicClose" 262*c8dee2aaSAndroid Build Coastguard Worker }; 263*c8dee2aaSAndroid Build Coastguard Worker 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 10"}, 281*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke 10 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 294*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 295*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setColor(SK_ColorBLACK); 296*c8dee2aaSAndroid Build Coastguard Worker titlePaint.setAntiAlias(true); 297*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 298*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Random Paths Drawn Into Rectangle Clips With " 299*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, " 300*c8dee2aaSAndroid Build Coastguard Worker "with Stroke width 6"; 301*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20, 20, font, titlePaint); 302*c8dee2aaSAndroid Build Coastguard Worker 303*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 304*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(220*SK_Scalar1, 50*SK_Scalar1); 305*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 306*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(2*SK_Scalar1, 30 * SK_Scalar1); // The title 307*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 308*c8dee2aaSAndroid Build Coastguard Worker unsigned numSegments = std::size(gSegmentFunctions); 309*c8dee2aaSAndroid Build Coastguard Worker unsigned numCaps = std::size(gCaps); 310*c8dee2aaSAndroid Build Coastguard Worker unsigned numStyles = std::size(gStyles); 311*c8dee2aaSAndroid Build Coastguard Worker unsigned numFills = std::size(gFills); 312*c8dee2aaSAndroid Build Coastguard Worker for (size_t row = 0; row < 6; ++row) { 313*c8dee2aaSAndroid Build Coastguard Worker if (0 < row) { 314*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 100*SK_Scalar1); 315*c8dee2aaSAndroid Build Coastguard Worker } 316*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 317*c8dee2aaSAndroid Build Coastguard Worker for (size_t column = 0; column < 4; ++column) { 318*c8dee2aaSAndroid Build Coastguard Worker if (0 < column) { 319*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 4*SK_Scalar1, 0); 320*c8dee2aaSAndroid Build Coastguard Worker } 321*c8dee2aaSAndroid Build Coastguard Worker 322*c8dee2aaSAndroid Build Coastguard Worker SkColor color = ToolUtils::color_to_565(0xff007000); 323*c8dee2aaSAndroid Build Coastguard Worker StyleAndName style = gStyles[(rand.nextU() >> 16) % numStyles]; 324*c8dee2aaSAndroid Build Coastguard Worker CapAndName cap = gCaps[(rand.nextU() >> 16) % numCaps]; 325*c8dee2aaSAndroid Build Coastguard Worker FillAndName fill = gFills[(rand.nextU() >> 16) % numFills]; 326*c8dee2aaSAndroid Build Coastguard Worker unsigned s1 = (rand.nextU() >> 16) % numSegments; 327*c8dee2aaSAndroid Build Coastguard Worker unsigned s2 = (rand.nextU() >> 16) % numSegments; 328*c8dee2aaSAndroid Build Coastguard Worker unsigned s3 = (rand.nextU() >> 16) % numSegments; 329*c8dee2aaSAndroid Build Coastguard Worker unsigned s4 = (rand.nextU() >> 16) % numSegments; 330*c8dee2aaSAndroid Build Coastguard Worker unsigned s5 = (rand.nextU() >> 16) % numSegments; 331*c8dee2aaSAndroid Build Coastguard Worker SkPoint pt = SkPoint::Make(10*SK_Scalar1, 0); 332*c8dee2aaSAndroid Build Coastguard Worker SkPathBuilder path; 333*c8dee2aaSAndroid Build Coastguard Worker pt = gSegmentFunctions[s1](path, pt); 334*c8dee2aaSAndroid Build Coastguard Worker pt = gSegmentFunctions[s2](path, pt); 335*c8dee2aaSAndroid Build Coastguard Worker pt = gSegmentFunctions[s3](path, pt); 336*c8dee2aaSAndroid Build Coastguard Worker pt = gSegmentFunctions[s4](path, pt); 337*c8dee2aaSAndroid Build Coastguard Worker pt = gSegmentFunctions[s5](path, pt); 338*c8dee2aaSAndroid Build Coastguard Worker 339*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.detach(), canvas, color, rect, 340*c8dee2aaSAndroid Build Coastguard Worker cap.fCap, cap.fJoin, style.fStyle, 341*c8dee2aaSAndroid Build Coastguard Worker fill.fFill, SK_Scalar1*6); 342*c8dee2aaSAndroid Build Coastguard Worker 343*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 344*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 345*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 346*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 347*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 348*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 349*c8dee2aaSAndroid Build Coastguard Worker 350*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 351*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 352*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setAntiAlias(true); 353*c8dee2aaSAndroid Build Coastguard Worker font.setSize(10); 354*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(style.fName, 0, rect.height() + 12, font, labelPaint); 355*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(fill.fName, 0, rect.height() + 24, font, labelPaint); 356*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(cap.fName, 0, rect.height() + 36, font, labelPaint); 357*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gSegmentNames[s1], 0, rect.height() + 48, font, labelPaint); 358*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gSegmentNames[s2], 0, rect.height() + 60, font, labelPaint); 359*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gSegmentNames[s3], 0, rect.height() + 72, font, labelPaint); 360*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gSegmentNames[s4], 0, rect.height() + 84, font, labelPaint); 361*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gSegmentNames[s5], 0, rect.height() + 96, font, labelPaint); 362*c8dee2aaSAndroid Build Coastguard Worker } 363*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 364*c8dee2aaSAndroid Build Coastguard Worker } 365*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 366*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 367*c8dee2aaSAndroid Build Coastguard Worker } 368*c8dee2aaSAndroid Build Coastguard Worker }; 369*c8dee2aaSAndroid Build Coastguard Worker 370*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 371*c8dee2aaSAndroid Build Coastguard Worker 372*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new DegenerateSegmentsGM; ) 373*c8dee2aaSAndroid Build Coastguard Worker 374*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 375