xref: /aosp_15_r20/external/skia/bench/RectBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 "bench/Benchmark.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class RectBench : public Benchmark {
21*c8dee2aaSAndroid Build Coastguard Worker public:
22*c8dee2aaSAndroid Build Coastguard Worker     int fShift, fStroke;
23*c8dee2aaSAndroid Build Coastguard Worker     enum {
24*c8dee2aaSAndroid Build Coastguard Worker         W = 640,
25*c8dee2aaSAndroid Build Coastguard Worker         H = 480,
26*c8dee2aaSAndroid Build Coastguard Worker         N = 300,
27*c8dee2aaSAndroid Build Coastguard Worker     };
28*c8dee2aaSAndroid Build Coastguard Worker     SkRect  fRects[N];
29*c8dee2aaSAndroid Build Coastguard Worker     SkColor fColors[N];
30*c8dee2aaSAndroid Build Coastguard Worker     bool    fAA;
31*c8dee2aaSAndroid Build Coastguard Worker     bool    fPerspective;
32*c8dee2aaSAndroid Build Coastguard Worker 
RectBench(int shift,int stroke=0,bool aa=true,bool perspective=false)33*c8dee2aaSAndroid Build Coastguard Worker     RectBench(int shift, int stroke = 0, bool aa = true, bool perspective = false)
34*c8dee2aaSAndroid Build Coastguard Worker         : fShift(shift)
35*c8dee2aaSAndroid Build Coastguard Worker         , fStroke(stroke)
36*c8dee2aaSAndroid Build Coastguard Worker         , fAA(aa)
37*c8dee2aaSAndroid Build Coastguard Worker         , fPerspective(perspective) {}
38*c8dee2aaSAndroid Build Coastguard Worker 
computeName(const char root[])39*c8dee2aaSAndroid Build Coastguard Worker     const char* computeName(const char root[]) {
40*c8dee2aaSAndroid Build Coastguard Worker         fBaseName.printf("%s_%d", root, fShift);
41*c8dee2aaSAndroid Build Coastguard Worker         if (fStroke > 0) {
42*c8dee2aaSAndroid Build Coastguard Worker             fBaseName.appendf("_stroke_%d", fStroke);
43*c8dee2aaSAndroid Build Coastguard Worker         }
44*c8dee2aaSAndroid Build Coastguard Worker         if (fAA) {
45*c8dee2aaSAndroid Build Coastguard Worker             fBaseName.appendf("_aa");
46*c8dee2aaSAndroid Build Coastguard Worker         } else {
47*c8dee2aaSAndroid Build Coastguard Worker             fBaseName.appendf("_bw");
48*c8dee2aaSAndroid Build Coastguard Worker         }
49*c8dee2aaSAndroid Build Coastguard Worker         if (fPerspective) {
50*c8dee2aaSAndroid Build Coastguard Worker             fBaseName.appendf("_persp");
51*c8dee2aaSAndroid Build Coastguard Worker         }
52*c8dee2aaSAndroid Build Coastguard Worker         return fBaseName.c_str();
53*c8dee2aaSAndroid Build Coastguard Worker     }
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker protected:
56*c8dee2aaSAndroid Build Coastguard Worker 
drawThisRect(SkCanvas * c,const SkRect & r,const SkPaint & p)57*c8dee2aaSAndroid Build Coastguard Worker     virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
58*c8dee2aaSAndroid Build Coastguard Worker         c->drawRect(r, p);
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()61*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return computeName("rects"); }
62*c8dee2aaSAndroid Build Coastguard Worker 
onDelayedSetup()63*c8dee2aaSAndroid Build Coastguard Worker     void onDelayedSetup() override {
64*c8dee2aaSAndroid Build Coastguard Worker         SkRandom rand;
65*c8dee2aaSAndroid Build Coastguard Worker         const SkScalar offset = SK_Scalar1/3;
66*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < N; i++) {
67*c8dee2aaSAndroid Build Coastguard Worker             int x = rand.nextU() % W;
68*c8dee2aaSAndroid Build Coastguard Worker             int y = rand.nextU() % H;
69*c8dee2aaSAndroid Build Coastguard Worker             int w = rand.nextU() % W;
70*c8dee2aaSAndroid Build Coastguard Worker             int h = rand.nextU() % H;
71*c8dee2aaSAndroid Build Coastguard Worker             w >>= fShift;
72*c8dee2aaSAndroid Build Coastguard Worker             h >>= fShift;
73*c8dee2aaSAndroid Build Coastguard Worker             x -= w/2;
74*c8dee2aaSAndroid Build Coastguard Worker             y -= h/2;
75*c8dee2aaSAndroid Build Coastguard Worker             fRects[i].setXYWH(SkIntToScalar(x), SkIntToScalar(y),
76*c8dee2aaSAndroid Build Coastguard Worker                               SkIntToScalar(w), SkIntToScalar(h));
77*c8dee2aaSAndroid Build Coastguard Worker             fRects[i].offset(offset, offset);
78*c8dee2aaSAndroid Build Coastguard Worker             fColors[i] = rand.nextU() | 0xFF808080;
79*c8dee2aaSAndroid Build Coastguard Worker         }
80*c8dee2aaSAndroid Build Coastguard Worker     }
81*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(int loops,SkCanvas * canvas)82*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas* canvas) override {
83*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
84*c8dee2aaSAndroid Build Coastguard Worker         if (fStroke > 0) {
85*c8dee2aaSAndroid Build Coastguard Worker             paint.setStyle(SkPaint::kStroke_Style);
86*c8dee2aaSAndroid Build Coastguard Worker             paint.setStrokeWidth(SkIntToScalar(fStroke));
87*c8dee2aaSAndroid Build Coastguard Worker         }
88*c8dee2aaSAndroid Build Coastguard Worker         if (fPerspective) {
89*c8dee2aaSAndroid Build Coastguard Worker             // Apply some fixed perspective to change how ops may draw the rects
90*c8dee2aaSAndroid Build Coastguard Worker             SkMatrix perspective;
91*c8dee2aaSAndroid Build Coastguard Worker             perspective.setIdentity();
92*c8dee2aaSAndroid Build Coastguard Worker             perspective.setPerspX(1e-4f);
93*c8dee2aaSAndroid Build Coastguard Worker             perspective.setPerspY(1e-3f);
94*c8dee2aaSAndroid Build Coastguard Worker             perspective.setSkewX(0.1f);
95*c8dee2aaSAndroid Build Coastguard Worker             canvas->concat(perspective);
96*c8dee2aaSAndroid Build Coastguard Worker         }
97*c8dee2aaSAndroid Build Coastguard Worker         for (int i = 0; i < loops; i++) {
98*c8dee2aaSAndroid Build Coastguard Worker             paint.setColor(fColors[i % N]);
99*c8dee2aaSAndroid Build Coastguard Worker             this->setupPaint(&paint);
100*c8dee2aaSAndroid Build Coastguard Worker             this->drawThisRect(canvas, fRects[i % N], paint);
101*c8dee2aaSAndroid Build Coastguard Worker         }
102*c8dee2aaSAndroid Build Coastguard Worker     }
103*c8dee2aaSAndroid Build Coastguard Worker 
setupPaint(SkPaint * paint)104*c8dee2aaSAndroid Build Coastguard Worker     void setupPaint(SkPaint* paint) override {
105*c8dee2aaSAndroid Build Coastguard Worker         this->INHERITED::setupPaint(paint);
106*c8dee2aaSAndroid Build Coastguard Worker         paint->setAntiAlias(fAA);
107*c8dee2aaSAndroid Build Coastguard Worker     }
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker private:
110*c8dee2aaSAndroid Build Coastguard Worker     SkString fBaseName;
111*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = Benchmark;
112*c8dee2aaSAndroid Build Coastguard Worker };
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker class SrcModeRectBench : public RectBench {
115*c8dee2aaSAndroid Build Coastguard Worker public:
SrcModeRectBench()116*c8dee2aaSAndroid Build Coastguard Worker     SrcModeRectBench() : INHERITED(1, 0) {
117*c8dee2aaSAndroid Build Coastguard Worker         fMode = SkBlendMode::kSrc;
118*c8dee2aaSAndroid Build Coastguard Worker     }
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker protected:
setupPaint(SkPaint * paint)121*c8dee2aaSAndroid Build Coastguard Worker     void setupPaint(SkPaint* paint) override {
122*c8dee2aaSAndroid Build Coastguard Worker         this->INHERITED::setupPaint(paint);
123*c8dee2aaSAndroid Build Coastguard Worker         // srcmode is most interesting when we're not opaque
124*c8dee2aaSAndroid Build Coastguard Worker         paint->setAlpha(0x80);
125*c8dee2aaSAndroid Build Coastguard Worker         paint->setBlendMode(fMode);
126*c8dee2aaSAndroid Build Coastguard Worker     }
127*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()128*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override {
129*c8dee2aaSAndroid Build Coastguard Worker         fName.set(this->INHERITED::onGetName());
130*c8dee2aaSAndroid Build Coastguard Worker         fName.prepend("srcmode_");
131*c8dee2aaSAndroid Build Coastguard Worker         return fName.c_str();
132*c8dee2aaSAndroid Build Coastguard Worker     }
133*c8dee2aaSAndroid Build Coastguard Worker 
134*c8dee2aaSAndroid Build Coastguard Worker private:
135*c8dee2aaSAndroid Build Coastguard Worker     SkBlendMode fMode;
136*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = RectBench;
139*c8dee2aaSAndroid Build Coastguard Worker };
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker class TransparentRectBench : public RectBench {
142*c8dee2aaSAndroid Build Coastguard Worker public:
TransparentRectBench()143*c8dee2aaSAndroid Build Coastguard Worker     TransparentRectBench() : INHERITED(1, 0) {}
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker protected:
setupPaint(SkPaint * paint)146*c8dee2aaSAndroid Build Coastguard Worker     void setupPaint(SkPaint* paint) override {
147*c8dee2aaSAndroid Build Coastguard Worker         this->INHERITED::setupPaint(paint);
148*c8dee2aaSAndroid Build Coastguard Worker         // draw non opaque rect
149*c8dee2aaSAndroid Build Coastguard Worker         paint->setAlpha(0x80);
150*c8dee2aaSAndroid Build Coastguard Worker     }
151*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()152*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override {
153*c8dee2aaSAndroid Build Coastguard Worker         fName.set(this->INHERITED::onGetName());
154*c8dee2aaSAndroid Build Coastguard Worker         fName.prepend("transparent_");
155*c8dee2aaSAndroid Build Coastguard Worker         return fName.c_str();
156*c8dee2aaSAndroid Build Coastguard Worker     }
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker private:
159*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
160*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = RectBench;
161*c8dee2aaSAndroid Build Coastguard Worker };
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker // Adds a shader to the paint that requires local coordinates to be used
164*c8dee2aaSAndroid Build Coastguard Worker class LocalCoordsRectBench : public RectBench {
165*c8dee2aaSAndroid Build Coastguard Worker public:
LocalCoordsRectBench(bool aa,bool perspective=false)166*c8dee2aaSAndroid Build Coastguard Worker     LocalCoordsRectBench(bool aa, bool perspective = false) : INHERITED(1, 0, aa, perspective) { }
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker protected:
onDelayedSetup()169*c8dee2aaSAndroid Build Coastguard Worker     void onDelayedSetup() override {
170*c8dee2aaSAndroid Build Coastguard Worker         this->INHERITED::onDelayedSetup();
171*c8dee2aaSAndroid Build Coastguard Worker         // Create the shader once, so that isn't included in the timing
172*c8dee2aaSAndroid Build Coastguard Worker         SkPoint pts[2] = { {0.f, 0.f}, {50.f, 50.f} };
173*c8dee2aaSAndroid Build Coastguard Worker         SkColor colors[] = { SK_ColorWHITE, SK_ColorBLUE };
174*c8dee2aaSAndroid Build Coastguard Worker         fShader = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
175*c8dee2aaSAndroid Build Coastguard Worker     }
176*c8dee2aaSAndroid Build Coastguard Worker 
setupPaint(SkPaint * paint)177*c8dee2aaSAndroid Build Coastguard Worker     void setupPaint(SkPaint* paint) override {
178*c8dee2aaSAndroid Build Coastguard Worker         this->INHERITED::setupPaint(paint);
179*c8dee2aaSAndroid Build Coastguard Worker         paint->setShader(fShader);
180*c8dee2aaSAndroid Build Coastguard Worker     }
181*c8dee2aaSAndroid Build Coastguard Worker 
onGetName()182*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override {
183*c8dee2aaSAndroid Build Coastguard Worker         fName.set(this->INHERITED::onGetName());
184*c8dee2aaSAndroid Build Coastguard Worker         fName.append("_localcoords");
185*c8dee2aaSAndroid Build Coastguard Worker         return fName.c_str();
186*c8dee2aaSAndroid Build Coastguard Worker     }
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker private:
189*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
190*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkShader> fShader;
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = RectBench;
193*c8dee2aaSAndroid Build Coastguard Worker };
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker class OvalBench : public RectBench {
197*c8dee2aaSAndroid Build Coastguard Worker public:
OvalBench(int shift,int stroke=0)198*c8dee2aaSAndroid Build Coastguard Worker     OvalBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
199*c8dee2aaSAndroid Build Coastguard Worker protected:
drawThisRect(SkCanvas * c,const SkRect & r,const SkPaint & p)200*c8dee2aaSAndroid Build Coastguard Worker     void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
201*c8dee2aaSAndroid Build Coastguard Worker         c->drawOval(r, p);
202*c8dee2aaSAndroid Build Coastguard Worker     }
onGetName()203*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return computeName("ovals"); }
204*c8dee2aaSAndroid Build Coastguard Worker };
205*c8dee2aaSAndroid Build Coastguard Worker 
206*c8dee2aaSAndroid Build Coastguard Worker class RRectBench : public RectBench {
207*c8dee2aaSAndroid Build Coastguard Worker public:
RRectBench(int shift,int stroke=0)208*c8dee2aaSAndroid Build Coastguard Worker     RRectBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
209*c8dee2aaSAndroid Build Coastguard Worker protected:
drawThisRect(SkCanvas * c,const SkRect & r,const SkPaint & p)210*c8dee2aaSAndroid Build Coastguard Worker     void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
211*c8dee2aaSAndroid Build Coastguard Worker         c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
212*c8dee2aaSAndroid Build Coastguard Worker     }
onGetName()213*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return computeName("rrects"); }
214*c8dee2aaSAndroid Build Coastguard Worker };
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker class PointsBench : public RectBench {
217*c8dee2aaSAndroid Build Coastguard Worker public:
218*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas::PointMode fMode;
219*c8dee2aaSAndroid Build Coastguard Worker 
PointsBench(SkCanvas::PointMode mode,const char * name)220*c8dee2aaSAndroid Build Coastguard Worker     PointsBench(SkCanvas::PointMode mode, const char* name)
221*c8dee2aaSAndroid Build Coastguard Worker         : RectBench(2)
222*c8dee2aaSAndroid Build Coastguard Worker         , fMode(mode) {
223*c8dee2aaSAndroid Build Coastguard Worker         fName = name;
224*c8dee2aaSAndroid Build Coastguard Worker     }
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker protected:
onDraw(int loops,SkCanvas * canvas)227*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas* canvas) override {
228*c8dee2aaSAndroid Build Coastguard Worker         SkScalar gSizes[] = {
229*c8dee2aaSAndroid Build Coastguard Worker             SkIntToScalar(7), 0
230*c8dee2aaSAndroid Build Coastguard Worker         };
231*c8dee2aaSAndroid Build Coastguard Worker         size_t sizes = std::size(gSizes);
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker         if (FLAGS_strokeWidth >= 0) {
234*c8dee2aaSAndroid Build Coastguard Worker             gSizes[0] = (SkScalar)FLAGS_strokeWidth;
235*c8dee2aaSAndroid Build Coastguard Worker             sizes = 1;
236*c8dee2aaSAndroid Build Coastguard Worker         }
237*c8dee2aaSAndroid Build Coastguard Worker 
238*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
239*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeCap(SkPaint::kRound_Cap);
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker         for (int loop = 0; loop < loops; loop++) {
242*c8dee2aaSAndroid Build Coastguard Worker             for (size_t i = 0; i < sizes; i++) {
243*c8dee2aaSAndroid Build Coastguard Worker                 paint.setStrokeWidth(gSizes[i]);
244*c8dee2aaSAndroid Build Coastguard Worker                 this->setupPaint(&paint);
245*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawPoints(fMode, N * 2, reinterpret_cast<SkPoint*>(fRects), paint);
246*c8dee2aaSAndroid Build Coastguard Worker                 paint.setColor(fColors[i % N]);
247*c8dee2aaSAndroid Build Coastguard Worker             }
248*c8dee2aaSAndroid Build Coastguard Worker         }
249*c8dee2aaSAndroid Build Coastguard Worker     }
onGetName()250*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return fName.c_str(); }
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker private:
253*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker };
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker /*******************************************************************************
258*c8dee2aaSAndroid Build Coastguard Worker  * to bench BlitMask [Opaque, Black, color, shader]
259*c8dee2aaSAndroid Build Coastguard Worker  *******************************************************************************/
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker class BlitMaskBench : public RectBench {
262*c8dee2aaSAndroid Build Coastguard Worker public:
263*c8dee2aaSAndroid Build Coastguard Worker     enum kMaskType {
264*c8dee2aaSAndroid Build Coastguard Worker         kMaskOpaque = 0,
265*c8dee2aaSAndroid Build Coastguard Worker         kMaskBlack,
266*c8dee2aaSAndroid Build Coastguard Worker         kMaskColor,
267*c8dee2aaSAndroid Build Coastguard Worker         KMaskShader
268*c8dee2aaSAndroid Build Coastguard Worker     };
269*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas::PointMode fMode;
270*c8dee2aaSAndroid Build Coastguard Worker 
BlitMaskBench(SkCanvas::PointMode mode,BlitMaskBench::kMaskType type,const char * name)271*c8dee2aaSAndroid Build Coastguard Worker     BlitMaskBench(SkCanvas::PointMode mode,
272*c8dee2aaSAndroid Build Coastguard Worker                   BlitMaskBench::kMaskType type, const char* name) :
273*c8dee2aaSAndroid Build Coastguard Worker         RectBench(2), fMode(mode), _type(type) {
274*c8dee2aaSAndroid Build Coastguard Worker         fName = name;
275*c8dee2aaSAndroid Build Coastguard Worker     }
276*c8dee2aaSAndroid Build Coastguard Worker 
277*c8dee2aaSAndroid Build Coastguard Worker protected:
onDraw(int loops,SkCanvas * canvas)278*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(int loops, SkCanvas* canvas) override {
279*c8dee2aaSAndroid Build Coastguard Worker         SkScalar gSizes[] = {
280*c8dee2aaSAndroid Build Coastguard Worker             SkIntToScalar(13), SkIntToScalar(24)
281*c8dee2aaSAndroid Build Coastguard Worker         };
282*c8dee2aaSAndroid Build Coastguard Worker         size_t sizes = std::size(gSizes);
283*c8dee2aaSAndroid Build Coastguard Worker 
284*c8dee2aaSAndroid Build Coastguard Worker         if (FLAGS_strokeWidth >= 0) {
285*c8dee2aaSAndroid Build Coastguard Worker             gSizes[0] = (SkScalar)FLAGS_strokeWidth;
286*c8dee2aaSAndroid Build Coastguard Worker             sizes = 1;
287*c8dee2aaSAndroid Build Coastguard Worker         }
288*c8dee2aaSAndroid Build Coastguard Worker         SkRandom rand;
289*c8dee2aaSAndroid Build Coastguard Worker         SkColor color = 0xFF000000;
290*c8dee2aaSAndroid Build Coastguard Worker         U8CPU alpha = 0xFF;
291*c8dee2aaSAndroid Build Coastguard Worker         SkPaint paint;
292*c8dee2aaSAndroid Build Coastguard Worker         paint.setStrokeCap(SkPaint::kRound_Cap);
293*c8dee2aaSAndroid Build Coastguard Worker         if (_type == KMaskShader) {
294*c8dee2aaSAndroid Build Coastguard Worker             SkBitmap srcBM;
295*c8dee2aaSAndroid Build Coastguard Worker             srcBM.allocN32Pixels(10, 1);
296*c8dee2aaSAndroid Build Coastguard Worker             srcBM.eraseColor(0xFF00FF00);
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker             paint.setShader(srcBM.makeShader(SkSamplingOptions()));
299*c8dee2aaSAndroid Build Coastguard Worker         }
300*c8dee2aaSAndroid Build Coastguard Worker         for (int loop = 0; loop < loops; loop++) {
301*c8dee2aaSAndroid Build Coastguard Worker             for (size_t i = 0; i < sizes; i++) {
302*c8dee2aaSAndroid Build Coastguard Worker                 switch (_type) {
303*c8dee2aaSAndroid Build Coastguard Worker                     case kMaskOpaque:
304*c8dee2aaSAndroid Build Coastguard Worker                         color = fColors[i];
305*c8dee2aaSAndroid Build Coastguard Worker                         alpha = 0xFF;
306*c8dee2aaSAndroid Build Coastguard Worker                         break;
307*c8dee2aaSAndroid Build Coastguard Worker                     case kMaskBlack:
308*c8dee2aaSAndroid Build Coastguard Worker                         alpha = 0xFF;
309*c8dee2aaSAndroid Build Coastguard Worker                         color = 0xFF000000;
310*c8dee2aaSAndroid Build Coastguard Worker                         break;
311*c8dee2aaSAndroid Build Coastguard Worker                     case kMaskColor:
312*c8dee2aaSAndroid Build Coastguard Worker                         color = fColors[i];
313*c8dee2aaSAndroid Build Coastguard Worker                         alpha = rand.nextU() & 255;
314*c8dee2aaSAndroid Build Coastguard Worker                         break;
315*c8dee2aaSAndroid Build Coastguard Worker                     case KMaskShader:
316*c8dee2aaSAndroid Build Coastguard Worker                         break;
317*c8dee2aaSAndroid Build Coastguard Worker                 }
318*c8dee2aaSAndroid Build Coastguard Worker                 paint.setStrokeWidth(gSizes[i]);
319*c8dee2aaSAndroid Build Coastguard Worker                 this->setupPaint(&paint);
320*c8dee2aaSAndroid Build Coastguard Worker                 paint.setColor(color);
321*c8dee2aaSAndroid Build Coastguard Worker                 paint.setAlpha(alpha);
322*c8dee2aaSAndroid Build Coastguard Worker                 canvas->drawPoints(fMode, N * 2, reinterpret_cast<SkPoint*>(fRects), paint);
323*c8dee2aaSAndroid Build Coastguard Worker            }
324*c8dee2aaSAndroid Build Coastguard Worker         }
325*c8dee2aaSAndroid Build Coastguard Worker     }
onGetName()326*c8dee2aaSAndroid Build Coastguard Worker     const char* onGetName() override { return fName.c_str(); }
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker private:
329*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = RectBench;
330*c8dee2aaSAndroid Build Coastguard Worker     kMaskType _type;
331*c8dee2aaSAndroid Build Coastguard Worker     SkString fName;
332*c8dee2aaSAndroid Build Coastguard Worker };
333*c8dee2aaSAndroid Build Coastguard Worker 
334*c8dee2aaSAndroid Build Coastguard Worker // AA rects
335*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 0, true);)
336*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 4, true);)
337*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(3, 0, true);)
338*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(3, 4, true);)
339*c8dee2aaSAndroid Build Coastguard Worker // Non-AA rects
340*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 0, false);)
341*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 4, false);)
342*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(3, 0, false);)
343*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(3, 4, false);)
344*c8dee2aaSAndroid Build Coastguard Worker 
345*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new OvalBench(1);)
346*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new OvalBench(3);)
347*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new OvalBench(1, 4);)
348*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new OvalBench(3, 4);)
349*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RRectBench(1);)
350*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RRectBench(1, 4);)
351*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RRectBench(3);)
352*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RRectBench(3, 4);)
353*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new PointsBench(SkCanvas::kPoints_PointMode, "points");)
354*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new PointsBench(SkCanvas::kLines_PointMode, "lines");)
355*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new PointsBench(SkCanvas::kPolygon_PointMode, "polygon");)
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new SrcModeRectBench();)
358*c8dee2aaSAndroid Build Coastguard Worker 
359*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new TransparentRectBench();)
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new LocalCoordsRectBench(true);)
362*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new LocalCoordsRectBench(false);)
363*c8dee2aaSAndroid Build Coastguard Worker 
364*c8dee2aaSAndroid Build Coastguard Worker // Perspective rects
365*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 0, true, true);)
366*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RectBench(1, 0, false, true);)
367*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new LocalCoordsRectBench(true, true);)
368*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new LocalCoordsRectBench(false, true);)
369*c8dee2aaSAndroid Build Coastguard Worker 
370*c8dee2aaSAndroid Build Coastguard Worker /* init the blitmask bench
371*c8dee2aaSAndroid Build Coastguard Worker  */
372*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
373*c8dee2aaSAndroid Build Coastguard Worker                                    BlitMaskBench::kMaskOpaque,
374*c8dee2aaSAndroid Build Coastguard Worker                                    "maskopaque");)
375*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
376*c8dee2aaSAndroid Build Coastguard Worker                                    BlitMaskBench::kMaskBlack,
377*c8dee2aaSAndroid Build Coastguard Worker                                    "maskblack");)
378*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
379*c8dee2aaSAndroid Build Coastguard Worker                                    BlitMaskBench::kMaskColor,
380*c8dee2aaSAndroid Build Coastguard Worker                                    "maskcolor");)
381*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
382*c8dee2aaSAndroid Build Coastguard Worker                                    BlitMaskBench::KMaskShader,
383*c8dee2aaSAndroid Build Coastguard Worker                                    "maskshader");)
384