RectBench.cpp revision 7cc0a6ac7b817b217dd614cba96fc533b32d505d
1#include "SkBenchmark.h"
2#include "SkCanvas.h"
3#include "SkPaint.h"
4#include "SkRandom.h"
5#include "SkString.h"
6
7class RectBench : public SkBenchmark {
8public:
9    int fShift;
10    enum {
11        W = 640,
12        H = 480,
13        N = 300
14    };
15    SkRect  fRects[N];
16    SkColor fColors[N];
17
18    RectBench(int shift) : fShift(shift) {
19        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;
25            w >>= shift;
26            h >>= shift;
27            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    }
34
35    SkString fName;
36    const char* computeName(const char root[]) {
37        fName.set(root);
38        fName.appendS32(fShift);
39        return fName.c_str();
40    }
41
42protected:
43    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
44        c->drawRect(r, p);
45    }
46
47    virtual const char* onGetName() { return computeName("rects"); }
48    virtual void onDraw(SkCanvas* canvas) {
49        SkPaint paint;
50        for (int i = 0; i < N; i++) {
51            paint.setColor(fColors[i]);
52            this->setupPaint(&paint);
53            this->drawThisRect(canvas, fRects[i], paint);
54        }
55    }
56};
57
58class OvalBench : public RectBench {
59public:
60    OvalBench(int shift) : RectBench(shift) {}
61protected:
62    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
63        c->drawOval(r, p);
64    }
65    virtual const char* onGetName() { return computeName("ovals"); }
66};
67
68class RRectBench : public RectBench {
69public:
70    RRectBench(int shift) : RectBench(shift) {}
71protected:
72    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
73        c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
74    }
75    virtual const char* onGetName() { return computeName("rrects"); }
76};
77
78class PointsBench : public RectBench {
79public:
80    SkCanvas::PointMode fMode;
81    const char* fName;
82
83    PointsBench(SkCanvas::PointMode mode, const char* name) :
84        RectBench(2), fMode(mode) {
85        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;
95        paint.setStrokeCap(SkPaint::kRound_Cap);
96
97        for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) {
98            paint.setStrokeWidth(gSizes[i]);
99            this->setupPaint(&paint);
100            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
108static 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*) {
115    return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points"));
116}
117static SkBenchmark* LinesFactory(void*) {
118    return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines"));
119}
120static SkBenchmark* PolygonFactory(void*) {
121    return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon"));
122}
123
124static 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);
133
134