blob: 0c3eb561c48c27f5a7e59331c010514254d14c29 [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@android.combd700c32009-01-05 03:34:50 +00006
7class RectBench : public SkBenchmark {
8public:
reed@android.comd2c37442009-01-08 03:00:57 +00009 int fShift;
reed@android.combd700c32009-01-05 03:34:50 +000010 enum {
11 W = 640,
12 H = 480,
reed@android.comd2c37442009-01-08 03:00:57 +000013 N = 300
reed@android.combd700c32009-01-05 03:34:50 +000014 };
15 SkRect fRects[N];
16 SkColor fColors[N];
17
reed@android.come9d00602009-09-02 21:12:42 +000018 RectBench(void* param, int shift) : INHERITED(param), fShift(shift) {
reed@android.combd700c32009-01-05 03:34:50 +000019 SkRandom rand;
20 for (int i = 0; i < N; i++) {
21 int x = rand.nextU() % W;
22 int y = rand.nextU() % H;
23 int w = rand.nextU() % W;
24 int h = rand.nextU() % H;
reed@android.comd2c37442009-01-08 03:00:57 +000025 w >>= shift;
26 h >>= shift;
reed@android.combd700c32009-01-05 03:34:50 +000027 x -= w/2;
28 y -= h/2;
29 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
30 SkIntToScalar(x+w), SkIntToScalar(y+h));
31 fColors[i] = rand.nextU() | 0xFF808080;
32 }
33 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000034
reed@android.comd2c37442009-01-08 03:00:57 +000035 SkString fName;
36 const char* computeName(const char root[]) {
37 fName.set(root);
38 fName.appendS32(fShift);
39 return fName.c_str();
40 }
reed@google.com1fcd51e2011-01-05 15:50:27 +000041
reed@android.combd700c32009-01-05 03:34:50 +000042protected:
43 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
44 c->drawRect(r, p);
45 }
46
reed@android.com4bc19832009-01-19 20:08:35 +000047 virtual const char* onGetName() { return computeName("rects"); }
reed@android.combd700c32009-01-05 03:34:50 +000048 virtual void onDraw(SkCanvas* canvas) {
49 SkPaint paint;
50 for (int i = 0; i < N; i++) {
51 paint.setColor(fColors[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000052 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +000053 this->drawThisRect(canvas, fRects[i], paint);
54 }
55 }
reed@android.come9d00602009-09-02 21:12:42 +000056private:
57 typedef SkBenchmark INHERITED;
reed@android.combd700c32009-01-05 03:34:50 +000058};
59
60class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000061public:
reed@android.come9d00602009-09-02 21:12:42 +000062 OvalBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000063protected:
64 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
65 c->drawOval(r, p);
66 }
reed@android.comd2c37442009-01-08 03:00:57 +000067 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +000068};
69
70class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000071public:
reed@android.come9d00602009-09-02 21:12:42 +000072 RRectBench(void* param, int shift) : RectBench(param, shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000073protected:
74 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
75 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
76 }
reed@android.com4bc19832009-01-19 20:08:35 +000077 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +000078};
79
80class PointsBench : public RectBench {
81public:
82 SkCanvas::PointMode fMode;
83 const char* fName;
84
reed@google.com1fcd51e2011-01-05 15:50:27 +000085 PointsBench(void* param, SkCanvas::PointMode mode, const char* name) :
reed@android.come9d00602009-09-02 21:12:42 +000086 RectBench(param, 2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +000087 fName = name;
88 }
89
90protected:
91 virtual void onDraw(SkCanvas* canvas) {
agl@chromium.org652807b2010-04-27 15:47:34 +000092 SkScalar gSizes[] = {
reed@android.combd700c32009-01-05 03:34:50 +000093 SkIntToScalar(7), 0
94 };
agl@chromium.org652807b2010-04-27 15:47:34 +000095 size_t sizes = SK_ARRAY_COUNT(gSizes);
96
97 if (this->hasStrokeWidth()) {
98 gSizes[0] = this->getStrokeWidth();
99 sizes = 1;
100 }
reed@android.combd700c32009-01-05 03:34:50 +0000101
102 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +0000103 paint.setStrokeCap(SkPaint::kRound_Cap);
agl@chromium.org652807b2010-04-27 15:47:34 +0000104
105 for (size_t i = 0; i < sizes; i++) {
reed@android.combd700c32009-01-05 03:34:50 +0000106 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000107 this->setupPaint(&paint);
reed@google.com1fcd51e2011-01-05 15:50:27 +0000108 canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
reed@android.combd700c32009-01-05 03:34:50 +0000109 paint.setColor(fColors[i]);
110 }
111 }
112 virtual const char* onGetName() { return fName; }
113};
114
reed@android.come9d00602009-09-02 21:12:42 +0000115static SkBenchmark* RectFactory1(void* p) { return SkNEW_ARGS(RectBench, (p, 1)); }
116static SkBenchmark* RectFactory2(void* p) { return SkNEW_ARGS(RectBench, (p, 3)); }
117static SkBenchmark* OvalFactory1(void* p) { return SkNEW_ARGS(OvalBench, (p, 1)); }
118static SkBenchmark* OvalFactory2(void* p) { return SkNEW_ARGS(OvalBench, (p, 3)); }
119static SkBenchmark* RRectFactory1(void* p) { return SkNEW_ARGS(RRectBench, (p, 1)); }
120static SkBenchmark* RRectFactory2(void* p) { return SkNEW_ARGS(RRectBench, (p, 3)); }
121static SkBenchmark* PointsFactory(void* p) {
122 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points"));
reed@android.combd700c32009-01-05 03:34:50 +0000123}
reed@android.come9d00602009-09-02 21:12:42 +0000124static SkBenchmark* LinesFactory(void* p) {
125 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines"));
reed@android.combd700c32009-01-05 03:34:50 +0000126}
reed@android.come9d00602009-09-02 21:12:42 +0000127static SkBenchmark* PolygonFactory(void* p) {
128 return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon"));
reed@android.combd700c32009-01-05 03:34:50 +0000129}
130
reed@android.comf523e252009-01-26 23:15:37 +0000131static BenchRegistry gRectReg1(RectFactory1);
132static BenchRegistry gRectReg2(RectFactory2);
133static BenchRegistry gOvalReg1(OvalFactory1);
134static BenchRegistry gOvalReg2(OvalFactory2);
135static BenchRegistry gRRectReg1(RRectFactory1);
136static BenchRegistry gRRectReg2(RRectFactory2);
137static BenchRegistry gPointsReg(PointsFactory);
138static BenchRegistry gLinesReg(LinesFactory);
139static BenchRegistry gPolygonReg(PolygonFactory);