blob: beaa9ab1f8a9377e96f99c5219bbd5e07352dfd0 [file] [log] [blame]
reed@google.comd34658a2011-04-11 13:12:51 +00001#include "SkBenchmark.h"
2#include "SkBitmap.h"
3#include "SkCanvas.h"
4#include "SkColorPriv.h"
5#include "SkPaint.h"
tomhudson@google.com6e8d3352011-06-22 17:16:35 +00006#include "SkRandom.h"
reed@google.comd34658a2011-04-11 13:12:51 +00007#include "SkShader.h"
8#include "SkString.h"
9
10enum Flags {
11 kStroke_Flag = 1 << 0,
12 kBig_Flag = 1 << 1
13};
14
15#define FLAGS00 Flags(0)
16#define FLAGS01 Flags(kStroke_Flag)
17#define FLAGS10 Flags(kBig_Flag)
18#define FLAGS11 Flags(kStroke_Flag | kBig_Flag)
19
20class PathBench : public SkBenchmark {
21 SkPaint fPaint;
22 SkString fName;
23 Flags fFlags;
24 enum { N = 1000 };
25public:
26 PathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) {
27 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
28 SkPaint::kFill_Style);
29 fPaint.setStrokeWidth(SkIntToScalar(5));
30 fPaint.setStrokeJoin(SkPaint::kBevel_Join);
31 }
32
33 virtual void appendName(SkString*) = 0;
34 virtual void makePath(SkPath*) = 0;
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000035 virtual int complexity() { return 0; }
reed@google.comd34658a2011-04-11 13:12:51 +000036
37protected:
38 virtual const char* onGetName() {
39 fName.printf("path_%s_%s_",
40 fFlags & kStroke_Flag ? "stroke" : "fill",
41 fFlags & kBig_Flag ? "big" : "small");
42 this->appendName(&fName);
43 return fName.c_str();
44 }
45
46 virtual void onDraw(SkCanvas* canvas) {
47 SkPaint paint(fPaint);
48 this->setupPaint(&paint);
49
50 SkPath path;
51 this->makePath(&path);
52 if (fFlags & kBig_Flag) {
53 SkMatrix m;
54 m.setScale(SkIntToScalar(10), SkIntToScalar(10));
55 path.transform(m);
56 }
57
58 int count = N;
59 if (fFlags & kBig_Flag) {
60 count >>= 2;
61 }
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000062 count >>= (3 * complexity());
reed@google.comd34658a2011-04-11 13:12:51 +000063
64 for (int i = 0; i < count; i++) {
65 canvas->drawPath(path, paint);
66 }
67 }
68
69private:
70 typedef SkBenchmark INHERITED;
71};
72
73class TrianglePathBench : public PathBench {
74public:
75 TrianglePathBench(void* param, Flags flags) : INHERITED(param, flags) {}
76
77 virtual void appendName(SkString* name) {
78 name->append("triangle");
79 }
80 virtual void makePath(SkPath* path) {
81 static const int gCoord[] = {
82 10, 10, 15, 5, 20, 20
83 };
84 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
85 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
86 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
87 path->close();
88 }
89private:
90 typedef PathBench INHERITED;
91};
92
93class RectPathBench : public PathBench {
94public:
95 RectPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
96
97 virtual void appendName(SkString* name) {
98 name->append("rect");
99 }
100 virtual void makePath(SkPath* path) {
101 SkRect r = { 10, 10, 20, 20 };
102 path->addRect(r);
103 }
104private:
105 typedef PathBench INHERITED;
106};
107
108class OvalPathBench : public PathBench {
109public:
110 OvalPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
111
112 virtual void appendName(SkString* name) {
113 name->append("oval");
114 }
115 virtual void makePath(SkPath* path) {
116 SkRect r = { 10, 10, 20, 20 };
117 path->addOval(r);
118 }
119private:
120 typedef PathBench INHERITED;
121};
122
123class SawToothPathBench : public PathBench {
124public:
125 SawToothPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
126
127 virtual void appendName(SkString* name) {
128 name->append("sawtooth");
129 }
130 virtual void makePath(SkPath* path) {
131 SkScalar x = SkIntToScalar(20);
132 SkScalar y = SkIntToScalar(20);
133 const SkScalar x0 = x;
134 const SkScalar dx = SK_Scalar1 * 5;
135 const SkScalar dy = SK_Scalar1 * 10;
136
137 path->moveTo(x, y);
138 for (int i = 0; i < 32; i++) {
139 x += dx;
140 path->lineTo(x, y - dy);
141 x += dx;
142 path->lineTo(x, y + dy);
143 }
144 path->lineTo(x, y + 2 * dy);
145 path->lineTo(x0, y + 2 * dy);
146 path->close();
147 }
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000148 virtual int complexity() { return 1; }
reed@google.comd34658a2011-04-11 13:12:51 +0000149private:
150 typedef PathBench INHERITED;
151};
152
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000153class LongCurvedPathBench : public PathBench {
154public:
155 LongCurvedPathBench(void * param, Flags flags)
156 : INHERITED(param, flags) {
157 }
158
159 virtual void appendName(SkString* name) {
160 name->append("long_curved");
161 }
162 virtual void makePath(SkPath* path) {
163 SkRandom rand (12);
164 int i;
165 for (i = 0; i < 100; i++) {
166 path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
167 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)),
168 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
169 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)));
170 }
171 path->close();
172 }
173 virtual int complexity() { return 2; }
174private:
175 typedef PathBench INHERITED;
176};
177
178
179
reed@google.comd34658a2011-04-11 13:12:51 +0000180static SkBenchmark* FactT00(void* p) { return new TrianglePathBench(p, FLAGS00); }
181static SkBenchmark* FactT01(void* p) { return new TrianglePathBench(p, FLAGS01); }
182static SkBenchmark* FactT10(void* p) { return new TrianglePathBench(p, FLAGS10); }
183static SkBenchmark* FactT11(void* p) { return new TrianglePathBench(p, FLAGS11); }
184
185static SkBenchmark* FactR00(void* p) { return new RectPathBench(p, FLAGS00); }
186static SkBenchmark* FactR01(void* p) { return new RectPathBench(p, FLAGS01); }
187static SkBenchmark* FactR10(void* p) { return new RectPathBench(p, FLAGS10); }
188static SkBenchmark* FactR11(void* p) { return new RectPathBench(p, FLAGS11); }
189
190static SkBenchmark* FactO00(void* p) { return new OvalPathBench(p, FLAGS00); }
191static SkBenchmark* FactO01(void* p) { return new OvalPathBench(p, FLAGS01); }
192static SkBenchmark* FactO10(void* p) { return new OvalPathBench(p, FLAGS10); }
193static SkBenchmark* FactO11(void* p) { return new OvalPathBench(p, FLAGS11); }
194
195static SkBenchmark* FactS00(void* p) { return new SawToothPathBench(p, FLAGS00); }
196static SkBenchmark* FactS01(void* p) { return new SawToothPathBench(p, FLAGS01); }
197
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000198static SkBenchmark* FactLC00(void* p) {
199 return new LongCurvedPathBench(p, FLAGS00);
200}
201static SkBenchmark* FactLC01(void* p) {
202 return new LongCurvedPathBench(p, FLAGS01);
203}
204
reed@google.comd34658a2011-04-11 13:12:51 +0000205static BenchRegistry gRegT00(FactT00);
206static BenchRegistry gRegT01(FactT01);
207static BenchRegistry gRegT10(FactT10);
208static BenchRegistry gRegT11(FactT11);
209
210static BenchRegistry gRegR00(FactR00);
211static BenchRegistry gRegR01(FactR01);
212static BenchRegistry gRegR10(FactR10);
213static BenchRegistry gRegR11(FactR11);
214
215static BenchRegistry gRegO00(FactO00);
216static BenchRegistry gRegO01(FactO01);
217static BenchRegistry gRegO10(FactO10);
218static BenchRegistry gRegO11(FactO11);
219
220static BenchRegistry gRegS00(FactS00);
221static BenchRegistry gRegS01(FactS01);
222
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000223static BenchRegistry gRegLC00(FactLC00);
224static BenchRegistry gRegLC01(FactLC01);
225