1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 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 "bench/Benchmark.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkGeometry.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPathPriv.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker class GeometryBench : public Benchmark { 16*c8dee2aaSAndroid Build Coastguard Worker public: GeometryBench(const char suffix[])17*c8dee2aaSAndroid Build Coastguard Worker GeometryBench(const char suffix[]) : fVolatileInt(0) { 18*c8dee2aaSAndroid Build Coastguard Worker fName.printf("geo_%s", suffix); 19*c8dee2aaSAndroid Build Coastguard Worker } 20*c8dee2aaSAndroid Build Coastguard Worker onGetName()21*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 22*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 23*c8dee2aaSAndroid Build Coastguard Worker } 24*c8dee2aaSAndroid Build Coastguard Worker isSuitableFor(Backend backend)25*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 26*c8dee2aaSAndroid Build Coastguard Worker return Backend::kNonRendering == backend; 27*c8dee2aaSAndroid Build Coastguard Worker } 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker protected: 30*c8dee2aaSAndroid Build Coastguard Worker volatile int fVolatileInt; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** 33*c8dee2aaSAndroid Build Coastguard Worker * Subclasses can call this to try to defeat the optimizer (with some result of their 34*c8dee2aaSAndroid Build Coastguard Worker * inner loop), since it will fool the compiler into assuming that "n" is actually 35*c8dee2aaSAndroid Build Coastguard Worker * needed somewhere, and since this method is not const, the member fields cannot 36*c8dee2aaSAndroid Build Coastguard Worker * be assumed to be const before and after the call. 37*c8dee2aaSAndroid Build Coastguard Worker */ virtualCallToFoilOptimizers(int n)38*c8dee2aaSAndroid Build Coastguard Worker virtual void virtualCallToFoilOptimizers(int n) { 39*c8dee2aaSAndroid Build Coastguard Worker fVolatileInt = n; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker private: 43*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 44*c8dee2aaSAndroid Build Coastguard Worker }; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker class GeoRectBench : public GeometryBench { 47*c8dee2aaSAndroid Build Coastguard Worker public: GeoRectBench(const char suffix[])48*c8dee2aaSAndroid Build Coastguard Worker GeoRectBench(const char suffix[]) : GeometryBench(suffix) {} 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker protected: 51*c8dee2aaSAndroid Build Coastguard Worker SkRect fRects[2048]; 52*c8dee2aaSAndroid Build Coastguard Worker onDelayedSetup()53*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { 54*c8dee2aaSAndroid Build Coastguard Worker const SkScalar min = -100; 55*c8dee2aaSAndroid Build Coastguard Worker const SkScalar max = 100; 56*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 57*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fRects); ++i) { 58*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = rand.nextRangeScalar(min, max); 59*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = rand.nextRangeScalar(min, max); 60*c8dee2aaSAndroid Build Coastguard Worker SkScalar w = rand.nextRangeScalar(min, max); 61*c8dee2aaSAndroid Build Coastguard Worker SkScalar h = rand.nextRangeScalar(min, max); 62*c8dee2aaSAndroid Build Coastguard Worker fRects[i].setXYWH(x, y, w, h); 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker class GeoRectBench_intersect : public GeoRectBench { 68*c8dee2aaSAndroid Build Coastguard Worker public: GeoRectBench_intersect()69*c8dee2aaSAndroid Build Coastguard Worker GeoRectBench_intersect() : GeoRectBench("rect_intersect") {} 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)72*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 73*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 74*c8dee2aaSAndroid Build Coastguard Worker int count = 0; 75*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fRects); ++i) { 76*c8dee2aaSAndroid Build Coastguard Worker SkRect r = fRects[0]; 77*c8dee2aaSAndroid Build Coastguard Worker count += r.intersect(fRects[i]); 78*c8dee2aaSAndroid Build Coastguard Worker } 79*c8dee2aaSAndroid Build Coastguard Worker this->virtualCallToFoilOptimizers(count); 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker class GeoRectBench_intersect_rect : public GeoRectBench { 85*c8dee2aaSAndroid Build Coastguard Worker public: GeoRectBench_intersect_rect()86*c8dee2aaSAndroid Build Coastguard Worker GeoRectBench_intersect_rect() : GeoRectBench("rect_intersect_rect") {} 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)89*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 90*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 91*c8dee2aaSAndroid Build Coastguard Worker int count = 0; 92*c8dee2aaSAndroid Build Coastguard Worker SkRect r; 93*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fRects); ++i) { 94*c8dee2aaSAndroid Build Coastguard Worker count += r.intersect(fRects[0], fRects[i]); 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker this->virtualCallToFoilOptimizers(count); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker }; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker class GeoRectBench_Intersects : public GeoRectBench { 102*c8dee2aaSAndroid Build Coastguard Worker public: GeoRectBench_Intersects()103*c8dee2aaSAndroid Build Coastguard Worker GeoRectBench_Intersects() : GeoRectBench("rect_Intersects") {} 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)106*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 107*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 108*c8dee2aaSAndroid Build Coastguard Worker int count = 0; 109*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fRects); ++i) { 110*c8dee2aaSAndroid Build Coastguard Worker count += SkRect::Intersects(fRects[0], fRects[i]); 111*c8dee2aaSAndroid Build Coastguard Worker } 112*c8dee2aaSAndroid Build Coastguard Worker this->virtualCallToFoilOptimizers(count); 113*c8dee2aaSAndroid Build Coastguard Worker } 114*c8dee2aaSAndroid Build Coastguard Worker } 115*c8dee2aaSAndroid Build Coastguard Worker }; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker class GeoRectBench_sort : public GeoRectBench { 118*c8dee2aaSAndroid Build Coastguard Worker public: GeoRectBench_sort()119*c8dee2aaSAndroid Build Coastguard Worker GeoRectBench_sort() : GeoRectBench("rect_sort") {} 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)122*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 123*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 124*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fRects); ++i) { 125*c8dee2aaSAndroid Build Coastguard Worker fRects[i].sort(); 126*c8dee2aaSAndroid Build Coastguard Worker } 127*c8dee2aaSAndroid Build Coastguard Worker } 128*c8dee2aaSAndroid Build Coastguard Worker } 129*c8dee2aaSAndroid Build Coastguard Worker }; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new GeoRectBench_intersect; ) 132*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new GeoRectBench_intersect_rect; ) 133*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new GeoRectBench_Intersects; ) 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new GeoRectBench_sort; ) 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////////// 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker class QuadBenchBase : public GeometryBench { 140*c8dee2aaSAndroid Build Coastguard Worker protected: 141*c8dee2aaSAndroid Build Coastguard Worker SkPoint fPts[4]; 142*c8dee2aaSAndroid Build Coastguard Worker public: QuadBenchBase(const char name[])143*c8dee2aaSAndroid Build Coastguard Worker QuadBenchBase(const char name[]) : GeometryBench(name) { 144*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 145*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) { 146*c8dee2aaSAndroid Build Coastguard Worker fPts[i].set(rand.nextUScalar1(), rand.nextUScalar1()); 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker } 149*c8dee2aaSAndroid Build Coastguard Worker }; 150*c8dee2aaSAndroid Build Coastguard Worker 151*c8dee2aaSAndroid Build Coastguard Worker class EvalQuadAt0 : public QuadBenchBase { 152*c8dee2aaSAndroid Build Coastguard Worker public: EvalQuadAt0()153*c8dee2aaSAndroid Build Coastguard Worker EvalQuadAt0() : QuadBenchBase("evalquadat0") {} 154*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)155*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 156*c8dee2aaSAndroid Build Coastguard Worker SkPoint result; 157*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 158*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, &result); 159*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, &result); 160*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, &result); 161*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, &result); 162*c8dee2aaSAndroid Build Coastguard Worker } 163*c8dee2aaSAndroid Build Coastguard Worker } 164*c8dee2aaSAndroid Build Coastguard Worker }; 165*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new EvalQuadAt0; ) 166*c8dee2aaSAndroid Build Coastguard Worker 167*c8dee2aaSAndroid Build Coastguard Worker class EvalQuadAt1 : public QuadBenchBase { 168*c8dee2aaSAndroid Build Coastguard Worker public: EvalQuadAt1()169*c8dee2aaSAndroid Build Coastguard Worker EvalQuadAt1() : QuadBenchBase("evalquadat1") {} 170*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)171*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 172*c8dee2aaSAndroid Build Coastguard Worker SkPoint result; 173*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 174*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadAt(fPts, 0.5f); 175*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadAt(fPts, 0.5f); 176*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadAt(fPts, 0.5f); 177*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadAt(fPts, 0.5f); 178*c8dee2aaSAndroid Build Coastguard Worker } 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker }; 181*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new EvalQuadAt1; ) 182*c8dee2aaSAndroid Build Coastguard Worker 183*c8dee2aaSAndroid Build Coastguard Worker //////// 184*c8dee2aaSAndroid Build Coastguard Worker 185*c8dee2aaSAndroid Build Coastguard Worker class EvalQuadTangentAt0 : public QuadBenchBase { 186*c8dee2aaSAndroid Build Coastguard Worker public: EvalQuadTangentAt0()187*c8dee2aaSAndroid Build Coastguard Worker EvalQuadTangentAt0() : QuadBenchBase("evalquadtangentat0") {} 188*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)189*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 190*c8dee2aaSAndroid Build Coastguard Worker SkPoint result; 191*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 192*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, nullptr, &result); 193*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, nullptr, &result); 194*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, nullptr, &result); 195*c8dee2aaSAndroid Build Coastguard Worker SkEvalQuadAt(fPts, 0.5f, nullptr, &result); 196*c8dee2aaSAndroid Build Coastguard Worker } 197*c8dee2aaSAndroid Build Coastguard Worker } 198*c8dee2aaSAndroid Build Coastguard Worker }; 199*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new EvalQuadTangentAt0; ) 200*c8dee2aaSAndroid Build Coastguard Worker 201*c8dee2aaSAndroid Build Coastguard Worker class EvalQuadTangentAt1 : public QuadBenchBase { 202*c8dee2aaSAndroid Build Coastguard Worker public: EvalQuadTangentAt1()203*c8dee2aaSAndroid Build Coastguard Worker EvalQuadTangentAt1() : QuadBenchBase("evalquadtangentat1") {} 204*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)205*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 206*c8dee2aaSAndroid Build Coastguard Worker SkPoint result; 207*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 208*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadTangentAt(fPts, 0.5f); 209*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadTangentAt(fPts, 0.5f); 210*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadTangentAt(fPts, 0.5f); 211*c8dee2aaSAndroid Build Coastguard Worker result = SkEvalQuadTangentAt(fPts, 0.5f); 212*c8dee2aaSAndroid Build Coastguard Worker } 213*c8dee2aaSAndroid Build Coastguard Worker } 214*c8dee2aaSAndroid Build Coastguard Worker }; 215*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new EvalQuadTangentAt1; ) 216*c8dee2aaSAndroid Build Coastguard Worker 217*c8dee2aaSAndroid Build Coastguard Worker //////// 218*c8dee2aaSAndroid Build Coastguard Worker 219*c8dee2aaSAndroid Build Coastguard Worker class ChopQuadAt : public QuadBenchBase { 220*c8dee2aaSAndroid Build Coastguard Worker public: ChopQuadAt()221*c8dee2aaSAndroid Build Coastguard Worker ChopQuadAt() : QuadBenchBase("chopquadat") {} 222*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)223*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 224*c8dee2aaSAndroid Build Coastguard Worker SkPoint dst[5]; 225*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 226*c8dee2aaSAndroid Build Coastguard Worker SkChopQuadAt(fPts, dst, 0.5f); 227*c8dee2aaSAndroid Build Coastguard Worker SkChopQuadAt(fPts, dst, 0.5f); 228*c8dee2aaSAndroid Build Coastguard Worker SkChopQuadAt(fPts, dst, 0.5f); 229*c8dee2aaSAndroid Build Coastguard Worker SkChopQuadAt(fPts, dst, 0.5f); 230*c8dee2aaSAndroid Build Coastguard Worker } 231*c8dee2aaSAndroid Build Coastguard Worker } 232*c8dee2aaSAndroid Build Coastguard Worker }; 233*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new ChopQuadAt; ) 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker class ChopCubicAt : public QuadBenchBase { 236*c8dee2aaSAndroid Build Coastguard Worker public: ChopCubicAt()237*c8dee2aaSAndroid Build Coastguard Worker ChopCubicAt() : QuadBenchBase("chopcubicat0") {} 238*c8dee2aaSAndroid Build Coastguard Worker protected: onDraw(int loops,SkCanvas * canvas)239*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 240*c8dee2aaSAndroid Build Coastguard Worker SkPoint dst[7]; 241*c8dee2aaSAndroid Build Coastguard Worker for (int outer = 0; outer < loops; ++outer) { 242*c8dee2aaSAndroid Build Coastguard Worker SkChopCubicAt(fPts, dst, 0.5f); 243*c8dee2aaSAndroid Build Coastguard Worker SkChopCubicAt(fPts, dst, 0.5f); 244*c8dee2aaSAndroid Build Coastguard Worker SkChopCubicAt(fPts, dst, 0.5f); 245*c8dee2aaSAndroid Build Coastguard Worker SkChopCubicAt(fPts, dst, 0.5f); 246*c8dee2aaSAndroid Build Coastguard Worker } 247*c8dee2aaSAndroid Build Coastguard Worker } 248*c8dee2aaSAndroid Build Coastguard Worker }; 249*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new ChopCubicAt; ) 250*c8dee2aaSAndroid Build Coastguard Worker 251*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 252*c8dee2aaSAndroid Build Coastguard Worker 253*c8dee2aaSAndroid Build Coastguard Worker class ConvexityBench : public Benchmark { 254*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 255*c8dee2aaSAndroid Build Coastguard Worker 256*c8dee2aaSAndroid Build Coastguard Worker public: ConvexityBench(const char suffix[])257*c8dee2aaSAndroid Build Coastguard Worker ConvexityBench(const char suffix[]) { 258*c8dee2aaSAndroid Build Coastguard Worker fName.printf("convexity_%s", suffix); 259*c8dee2aaSAndroid Build Coastguard Worker } 260*c8dee2aaSAndroid Build Coastguard Worker onGetName()261*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 262*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 263*c8dee2aaSAndroid Build Coastguard Worker } 264*c8dee2aaSAndroid Build Coastguard Worker isSuitableFor(Backend backend)265*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 266*c8dee2aaSAndroid Build Coastguard Worker return Backend::kNonRendering == backend; 267*c8dee2aaSAndroid Build Coastguard Worker } 268*c8dee2aaSAndroid Build Coastguard Worker 269*c8dee2aaSAndroid Build Coastguard Worker virtual void preparePath(SkPath*) = 0; 270*c8dee2aaSAndroid Build Coastguard Worker 271*c8dee2aaSAndroid Build Coastguard Worker protected: onPreDraw(SkCanvas *)272*c8dee2aaSAndroid Build Coastguard Worker void onPreDraw(SkCanvas*) override { 273*c8dee2aaSAndroid Build Coastguard Worker this->preparePath(&fPath); 274*c8dee2aaSAndroid Build Coastguard Worker } 275*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)276*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 277*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 278*c8dee2aaSAndroid Build Coastguard Worker SkPathPriv::ForceComputeConvexity(fPath); 279*c8dee2aaSAndroid Build Coastguard Worker } 280*c8dee2aaSAndroid Build Coastguard Worker } 281*c8dee2aaSAndroid Build Coastguard Worker 282*c8dee2aaSAndroid Build Coastguard Worker private: 283*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 284*c8dee2aaSAndroid Build Coastguard Worker }; 285*c8dee2aaSAndroid Build Coastguard Worker 286*c8dee2aaSAndroid Build Coastguard Worker class RRectConvexityBench : public ConvexityBench { 287*c8dee2aaSAndroid Build Coastguard Worker public: RRectConvexityBench()288*c8dee2aaSAndroid Build Coastguard Worker RRectConvexityBench() : ConvexityBench("rrect") {} 289*c8dee2aaSAndroid Build Coastguard Worker preparePath(SkPath * path)290*c8dee2aaSAndroid Build Coastguard Worker void preparePath(SkPath* path) override { 291*c8dee2aaSAndroid Build Coastguard Worker SkRRect rr; 292*c8dee2aaSAndroid Build Coastguard Worker rr.setRectXY({0, 0, 100, 100}, 20, 30); 293*c8dee2aaSAndroid Build Coastguard Worker path->addRRect(rr); 294*c8dee2aaSAndroid Build Coastguard Worker } 295*c8dee2aaSAndroid Build Coastguard Worker }; 296*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new RRectConvexityBench; ) 297*c8dee2aaSAndroid Build Coastguard Worker 298