blob: 081e2421d727e6ea984f8da9c3ec6183144e6fc4 [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"
5
6class RectBench : public SkBenchmark {
7public:
8 enum {
9 W = 640,
10 H = 480,
11 N = 100
12 };
13 SkRect fRects[N];
14 SkColor fColors[N];
15
16 RectBench() {
17 SkRandom rand;
18 for (int i = 0; i < N; i++) {
19 int x = rand.nextU() % W;
20 int y = rand.nextU() % H;
21 int w = rand.nextU() % W;
22 int h = rand.nextU() % H;
23 w >>= 1;
24 h >>= 1;
25 x -= w/2;
26 y -= h/2;
27 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
28 SkIntToScalar(x+w), SkIntToScalar(y+h));
29 fColors[i] = rand.nextU() | 0xFF808080;
30 }
31 }
32
33protected:
34 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
35 c->drawRect(r, p);
36 }
37
38 virtual const char* onGetName() { return "rectangles"; }
39 virtual SkIPoint onGetSize() { return SkMakeIPoint(640, 480); }
40 virtual void onDraw(SkCanvas* canvas) {
41 SkPaint paint;
42 for (int i = 0; i < N; i++) {
43 paint.setColor(fColors[i]);
44 this->drawThisRect(canvas, fRects[i], paint);
45 }
46 }
47};
48
49class OvalBench : public RectBench {
50protected:
51 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
52 c->drawOval(r, p);
53 }
54 virtual const char* onGetName() { return "ovals"; }
55};
56
57class RRectBench : public RectBench {
58protected:
59 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
60 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
61 }
62 virtual const char* onGetName() { return "roundrects"; }
63};
64
65class PointsBench : public RectBench {
66public:
67 SkCanvas::PointMode fMode;
68 const char* fName;
69
70 PointsBench(SkCanvas::PointMode mode, const char* name) : fMode(mode) {
71 fName = name;
72 }
73
74protected:
75 virtual void onDraw(SkCanvas* canvas) {
76 static const SkScalar gSizes[] = {
77 SkIntToScalar(7), 0
78 };
79
80 SkPaint paint;
81 paint.setAntiAlias(true);
82 paint.setStrokeCap(SkPaint::kRound_Cap);
83
84 for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) {
85 paint.setStrokeWidth(gSizes[i]);
86 canvas->drawPoints(fMode, N * 2,
87 reinterpret_cast<const SkPoint*>(fRects), paint);
88 paint.setColor(fColors[i]);
89 }
90 }
91 virtual const char* onGetName() { return fName; }
92};
93
94static SkBenchmark* RectFactory() { return SkNEW(RectBench); }
95static SkBenchmark* OvalFactory() { return SkNEW(OvalBench); }
96static SkBenchmark* RRectFactory() { return SkNEW(RRectBench); }
97static SkBenchmark* PointsFactory() {
98 return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points"));
99}
100static SkBenchmark* LinesFactory() {
101 return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines"));
102}
103static SkBenchmark* PolygonFactory() {
104 return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon"));
105}
106
107static SkTRegistry<SkBenchmark> gRectReg(RectFactory);
108static SkTRegistry<SkBenchmark> gOvalReg(OvalFactory);
109static SkTRegistry<SkBenchmark> gRRectReg(RRectFactory);
110static SkTRegistry<SkBenchmark> gPointsReg(PointsFactory);
111static SkTRegistry<SkBenchmark> gLinesReg(LinesFactory);
112static SkTRegistry<SkBenchmark> gPolygonReg(PolygonFactory);
113