xref: /aosp_15_r20/external/skia/bench/GeometryBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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