blob: ba01375b82b02f3384208d2bfb5335d32b838521 [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.coma70ba362009-01-22 17:41:57 +00006#include "SkTRegistry.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.comd2c37442009-01-08 03:00:57 +000019 RectBench(int shift) : 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@android.comd2c37442009-01-08 03:00:57 +000035
36 SkString fName;
37 const char* computeName(const char root[]) {
38 fName.set(root);
39 fName.appendS32(fShift);
40 return fName.c_str();
41 }
reed@android.combd700c32009-01-05 03:34:50 +000042
43protected:
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 SkIPoint onGetSize() { return SkMakeIPoint(640, 480); }
50 virtual void onDraw(SkCanvas* canvas) {
51 SkPaint paint;
52 for (int i = 0; i < N; i++) {
53 paint.setColor(fColors[i]);
reed@android.com4bc19832009-01-19 20:08:35 +000054 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +000055 this->drawThisRect(canvas, fRects[i], paint);
56 }
57 }
58};
59
60class OvalBench : public RectBench {
reed@android.comd2c37442009-01-08 03:00:57 +000061public:
62 OvalBench(int shift) : RectBench(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:
72 RRectBench(int shift) : RectBench(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@android.comd2c37442009-01-08 03:00:57 +000085 PointsBench(SkCanvas::PointMode mode, const char* name) :
86 RectBench(2), fMode(mode) {
reed@android.combd700c32009-01-05 03:34:50 +000087 fName = name;
88 }
89
90protected:
91 virtual void onDraw(SkCanvas* canvas) {
92 static const SkScalar gSizes[] = {
93 SkIntToScalar(7), 0
94 };
95
96 SkPaint paint;
reed@android.combd700c32009-01-05 03:34:50 +000097 paint.setStrokeCap(SkPaint::kRound_Cap);
98
99 for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) {
100 paint.setStrokeWidth(gSizes[i]);
reed@android.com4bc19832009-01-19 20:08:35 +0000101 this->setupPaint(&paint);
reed@android.combd700c32009-01-05 03:34:50 +0000102 canvas->drawPoints(fMode, N * 2,
103 reinterpret_cast<const SkPoint*>(fRects), paint);
104 paint.setColor(fColors[i]);
105 }
106 }
107 virtual const char* onGetName() { return fName; }
108};
109
reed@android.coma70ba362009-01-22 17:41:57 +0000110static SkBenchmark* RectFactory1(void*) { return SkNEW_ARGS(RectBench, (1)); }
111static SkBenchmark* RectFactory2(void*) { return SkNEW_ARGS(RectBench, (3)); }
112static SkBenchmark* OvalFactory1(void*) { return SkNEW_ARGS(OvalBench, (1)); }
113static SkBenchmark* OvalFactory2(void*) { return SkNEW_ARGS(OvalBench, (3)); }
114static SkBenchmark* RRectFactory1(void*) { return SkNEW_ARGS(RRectBench, (1)); }
115static SkBenchmark* RRectFactory2(void*) { return SkNEW_ARGS(RRectBench, (3)); }
116static SkBenchmark* PointsFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000117 return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points"));
118}
reed@android.coma70ba362009-01-22 17:41:57 +0000119static SkBenchmark* LinesFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000120 return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines"));
121}
reed@android.coma70ba362009-01-22 17:41:57 +0000122static SkBenchmark* PolygonFactory(void*) {
reed@android.combd700c32009-01-05 03:34:50 +0000123 return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon"));
124}
125
reed@android.coma70ba362009-01-22 17:41:57 +0000126static SkTRegistry<SkBenchmark*, void*> gRectReg1(RectFactory1);
127static SkTRegistry<SkBenchmark*, void*> gRectReg2(RectFactory2);
128static SkTRegistry<SkBenchmark*, void*> gOvalReg1(OvalFactory1);
129static SkTRegistry<SkBenchmark*, void*> gOvalReg2(OvalFactory2);
130static SkTRegistry<SkBenchmark*, void*> gRRectReg1(RRectFactory1);
131static SkTRegistry<SkBenchmark*, void*> gRRectReg2(RRectFactory2);
132static SkTRegistry<SkBenchmark*, void*> gPointsReg(PointsFactory);
133static SkTRegistry<SkBenchmark*, void*> gLinesReg(LinesFactory);
134static SkTRegistry<SkBenchmark*, void*> gPolygonReg(PolygonFactory);
reed@android.combd700c32009-01-05 03:34:50 +0000135