blob: 5fe002541a542e7d37c2c1e896bf3433d55bc7ab [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@google.comd34658a2011-04-11 13:12:51 +00008#include "SkBenchmark.h"
9#include "SkBitmap.h"
10#include "SkCanvas.h"
11#include "SkColorPriv.h"
12#include "SkPaint.h"
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000013#include "SkRandom.h"
reed@google.comd34658a2011-04-11 13:12:51 +000014#include "SkShader.h"
15#include "SkString.h"
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +000016#include "SkTArray.h"
17
reed@google.comd34658a2011-04-11 13:12:51 +000018enum Flags {
19 kStroke_Flag = 1 << 0,
20 kBig_Flag = 1 << 1
21};
22
23#define FLAGS00 Flags(0)
24#define FLAGS01 Flags(kStroke_Flag)
25#define FLAGS10 Flags(kBig_Flag)
26#define FLAGS11 Flags(kStroke_Flag | kBig_Flag)
27
28class PathBench : public SkBenchmark {
29 SkPaint fPaint;
30 SkString fName;
31 Flags fFlags;
tomhudson@google.comca529d32011-10-28 15:34:49 +000032 enum { N = SkBENCHLOOP(1000) };
reed@google.comd34658a2011-04-11 13:12:51 +000033public:
34 PathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) {
35 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
36 SkPaint::kFill_Style);
37 fPaint.setStrokeWidth(SkIntToScalar(5));
38 fPaint.setStrokeJoin(SkPaint::kBevel_Join);
39 }
40
41 virtual void appendName(SkString*) = 0;
42 virtual void makePath(SkPath*) = 0;
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000043 virtual int complexity() { return 0; }
reed@google.comd34658a2011-04-11 13:12:51 +000044
45protected:
bsalomon@google.com1647a192012-04-11 15:34:46 +000046 virtual const char* onGetName() SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +000047 fName.printf("path_%s_%s_",
48 fFlags & kStroke_Flag ? "stroke" : "fill",
49 fFlags & kBig_Flag ? "big" : "small");
50 this->appendName(&fName);
51 return fName.c_str();
52 }
53
bsalomon@google.com1647a192012-04-11 15:34:46 +000054 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +000055 SkPaint paint(fPaint);
56 this->setupPaint(&paint);
57
58 SkPath path;
59 this->makePath(&path);
60 if (fFlags & kBig_Flag) {
61 SkMatrix m;
62 m.setScale(SkIntToScalar(10), SkIntToScalar(10));
63 path.transform(m);
64 }
65
66 int count = N;
67 if (fFlags & kBig_Flag) {
68 count >>= 2;
69 }
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000070 count >>= (3 * complexity());
reed@google.comd34658a2011-04-11 13:12:51 +000071
72 for (int i = 0; i < count; i++) {
73 canvas->drawPath(path, paint);
74 }
75 }
76
77private:
78 typedef SkBenchmark INHERITED;
79};
80
81class TrianglePathBench : public PathBench {
82public:
83 TrianglePathBench(void* param, Flags flags) : INHERITED(param, flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +000084
bsalomon@google.com1647a192012-04-11 15:34:46 +000085 virtual void appendName(SkString* name) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +000086 name->append("triangle");
87 }
bsalomon@google.com1647a192012-04-11 15:34:46 +000088 virtual void makePath(SkPath* path) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +000089 static const int gCoord[] = {
90 10, 10, 15, 5, 20, 20
91 };
92 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
93 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
94 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
95 path->close();
96 }
97private:
98 typedef PathBench INHERITED;
99};
100
101class RectPathBench : public PathBench {
102public:
103 RectPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000104
bsalomon@google.com1647a192012-04-11 15:34:46 +0000105 virtual void appendName(SkString* name) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +0000106 name->append("rect");
107 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000108 virtual void makePath(SkPath* path) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +0000109 SkRect r = { 10, 10, 20, 20 };
110 path->addRect(r);
111 }
112private:
113 typedef PathBench INHERITED;
114};
115
116class OvalPathBench : public PathBench {
117public:
118 OvalPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000119
bsalomon@google.com1647a192012-04-11 15:34:46 +0000120 virtual void appendName(SkString* name) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +0000121 name->append("oval");
122 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000123 virtual void makePath(SkPath* path) SK_OVERRIDE {
jvanverth@google.come2bfd8b2013-01-24 15:45:35 +0000124 SkRect r = { 10, 10, 23, 20 };
reed@google.comd34658a2011-04-11 13:12:51 +0000125 path->addOval(r);
126 }
127private:
128 typedef PathBench INHERITED;
129};
130
bsalomon@google.com1647a192012-04-11 15:34:46 +0000131class CirclePathBench: public PathBench {
132public:
133 CirclePathBench(void* param, Flags flags) : INHERITED(param, flags) {}
134
135 virtual void appendName(SkString* name) SK_OVERRIDE {
136 name->append("circle");
137 }
138 virtual void makePath(SkPath* path) SK_OVERRIDE {
139 path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
140 SkIntToScalar(10));
141 }
142private:
143 typedef PathBench INHERITED;
144};
145
reed@google.comd34658a2011-04-11 13:12:51 +0000146class SawToothPathBench : public PathBench {
147public:
148 SawToothPathBench(void* param, Flags flags) : INHERITED(param, flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000149
bsalomon@google.com1647a192012-04-11 15:34:46 +0000150 virtual void appendName(SkString* name) SK_OVERRIDE {
reed@google.comd34658a2011-04-11 13:12:51 +0000151 name->append("sawtooth");
152 }
153 virtual void makePath(SkPath* path) {
154 SkScalar x = SkIntToScalar(20);
155 SkScalar y = SkIntToScalar(20);
156 const SkScalar x0 = x;
157 const SkScalar dx = SK_Scalar1 * 5;
158 const SkScalar dy = SK_Scalar1 * 10;
159
160 path->moveTo(x, y);
161 for (int i = 0; i < 32; i++) {
162 x += dx;
163 path->lineTo(x, y - dy);
164 x += dx;
165 path->lineTo(x, y + dy);
166 }
167 path->lineTo(x, y + 2 * dy);
168 path->lineTo(x0, y + 2 * dy);
169 path->close();
170 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000171 virtual int complexity() SK_OVERRIDE { return 1; }
reed@google.comd34658a2011-04-11 13:12:51 +0000172private:
173 typedef PathBench INHERITED;
174};
175
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000176class LongCurvedPathBench : public PathBench {
177public:
178 LongCurvedPathBench(void * param, Flags flags)
179 : INHERITED(param, flags) {
180 }
181
bsalomon@google.com1647a192012-04-11 15:34:46 +0000182 virtual void appendName(SkString* name) SK_OVERRIDE {
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000183 name->append("long_curved");
184 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000185 virtual void makePath(SkPath* path) SK_OVERRIDE {
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000186 SkRandom rand (12);
187 int i;
188 for (i = 0; i < 100; i++) {
189 path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
190 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)),
191 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
192 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)));
193 }
194 path->close();
195 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000196 virtual int complexity() SK_OVERRIDE { return 2; }
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000197private:
198 typedef PathBench INHERITED;
199};
200
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000201class LongLinePathBench : public PathBench {
202public:
203 LongLinePathBench(void * param, Flags flags)
204 : INHERITED(param, flags) {
205 }
206
bsalomon@google.com1647a192012-04-11 15:34:46 +0000207 virtual void appendName(SkString* name) SK_OVERRIDE {
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000208 name->append("long_line");
209 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000210 virtual void makePath(SkPath* path) SK_OVERRIDE {
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000211 SkRandom rand;
212 path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
213 for (size_t i = 1; i < 100; i++) {
214 path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
215 }
216 }
bsalomon@google.com1647a192012-04-11 15:34:46 +0000217 virtual int complexity() SK_OVERRIDE { return 2; }
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000218private:
219 typedef PathBench INHERITED;
220};
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000221
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000222class RandomPathBench : public SkBenchmark {
223public:
224 RandomPathBench(void* param) : INHERITED(param) {
robertphillips@google.com83187a22012-09-13 16:39:08 +0000225 fIsRendering = false;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000226 }
227
228protected:
229 void createData(int minVerbs,
230 int maxVerbs,
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000231 bool allowMoves = true,
232 SkRect* bounds = NULL) {
233 SkRect tempBounds;
234 if (NULL == bounds) {
235 tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
236 bounds = &tempBounds;
237 }
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000238 fVerbCnts.reset(kNumVerbCnts);
239 for (int i = 0; i < kNumVerbCnts; ++i) {
240 fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
241 }
242 fVerbs.reset(kNumVerbs);
243 for (int i = 0; i < kNumVerbs; ++i) {
244 do {
245 fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
246 } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
247 }
248 fPoints.reset(kNumPoints);
249 for (int i = 0; i < kNumPoints; ++i) {
250 fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
251 fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000252 }
253 this->restartMakingPaths();
254 }
255
256 void restartMakingPaths() {
257 fCurrPath = 0;
258 fCurrVerb = 0;
259 fCurrPoint = 0;
260 }
261
262 void makePath(SkPath* path) {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000263 int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000264 for (int v = 0; v < vCount; ++v) {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000265 int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
266 switch (verb) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000267 case SkPath::kMove_Verb:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000268 path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000269 break;
270 case SkPath::kLine_Verb:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000271 path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000272 break;
273 case SkPath::kQuad_Verb:
bsalomon@google.com373ebc62012-09-26 13:08:56 +0000274 path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
275 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
276 fCurrPoint += 2;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000277 break;
278 case SkPath::kCubic_Verb:
bsalomon@google.com373ebc62012-09-26 13:08:56 +0000279 path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
280 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
281 fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
282 fCurrPoint += 3;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000283 break;
284 case SkPath::kClose_Verb:
285 path->close();
286 break;
287 default:
288 SkDEBUGFAIL("Unexpected path verb");
289 break;
290 }
291 }
292 }
293
294 void finishedMakingPaths() {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000295 fVerbCnts.reset(0);
296 fVerbs.reset(0);
297 fPoints.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000298 }
299
300private:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000301 enum {
302 // these should all be pow 2
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000303 kNumVerbCnts = 1 << 5,
304 kNumVerbs = 1 << 5,
305 kNumPoints = 1 << 5,
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000306 };
307 SkAutoTArray<int> fVerbCnts;
308 SkAutoTArray<SkPath::Verb> fVerbs;
309 SkAutoTArray<SkPoint> fPoints;
310 int fCurrPath;
311 int fCurrVerb;
312 int fCurrPoint;
313 SkRandom fRandom;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000314 typedef SkBenchmark INHERITED;
315};
316
317class PathCreateBench : public RandomPathBench {
318public:
319 PathCreateBench(void* param) : INHERITED(param) {
320 }
321
322protected:
323 enum { N = SkBENCHLOOP(5000) };
324
325 virtual const char* onGetName() SK_OVERRIDE {
326 return "path_create";
327 }
328
329 virtual void onPreDraw() SK_OVERRIDE {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000330 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000331 fPaths.reset(kPathCnt);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000332 }
333
334 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
335 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000336 this->makePath(&fPaths[i & (kPathCnt - 1)]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000337 }
338 this->restartMakingPaths();
339 }
340
341 virtual void onPostDraw() SK_OVERRIDE {
342 this->finishedMakingPaths();
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000343 fPaths.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000344 }
345
346private:
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000347 enum {
348 // must be a pow 2
349 kPathCnt = 1 << 5,
350 };
351 SkAutoTArray<SkPath> fPaths;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000352
353 typedef RandomPathBench INHERITED;
354};
355
356class PathCopyBench : public RandomPathBench {
357public:
358 PathCopyBench(void* param) : INHERITED(param) {
359 }
360
361protected:
bsalomon@google.com62e41902012-08-13 16:59:21 +0000362 enum { N = SkBENCHLOOP(30000) };
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000363
364 virtual const char* onGetName() SK_OVERRIDE {
365 return "path_copy";
366 }
367 virtual void onPreDraw() SK_OVERRIDE {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000368 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000369 fPaths.reset(kPathCnt);
370 fCopies.reset(kPathCnt);
371 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000372 this->makePath(&fPaths[i]);
373 }
374 this->finishedMakingPaths();
375 }
376 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
377 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000378 int idx = i & (kPathCnt - 1);
379 fCopies[idx] = fPaths[idx];
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000380 }
381 }
382 virtual void onPostDraw() SK_OVERRIDE {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000383 fPaths.reset(0);
384 fCopies.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000385 }
386
387private:
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000388 enum {
389 // must be a pow 2
390 kPathCnt = 1 << 5,
391 };
392 SkAutoTArray<SkPath> fPaths;
393 SkAutoTArray<SkPath> fCopies;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000394
395 typedef RandomPathBench INHERITED;
396};
397
398class PathTransformBench : public RandomPathBench {
399public:
400 PathTransformBench(bool inPlace, void* param)
401 : INHERITED(param)
402 , fInPlace(inPlace) {
403 }
404
405protected:
406 enum { N = SkBENCHLOOP(30000) };
407
408 virtual const char* onGetName() SK_OVERRIDE {
409 return fInPlace ? "path_transform_in_place" : "path_transform_copy";
410 }
411
412 virtual void onPreDraw() SK_OVERRIDE {
413 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000414 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000415 fPaths.reset(kPathCnt);
416 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000417 this->makePath(&fPaths[i]);
418 }
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000419 this->finishedMakingPaths();
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000420 if (!fInPlace) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000421 fTransformed.reset(kPathCnt);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000422 }
423 }
424
425 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
426 if (fInPlace) {
427 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000428 fPaths[i & (kPathCnt - 1)].transform(fMatrix);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000429 }
430 } else {
431 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000432 int idx = i & (kPathCnt - 1);
433 fPaths[idx].transform(fMatrix, &fTransformed[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000434 }
435 }
436 }
437
438 virtual void onPostDraw() SK_OVERRIDE {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000439 fPaths.reset(0);
440 fTransformed.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000441 }
442
443private:
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000444 enum {
445 // must be a pow 2
446 kPathCnt = 1 << 5,
447 };
448 SkAutoTArray<SkPath> fPaths;
449 SkAutoTArray<SkPath> fTransformed;
450
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000451 SkMatrix fMatrix;
452 bool fInPlace;
453 typedef RandomPathBench INHERITED;
454};
455
456class PathEqualityBench : public RandomPathBench {
457public:
458 PathEqualityBench(void* param)
459 : INHERITED(param) {
460 }
461
462protected:
463 enum { N = SkBENCHLOOP(40000) };
464
465 virtual const char* onGetName() SK_OVERRIDE {
466 return "path_equality_50%";
467 }
468
469 virtual void onPreDraw() SK_OVERRIDE {
470 fParity = 0;
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000471 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000472 fPaths.reset(kPathCnt);
473 fCopies.reset(kPathCnt);
474 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000475 this->makePath(&fPaths[i]);
476 fCopies[i] = fPaths[i];
477 }
478 this->finishedMakingPaths();
479 }
480
481 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
482 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000483 int idx = i & (kPathCnt - 1);
484 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000485 }
486 }
487
488 virtual void onPostDraw() SK_OVERRIDE {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000489 fPaths.reset(0);
490 fCopies.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000491 }
492
493private:
494 bool fParity; // attempt to keep compiler from optimizing out the ==
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000495 enum {
496 // must be a pow 2
497 kPathCnt = 1 << 5,
498 };
499 SkAutoTArray<SkPath> fPaths;
500 SkAutoTArray<SkPath> fCopies;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000501 typedef RandomPathBench INHERITED;
502};
503
504class SkBench_AddPathTest : public RandomPathBench {
505public:
506 enum AddType {
507 kAdd_AddType,
508 kAddTrans_AddType,
509 kAddMatrix_AddType,
510 kPathTo_AddType,
511 kReverseAdd_AddType,
512 kReversePathTo_AddType,
513 };
514
515 SkBench_AddPathTest(AddType type, void* param)
516 : INHERITED(param)
517 , fType(type) {
518 fMatrix.setRotate(60 * SK_Scalar1);
519 }
520
521protected:
522 enum { N = SkBENCHLOOP(15000) };
523
524 virtual const char* onGetName() SK_OVERRIDE {
525 switch (fType) {
526 case kAdd_AddType:
527 return "path_add_path";
528 case kAddTrans_AddType:
529 return "path_add_path_trans";
530 case kAddMatrix_AddType:
531 return "path_add_path_matrix";
532 case kPathTo_AddType:
533 return "path_path_to";
534 case kReverseAdd_AddType:
535 return "path_reverse_add_path";
536 case kReversePathTo_AddType:
537 return "path_reverse_path_to";
538 default:
539 SkDEBUGFAIL("Bad add type");
540 return "";
541 }
542 }
543
544 virtual void onPreDraw() SK_OVERRIDE {
545 // pathTo and reversePathTo assume a single contour path.
546 bool allowMoves = kPathTo_AddType != fType &&
547 kReversePathTo_AddType != fType;
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000548 this->createData(10, 100, allowMoves);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000549 fPaths0.reset(kPathCnt);
550 fPaths1.reset(kPathCnt);
551 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000552 this->makePath(&fPaths0[i]);
553 this->makePath(&fPaths1[i]);
554 }
555 this->finishedMakingPaths();
556 }
557
558 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
559 switch (fType) {
560 case kAdd_AddType:
561 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000562 int idx = i & (kPathCnt - 1);
563 SkPath result = fPaths0[idx];
564 result.addPath(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000565 }
566 break;
567 case kAddTrans_AddType:
568 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000569 int idx = i & (kPathCnt - 1);
570 SkPath result = fPaths0[idx];
571 result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000572 }
573 break;
574 case kAddMatrix_AddType:
575 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000576 int idx = i & (kPathCnt - 1);
577 SkPath result = fPaths0[idx];
578 result.addPath(fPaths1[idx], fMatrix);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000579 }
580 break;
581 case kPathTo_AddType:
582 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000583 int idx = i & (kPathCnt - 1);
584 SkPath result = fPaths0[idx];
585 result.pathTo(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000586 }
587 break;
588 case kReverseAdd_AddType:
589 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000590 int idx = i & (kPathCnt - 1);
591 SkPath result = fPaths0[idx];
592 result.reverseAddPath(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000593 }
594 break;
595 case kReversePathTo_AddType:
596 for (int i = 0; i < N; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000597 int idx = i & (kPathCnt - 1);
598 SkPath result = fPaths0[idx];
599 result.reversePathTo(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000600 }
601 break;
602 }
603 }
604
605 virtual void onPostDraw() SK_OVERRIDE {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000606 fPaths0.reset(0);
607 fPaths1.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000608 }
609
610private:
611 AddType fType; // or reverseAddPath
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000612 enum {
613 // must be a pow 2
614 kPathCnt = 1 << 5,
615 };
616 SkAutoTArray<SkPath> fPaths0;
617 SkAutoTArray<SkPath> fPaths1;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000618 SkMatrix fMatrix;
619 typedef RandomPathBench INHERITED;
620};
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000621
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000622
623class CirclesBench : public SkBenchmark {
624protected:
625 SkString fName;
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000626 Flags fFlags;
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000627
628 enum {
629 N = SkBENCHLOOP(100)
630 };
631public:
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000632 CirclesBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) {
633 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000634 }
635
636protected:
637 virtual const char* onGetName() SK_OVERRIDE {
638 return fName.c_str();
639 }
640
641 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
642 SkPaint paint;
643
644 paint.setColor(SK_ColorBLACK);
645 paint.setAntiAlias(true);
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000646 if (fFlags & kStroke_Flag) {
647 paint.setStyle(SkPaint::kStroke_Style);
648 }
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000649
650 SkRandom rand;
651
652 SkRect r;
653
654 for (int i = 0; i < 5000; ++i) {
655 SkScalar radius = rand.nextUScalar1() * 3;
656 r.fLeft = rand.nextUScalar1() * 300;
657 r.fTop = rand.nextUScalar1() * 300;
658 r.fRight = r.fLeft + 2 * radius;
659 r.fBottom = r.fTop + 2 * radius;
660
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000661 if (fFlags & kStroke_Flag) {
662 paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
663 }
664
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000665 SkPath temp;
666
667 // mimic how Chrome does circles
668 temp.arcTo(r, 0, 0, false);
669 temp.addOval(r, SkPath::kCCW_Direction);
670 temp.arcTo(r, 360, 0, true);
671 temp.close();
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000672
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000673 canvas->drawPath(temp, paint);
674 }
675 }
676
677private:
678 typedef SkBenchmark INHERITED;
679};
680
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000681
robertphillips@google.com158618e2012-10-23 16:56:56 +0000682// Chrome creates its own round rects with each corner possibly being different.
683// In its "zero radius" incarnation it creates degenerate round rects.
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000684// Note: PathTest::test_arb_round_rect_is_convex and
robertphillips@google.com158618e2012-10-23 16:56:56 +0000685// test_arb_zero_rad_round_rect_is_rect perform almost exactly
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000686// the same test (but with no drawing)
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000687class ArbRoundRectBench : public SkBenchmark {
688protected:
689 SkString fName;
690
691 enum {
692 N = SkBENCHLOOP(100)
693 };
694public:
robertphillips@google.com158618e2012-10-23 16:56:56 +0000695 ArbRoundRectBench(void* param, bool zeroRad) : INHERITED(param), fZeroRad(zeroRad) {
696 if (zeroRad) {
697 fName.printf("zeroradroundrect");
698 } else {
699 fName.printf("arbroundrect");
700 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000701 }
702
703protected:
704 virtual const char* onGetName() SK_OVERRIDE {
705 return fName.c_str();
706 }
707
skia.committer@gmail.com989a95e2012-10-18 02:01:23 +0000708 static void add_corner_arc(SkPath* path, const SkRect& rect,
709 SkScalar xIn, SkScalar yIn,
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000710 int startAngle)
711 {
712
713 SkScalar rx = SkMinScalar(rect.width(), xIn);
714 SkScalar ry = SkMinScalar(rect.height(), yIn);
715
716 SkRect arcRect;
717 arcRect.set(-rx, -ry, rx, ry);
718 switch (startAngle) {
719 case 0:
720 arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
721 break;
722 case 90:
723 arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
724 break;
725 case 180:
726 arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
727 break;
728 case 270:
729 arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
730 break;
731 default:
732 break;
733 }
734
735 path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
736 }
737
skia.committer@gmail.com989a95e2012-10-18 02:01:23 +0000738 static void make_arb_round_rect(SkPath* path, const SkRect& r,
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000739 SkScalar xCorner, SkScalar yCorner) {
740 // we are lazy here and use the same x & y for each corner
741 add_corner_arc(path, r, xCorner, yCorner, 270);
742 add_corner_arc(path, r, xCorner, yCorner, 0);
743 add_corner_arc(path, r, xCorner, yCorner, 90);
744 add_corner_arc(path, r, xCorner, yCorner, 180);
robertphillips@google.com158618e2012-10-23 16:56:56 +0000745 path->close();
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000746
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000747 SkASSERT(path->isConvex());
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000748 }
749
750 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
751 SkRandom rand;
752 SkRect r;
753
754 for (int i = 0; i < 5000; ++i) {
755 SkPaint paint;
756 paint.setColor(0xff000000 | rand.nextU());
757 paint.setAntiAlias(true);
758
robertphillips@google.com158618e2012-10-23 16:56:56 +0000759 SkScalar size = rand.nextUScalar1() * 30;
760 if (size < SK_Scalar1) {
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000761 continue;
762 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000763 r.fLeft = rand.nextUScalar1() * 300;
764 r.fTop = rand.nextUScalar1() * 300;
robertphillips@google.com158618e2012-10-23 16:56:56 +0000765 r.fRight = r.fLeft + 2 * size;
766 r.fBottom = r.fTop + 2 * size;
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000767
768 SkPath temp;
769
robertphillips@google.com158618e2012-10-23 16:56:56 +0000770 if (fZeroRad) {
771 make_arb_round_rect(&temp, r, 0, 0);
772
773 SkASSERT(temp.isRect(NULL));
774 } else {
775 make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
776 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000777
778 canvas->drawPath(temp, paint);
779 }
780 }
781
782private:
robertphillips@google.com158618e2012-10-23 16:56:56 +0000783 bool fZeroRad; // should 0 radius rounds rects be tested?
784
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000785 typedef SkBenchmark INHERITED;
786};
787
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000788class ConservativelyContainsBench : public SkBenchmark {
789public:
790 enum Type {
791 kRect_Type,
792 kRoundRect_Type,
793 kOval_Type,
794 };
795
796 ConservativelyContainsBench(void* param, Type type) : INHERITED(param) {
797 fIsRendering = false;
798 fParity = false;
799 fName = "conservatively_contains_";
800 switch (type) {
801 case kRect_Type:
802 fName.append("rect");
803 fPath.addRect(kBaseRect);
804 break;
805 case kRoundRect_Type:
806 fName.append("round_rect");
807 fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
808 break;
809 case kOval_Type:
810 fName.append("oval");
811 fPath.addOval(kBaseRect);
812 break;
813 }
814 }
815
816private:
817 virtual const char* onGetName() SK_OVERRIDE {
818 return fName.c_str();
819 }
820
sugoi@google.com77472f02013-03-05 18:50:01 +0000821 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000822 for (int i = 0; i < N; ++i) {
823 const SkRect& rect = fQueryRects[i % kQueryRectCnt];
824 fParity = fParity != fPath.conservativelyContainsRect(rect);
825 }
826 }
827
828 virtual void onPreDraw() SK_OVERRIDE {
829 fQueryRects.setCount(kQueryRectCnt);
830
831 SkRandom rand;
832 for (int i = 0; i < kQueryRectCnt; ++i) {
833 SkSize size;
834 SkPoint xy;
835 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth);
836 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
837 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
838 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
839
840 fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
841 }
842 }
843
844 virtual void onPostDraw() SK_OVERRIDE {
845 fQueryRects.setCount(0);
846 }
847
848 enum {
849 N = SkBENCHLOOP(100000),
850 kQueryRectCnt = 400,
851 };
852 static const SkRect kBounds; // bounds for all random query rects
853 static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
854 static const SkSize kQueryMax; // max query rect size, should < kBounds
855 static const SkRect kBaseRect; // rect that is used to construct the path
856 static const SkScalar kRRRadii[2]; // x and y radii for round rect
857
858 SkString fName;
859 SkPath fPath;
860 bool fParity;
861 SkTDArray<SkRect> fQueryRects;
862
863 typedef SkBenchmark INHERITED;
864};
865
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000866///////////////////////////////////////////////////////////////////////////////
867
868#include "SkGeometry.h"
869
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000870class ConicBench_Chop5 : public SkBenchmark {
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000871 enum {
872 N = 100000
873 };
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000874 SkConic fRQ;
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000875public:
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000876 ConicBench_Chop5(void* param) : INHERITED(param) {
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000877 fRQ.fPts[0].set(0, 0);
878 fRQ.fPts[1].set(100, 0);
879 fRQ.fPts[2].set(100, 100);
880 fRQ.fW = SkScalarCos(SK_ScalarPI/4);
881 }
skia.committer@gmail.comab38e562013-04-14 07:01:08 +0000882
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000883private:
884 virtual const char* onGetName() SK_OVERRIDE {
885 return "ratquad-chop-0.5";
886 }
skia.committer@gmail.comab38e562013-04-14 07:01:08 +0000887
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000888 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000889 SkConic dst[2];
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000890 for (int i = 0; i < N; ++i) {
891 fRQ.chopAt(0.5f, dst);
892 }
893 }
skia.committer@gmail.comab38e562013-04-14 07:01:08 +0000894
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000895 typedef SkBenchmark INHERITED;
896};
897
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000898class ConicBench_ChopHalf : public SkBenchmark {
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000899 enum {
900 N = 100000
901 };
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000902 SkConic fRQ;
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000903public:
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000904 ConicBench_ChopHalf(void* param) : INHERITED(param) {
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000905 fRQ.fPts[0].set(0, 0);
906 fRQ.fPts[1].set(100, 0);
907 fRQ.fPts[2].set(100, 100);
908 fRQ.fW = SkScalarCos(SK_ScalarPI/4);
909 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000910
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000911private:
912 virtual const char* onGetName() SK_OVERRIDE {
913 return "ratquad-chop-half";
914 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000915
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000916 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
mike@reedtribe.org28552e12013-04-26 00:58:29 +0000917 SkConic dst[2];
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000918 for (int i = 0; i < N; ++i) {
919 fRQ.chop(dst);
920 }
921 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000922
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000923 typedef SkBenchmark INHERITED;
924};
925
926///////////////////////////////////////////////////////////////////////////////
927
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000928static void rand_conic(SkConic* conic, SkRandom& rand) {
929 for (int i = 0; i < 3; ++i) {
930 conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
931 }
932 if (rand.nextUScalar1() > 0.5f) {
933 conic->fW = rand.nextUScalar1();
934 } else {
935 conic->fW = 1 + rand.nextUScalar1() * 4;
936 }
937}
938
939class ConicBench : public SkBenchmark {
940public:
941 ConicBench(void* param) : INHERITED(param) {
942 SkRandom rand;
943 for (int i = 0; i < CONICS; ++i) {
944 rand_conic(&fConics[i], rand);
945 }
946 fIsRendering = false;
947 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000948
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000949protected:
950 enum {
951 N = 20000,
952 CONICS = 100
953 };
954 SkConic fConics[CONICS];
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000955
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000956private:
957 typedef SkBenchmark INHERITED;
958};
959
960class ConicBench_ComputeError : public ConicBench {
961public:
962 ConicBench_ComputeError(void* param) : INHERITED(param) {}
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000963
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000964protected:
965 virtual const char* onGetName() SK_OVERRIDE {
966 return "conic-compute-error";
967 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000968
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000969 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
970 SkVector err;
971 for (int i = 0; i < N; ++i) {
972 for (int j = 0; j < CONICS; ++j) {
973 fConics[j].computeAsQuadError(&err);
974 }
975 }
976 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000977
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000978private:
979 typedef ConicBench INHERITED;
980};
981
982class ConicBench_asQuadTol : public ConicBench {
983public:
984 ConicBench_asQuadTol(void* param) : INHERITED(param) {}
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000985
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000986protected:
987 virtual const char* onGetName() SK_OVERRIDE {
988 return "conic-asQuadTol";
989 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000990
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000991 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
992 for (int i = 0; i < N; ++i) {
993 for (int j = 0; j < CONICS; ++j) {
994 fConics[j].asQuadTol(SK_ScalarHalf);
995 }
996 }
997 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000998
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +0000999private:
1000 typedef ConicBench INHERITED;
1001};
1002
1003class ConicBench_quadPow2 : public ConicBench {
1004public:
1005 ConicBench_quadPow2(void* param) : INHERITED(param) {}
1006
1007protected:
1008 virtual const char* onGetName() SK_OVERRIDE {
1009 return "conic-quadPow2";
1010 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001011
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001012 virtual void onDraw(SkCanvas*) SK_OVERRIDE {
1013 for (int i = 0; i < N; ++i) {
1014 for (int j = 0; j < CONICS; ++j) {
1015 fConics[j].computeQuadPOW2(SK_ScalarHalf);
1016 }
1017 }
1018 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001019
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001020private:
1021 typedef ConicBench INHERITED;
1022};
1023
1024///////////////////////////////////////////////////////////////////////////////
1025
bsalomon@google.com9bee33a2012-11-13 21:51:38 +00001026const SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
1027const SkSize ConservativelyContainsBench::kQueryMin = SkSize::Make(SkIntToScalar(1), SkIntToScalar(1));
1028const SkSize ConservativelyContainsBench::kQueryMax = SkSize::Make(SkIntToScalar(40), SkIntToScalar(40));
1029const SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
1030const SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
1031
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001032DEF_BENCH( return new TrianglePathBench(p, FLAGS00); )
1033DEF_BENCH( return new TrianglePathBench(p, FLAGS01); )
1034DEF_BENCH( return new TrianglePathBench(p, FLAGS10); )
1035DEF_BENCH( return new TrianglePathBench(p, FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001036
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001037DEF_BENCH( return new RectPathBench(p, FLAGS00); )
1038DEF_BENCH( return new RectPathBench(p, FLAGS01); )
1039DEF_BENCH( return new RectPathBench(p, FLAGS10); )
1040DEF_BENCH( return new RectPathBench(p, FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001041
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001042DEF_BENCH( return new OvalPathBench(p, FLAGS00); )
1043DEF_BENCH( return new OvalPathBench(p, FLAGS01); )
1044DEF_BENCH( return new OvalPathBench(p, FLAGS10); )
1045DEF_BENCH( return new OvalPathBench(p, FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001046
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001047DEF_BENCH( return new CirclePathBench(p, FLAGS00); )
1048DEF_BENCH( return new CirclePathBench(p, FLAGS01); )
1049DEF_BENCH( return new CirclePathBench(p, FLAGS10); )
1050DEF_BENCH( return new CirclePathBench(p, FLAGS11); )
bsalomon@google.com1647a192012-04-11 15:34:46 +00001051
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001052DEF_BENCH( return new SawToothPathBench(p, FLAGS00); )
1053DEF_BENCH( return new SawToothPathBench(p, FLAGS01); )
reed@google.comd34658a2011-04-11 13:12:51 +00001054
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001055DEF_BENCH( return new LongCurvedPathBench(p, FLAGS00); )
1056DEF_BENCH( return new LongCurvedPathBench(p, FLAGS01); )
1057DEF_BENCH( return new LongLinePathBench(p, FLAGS00); )
1058DEF_BENCH( return new LongLinePathBench(p, FLAGS01); )
tomhudson@google.com6e8d3352011-06-22 17:16:35 +00001059
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001060DEF_BENCH( return new PathCreateBench(p); )
1061DEF_BENCH( return new PathCopyBench(p); )
1062DEF_BENCH( return new PathTransformBench(true, p); )
1063DEF_BENCH( return new PathTransformBench(false, p); )
1064DEF_BENCH( return new PathEqualityBench(p); )
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +00001065
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001066DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType, p); )
1067DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType, p); )
1068DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType, p); )
1069DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kPathTo_AddType, p); )
1070DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType, p); )
1071DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType, p); )
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +00001072
mike@reedtribe.org0cf7b822013-02-04 05:05:36 +00001073DEF_BENCH( return new CirclesBench(p, FLAGS00); )
1074DEF_BENCH( return new CirclesBench(p, FLAGS01); )
1075DEF_BENCH( return new ArbRoundRectBench(p, false); )
1076DEF_BENCH( return new ArbRoundRectBench(p, true); )
1077DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench::kRect_Type); )
1078DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench::kRoundRect_Type); )
1079DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench::kOval_Type); )
mike@reedtribe.org8d551012013-04-14 02:40:50 +00001080
mike@reedtribe.org28552e12013-04-26 00:58:29 +00001081DEF_BENCH( return new ConicBench_Chop5(p) )
1082DEF_BENCH( return new ConicBench_ChopHalf(p) )
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001083DEF_BENCH( return new ConicBench_ComputeError(p) )
1084DEF_BENCH( return new ConicBench_asQuadTol(p) )
1085DEF_BENCH( return new ConicBench_quadPow2(p) )