blob: 22c26456e3b264b4e99bc361924507e5a3370408 [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"
mtklein@google.comc2897432013-09-10 19:23:38 +000010#include "SkCommandLineFlags.h"
reed@android.combd700c32009-01-05 03:34:50 +000011#include "SkPaint.h"
12#include "SkRandom.h"
reed@google.com981d4792011-03-09 12:55:47 +000013#include "SkShader.h"
mtklein@google.comc2897432013-09-10 19:23:38 +000014#include "SkString.h"
15
16DEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
reed@android.combd700c32009-01-05 03:34:50 +000017
18class RectBench : public SkBenchmark {
19public:
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000020 int fShift, fStroke;
reed@android.combd700c32009-01-05 03:34:50 +000021 enum {
22 W = 640,
23 H = 480,
mtklein@google.comc2897432013-09-10 19:23:38 +000024 N = 300,
reed@android.combd700c32009-01-05 03:34:50 +000025 };
26 SkRect fRects[N];
27 SkColor fColors[N];
28
skia.committer@gmail.coma7aedfe2012-12-15 02:03:10 +000029 RectBench(void* param, int shift, int stroke = 0)
robertphillips@google.com12310e42012-12-14 22:10:30 +000030 : INHERITED(param)
31 , fShift(shift)
32 , fStroke(stroke) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000033 SkRandom rand;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000034 const SkScalar offset = SK_Scalar1/3;
reed@android.combd700c32009-01-05 03:34:50 +000035 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;
reed@android.comd2c37442009-01-08 03:00:57 +000040 w >>= shift;
41 h >>= shift;
reed@android.combd700c32009-01-05 03:34:50 +000042 x -= w/2;
43 y -= h/2;
44 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
45 SkIntToScalar(x+w), SkIntToScalar(y+h));
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000046 fRects[i].offset(offset, offset);
reed@android.combd700c32009-01-05 03:34:50 +000047 fColors[i] = rand.nextU() | 0xFF808080;
48 }
49 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000050
reed@android.comd2c37442009-01-08 03:00:57 +000051 SkString fName;
52 const char* computeName(const char root[]) {
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000053 fName.printf("%s_%d", root, fShift);
54 if (fStroke > 0) {
55 fName.appendf("_stroke_%d", fStroke);
56 }
reed@android.comd2c37442009-01-08 03:00:57 +000057 return fName.c_str();
58 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000059
reed@android.combd700c32009-01-05 03:34:50 +000060protected:
61 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
62 c->drawRect(r, p);
63 }
64
reed@android.com4bc19832009-01-19 20:08:35 +000065 virtual const char* onGetName() { return computeName("rects"); }
reed@android.combd700c32009-01-05 03:34:50 +000066 virtual void onDraw(SkCanvas* canvas) {
67 SkPaint paint;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000068 if (fStroke > 0) {
69 paint.setStyle(SkPaint::kStroke_Style);
70 paint.setStrokeWidth(SkIntToScalar(fStroke));
71 }
mtklein@google.comc2897432013-09-10 19:23:38 +000072 for (int i = 0; i < this->getLoops(); i++) {
73 paint.setColor(fColors[i % N]);
reed@android.com4bc19832009-01-19 20:08:35 +000074 this->setupPaint(&paint);
mtklein@google.comc2897432013-09-10 19:23:38 +000075 this->drawThisRect(canvas, fRects[i % N], paint);
reed@android.combd700c32009-01-05 03:34:50 +000076 }
77 }
reed@android.come9d00602009-09-02 21:12:42 +000078private:
79 typedef SkBenchmark INHERITED;
reed@android.combd700c32009-01-05 03:34:50 +000080};
81
reed@google.com2d078b62012-11-15 19:52:07 +000082class SrcModeRectBench : public RectBench {
83public:
84 SrcModeRectBench(void* param) : INHERITED(param, 1, 0) {
85 fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
86 }
skia.committer@gmail.com884e60b2012-11-16 02:01:17 +000087
reed@google.com2d078b62012-11-15 19:52:07 +000088 virtual ~SrcModeRectBench() {
89 SkSafeUnref(fMode);
90 }
91
92protected:
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);
98 }
99
100 virtual const char* onGetName() SK_OVERRIDE {
101 fName.set(this->INHERITED::onGetName());
102 fName.prepend("srcmode_");
103 return fName.c_str();
104 }
105
106private:
107 SkString fName;
108 SkXfermode* fMode;
109
110 typedef RectBench INHERITED;
111};
112
reed@android.combd700c32009-01-05 03:34:50 +0000113class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000114public:
jvanverth@google.comce0ce4f2013-05-07 13:03:21 +0000115 OvalBench(void* param, int shift, int stroke = 0) : RectBench(param, shift, stroke) {}
reed@android.combd700c32009-01-05 03:34:50 +0000116protected:
117 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
118 c->drawOval(r, p);
119 }
reed@android.comd2c37442009-01-08 03:00:57 +0000120 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +0000121};
122
123class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000124public:
jvanverth@google.com190260e2013-04-23 19:14:03 +0000125 RRectBench(void* param, int shift, int stroke = 0) : RectBench(param, shift, stroke) {}
reed@android.combd700c32009-01-05 03:34:50 +0000126protected:
127 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
128 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
129 }
reed@android.com4bc19832009-01-19 20:08:35 +0000130 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +0000131};
132
133class PointsBench : public RectBench {
134public:
135 SkCanvas::PointMode fMode;
136 const char* fName;
137
reed@google.com1fcd51e2011-01-05 15:50:27 +0000138 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
reed@android.come9d00602009-09-02 21:12:42 +0000139 RectBench(param, 2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +0000140 fName = name;
141 }
142
143protected:
144 virtual void onDraw(SkCanvas* canvas) {
agl@chromium.org652807b2010-04-27 15:47:34 +0000145 SkScalar gSizes[] = {
reed@android.combd700c32009-01-05 03:34:50 +0000146 SkIntToScalar(7), 0
147 };
agl@chromium.org652807b2010-04-27 15:47:34 +0000148 size_t sizes = SK_ARRAY_COUNT(gSizes);
149
mtklein@google.comc2897432013-09-10 19:23:38 +0000150 if (FLAGS_strokeWidth >= 0) {
mtklein@google.comb87bf832013-09-10 19:51:10 +0000151 gSizes[0] = (SkScalar)FLAGS_strokeWidth;
agl@chromium.org652807b2010-04-27 15:47:34 +0000152 sizes = 1;
153 }
reed@android.combd700c32009-01-05 03:34:50 +0000154
155 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +0000156 paint.setStrokeCap(SkPaint::kRound_Cap);
agl@chromium.org652807b2010-04-27 15:47:34 +0000157
mtklein@google.comc2897432013-09-10 19:23:38 +0000158 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]);
164 }
reed@android.combd700c32009-01-05 03:34:50 +0000165 }
166 }
167 virtual const char* onGetName() { return fName; }
168};
169
robertphillips@google.com12310e42012-12-14 22:10:30 +0000170class AARectBench : public SkBenchmark {
171public:
172 enum {
173 W = 640,
174 H = 480,
175 };
176
robertphillips@google.com370d8352013-05-02 13:57:52 +0000177 AARectBench(void* param, bool rotate) : INHERITED(param), fRotate(rotate) {}
robertphillips@google.com12310e42012-12-14 22:10:30 +0000178
179protected:
180
skia.committer@gmail.com2fd42c42013-05-03 07:01:00 +0000181 virtual const char* onGetName() {
robertphillips@google.com370d8352013-05-02 13:57:52 +0000182 if (fRotate) {
skia.committer@gmail.com2fd42c42013-05-03 07:01:00 +0000183 return "aarects_rotated";
robertphillips@google.com370d8352013-05-02 13:57:52 +0000184 }
skia.committer@gmail.com2fd42c42013-05-03 07:01:00 +0000185 return "aarects";
robertphillips@google.com370d8352013-05-02 13:57:52 +0000186 }
robertphillips@google.com12310e42012-12-14 22:10:30 +0000187
188 virtual void onDraw(SkCanvas* canvas) {
robertphillips@google.com370d8352013-05-02 13:57:52 +0000189 static const SkScalar kHalfRectSize = SkFloatToScalar(0.75f);
190
robertphillips@google.com12310e42012-12-14 22:10:30 +0000191 SkPaint paint;
192 this->setupPaint(&paint);
193 paint.setAntiAlias(true);
194 paint.setColor(SK_ColorBLACK);
robertphillips@google.com370d8352013-05-02 13:57:52 +0000195 SkRect r = { -kHalfRectSize, -kHalfRectSize, kHalfRectSize, kHalfRectSize };
196 int rot = 0;
robertphillips@google.com12310e42012-12-14 22:10:30 +0000197
mtklein@google.comc2897432013-09-10 19:23:38 +0000198 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) {
202 canvas->save();
203 canvas->translate(x, y);
robertphillips@google.com370d8352013-05-02 13:57:52 +0000204
mtklein@google.comc2897432013-09-10 19:23:38 +0000205 if (fRotate) {
206 SkMatrix rotate;
207 rotate.setRotate(SkIntToScalar(rot));
208 canvas->concat(rotate);
209 rot += 10;
210 }
211
212 canvas->drawRect(r, paint);
213 canvas->restore();
robertphillips@google.com370d8352013-05-02 13:57:52 +0000214 }
robertphillips@google.com12310e42012-12-14 22:10:30 +0000215 }
216 }
217
218 }
219private:
robertphillips@google.com370d8352013-05-02 13:57:52 +0000220 bool fRotate;
robertphillips@google.com12310e42012-12-14 22:10:30 +0000221 typedef SkBenchmark INHERITED;
222};
223
reed@google.com981d4792011-03-09 12:55:47 +0000224/*******************************************************************************
225 * to bench BlitMask [Opaque, Black, color, shader]
226 *******************************************************************************/
227
228class BlitMaskBench : public RectBench {
229public:
230 enum kMaskType {
231 kMaskOpaque = 0,
232 kMaskBlack,
233 kMaskColor,
234 KMaskShader
235 };
236 SkCanvas::PointMode fMode;
237 const char* fName;
238
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000239 BlitMaskBench(void* param, SkCanvas::PointMode mode,
reed@google.com981d4792011-03-09 12:55:47 +0000240 BlitMaskBench::kMaskType type, const char* name) :
241 RectBench(param, 2), fMode(mode), _type(type) {
242 fName = name;
243 }
244
245protected:
246 virtual void onDraw(SkCanvas* canvas) {
247 SkScalar gSizes[] = {
248 SkIntToScalar(13), SkIntToScalar(24)
249 };
250 size_t sizes = SK_ARRAY_COUNT(gSizes);
251
mtklein@google.comc2897432013-09-10 19:23:38 +0000252 if (FLAGS_strokeWidth >= 0) {
mtklein@google.comb87bf832013-09-10 19:51:10 +0000253 gSizes[0] = (SkScalar)FLAGS_strokeWidth;
reed@google.com981d4792011-03-09 12:55:47 +0000254 sizes = 1;
255 }
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000256 SkRandom rand;
reed@google.com981d4792011-03-09 12:55:47 +0000257 SkColor color = 0xFF000000;
258 U8CPU alpha = 0xFF;
259 SkPaint paint;
260 paint.setStrokeCap(SkPaint::kRound_Cap);
261 if (_type == KMaskShader) {
262 SkBitmap srcBM;
263 srcBM.setConfig(SkBitmap::kARGB_8888_Config, 10, 1);
264 srcBM.allocPixels();
265 srcBM.eraseColor(0xFF00FF00);
266
267 SkShader* s;
268 s = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
269 SkShader::kClamp_TileMode);
270 paint.setShader(s)->unref();
271 }
mtklein@google.comc2897432013-09-10 19:23:38 +0000272 for (int loop = 0; loop < this->getLoops(); loop++) {
273 for (size_t i = 0; i < sizes; i++) {
274 switch (_type) {
275 case kMaskOpaque:
276 color = fColors[i];
277 alpha = 0xFF;
278 break;
279 case kMaskBlack:
280 alpha = 0xFF;
281 color = 0xFF000000;
282 break;
283 case kMaskColor:
284 color = fColors[i];
285 alpha = rand.nextU() & 255;
286 break;
287 case KMaskShader:
288 break;
289 }
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);
295 }
296 }
reed@google.com981d4792011-03-09 12:55:47 +0000297 }
298 virtual const char* onGetName() { return fName; }
299private:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000300 typedef RectBench INHERITED;
301 kMaskType _type;
reed@google.com981d4792011-03-09 12:55:47 +0000302};
303
304
reed@google.com60712f32012-11-15 18:06:00 +0000305DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1)); )
306DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1, 4)); )
307DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3)); )
308DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3, 4)); )
309DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1)); )
310DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3)); )
jvanverth@google.comce0ce4f2013-05-07 13:03:21 +0000311DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1, 4)); )
312DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3, 4)); )
reed@google.com60712f32012-11-15 18:06:00 +0000313DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1)); )
jvanverth@google.com190260e2013-04-23 19:14:03 +0000314DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1, 4)); )
reed@google.com60712f32012-11-15 18:06:00 +0000315DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3)); )
jvanverth@google.com190260e2013-04-23 19:14:03 +0000316DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3, 4)); )
reed@google.com60712f32012-11-15 18:06:00 +0000317DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points")); )
318DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines")); )
319DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon")); )
reed@android.combd700c32009-01-05 03:34:50 +0000320
reed@google.com2d078b62012-11-15 19:52:07 +0000321DEF_BENCH( return SkNEW_ARGS(SrcModeRectBench, (p)); )
robertphillips@google.com370d8352013-05-02 13:57:52 +0000322
323DEF_BENCH( return SkNEW_ARGS(AARectBench, (p, false)); )
324DEF_BENCH( return SkNEW_ARGS(AARectBench, (p, true)); )
reed@google.com2d078b62012-11-15 19:52:07 +0000325
reed@google.com981d4792011-03-09 12:55:47 +0000326/* init the blitmask bench
327 */
reed@google.com60712f32012-11-15 18:06:00 +0000328DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000329 (p, SkCanvas::kPoints_PointMode,
330 BlitMaskBench::kMaskOpaque, "maskopaque")
reed@google.com60712f32012-11-15 18:06:00 +0000331 ); )
332DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000333 (p, SkCanvas::kPoints_PointMode,
334 BlitMaskBench::kMaskBlack, "maskblack")
reed@google.com60712f32012-11-15 18:06:00 +0000335 ); )
336DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000337 (p, SkCanvas::kPoints_PointMode,
338 BlitMaskBench::kMaskColor, "maskcolor")
reed@google.com60712f32012-11-15 18:06:00 +0000339 ); )
340DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000341 (p, SkCanvas::kPoints_PointMode,
342 BlitMaskBench::KMaskShader, "maskshader")
reed@google.com60712f32012-11-15 18:06:00 +0000343 ); )