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/SkMatrix.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/SkRRect.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/SkTypes.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace { 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class SkDoOnce { 28*c8dee2aaSAndroid Build Coastguard Worker public: SkDoOnce()29*c8dee2aaSAndroid Build Coastguard Worker SkDoOnce() { fDidOnce = false; } 30*c8dee2aaSAndroid Build Coastguard Worker // Make noncopyable 31*c8dee2aaSAndroid Build Coastguard Worker SkDoOnce(SkDoOnce&) = delete; 32*c8dee2aaSAndroid Build Coastguard Worker SkDoOnce& operator=(SkDoOnce&) = delete; 33*c8dee2aaSAndroid Build Coastguard Worker needToDo() const34*c8dee2aaSAndroid Build Coastguard Worker bool needToDo() const { return !fDidOnce; } alreadyDone() const35*c8dee2aaSAndroid Build Coastguard Worker bool alreadyDone() const { return fDidOnce; } accomplished()36*c8dee2aaSAndroid Build Coastguard Worker void accomplished() { 37*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fDidOnce); 38*c8dee2aaSAndroid Build Coastguard Worker fDidOnce = true; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker private: 42*c8dee2aaSAndroid Build Coastguard Worker bool fDidOnce; 43*c8dee2aaSAndroid Build Coastguard Worker }; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker class ConvexPathsGM : public skiagm::GM { 46*c8dee2aaSAndroid Build Coastguard Worker SkDoOnce fOnce; 47*c8dee2aaSAndroid Build Coastguard Worker onOnceBeforeDraw()48*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { this->setBGColor(0xFF000000); } 49*c8dee2aaSAndroid Build Coastguard Worker getName() const50*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("convexpaths"); } 51*c8dee2aaSAndroid Build Coastguard Worker getISize()52*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {1200, 1100}; } 53*c8dee2aaSAndroid Build Coastguard Worker makePaths()54*c8dee2aaSAndroid Build Coastguard Worker void makePaths() { 55*c8dee2aaSAndroid Build Coastguard Worker if (fOnce.alreadyDone()) { 56*c8dee2aaSAndroid Build Coastguard Worker return; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker fOnce.accomplished(); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker SkPathBuilder b; 61*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 0) 62*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 100, 0, 100) 63*c8dee2aaSAndroid Build Coastguard Worker .lineTo(0, 0) 64*c8dee2aaSAndroid Build Coastguard Worker .detach()); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 50) 67*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 0, 100, 50) 68*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 100, 0, 50) 69*c8dee2aaSAndroid Build Coastguard Worker .detach()); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Rect({0, 0, 100, 100}, SkPathDirection::kCW)); 72*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Rect({0, 0, 100, 100}, SkPathDirection::kCCW)); 73*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Circle(50, 50, 50, SkPathDirection::kCW)); 74*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Oval(SkRect::MakeXYWH(0, 0, 50, 100), SkPathDirection::kCW)); 75*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Oval(SkRect::MakeXYWH(0, 0, 100, 5), SkPathDirection::kCCW)); 76*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Oval(SkRect::MakeXYWH(0, 0, 1, 100), SkPathDirection::kCCW)); 77*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::RRect(SkRRect::MakeRectXY({0, 0, 100, 100}, 40, 20), 78*c8dee2aaSAndroid Build Coastguard Worker SkPathDirection::kCW)); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker // large number of points 81*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kLength = 100; 82*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kPtsPerSide = (1 << 12); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker b.moveTo(0, 0); 85*c8dee2aaSAndroid Build Coastguard Worker for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to moveTo. 86*c8dee2aaSAndroid Build Coastguard Worker b.lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0); 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kPtsPerSide; ++i) { 89*c8dee2aaSAndroid Build Coastguard Worker b.lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSide); 90*c8dee2aaSAndroid Build Coastguard Worker } 91*c8dee2aaSAndroid Build Coastguard Worker for (int i = kPtsPerSide; i > 0; --i) { 92*c8dee2aaSAndroid Build Coastguard Worker b.lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLength); 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker for (int i = kPtsPerSide; i > 0; --i) { 95*c8dee2aaSAndroid Build Coastguard Worker b.lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide); 96*c8dee2aaSAndroid Build Coastguard Worker } 97*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.detach()); 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker // shallow diagonals 100*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Polygon({{0,0}, {100,1}, {98,100}, {3,96}}, false)); 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.arcTo(SkRect::MakeXYWH(0, 0, 50, 100), 25, 130, false) 103*c8dee2aaSAndroid Build Coastguard Worker .detach()); 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker // cubics 106*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.cubicTo( 1, 1, 10, 90, 0, 100).detach()); 107*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.cubicTo(100, 50, 20, 100, 0, 0).detach()); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker // path that has a cubic with a repeated first control point and 110*c8dee2aaSAndroid Build Coastguard Worker // a repeated last control point. 111*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(10, 10) 112*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(10, 10, 10, 0, 20, 0) 113*c8dee2aaSAndroid Build Coastguard Worker .lineTo(40, 0) 114*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(40, 0, 50, 0, 50, 10) 115*c8dee2aaSAndroid Build Coastguard Worker .detach()); 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker // path that has two cubics with repeated middle control points. 118*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(10, 10) 119*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(10, 0, 10, 0, 20, 0) 120*c8dee2aaSAndroid Build Coastguard Worker .lineTo(40, 0) 121*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(50, 0, 50, 0, 50, 10) 122*c8dee2aaSAndroid Build Coastguard Worker .detach()); 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker // cubic where last three points are almost a line 125*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 228.0f/8) 126*c8dee2aaSAndroid Build Coastguard Worker .cubicTo( 628.0f/ 8, 82.0f/8, 127*c8dee2aaSAndroid Build Coastguard Worker 1255.0f/ 8, 141.0f/8, 128*c8dee2aaSAndroid Build Coastguard Worker 1883.0f/ 8, 202.0f/8) 129*c8dee2aaSAndroid Build Coastguard Worker .detach()); 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker // flat cubic where the at end point tangents both point outward. 132*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(10, 0) 133*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(0, 1, 30, 1, 20, 0) 134*c8dee2aaSAndroid Build Coastguard Worker .detach()); 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker // flat cubic where initial tangent is in, end tangent out 137*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 0) 138*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(10, 1, 30, 1, 20, 0) 139*c8dee2aaSAndroid Build Coastguard Worker .detach()); 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker // flat cubic where initial tangent is out, end tangent in 142*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(10, 0) 143*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(0, 1, 20, 1, 30, 0) 144*c8dee2aaSAndroid Build Coastguard Worker .detach()); 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker // triangle where one edge is a degenerate quad 147*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(8.59375f, 45) 148*c8dee2aaSAndroid Build Coastguard Worker .quadTo(16.9921875f, 45, 149*c8dee2aaSAndroid Build Coastguard Worker 31.25f, 45) 150*c8dee2aaSAndroid Build Coastguard Worker .lineTo(100, 100) 151*c8dee2aaSAndroid Build Coastguard Worker .lineTo(8.59375f, 45) 152*c8dee2aaSAndroid Build Coastguard Worker .detach()); 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker // triangle where one edge is a quad with a repeated point 155*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 25) 156*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 0) 157*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 50, 50, 50) 158*c8dee2aaSAndroid Build Coastguard Worker .detach()); 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker // triangle where one edge is a cubic with a 2x repeated point 161*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 25) 162*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 0) 163*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(50, 0, 50, 50, 50, 50) 164*c8dee2aaSAndroid Build Coastguard Worker .detach()); 165*c8dee2aaSAndroid Build Coastguard Worker 166*c8dee2aaSAndroid Build Coastguard Worker // triangle where one edge is a quad with a nearly repeated point 167*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 25) 168*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 0) 169*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 49.95f, 50, 50) 170*c8dee2aaSAndroid Build Coastguard Worker .detach()); 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker // triangle where one edge is a cubic with a 3x nearly repeated point 173*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 25) 174*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 0) 175*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(50, 49.95f, 50, 49.97f, 50, 50) 176*c8dee2aaSAndroid Build Coastguard Worker .detach()); 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker // triangle where there is a point degenerate cubic at one corner 179*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 25) 180*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 0) 181*c8dee2aaSAndroid Build Coastguard Worker .lineTo(50, 50) 182*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(50, 50, 50, 50, 50, 50) 183*c8dee2aaSAndroid Build Coastguard Worker .detach()); 184*c8dee2aaSAndroid Build Coastguard Worker 185*c8dee2aaSAndroid Build Coastguard Worker // point line 186*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Line({50, 50}, {50, 50})); 187*c8dee2aaSAndroid Build Coastguard Worker 188*c8dee2aaSAndroid Build Coastguard Worker // point quad 189*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(50, 50) 190*c8dee2aaSAndroid Build Coastguard Worker .quadTo(50, 50, 50, 50) 191*c8dee2aaSAndroid Build Coastguard Worker .detach()); 192*c8dee2aaSAndroid Build Coastguard Worker 193*c8dee2aaSAndroid Build Coastguard Worker // point cubic 194*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(50, 50) 195*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(50, 50, 50, 50, 50, 50) 196*c8dee2aaSAndroid Build Coastguard Worker .detach()); 197*c8dee2aaSAndroid Build Coastguard Worker 198*c8dee2aaSAndroid Build Coastguard Worker // moveTo only paths 199*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 0) 200*c8dee2aaSAndroid Build Coastguard Worker .moveTo(0, 0) 201*c8dee2aaSAndroid Build Coastguard Worker .moveTo(1, 1) 202*c8dee2aaSAndroid Build Coastguard Worker .moveTo(1, 1) 203*c8dee2aaSAndroid Build Coastguard Worker .moveTo(10, 10) 204*c8dee2aaSAndroid Build Coastguard Worker .detach()); 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(0, 0) 207*c8dee2aaSAndroid Build Coastguard Worker .moveTo(0, 0) 208*c8dee2aaSAndroid Build Coastguard Worker .detach()); 209*c8dee2aaSAndroid Build Coastguard Worker 210*c8dee2aaSAndroid Build Coastguard Worker // line degenerate 211*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.lineTo(100, 100).detach()); 212*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.quadTo(100, 100, 0, 0).detach()); 213*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.quadTo(100, 100, 50, 50).detach()); 214*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.quadTo(50, 50, 100, 100).detach()); 215*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.cubicTo(0, 0, 0, 0, 100, 100).detach()); 216*c8dee2aaSAndroid Build Coastguard Worker 217*c8dee2aaSAndroid Build Coastguard Worker // skbug.com/8928 218*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(b.moveTo(16.875f, 192.594f) 219*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(45.625f, 192.594f, 74.375f, 192.594f, 103.125f, 192.594f) 220*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(88.75f, 167.708f, 74.375f, 142.823f, 60, 117.938f) 221*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(45.625f, 142.823f, 31.25f, 167.708f, 16.875f, 192.594f) 222*c8dee2aaSAndroid Build Coastguard Worker .close() 223*c8dee2aaSAndroid Build Coastguard Worker .detach()); 224*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 225*c8dee2aaSAndroid Build Coastguard Worker m.setAll(0.1f, 0, -1, 0, 0.115207f, -2.64977f, 0, 0, 1); 226*c8dee2aaSAndroid Build Coastguard Worker fPaths.back().transform(m); 227*c8dee2aaSAndroid Build Coastguard Worker 228*c8dee2aaSAndroid Build Coastguard Worker // small circle. This is listed last so that it has device coords far 229*c8dee2aaSAndroid Build Coastguard Worker // from the origin (small area relative to x,y values). 230*c8dee2aaSAndroid Build Coastguard Worker fPaths.push_back(SkPath::Circle(0, 0, 1.2f)); 231*c8dee2aaSAndroid Build Coastguard Worker } 232*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)233*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 234*c8dee2aaSAndroid Build Coastguard Worker this->makePaths(); 235*c8dee2aaSAndroid Build Coastguard Worker 236*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 237*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 238*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 239*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(20, 20); 240*c8dee2aaSAndroid Build Coastguard Worker 241*c8dee2aaSAndroid Build Coastguard Worker // As we've added more paths this has gotten pretty big. Scale the whole thing down. 242*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(2.0f/3, 2.0f/3); 243*c8dee2aaSAndroid Build Coastguard Worker 244*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaths.size(); ++i) { 245*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 246*c8dee2aaSAndroid Build Coastguard Worker // position the path, and make it at off-integer coords. 247*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(200.0f * (i % 5) + 1.0f/10, 248*c8dee2aaSAndroid Build Coastguard Worker 200.0f * (i / 5) + 9.0f/10); 249*c8dee2aaSAndroid Build Coastguard Worker SkColor color = rand.nextU(); 250*c8dee2aaSAndroid Build Coastguard Worker color |= 0xff000000; 251*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(color); 252*c8dee2aaSAndroid Build Coastguard Worker #if 0 // This hitting on 32bit Linux builds for some paths. Temporarily disabling while it is 253*c8dee2aaSAndroid Build Coastguard Worker // debugged. 254*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fPaths[i].isConvex()); 255*c8dee2aaSAndroid Build Coastguard Worker #endif 256*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fPaths[i], paint); 257*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 258*c8dee2aaSAndroid Build Coastguard Worker } 259*c8dee2aaSAndroid Build Coastguard Worker } 260*c8dee2aaSAndroid Build Coastguard Worker 261*c8dee2aaSAndroid Build Coastguard Worker TArray<SkPath> fPaths; 262*c8dee2aaSAndroid Build Coastguard Worker }; 263*c8dee2aaSAndroid Build Coastguard Worker } // namespace 264*c8dee2aaSAndroid Build Coastguard Worker 265*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ConvexPathsGM; ) 266