2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
9 #include "SkCommandLineFlags.h"
15 DEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
17 class RectBench : public Benchmark {
28 RectBench(int shift, int stroke = 0)
32 const char* computeName(const char root[]) {
33 fBaseName.printf("%s_%d", root, fShift);
35 fBaseName.appendf("_stroke_%d", fStroke);
37 return fBaseName.c_str();
40 bool isVisual() override { return true; }
44 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
48 const char* onGetName() override { return computeName("rects"); }
50 void onDelayedSetup() override {
52 const SkScalar offset = SK_Scalar1/3;
53 for (int i = 0; i < N; i++) {
54 int x = rand.nextU() % W;
55 int y = rand.nextU() % H;
56 int w = rand.nextU() % W;
57 int h = rand.nextU() % H;
62 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
63 SkIntToScalar(x+w), SkIntToScalar(y+h));
64 fRects[i].offset(offset, offset);
65 fColors[i] = rand.nextU() | 0xFF808080;
69 void onDraw(int loops, SkCanvas* canvas) override {
72 paint.setStyle(SkPaint::kStroke_Style);
73 paint.setStrokeWidth(SkIntToScalar(fStroke));
75 for (int i = 0; i < loops; i++) {
76 paint.setColor(fColors[i % N]);
77 this->setupPaint(&paint);
78 this->drawThisRect(canvas, fRects[i % N], paint);
84 typedef Benchmark INHERITED;
87 class SrcModeRectBench : public RectBench {
89 SrcModeRectBench() : INHERITED(1, 0) {
90 fMode = SkBlendMode::kSrc;
94 void setupPaint(SkPaint* paint) override {
95 this->INHERITED::setupPaint(paint);
96 // srcmode is most interesting when we're not opaque
97 paint->setAlpha(0x80);
98 paint->setBlendMode(fMode);
101 const char* onGetName() override {
102 fName.set(this->INHERITED::onGetName());
103 fName.prepend("srcmode_");
104 return fName.c_str();
111 typedef RectBench INHERITED;
114 class TransparentRectBench : public RectBench {
116 TransparentRectBench() : INHERITED(1, 0) {}
119 void setupPaint(SkPaint* paint) override {
120 this->INHERITED::setupPaint(paint);
121 // draw non opaque rect
122 paint->setAlpha(0x80);
125 const char* onGetName() override {
126 fName.set(this->INHERITED::onGetName());
127 fName.prepend("transparent_");
128 return fName.c_str();
133 typedef RectBench INHERITED;
137 class OvalBench : public RectBench {
139 OvalBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
141 void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
144 const char* onGetName() override { return computeName("ovals"); }
147 class RRectBench : public RectBench {
149 RRectBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
151 void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
152 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
154 const char* onGetName() override { return computeName("rrects"); }
157 class PointsBench : public RectBench {
159 SkCanvas::PointMode fMode;
161 PointsBench(SkCanvas::PointMode mode, const char* name)
168 void onDraw(int loops, SkCanvas* canvas) override {
169 SkScalar gSizes[] = {
172 size_t sizes = SK_ARRAY_COUNT(gSizes);
174 if (FLAGS_strokeWidth >= 0) {
175 gSizes[0] = (SkScalar)FLAGS_strokeWidth;
180 paint.setStrokeCap(SkPaint::kRound_Cap);
182 for (int loop = 0; loop < loops; loop++) {
183 for (size_t i = 0; i < sizes; i++) {
184 paint.setStrokeWidth(gSizes[i]);
185 this->setupPaint(&paint);
186 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
187 paint.setColor(fColors[i % N]);
191 const char* onGetName() override { return fName.c_str(); }
198 /*******************************************************************************
199 * to bench BlitMask [Opaque, Black, color, shader]
200 *******************************************************************************/
202 class BlitMaskBench : public RectBench {
210 SkCanvas::PointMode fMode;
212 BlitMaskBench(SkCanvas::PointMode mode,
213 BlitMaskBench::kMaskType type, const char* name) :
214 RectBench(2), fMode(mode), _type(type) {
219 void onDraw(int loops, SkCanvas* canvas) override {
220 SkScalar gSizes[] = {
221 SkIntToScalar(13), SkIntToScalar(24)
223 size_t sizes = SK_ARRAY_COUNT(gSizes);
225 if (FLAGS_strokeWidth >= 0) {
226 gSizes[0] = (SkScalar)FLAGS_strokeWidth;
230 SkColor color = 0xFF000000;
233 paint.setStrokeCap(SkPaint::kRound_Cap);
234 if (_type == KMaskShader) {
236 srcBM.allocN32Pixels(10, 1);
237 srcBM.eraseColor(0xFF00FF00);
239 paint.setShader(SkShader::MakeBitmapShader(srcBM, SkShader::kClamp_TileMode,
240 SkShader::kClamp_TileMode));
242 for (int loop = 0; loop < loops; loop++) {
243 for (size_t i = 0; i < sizes; i++) {
255 alpha = rand.nextU() & 255;
260 paint.setStrokeWidth(gSizes[i]);
261 this->setupPaint(&paint);
262 paint.setColor(color);
263 paint.setAlpha(alpha);
264 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
268 const char* onGetName() override { return fName.c_str(); }
271 typedef RectBench INHERITED;
276 DEF_BENCH(return new RectBench(1);)
277 DEF_BENCH(return new RectBench(1, 4);)
278 DEF_BENCH(return new RectBench(3);)
279 DEF_BENCH(return new RectBench(3, 4);)
280 DEF_BENCH(return new OvalBench(1);)
281 DEF_BENCH(return new OvalBench(3);)
282 DEF_BENCH(return new OvalBench(1, 4);)
283 DEF_BENCH(return new OvalBench(3, 4);)
284 DEF_BENCH(return new RRectBench(1);)
285 DEF_BENCH(return new RRectBench(1, 4);)
286 DEF_BENCH(return new RRectBench(3);)
287 DEF_BENCH(return new RRectBench(3, 4);)
288 DEF_BENCH(return new PointsBench(SkCanvas::kPoints_PointMode, "points");)
289 DEF_BENCH(return new PointsBench(SkCanvas::kLines_PointMode, "lines");)
290 DEF_BENCH(return new PointsBench(SkCanvas::kPolygon_PointMode, "polygon");)
292 DEF_BENCH(return new SrcModeRectBench();)
294 DEF_BENCH(return new TransparentRectBench();)
296 /* init the blitmask bench
298 DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
299 BlitMaskBench::kMaskOpaque,
301 DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
302 BlitMaskBench::kMaskBlack,
304 DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
305 BlitMaskBench::kMaskColor,
307 DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
308 BlitMaskBench::KMaskShader,