3 * Copyright 2011 Google Inc.
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
8 #include "SkBenchmark.h"
10 #include "SkCommandLineFlags.h"
16 DEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
18 class RectBench : public SkBenchmark {
29 RectBench(void* param, int shift, int stroke = 0)
34 const SkScalar offset = SK_Scalar1/3;
35 for (int i = 0; i < N; i++) {
36 int x = rand.nextU() % W;
37 int y = rand.nextU() % H;
38 int w = rand.nextU() % W;
39 int h = rand.nextU() % H;
44 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
45 SkIntToScalar(x+w), SkIntToScalar(y+h));
46 fRects[i].offset(offset, offset);
47 fColors[i] = rand.nextU() | 0xFF808080;
52 const char* computeName(const char root[]) {
53 fName.printf("%s_%d", root, fShift);
55 fName.appendf("_stroke_%d", fStroke);
61 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
65 virtual const char* onGetName() { return computeName("rects"); }
66 virtual void onDraw(SkCanvas* canvas) {
69 paint.setStyle(SkPaint::kStroke_Style);
70 paint.setStrokeWidth(SkIntToScalar(fStroke));
72 for (int i = 0; i < this->getLoops(); i++) {
73 paint.setColor(fColors[i % N]);
74 this->setupPaint(&paint);
75 this->drawThisRect(canvas, fRects[i % N], paint);
79 typedef SkBenchmark INHERITED;
82 class SrcModeRectBench : public RectBench {
84 SrcModeRectBench(void* param) : INHERITED(param, 1, 0) {
85 fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
88 virtual ~SrcModeRectBench() {
93 virtual void setupPaint(SkPaint* paint) SK_OVERRIDE {
94 this->INHERITED::setupPaint(paint);
95 // srcmode is most interesting when we're not opaque
96 paint->setAlpha(0x80);
97 paint->setXfermode(fMode);
100 virtual const char* onGetName() SK_OVERRIDE {
101 fName.set(this->INHERITED::onGetName());
102 fName.prepend("srcmode_");
103 return fName.c_str();
110 typedef RectBench INHERITED;
113 class OvalBench : public RectBench {
115 OvalBench(void* param, int shift, int stroke = 0) : RectBench(param, shift, stroke) {}
117 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
120 virtual const char* onGetName() { return computeName("ovals"); }
123 class RRectBench : public RectBench {
125 RRectBench(void* param, int shift, int stroke = 0) : RectBench(param, shift, stroke) {}
127 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
128 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
130 virtual const char* onGetName() { return computeName("rrects"); }
133 class PointsBench : public RectBench {
135 SkCanvas::PointMode fMode;
138 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
139 RectBench(param, 2), fMode(mode) {
144 virtual void onDraw(SkCanvas* canvas) {
145 SkScalar gSizes[] = {
148 size_t sizes = SK_ARRAY_COUNT(gSizes);
150 if (FLAGS_strokeWidth >= 0) {
151 gSizes[0] = FLAGS_strokeWidth;
156 paint.setStrokeCap(SkPaint::kRound_Cap);
158 for (int loop = 0; loop < this->getLoops(); loop++) {
159 for (size_t i = 0; i < sizes; i++) {
160 paint.setStrokeWidth(gSizes[i]);
161 this->setupPaint(&paint);
162 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
163 paint.setColor(fColors[i % N]);
167 virtual const char* onGetName() { return fName; }
170 class AARectBench : public SkBenchmark {
177 AARectBench(void* param, bool rotate) : INHERITED(param), fRotate(rotate) {}
181 virtual const char* onGetName() {
183 return "aarects_rotated";
188 virtual void onDraw(SkCanvas* canvas) {
189 static const SkScalar kHalfRectSize = SkFloatToScalar(0.75f);
192 this->setupPaint(&paint);
193 paint.setAntiAlias(true);
194 paint.setColor(SK_ColorBLACK);
195 SkRect r = { -kHalfRectSize, -kHalfRectSize, kHalfRectSize, kHalfRectSize };
198 for (int i = 0; i < this->getLoops(); i++) {
199 // Draw small aa rects in a grid across the screen
200 for (SkScalar y = kHalfRectSize+SK_Scalar1; y < H; y += 2*kHalfRectSize+2) {
201 for (SkScalar x = kHalfRectSize+SK_Scalar1; x < W; x += 2*kHalfRectSize+2) {
203 canvas->translate(x, y);
207 rotate.setRotate(SkIntToScalar(rot));
208 canvas->concat(rotate);
212 canvas->drawRect(r, paint);
221 typedef SkBenchmark INHERITED;
224 /*******************************************************************************
225 * to bench BlitMask [Opaque, Black, color, shader]
226 *******************************************************************************/
228 class BlitMaskBench : public RectBench {
236 SkCanvas::PointMode fMode;
239 BlitMaskBench(void* param, SkCanvas::PointMode mode,
240 BlitMaskBench::kMaskType type, const char* name) :
241 RectBench(param, 2), fMode(mode), _type(type) {
246 virtual void onDraw(SkCanvas* canvas) {
247 SkScalar gSizes[] = {
248 SkIntToScalar(13), SkIntToScalar(24)
250 size_t sizes = SK_ARRAY_COUNT(gSizes);
252 if (FLAGS_strokeWidth >= 0) {
253 gSizes[0] = FLAGS_strokeWidth;
257 SkColor color = 0xFF000000;
260 paint.setStrokeCap(SkPaint::kRound_Cap);
261 if (_type == KMaskShader) {
263 srcBM.setConfig(SkBitmap::kARGB_8888_Config, 10, 1);
265 srcBM.eraseColor(0xFF00FF00);
268 s = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
269 SkShader::kClamp_TileMode);
270 paint.setShader(s)->unref();
272 for (int loop = 0; loop < this->getLoops(); loop++) {
273 for (size_t i = 0; i < sizes; i++) {
285 alpha = rand.nextU() & 255;
290 paint.setStrokeWidth(gSizes[i]);
291 this->setupPaint(&paint);
292 paint.setColor(color);
293 paint.setAlpha(alpha);
294 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
298 virtual const char* onGetName() { return fName; }
300 typedef RectBench INHERITED;
305 DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1)); )
306 DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1, 4)); )
307 DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3)); )
308 DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3, 4)); )
309 DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1)); )
310 DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3)); )
311 DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1, 4)); )
312 DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3, 4)); )
313 DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1)); )
314 DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1, 4)); )
315 DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3)); )
316 DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3, 4)); )
317 DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points")); )
318 DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines")); )
319 DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon")); )
321 DEF_BENCH( return SkNEW_ARGS(SrcModeRectBench, (p)); )
323 DEF_BENCH( return SkNEW_ARGS(AARectBench, (p, false)); )
324 DEF_BENCH( return SkNEW_ARGS(AARectBench, (p, true)); )
326 /* init the blitmask bench
328 DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
329 (p, SkCanvas::kPoints_PointMode,
330 BlitMaskBench::kMaskOpaque, "maskopaque")
332 DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
333 (p, SkCanvas::kPoints_PointMode,
334 BlitMaskBench::kMaskBlack, "maskblack")
336 DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
337 (p, SkCanvas::kPoints_PointMode,
338 BlitMaskBench::kMaskColor, "maskcolor")
340 DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
341 (p, SkCanvas::kPoints_PointMode,
342 BlitMaskBench::KMaskShader, "maskshader")