blob: 17fccfd3ab308de4391f3b919ae1ecb5c10d3208 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.combd700c32009-01-05 03:34:50 +00008#include "SkBenchmark.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkRandom.h"
reed@android.comd2c37442009-01-08 03:00:57 +000012#include "SkString.h"
reed@google.com981d4792011-03-09 12:55:47 +000013#include "SkShader.h"
reed@android.combd700c32009-01-05 03:34:50 +000014
15class RectBench : public SkBenchmark {
16public:
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000017 int fShift, fStroke;
reed@android.combd700c32009-01-05 03:34:50 +000018 enum {
19 W = 640,
20 H = 480,
tomhudson@google.comca529d32011-10-28 15:34:49 +000021 N = SkBENCHLOOP(300)
reed@android.combd700c32009-01-05 03:34:50 +000022 };
23 SkRect fRects[N];
24 SkColor fColors[N];
25
robertphillips@google.com12310e42012-12-14 22:10:30 +000026 RectBench(void* param, int shift, int stroke = 0)
27 : INHERITED(param)
28 , fShift(shift)
29 , fStroke(stroke) {
reed@android.combd700c32009-01-05 03:34:50 +000030 SkRandom rand;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000031 const SkScalar offset = SK_Scalar1/3;
reed@android.combd700c32009-01-05 03:34:50 +000032 for (int i = 0; i < N; i++) {
33 int x = rand.nextU() % W;
34 int y = rand.nextU() % H;
35 int w = rand.nextU() % W;
36 int h = rand.nextU() % H;
reed@android.comd2c37442009-01-08 03:00:57 +000037 w >>= shift;
38 h >>= shift;
reed@android.combd700c32009-01-05 03:34:50 +000039 x -= w/2;
40 y -= h/2;
41 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
42 SkIntToScalar(x+w), SkIntToScalar(y+h));
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000043 fRects[i].offset(offset, offset);
reed@android.combd700c32009-01-05 03:34:50 +000044 fColors[i] = rand.nextU() | 0xFF808080;
45 }
46 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000047
reed@android.comd2c37442009-01-08 03:00:57 +000048 SkString fName;
49 const char* computeName(const char root[]) {
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000050 fName.printf("%s_%d", root, fShift);
51 if (fStroke > 0) {
52 fName.appendf("_stroke_%d", fStroke);
53 }
reed@android.comd2c37442009-01-08 03:00:57 +000054 return fName.c_str();
55 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000056
reed@android.combd700c32009-01-05 03:34:50 +000057protected:
58 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
59 c->drawRect(r, p);
60 }
61
reed@android.com4bc19832009-01-19 20:08:35 +000062 virtual const char* onGetName() { return computeName("rects"); }
reed@android.combd700c32009-01-05 03:34:50 +000063 virtual void onDraw(SkCanvas* canvas) {
64 SkPaint paint;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000065 if (fStroke > 0) {
66 paint.setStyle(SkPaint::kStroke_Style);
67 paint.setStrokeWidth(SkIntToScalar(fStroke));
68 }
reed@android.combd700c32009-01-05 03:34:50 +000069 for (int i = 0; i < N; i++) {
70 paint.setColor(fColors[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000071 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +000072 this->drawThisRect(canvas, fRects[i], paint);
73 }
74 }
reed@android.come9d00602009-09-02 21:12:42 +000075private:
76 typedef SkBenchmark INHERITED;
reed@android.combd700c32009-01-05 03:34:50 +000077};
78
reed@google.com2d078b62012-11-15 19:52:07 +000079class SrcModeRectBench : public RectBench {
80public:
81 SrcModeRectBench(void* param) : INHERITED(param, 1, 0) {
82 fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
83 }
skia.committer@gmail.com884e60b2012-11-16 02:01:17 +000084
reed@google.com2d078b62012-11-15 19:52:07 +000085 virtual ~SrcModeRectBench() {
86 SkSafeUnref(fMode);
87 }
88
89protected:
90 virtual void setupPaint(SkPaint* paint) SK_OVERRIDE {
91 this->INHERITED::setupPaint(paint);
92 // srcmode is most interesting when we're not opaque
93 paint->setAlpha(0x80);
94 paint->setXfermode(fMode);
95 }
96
97 virtual const char* onGetName() SK_OVERRIDE {
98 fName.set(this->INHERITED::onGetName());
99 fName.prepend("srcmode_");
100 return fName.c_str();
101 }
102
103private:
104 SkString fName;
105 SkXfermode* fMode;
106
107 typedef RectBench INHERITED;
108};
109
reed@android.combd700c32009-01-05 03:34:50 +0000110class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000111public:
reed@android.come9d00602009-09-02 21:12:42 +0000112 OvalBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +0000113protected:
114 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
115 c->drawOval(r, p);
116 }
reed@android.comd2c37442009-01-08 03:00:57 +0000117 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +0000118};
119
120class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000121public:
reed@android.come9d00602009-09-02 21:12:42 +0000122 RRectBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +0000123protected:
124 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
125 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
126 }
reed@android.com4bc19832009-01-19 20:08:35 +0000127 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +0000128};
129
130class PointsBench : public RectBench {
131public:
132 SkCanvas::PointMode fMode;
133 const char* fName;
134
reed@google.com1fcd51e2011-01-05 15:50:27 +0000135 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
reed@android.come9d00602009-09-02 21:12:42 +0000136 RectBench(param, 2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +0000137 fName = name;
138 }
139
140protected:
141 virtual void onDraw(SkCanvas* canvas) {
agl@chromium.org652807b2010-04-27 15:47:34 +0000142 SkScalar gSizes[] = {
reed@android.combd700c32009-01-05 03:34:50 +0000143 SkIntToScalar(7), 0
144 };
agl@chromium.org652807b2010-04-27 15:47:34 +0000145 size_t sizes = SK_ARRAY_COUNT(gSizes);
146
147 if (this->hasStrokeWidth()) {
148 gSizes[0] = this->getStrokeWidth();
149 sizes = 1;
150 }
reed@android.combd700c32009-01-05 03:34:50 +0000151
152 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +0000153 paint.setStrokeCap(SkPaint::kRound_Cap);
agl@chromium.org652807b2010-04-27 15:47:34 +0000154
155 for (size_t i = 0; i < sizes; i++) {
reed@android.combd700c32009-01-05 03:34:50 +0000156 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000157 this->setupPaint(&paint);
reed@google.com1fcd51e2011-01-05 15:50:27 +0000158 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
reed@android.combd700c32009-01-05 03:34:50 +0000159 paint.setColor(fColors[i]);
160 }
161 }
162 virtual const char* onGetName() { return fName; }
163};
164
robertphillips@google.com12310e42012-12-14 22:10:30 +0000165class AARectBench : public SkBenchmark {
166public:
167 enum {
168 W = 640,
169 H = 480,
170 };
171
172 AARectBench(void* param) : INHERITED(param) {}
173
174protected:
175
176 virtual const char* onGetName() { return "aarects"; }
177
178 virtual void onDraw(SkCanvas* canvas) {
179 SkPaint paint;
180 this->setupPaint(&paint);
181 paint.setAntiAlias(true);
182 paint.setColor(SK_ColorBLACK);
183 SkRect r;
184
185 // Draw small aa rects in a grid across the screen
186 for (SkScalar y = SK_ScalarHalf; y < H; y += SkIntToScalar(2)) {
187 for (SkScalar x = SK_ScalarHalf; x < W; x += SkIntToScalar(2)) {
188 r.set(x, y,
189 x+SkFloatToScalar(1.5f), y+SkFloatToScalar(1.5f));
190 canvas->drawRect(r, paint);
191 }
192 }
193
194 }
195private:
196 typedef SkBenchmark INHERITED;
197};
198
reed@google.com981d4792011-03-09 12:55:47 +0000199/*******************************************************************************
200 * to bench BlitMask [Opaque, Black, color, shader]
201 *******************************************************************************/
202
203class BlitMaskBench : public RectBench {
204public:
205 enum kMaskType {
206 kMaskOpaque = 0,
207 kMaskBlack,
208 kMaskColor,
209 KMaskShader
210 };
211 SkCanvas::PointMode fMode;
212 const char* fName;
213
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000214 BlitMaskBench(void* param, SkCanvas::PointMode mode,
reed@google.com981d4792011-03-09 12:55:47 +0000215 BlitMaskBench::kMaskType type, const char* name) :
216 RectBench(param, 2), fMode(mode), _type(type) {
217 fName = name;
218 }
219
220protected:
221 virtual void onDraw(SkCanvas* canvas) {
222 SkScalar gSizes[] = {
223 SkIntToScalar(13), SkIntToScalar(24)
224 };
225 size_t sizes = SK_ARRAY_COUNT(gSizes);
226
227 if (this->hasStrokeWidth()) {
228 gSizes[0] = this->getStrokeWidth();
229 sizes = 1;
230 }
231 SkRandom rand;
232 SkColor color = 0xFF000000;
233 U8CPU alpha = 0xFF;
234 SkPaint paint;
235 paint.setStrokeCap(SkPaint::kRound_Cap);
236 if (_type == KMaskShader) {
237 SkBitmap srcBM;
238 srcBM.setConfig(SkBitmap::kARGB_8888_Config, 10, 1);
239 srcBM.allocPixels();
240 srcBM.eraseColor(0xFF00FF00);
241
242 SkShader* s;
243 s = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
244 SkShader::kClamp_TileMode);
245 paint.setShader(s)->unref();
246 }
247 for (size_t i = 0; i < sizes; i++) {
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000248 switch (_type) {
249 case kMaskOpaque:
250 color = fColors[i];
251 alpha = 0xFF;
reed@google.com981d4792011-03-09 12:55:47 +0000252 break;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000253 case kMaskBlack:
reed@google.com981d4792011-03-09 12:55:47 +0000254 alpha = 0xFF;
255 color = 0xFF000000;
256 break;
257 case kMaskColor:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000258 color = fColors[i];
reed@google.com981d4792011-03-09 12:55:47 +0000259 alpha = rand.nextU() & 255;
260 break;
261 case KMaskShader:
262 break;
263 }
264 paint.setStrokeWidth(gSizes[i]);
265 this->setupPaint(&paint);
266 paint.setColor(color);
267 paint.setAlpha(alpha);
268 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
269 }
270 }
271 virtual const char* onGetName() { return fName; }
272private:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000273 typedef RectBench INHERITED;
274 kMaskType _type;
reed@google.com981d4792011-03-09 12:55:47 +0000275};
276
277
reed@google.com60712f32012-11-15 18:06:00 +0000278DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1)); )
279DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1, 4)); )
280DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3)); )
281DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3, 4)); )
282DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1)); )
283DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3)); )
284DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1)); )
285DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3)); )
286DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points")); )
287DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines")); )
288DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon")); )
reed@android.combd700c32009-01-05 03:34:50 +0000289
reed@google.com2d078b62012-11-15 19:52:07 +0000290DEF_BENCH( return SkNEW_ARGS(SrcModeRectBench, (p)); )
robertphillips@google.com12310e42012-12-14 22:10:30 +0000291DEF_BENCH( return SkNEW_ARGS(AARectBench, (p)); )
reed@google.com2d078b62012-11-15 19:52:07 +0000292
reed@google.com981d4792011-03-09 12:55:47 +0000293/* init the blitmask bench
294 */
reed@google.com60712f32012-11-15 18:06:00 +0000295DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000296 (p, SkCanvas::kPoints_PointMode,
297 BlitMaskBench::kMaskOpaque, "maskopaque")
reed@google.com60712f32012-11-15 18:06:00 +0000298 ); )
299DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000300 (p, SkCanvas::kPoints_PointMode,
301 BlitMaskBench::kMaskBlack, "maskblack")
reed@google.com60712f32012-11-15 18:06:00 +0000302 ); )
303DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000304 (p, SkCanvas::kPoints_PointMode,
305 BlitMaskBench::kMaskColor, "maskcolor")
reed@google.com60712f32012-11-15 18:06:00 +0000306 ); )
307DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000308 (p, SkCanvas::kPoints_PointMode,
309 BlitMaskBench::KMaskShader, "maskshader")
reed@google.com60712f32012-11-15 18:06:00 +0000310 ); )
mike@reedtribe.org2ecead52011-04-02 13:37:23 +0000311