blob: 13239f1500d9201512e3635c024fd955c6efa6f7 [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 SkIPoint onGetSize() { return SkMakeIPoint(640, 480); }
49 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 }
57};
58
59class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000060public:
61 OvalBench(int shift) : RectBench(shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000062protected:
63 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
64 c->drawOval(r, p);
65 }
reed@android.comd2c37442009-01-08 03:00:57 +000066 virtual const char* onGetName() { return computeName("ovals"); }
reed@android.combd700c32009-01-05 03:34:50 +000067};
68
69class RRectBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000070public:
71 RRectBench(int shift) : RectBench(shift) {}
reed@android.combd700c32009-01-05 03:34:50 +000072protected:
73 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
74 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
75 }
reed@android.com4bc19832009-01-19 20:08:35 +000076 virtual const char* onGetName() { return computeName("rrects"); }
reed@android.combd700c32009-01-05 03:34:50 +000077};
78
79class PointsBench : public RectBench {
80public:
81 SkCanvas::PointMode fMode;
82 const char* fName;
83
reed@android.comd2c37442009-01-08 03:00:57 +000084 PointsBench(SkCanvas::PointMode mode, const char* name) :
85 RectBench(2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +000086 fName = name;
87 }
88
89protected:
90 virtual void onDraw(SkCanvas* canvas) {
91 static const SkScalar gSizes[] = {
92 SkIntToScalar(7), 0
93 };
94
95 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +000096 paint.setStrokeCap(SkPaint::kRound_Cap);
97
98 for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) {
99 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000100 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +0000101 canvas->drawPoints(fMode, N * 2,
102 reinterpret_cast<const SkPoint*>(fRects), paint);
103 paint.setColor(fColors[i]);
104 }
105 }
106 virtual const char* onGetName() { return fName; }
107};
108
reed@android.comd2c37442009-01-08 03:00:57 +0000109static SkBenchmark* RectFactory1() { return SkNEW_ARGS(RectBench, (1)); }
110static SkBenchmark* RectFactory2() { return SkNEW_ARGS(RectBench, (3)); }
111static SkBenchmark* OvalFactory1() { return SkNEW_ARGS(OvalBench, (1)); }
112static SkBenchmark* OvalFactory2() { return SkNEW_ARGS(OvalBench, (3)); }
113static SkBenchmark* RRectFactory1() { return SkNEW_ARGS(RRectBench, (1)); }
114static SkBenchmark* RRectFactory2() { return SkNEW_ARGS(RRectBench, (3)); }
reed@android.combd700c32009-01-05 03:34:50 +0000115static SkBenchmark* PointsFactory() {
116 return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points"));
117}
118static SkBenchmark* LinesFactory() {
119 return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines"));
120}
121static SkBenchmark* PolygonFactory() {
122 return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon"));
123}
124
reed@android.comd2c37442009-01-08 03:00:57 +0000125static SkTRegistry<SkBenchmark> gRectReg1(RectFactory1);
126static SkTRegistry<SkBenchmark> gRectReg2(RectFactory2);
127static SkTRegistry<SkBenchmark> gOvalReg1(OvalFactory1);
128static SkTRegistry<SkBenchmark> gOvalReg2(OvalFactory2);
129static SkTRegistry<SkBenchmark> gRRectReg1(RRectFactory1);
130static SkTRegistry<SkBenchmark> gRRectReg2(RRectFactory2);
reed@android.combd700c32009-01-05 03:34:50 +0000131static SkTRegistry<SkBenchmark> gPointsReg(PointsFactory);
132static SkTRegistry<SkBenchmark> gLinesReg(LinesFactory);
133static SkTRegistry<SkBenchmark> gPolygonReg(PolygonFactory);
134