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