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/SkPath.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker class QuadPathGM : public GM { 27*c8dee2aaSAndroid Build Coastguard Worker public: QuadPathGM()28*c8dee2aaSAndroid Build Coastguard Worker QuadPathGM() {} 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const31*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("quadpath"); } 32*c8dee2aaSAndroid Build Coastguard Worker getISize()33*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1240, 390); } 34*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)35*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 36*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 37*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 38*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 39*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 40*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 41*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 42*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 43*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 44*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 45*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 46*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 47*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 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 onDraw(SkCanvas * canvas)52*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 53*c8dee2aaSAndroid Build Coastguard Worker struct FillAndName { 54*c8dee2aaSAndroid Build Coastguard Worker SkPathFillType fFill; 55*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker constexpr FillAndName gFills[] = { 58*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kWinding, "Winding"}, 59*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kEvenOdd, "Even / Odd"}, 60*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseWinding, "Inverse Winding"}, 61*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker struct StyleAndName { 64*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 65*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 66*c8dee2aaSAndroid Build Coastguard Worker }; 67*c8dee2aaSAndroid Build Coastguard Worker constexpr StyleAndName gStyles[] = { 68*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kFill_Style, "Fill"}, 69*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStroke_Style, "Stroke"}, 70*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 71*c8dee2aaSAndroid Build Coastguard Worker }; 72*c8dee2aaSAndroid Build Coastguard Worker struct CapAndName { 73*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Cap fCap; 74*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 75*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker constexpr CapAndName gCaps[] = { 78*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 79*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 80*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 81*c8dee2aaSAndroid Build Coastguard Worker }; 82*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 83*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 84*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker PathAndName path; 87*c8dee2aaSAndroid Build Coastguard Worker path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 88*c8dee2aaSAndroid Build Coastguard Worker path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1, 89*c8dee2aaSAndroid Build Coastguard Worker 75*SK_Scalar1, 10*SK_Scalar1); 90*c8dee2aaSAndroid Build Coastguard Worker path.fName = "moveTo-quad"; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 93*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 94*c8dee2aaSAndroid Build Coastguard Worker SkFont labelFont(ToolUtils::DefaultPortableTypeface(), 10); 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Quad Drawn Into Rectangle Clips With " 97*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, with stroke width 10"; 98*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20.0f, 20.0f, font, titlePaint); 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 101*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 102*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 103*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 104*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 105*c8dee2aaSAndroid Build Coastguard Worker for (size_t cap = 0; cap < std::size(gCaps); ++cap) { 106*c8dee2aaSAndroid Build Coastguard Worker if (0 < cap) { 107*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((rect.width() + 40 * SK_Scalar1) * std::size(gStyles), 0); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 110*c8dee2aaSAndroid Build Coastguard Worker for (size_t fill = 0; fill < std::size(gFills); ++fill) { 111*c8dee2aaSAndroid Build Coastguard Worker if (0 < fill) { 112*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 40 * SK_Scalar1); 113*c8dee2aaSAndroid Build Coastguard Worker } 114*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 115*c8dee2aaSAndroid Build Coastguard Worker for (size_t style = 0; style < std::size(gStyles); ++style) { 116*c8dee2aaSAndroid Build Coastguard Worker if (0 < style) { 117*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 118*c8dee2aaSAndroid Build Coastguard Worker } 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker SkColor color = ToolUtils::color_to_565(0xff007000); 121*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.fPath, canvas, color, rect, 122*c8dee2aaSAndroid Build Coastguard Worker gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 123*c8dee2aaSAndroid Build Coastguard Worker gFills[fill].fFill, SK_Scalar1*10); 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 126*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 127*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 128*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 129*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 130*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 131*c8dee2aaSAndroid Build Coastguard Worker 132*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 133*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 134*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gStyles[style].fName, 0, rect.height() + 12.0f, 135*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 136*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gFills[fill].fName, 0, rect.height() + 24.0f, 137*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 138*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36.0f, 139*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 140*c8dee2aaSAndroid Build Coastguard Worker } 141*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 142*c8dee2aaSAndroid Build Coastguard Worker } 143*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 144*c8dee2aaSAndroid Build Coastguard Worker } 145*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 146*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker private: 150*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 151*c8dee2aaSAndroid Build Coastguard Worker }; 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker class QuadClosePathGM : public GM { 154*c8dee2aaSAndroid Build Coastguard Worker public: QuadClosePathGM()155*c8dee2aaSAndroid Build Coastguard Worker QuadClosePathGM() {} 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const158*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("quadclosepath"); } 159*c8dee2aaSAndroid Build Coastguard Worker getISize()160*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1240, 390); } 161*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)162*c8dee2aaSAndroid Build Coastguard Worker void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 163*c8dee2aaSAndroid Build Coastguard Worker const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 164*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style style, SkPathFillType fill, 165*c8dee2aaSAndroid Build Coastguard Worker SkScalar strokeWidth) { 166*c8dee2aaSAndroid Build Coastguard Worker path.setFillType(fill); 167*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 168*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 169*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(strokeWidth); 170*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(join); 171*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 172*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(style); 173*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 174*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clip); 175*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint); 176*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 177*c8dee2aaSAndroid Build Coastguard Worker } 178*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)179*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 180*c8dee2aaSAndroid Build Coastguard Worker struct FillAndName { 181*c8dee2aaSAndroid Build Coastguard Worker SkPathFillType fFill; 182*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 183*c8dee2aaSAndroid Build Coastguard Worker }; 184*c8dee2aaSAndroid Build Coastguard Worker constexpr FillAndName gFills[] = { 185*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kWinding, "Winding"}, 186*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kEvenOdd, "Even / Odd"}, 187*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseWinding, "Inverse Winding"}, 188*c8dee2aaSAndroid Build Coastguard Worker {SkPathFillType::kInverseEvenOdd, "Inverse Even / Odd"}, 189*c8dee2aaSAndroid Build Coastguard Worker }; 190*c8dee2aaSAndroid Build Coastguard Worker struct StyleAndName { 191*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Style fStyle; 192*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 193*c8dee2aaSAndroid Build Coastguard Worker }; 194*c8dee2aaSAndroid Build Coastguard Worker constexpr StyleAndName gStyles[] = { 195*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kFill_Style, "Fill"}, 196*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStroke_Style, "Stroke"}, 197*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 198*c8dee2aaSAndroid Build Coastguard Worker }; 199*c8dee2aaSAndroid Build Coastguard Worker struct CapAndName { 200*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Cap fCap; 201*c8dee2aaSAndroid Build Coastguard Worker SkPaint::Join fJoin; 202*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 203*c8dee2aaSAndroid Build Coastguard Worker }; 204*c8dee2aaSAndroid Build Coastguard Worker constexpr CapAndName gCaps[] = { 205*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 206*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 207*c8dee2aaSAndroid Build Coastguard Worker {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 208*c8dee2aaSAndroid Build Coastguard Worker }; 209*c8dee2aaSAndroid Build Coastguard Worker struct PathAndName { 210*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 211*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 212*c8dee2aaSAndroid Build Coastguard Worker }; 213*c8dee2aaSAndroid Build Coastguard Worker PathAndName path; 214*c8dee2aaSAndroid Build Coastguard Worker path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 215*c8dee2aaSAndroid Build Coastguard Worker path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1, 216*c8dee2aaSAndroid Build Coastguard Worker 75*SK_Scalar1, 10*SK_Scalar1); 217*c8dee2aaSAndroid Build Coastguard Worker path.fPath.close(); 218*c8dee2aaSAndroid Build Coastguard Worker path.fName = "moveTo-quad-close"; 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker SkPaint titlePaint; 221*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::DefaultPortableTypeface(), 15); 222*c8dee2aaSAndroid Build Coastguard Worker SkFont labelFont(ToolUtils::DefaultPortableTypeface(), 10); 223*c8dee2aaSAndroid Build Coastguard Worker const char title[] = "Quad Closed Drawn Into Rectangle Clips With " 224*c8dee2aaSAndroid Build Coastguard Worker "Indicated Style, Fill and Linecaps, with stroke width 10"; 225*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(title, 20.0f, 20.0f, font, titlePaint); 226*c8dee2aaSAndroid Build Coastguard Worker 227*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 228*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 229*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 230*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 231*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 232*c8dee2aaSAndroid Build Coastguard Worker for (size_t cap = 0; cap < std::size(gCaps); ++cap) { 233*c8dee2aaSAndroid Build Coastguard Worker if (0 < cap) { 234*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((rect.width() + 40 * SK_Scalar1) * std::size(gStyles), 0); 235*c8dee2aaSAndroid Build Coastguard Worker } 236*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 237*c8dee2aaSAndroid Build Coastguard Worker for (size_t fill = 0; fill < std::size(gFills); ++fill) { 238*c8dee2aaSAndroid Build Coastguard Worker if (0 < fill) { 239*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, rect.height() + 40 * SK_Scalar1); 240*c8dee2aaSAndroid Build Coastguard Worker } 241*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 242*c8dee2aaSAndroid Build Coastguard Worker for (size_t style = 0; style < std::size(gStyles); ++style) { 243*c8dee2aaSAndroid Build Coastguard Worker if (0 < style) { 244*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 245*c8dee2aaSAndroid Build Coastguard Worker } 246*c8dee2aaSAndroid Build Coastguard Worker 247*c8dee2aaSAndroid Build Coastguard Worker SkColor color = ToolUtils::color_to_565(0xff007000); 248*c8dee2aaSAndroid Build Coastguard Worker this->drawPath(path.fPath, canvas, color, rect, 249*c8dee2aaSAndroid Build Coastguard Worker gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 250*c8dee2aaSAndroid Build Coastguard Worker gFills[fill].fFill, SK_Scalar1*10); 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 253*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorBLACK); 254*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 255*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(-1); 256*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 257*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, rectPaint); 258*c8dee2aaSAndroid Build Coastguard Worker 259*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 260*c8dee2aaSAndroid Build Coastguard Worker labelPaint.setColor(color); 261*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gStyles[style].fName, 0, rect.height() + 12.0f, 262*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 263*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gFills[fill].fName, 0, rect.height() + 24.0f, 264*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 265*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(gCaps[cap].fName, 0, rect.height() + 36.0f, 266*c8dee2aaSAndroid Build Coastguard Worker labelFont, labelPaint); 267*c8dee2aaSAndroid Build Coastguard Worker } 268*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 269*c8dee2aaSAndroid Build Coastguard Worker } 270*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 271*c8dee2aaSAndroid Build Coastguard Worker } 272*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 273*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 274*c8dee2aaSAndroid Build Coastguard Worker } 275*c8dee2aaSAndroid Build Coastguard Worker 276*c8dee2aaSAndroid Build Coastguard Worker private: 277*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 278*c8dee2aaSAndroid Build Coastguard Worker }; 279*c8dee2aaSAndroid Build Coastguard Worker 280*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 281*c8dee2aaSAndroid Build Coastguard Worker 282*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new QuadPathGM; ) 283*c8dee2aaSAndroid Build Coastguard Worker 284*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new QuadClosePathGM; ) 285*c8dee2aaSAndroid Build Coastguard Worker 286*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 287