blob: 69e0b005ebbb37ad085b2583951f2a9b8d8493cc [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.comd2c37442009-01-08 03:00:57 +000018 RectBench(int shift) : 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@android.comd2c37442009-01-08 03:00:57 +000034
35 SkString fName;
36 const char* computeName(const char root[]) {
37 fName.set(root);
38 fName.appendS32(fShift);
39 return fName.c_str();
40 }
reed@android.combd700c32009-01-05 03:34:50 +000041
42protected:
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 }
56};
57
58class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000059public:
60 OvalBench(int shift) : RectBench(shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000061protected:
62 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
63 c->drawOval(r, p);
64 }
reed@android.comd2c37442009-01-08 03:00:57 +000065 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +000066};
67
68class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000069public:
70 RRectBench(int shift) : RectBench(shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000071protected:
72 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
73 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
74 }
reed@android.com4bc19832009-01-19 20:08:35 +000075 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +000076};
77
78class PointsBench : public RectBench {
79public:
80 SkCanvas::PointMode fMode;
81 const char* fName;
82
reed@android.comd2c37442009-01-08 03:00:57 +000083 PointsBench(SkCanvas::PointMode mode, const char* name) :
84 RectBench(2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +000085 fName = name;
86 }
87
88protected:
89 virtual void onDraw(SkCanvas* canvas) {
90 static const SkScalar gSizes[] = {
91 SkIntToScalar(7), 0
92 };
93
94 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +000095 paint.setStrokeCap(SkPaint::kRound_Cap);
96
97 for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) {
98 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000099 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +0000100 canvas->drawPoints(fMode, N * 2,
101 reinterpret_cast<const SkPoint*>(fRects), paint);
102 paint.setColor(fColors[i]);
103 }
104 }
105 virtual const char* onGetName() { return fName; }
106};
107
reed@android.coma70ba362009-01-22 17:41:57 +0000108static SkBenchmark* RectFactory1(void*) { return SkNEW_ARGS(RectBench, (1)); }
109static SkBenchmark* RectFactory2(void*) { return SkNEW_ARGS(RectBench, (3)); }
110static SkBenchmark* OvalFactory1(void*) { return SkNEW_ARGS(OvalBench, (1)); }
111static SkBenchmark* OvalFactory2(void*) { return SkNEW_ARGS(OvalBench, (3)); }
112static SkBenchmark* RRectFactory1(void*) { return SkNEW_ARGS(RRectBench, (1)); }
113static SkBenchmark* RRectFactory2(void*) { return SkNEW_ARGS(RRectBench, (3)); }
114static SkBenchmark* PointsFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000115 return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points"));
116}
reed@android.coma70ba362009-01-22 17:41:57 +0000117static SkBenchmark* LinesFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000118 return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines"));
119}
reed@android.coma70ba362009-01-22 17:41:57 +0000120static SkBenchmark* PolygonFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000121 return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon"));
122}
123
reed@android.comf523e252009-01-26 23:15:37 +0000124static BenchRegistry gRectReg1(RectFactory1);
125static BenchRegistry gRectReg2(RectFactory2);
126static BenchRegistry gOvalReg1(OvalFactory1);
127static BenchRegistry gOvalReg2(OvalFactory2);
128static BenchRegistry gRRectReg1(RRectFactory1);
129static BenchRegistry gRRectReg2(RRectFactory2);
130static BenchRegistry gPointsReg(PointsFactory);
131static BenchRegistry gLinesReg(LinesFactory);
132static BenchRegistry gPolygonReg(PolygonFactory);
reed@android.combd700c32009-01-05 03:34:50 +0000133