blob: a6f300e330700daf9da58669bfa6261032aecdcf [file] [log] [blame]
reed@android.combd700c32009-01-05 03:34:50 +00001#include "SkBenchmark.h"
2#include "SkCanvas.h"
3#include "SkPaint.h"
4#include "SkRandom.h"
reed@android.comd2c37442009-01-08 03:00:57 +00005#include "SkString.h"
reed@google.com981d4792011-03-09 12:55:47 +00006#include "SkShader.h"
reed@android.combd700c32009-01-05 03:34:50 +00007
8class RectBench : public SkBenchmark {
9public:
reed@android.comd2c37442009-01-08 03:00:57 +000010 int fShift;
reed@android.combd700c32009-01-05 03:34:50 +000011 enum {
12 W = 640,
13 H = 480,
reed@android.comd2c37442009-01-08 03:00:57 +000014 N = 300
reed@android.combd700c32009-01-05 03:34:50 +000015 };
16 SkRect fRects[N];
17 SkColor fColors[N];
18
reed@android.come9d00602009-09-02 21:12:42 +000019 RectBench(void* param, int shift) : INHERITED(param), fShift(shift) {
reed@android.combd700c32009-01-05 03:34:50 +000020 SkRandom rand;
21 for (int i = 0; i < N; i++) {
22 int x = rand.nextU() % W;
23 int y = rand.nextU() % H;
24 int w = rand.nextU() % W;
25 int h = rand.nextU() % H;
reed@android.comd2c37442009-01-08 03:00:57 +000026 w >>= shift;
27 h >>= shift;
reed@android.combd700c32009-01-05 03:34:50 +000028 x -= w/2;
29 y -= h/2;
30 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
31 SkIntToScalar(x+w), SkIntToScalar(y+h));
32 fColors[i] = rand.nextU() | 0xFF808080;
33 }
34 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000035
reed@android.comd2c37442009-01-08 03:00:57 +000036 SkString fName;
37 const char* computeName(const char root[]) {
38 fName.set(root);
39 fName.appendS32(fShift);
40 return fName.c_str();
41 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000042
reed@android.combd700c32009-01-05 03:34:50 +000043protected:
44 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
45 c->drawRect(r, p);
46 }
47
reed@android.com4bc19832009-01-19 20:08:35 +000048 virtual const char* onGetName() { return computeName("rects"); }
reed@android.combd700c32009-01-05 03:34:50 +000049 virtual void onDraw(SkCanvas* canvas) {
50 SkPaint paint;
51 for (int i = 0; i < N; i++) {
52 paint.setColor(fColors[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000053 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +000054 this->drawThisRect(canvas, fRects[i], paint);
55 }
56 }
reed@android.come9d00602009-09-02 21:12:42 +000057private:
58 typedef SkBenchmark INHERITED;
reed@android.combd700c32009-01-05 03:34:50 +000059};
60
61class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000062public:
reed@android.come9d00602009-09-02 21:12:42 +000063 OvalBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000064protected:
65 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
66 c->drawOval(r, p);
67 }
reed@android.comd2c37442009-01-08 03:00:57 +000068 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +000069};
70
71class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000072public:
reed@android.come9d00602009-09-02 21:12:42 +000073 RRectBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000074protected:
75 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
76 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
77 }
reed@android.com4bc19832009-01-19 20:08:35 +000078 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +000079};
80
81class PointsBench : public RectBench {
82public:
83 SkCanvas::PointMode fMode;
84 const char* fName;
85
reed@google.com1fcd51e2011-01-05 15:50:27 +000086 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
reed@android.come9d00602009-09-02 21:12:42 +000087 RectBench(param, 2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +000088 fName = name;
89 }
90
91protected:
92 virtual void onDraw(SkCanvas* canvas) {
agl@chromium.org652807b2010-04-27 15:47:34 +000093 SkScalar gSizes[] = {
reed@android.combd700c32009-01-05 03:34:50 +000094 SkIntToScalar(7), 0
95 };
agl@chromium.org652807b2010-04-27 15:47:34 +000096 size_t sizes = SK_ARRAY_COUNT(gSizes);
97
98 if (this->hasStrokeWidth()) {
99 gSizes[0] = this->getStrokeWidth();
100 sizes = 1;
101 }
reed@android.combd700c32009-01-05 03:34:50 +0000102
103 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +0000104 paint.setStrokeCap(SkPaint::kRound_Cap);
agl@chromium.org652807b2010-04-27 15:47:34 +0000105
106 for (size_t i = 0; i < sizes; i++) {
reed@android.combd700c32009-01-05 03:34:50 +0000107 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000108 this->setupPaint(&paint);
reed@google.com1fcd51e2011-01-05 15:50:27 +0000109 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
reed@android.combd700c32009-01-05 03:34:50 +0000110 paint.setColor(fColors[i]);
111 }
112 }
113 virtual const char* onGetName() { return fName; }
114};
115
reed@google.com981d4792011-03-09 12:55:47 +0000116/*******************************************************************************
117 * to bench BlitMask [Opaque, Black, color, shader]
118 *******************************************************************************/
119
120class BlitMaskBench : public RectBench {
121public:
122 enum kMaskType {
123 kMaskOpaque = 0,
124 kMaskBlack,
125 kMaskColor,
126 KMaskShader
127 };
128 SkCanvas::PointMode fMode;
129 const char* fName;
130
131 BlitMaskBench(void* param, SkCanvas::PointMode mode,
132 BlitMaskBench::kMaskType type, const char* name) :
133 RectBench(param, 2), fMode(mode), _type(type) {
134 fName = name;
135 }
136
137protected:
138 virtual void onDraw(SkCanvas* canvas) {
139 SkScalar gSizes[] = {
140 SkIntToScalar(13), SkIntToScalar(24)
141 };
142 size_t sizes = SK_ARRAY_COUNT(gSizes);
143
144 if (this->hasStrokeWidth()) {
145 gSizes[0] = this->getStrokeWidth();
146 sizes = 1;
147 }
148 SkRandom rand;
149 SkColor color = 0xFF000000;
150 U8CPU alpha = 0xFF;
151 SkPaint paint;
152 paint.setStrokeCap(SkPaint::kRound_Cap);
153 if (_type == KMaskShader) {
154 SkBitmap srcBM;
155 srcBM.setConfig(SkBitmap::kARGB_8888_Config, 10, 1);
156 srcBM.allocPixels();
157 srcBM.eraseColor(0xFF00FF00);
158
159 SkShader* s;
160 s = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
161 SkShader::kClamp_TileMode);
162 paint.setShader(s)->unref();
163 }
164 for (size_t i = 0; i < sizes; i++) {
165 switch (_type) {
166 case kMaskOpaque:
167 color = fColors[i];
168 alpha = 0xFF;
169 break;
170 case kMaskBlack:
171 alpha = 0xFF;
172 color = 0xFF000000;
173 break;
174 case kMaskColor:
175 color = fColors[i];
176 alpha = rand.nextU() & 255;
177 break;
178 case KMaskShader:
179 break;
180 }
181 paint.setStrokeWidth(gSizes[i]);
182 this->setupPaint(&paint);
183 paint.setColor(color);
184 paint.setAlpha(alpha);
185 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
186 }
187 }
188 virtual const char* onGetName() { return fName; }
189private:
190 typedef RectBench INHERITED;
191 kMaskType _type;
192};
193
194
reed@android.come9d00602009-09-02 21:12:42 +0000195static SkBenchmark* RectFactory1(void* p) { return SkNEW_ARGS(RectBench, (p, 1)); }
196static SkBenchmark* RectFactory2(void* p) { return SkNEW_ARGS(RectBench, (p, 3)); }
197static SkBenchmark* OvalFactory1(void* p) { return SkNEW_ARGS(OvalBench, (p, 1)); }
198static SkBenchmark* OvalFactory2(void* p) { return SkNEW_ARGS(OvalBench, (p, 3)); }
199static SkBenchmark* RRectFactory1(void* p) { return SkNEW_ARGS(RRectBench, (p, 1)); }
200static SkBenchmark* RRectFactory2(void* p) { return SkNEW_ARGS(RRectBench, (p, 3)); }
201static SkBenchmark* PointsFactory(void* p) {
202 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points"));
reed@android.combd700c32009-01-05 03:34:50 +0000203}
reed@android.come9d00602009-09-02 21:12:42 +0000204static SkBenchmark* LinesFactory(void* p) {
205 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines"));
reed@android.combd700c32009-01-05 03:34:50 +0000206}
reed@android.come9d00602009-09-02 21:12:42 +0000207static SkBenchmark* PolygonFactory(void* p) {
208 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon"));
reed@android.combd700c32009-01-05 03:34:50 +0000209}
210
reed@google.com981d4792011-03-09 12:55:47 +0000211/* init the blitmask bench
212 */
213static SkBenchmark* BlitMaskOpaqueFactory(void* p) {
214 return SkNEW_ARGS(BlitMaskBench,
215 (p, SkCanvas::kPoints_PointMode,
216 BlitMaskBench::kMaskOpaque, "maskopaque")
217 );
218}
219static SkBenchmark* BlitMaskBlackFactory(void* p) {
220 return SkNEW_ARGS(BlitMaskBench,
221 (p, SkCanvas::kPoints_PointMode,
222 BlitMaskBench::kMaskBlack, "maskblack")
223 );
224}
225static SkBenchmark* BlitMaskColorFactory(void* p) {
226 return SkNEW_ARGS(BlitMaskBench,
227 (p, SkCanvas::kPoints_PointMode,
228 BlitMaskBench::kMaskColor, "maskcolor")
229 );
230}
231static SkBenchmark* BlitMaskShaderFactory(void* p) {
232 return SkNEW_ARGS(BlitMaskBench,
233 (p, SkCanvas::kPoints_PointMode,
234 BlitMaskBench::KMaskShader, "maskshader")
235 );
236}
reed@android.comf523e252009-01-26 23:15:37 +0000237static BenchRegistry gRectReg1(RectFactory1);
238static BenchRegistry gRectReg2(RectFactory2);
239static BenchRegistry gOvalReg1(OvalFactory1);
240static BenchRegistry gOvalReg2(OvalFactory2);
241static BenchRegistry gRRectReg1(RRectFactory1);
242static BenchRegistry gRRectReg2(RRectFactory2);
243static BenchRegistry gPointsReg(PointsFactory);
244static BenchRegistry gLinesReg(LinesFactory);
245static BenchRegistry gPolygonReg(PolygonFactory);
reed@google.com981d4792011-03-09 12:55:47 +0000246static BenchRegistry gRectRegOpaque(BlitMaskOpaqueFactory);
247static BenchRegistry gRectRegBlack(BlitMaskBlackFactory);
248static BenchRegistry gRectRegColor(BlitMaskColorFactory);
249static BenchRegistry gRectRegShader(BlitMaskShaderFactory);