blob: a7375334a4cf4f9c4ae5aaa4f21fd8607306800b [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
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000026 RectBench(void* param, int shift, int stroke = 0) : INHERITED(param), fShift(shift), fStroke(stroke) {
reed@android.combd700c32009-01-05 03:34:50 +000027 SkRandom rand;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000028 const SkScalar offset = SK_Scalar1/3;
reed@android.combd700c32009-01-05 03:34:50 +000029 for (int i = 0; i < N; i++) {
30 int x = rand.nextU() % W;
31 int y = rand.nextU() % H;
32 int w = rand.nextU() % W;
33 int h = rand.nextU() % H;
reed@android.comd2c37442009-01-08 03:00:57 +000034 w >>= shift;
35 h >>= shift;
reed@android.combd700c32009-01-05 03:34:50 +000036 x -= w/2;
37 y -= h/2;
38 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
39 SkIntToScalar(x+w), SkIntToScalar(y+h));
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000040 fRects[i].offset(offset, offset);
reed@android.combd700c32009-01-05 03:34:50 +000041 fColors[i] = rand.nextU() | 0xFF808080;
42 }
43 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000044
reed@android.comd2c37442009-01-08 03:00:57 +000045 SkString fName;
46 const char* computeName(const char root[]) {
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000047 fName.printf("%s_%d", root, fShift);
48 if (fStroke > 0) {
49 fName.appendf("_stroke_%d", fStroke);
50 }
reed@android.comd2c37442009-01-08 03:00:57 +000051 return fName.c_str();
52 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000053
reed@android.combd700c32009-01-05 03:34:50 +000054protected:
55 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
56 c->drawRect(r, p);
57 }
58
reed@android.com4bc19832009-01-19 20:08:35 +000059 virtual const char* onGetName() { return computeName("rects"); }
reed@android.combd700c32009-01-05 03:34:50 +000060 virtual void onDraw(SkCanvas* canvas) {
61 SkPaint paint;
mike@reedtribe.org2ecead52011-04-02 13:37:23 +000062 if (fStroke > 0) {
63 paint.setStyle(SkPaint::kStroke_Style);
64 paint.setStrokeWidth(SkIntToScalar(fStroke));
65 }
reed@android.combd700c32009-01-05 03:34:50 +000066 for (int i = 0; i < N; i++) {
67 paint.setColor(fColors[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000068 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +000069 this->drawThisRect(canvas, fRects[i], paint);
70 }
71 }
reed@android.come9d00602009-09-02 21:12:42 +000072private:
73 typedef SkBenchmark INHERITED;
reed@android.combd700c32009-01-05 03:34:50 +000074};
75
reed@google.com2d078b62012-11-15 19:52:07 +000076class SrcModeRectBench : public RectBench {
77public:
78 SrcModeRectBench(void* param) : INHERITED(param, 1, 0) {
79 fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
80 }
skia.committer@gmail.com884e60b2012-11-16 02:01:17 +000081
reed@google.com2d078b62012-11-15 19:52:07 +000082 virtual ~SrcModeRectBench() {
83 SkSafeUnref(fMode);
84 }
85
86protected:
87 virtual void setupPaint(SkPaint* paint) SK_OVERRIDE {
88 this->INHERITED::setupPaint(paint);
89 // srcmode is most interesting when we're not opaque
90 paint->setAlpha(0x80);
91 paint->setXfermode(fMode);
92 }
93
94 virtual const char* onGetName() SK_OVERRIDE {
95 fName.set(this->INHERITED::onGetName());
96 fName.prepend("srcmode_");
97 return fName.c_str();
98 }
99
100private:
101 SkString fName;
102 SkXfermode* fMode;
103
104 typedef RectBench INHERITED;
105};
106
reed@android.combd700c32009-01-05 03:34:50 +0000107class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000108public:
reed@android.come9d00602009-09-02 21:12:42 +0000109 OvalBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +0000110protected:
111 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
112 c->drawOval(r, p);
113 }
reed@android.comd2c37442009-01-08 03:00:57 +0000114 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +0000115};
116
117class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +0000118public:
reed@android.come9d00602009-09-02 21:12:42 +0000119 RRectBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +0000120protected:
121 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
122 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
123 }
reed@android.com4bc19832009-01-19 20:08:35 +0000124 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +0000125};
126
127class PointsBench : public RectBench {
128public:
129 SkCanvas::PointMode fMode;
130 const char* fName;
131
reed@google.com1fcd51e2011-01-05 15:50:27 +0000132 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
reed@android.come9d00602009-09-02 21:12:42 +0000133 RectBench(param, 2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +0000134 fName = name;
135 }
136
137protected:
138 virtual void onDraw(SkCanvas* canvas) {
agl@chromium.org652807b2010-04-27 15:47:34 +0000139 SkScalar gSizes[] = {
reed@android.combd700c32009-01-05 03:34:50 +0000140 SkIntToScalar(7), 0
141 };
agl@chromium.org652807b2010-04-27 15:47:34 +0000142 size_t sizes = SK_ARRAY_COUNT(gSizes);
143
144 if (this->hasStrokeWidth()) {
145 gSizes[0] = this->getStrokeWidth();
146 sizes = 1;
147 }
reed@android.combd700c32009-01-05 03:34:50 +0000148
149 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +0000150 paint.setStrokeCap(SkPaint::kRound_Cap);
agl@chromium.org652807b2010-04-27 15:47:34 +0000151
152 for (size_t i = 0; i < sizes; i++) {
reed@android.combd700c32009-01-05 03:34:50 +0000153 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000154 this->setupPaint(&paint);
reed@google.com1fcd51e2011-01-05 15:50:27 +0000155 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
reed@android.combd700c32009-01-05 03:34:50 +0000156 paint.setColor(fColors[i]);
157 }
158 }
159 virtual const char* onGetName() { return fName; }
160};
161
reed@google.com981d4792011-03-09 12:55:47 +0000162/*******************************************************************************
163 * to bench BlitMask [Opaque, Black, color, shader]
164 *******************************************************************************/
165
166class BlitMaskBench : public RectBench {
167public:
168 enum kMaskType {
169 kMaskOpaque = 0,
170 kMaskBlack,
171 kMaskColor,
172 KMaskShader
173 };
174 SkCanvas::PointMode fMode;
175 const char* fName;
176
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000177 BlitMaskBench(void* param, SkCanvas::PointMode mode,
reed@google.com981d4792011-03-09 12:55:47 +0000178 BlitMaskBench::kMaskType type, const char* name) :
179 RectBench(param, 2), fMode(mode), _type(type) {
180 fName = name;
181 }
182
183protected:
184 virtual void onDraw(SkCanvas* canvas) {
185 SkScalar gSizes[] = {
186 SkIntToScalar(13), SkIntToScalar(24)
187 };
188 size_t sizes = SK_ARRAY_COUNT(gSizes);
189
190 if (this->hasStrokeWidth()) {
191 gSizes[0] = this->getStrokeWidth();
192 sizes = 1;
193 }
194 SkRandom rand;
195 SkColor color = 0xFF000000;
196 U8CPU alpha = 0xFF;
197 SkPaint paint;
198 paint.setStrokeCap(SkPaint::kRound_Cap);
199 if (_type == KMaskShader) {
200 SkBitmap srcBM;
201 srcBM.setConfig(SkBitmap::kARGB_8888_Config, 10, 1);
202 srcBM.allocPixels();
203 srcBM.eraseColor(0xFF00FF00);
204
205 SkShader* s;
206 s = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
207 SkShader::kClamp_TileMode);
208 paint.setShader(s)->unref();
209 }
210 for (size_t i = 0; i < sizes; i++) {
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000211 switch (_type) {
212 case kMaskOpaque:
213 color = fColors[i];
214 alpha = 0xFF;
reed@google.com981d4792011-03-09 12:55:47 +0000215 break;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000216 case kMaskBlack:
reed@google.com981d4792011-03-09 12:55:47 +0000217 alpha = 0xFF;
218 color = 0xFF000000;
219 break;
220 case kMaskColor:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000221 color = fColors[i];
reed@google.com981d4792011-03-09 12:55:47 +0000222 alpha = rand.nextU() & 255;
223 break;
224 case KMaskShader:
225 break;
226 }
227 paint.setStrokeWidth(gSizes[i]);
228 this->setupPaint(&paint);
229 paint.setColor(color);
230 paint.setAlpha(alpha);
231 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
232 }
233 }
234 virtual const char* onGetName() { return fName; }
235private:
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000236 typedef RectBench INHERITED;
237 kMaskType _type;
reed@google.com981d4792011-03-09 12:55:47 +0000238};
239
240
reed@google.com60712f32012-11-15 18:06:00 +0000241DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1)); )
242DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 1, 4)); )
243DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3)); )
244DEF_BENCH( return SkNEW_ARGS(RectBench, (p, 3, 4)); )
245DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 1)); )
246DEF_BENCH( return SkNEW_ARGS(OvalBench, (p, 3)); )
247DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 1)); )
248DEF_BENCH( return SkNEW_ARGS(RRectBench, (p, 3)); )
249DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points")); )
250DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines")); )
251DEF_BENCH( return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon")); )
reed@android.combd700c32009-01-05 03:34:50 +0000252
reed@google.com2d078b62012-11-15 19:52:07 +0000253DEF_BENCH( return SkNEW_ARGS(SrcModeRectBench, (p)); )
254
reed@google.com981d4792011-03-09 12:55:47 +0000255/* init the blitmask bench
256 */
reed@google.com60712f32012-11-15 18:06:00 +0000257DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000258 (p, SkCanvas::kPoints_PointMode,
259 BlitMaskBench::kMaskOpaque, "maskopaque")
reed@google.com60712f32012-11-15 18:06:00 +0000260 ); )
261DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000262 (p, SkCanvas::kPoints_PointMode,
263 BlitMaskBench::kMaskBlack, "maskblack")
reed@google.com60712f32012-11-15 18:06:00 +0000264 ); )
265DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000266 (p, SkCanvas::kPoints_PointMode,
267 BlitMaskBench::kMaskColor, "maskcolor")
reed@google.com60712f32012-11-15 18:06:00 +0000268 ); )
269DEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
reed@google.com981d4792011-03-09 12:55:47 +0000270 (p, SkCanvas::kPoints_PointMode,
271 BlitMaskBench::KMaskShader, "maskshader")
reed@google.com60712f32012-11-15 18:06:00 +0000272 ); )
mike@reedtribe.org2ecead52011-04-02 13:37:23 +0000273