blob: a2da0e22bd804ded2635356a33d52a125fe6ff29 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
bungemand3ebb482015-08-05 13:57:49 -07007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
9#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColorPriv.h"
12#include "include/core/SkPaint.h"
13#include "include/core/SkPath.h"
14#include "include/core/SkShader.h"
15#include "include/core/SkString.h"
16#include "include/private/SkTArray.h"
17#include "include/utils/SkRandom.h"
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +000018
Tyler Denniston60fc6502020-08-10 11:09:47 -040019#include "src/core/SkDraw.h"
20
reed@google.comd34658a2011-04-11 13:12:51 +000021enum Flags {
22 kStroke_Flag = 1 << 0,
23 kBig_Flag = 1 << 1
24};
25
26#define FLAGS00 Flags(0)
27#define FLAGS01 Flags(kStroke_Flag)
28#define FLAGS10 Flags(kBig_Flag)
29#define FLAGS11 Flags(kStroke_Flag | kBig_Flag)
30
tfarinaf168b862014-06-19 12:32:29 -070031class PathBench : public Benchmark {
reed@google.comd34658a2011-04-11 13:12:51 +000032 SkPaint fPaint;
33 SkString fName;
34 Flags fFlags;
reed@google.comd34658a2011-04-11 13:12:51 +000035public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000036 PathBench(Flags flags) : fFlags(flags) {
reed@google.comd34658a2011-04-11 13:12:51 +000037 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
38 SkPaint::kFill_Style);
39 fPaint.setStrokeWidth(SkIntToScalar(5));
40 fPaint.setStrokeJoin(SkPaint::kBevel_Join);
41 }
42
43 virtual void appendName(SkString*) = 0;
44 virtual void makePath(SkPath*) = 0;
tomhudson@google.com6e8d3352011-06-22 17:16:35 +000045 virtual int complexity() { return 0; }
reed@google.comd34658a2011-04-11 13:12:51 +000046
47protected:
mtklein36352bf2015-03-25 18:17:31 -070048 const char* onGetName() override {
reed@google.comd34658a2011-04-11 13:12:51 +000049 fName.printf("path_%s_%s_",
50 fFlags & kStroke_Flag ? "stroke" : "fill",
51 fFlags & kBig_Flag ? "big" : "small");
52 this->appendName(&fName);
53 return fName.c_str();
54 }
55
mtkleina1ebeb22015-10-01 09:43:39 -070056 void onDraw(int loops, SkCanvas* canvas) override {
reed@google.comd34658a2011-04-11 13:12:51 +000057 SkPaint paint(fPaint);
58 this->setupPaint(&paint);
59
60 SkPath path;
61 this->makePath(&path);
62 if (fFlags & kBig_Flag) {
Mike Reed1f607332020-05-21 12:11:27 -040063 const SkMatrix m = SkMatrix::Scale(10, 10);
reed@google.comd34658a2011-04-11 13:12:51 +000064 path.transform(m);
65 }
66
Yuqian Lid29f0e72017-09-14 07:49:41 -070067 for (int i = 0; i < loops; i++) {
reed@google.comd34658a2011-04-11 13:12:51 +000068 canvas->drawPath(path, paint);
69 }
70 }
71
72private:
John Stiles7571f9e2020-09-02 22:42:33 -040073 using INHERITED = Benchmark;
reed@google.comd34658a2011-04-11 13:12:51 +000074};
75
76class TrianglePathBench : public PathBench {
77public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000078 TrianglePathBench(Flags flags) : INHERITED(flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +000079
mtklein36352bf2015-03-25 18:17:31 -070080 void appendName(SkString* name) override {
reed@google.comd34658a2011-04-11 13:12:51 +000081 name->append("triangle");
82 }
mtklein36352bf2015-03-25 18:17:31 -070083 void makePath(SkPath* path) override {
reed@google.comd34658a2011-04-11 13:12:51 +000084 static const int gCoord[] = {
85 10, 10, 15, 5, 20, 20
86 };
87 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
88 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
89 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
90 path->close();
91 }
92private:
John Stiles7571f9e2020-09-02 22:42:33 -040093 using INHERITED = PathBench;
reed@google.comd34658a2011-04-11 13:12:51 +000094};
95
96class RectPathBench : public PathBench {
97public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000098 RectPathBench(Flags flags) : INHERITED(flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +000099
mtklein36352bf2015-03-25 18:17:31 -0700100 void appendName(SkString* name) override {
reed@google.comd34658a2011-04-11 13:12:51 +0000101 name->append("rect");
102 }
mtklein36352bf2015-03-25 18:17:31 -0700103 void makePath(SkPath* path) override {
reed@google.comd34658a2011-04-11 13:12:51 +0000104 SkRect r = { 10, 10, 20, 20 };
105 path->addRect(r);
106 }
107private:
John Stiles7571f9e2020-09-02 22:42:33 -0400108 using INHERITED = PathBench;
reed@google.comd34658a2011-04-11 13:12:51 +0000109};
110
liyuqiana27f6692016-06-20 14:05:27 -0700111class RotatedRectBench : public PathBench {
112public:
113 RotatedRectBench(Flags flags, bool aa, int degrees) : INHERITED(flags) {
114 fAA = aa;
115 fDegrees = degrees;
116 }
117
118 void appendName(SkString* name) override {
119 SkString suffix;
120 suffix.printf("rotated_rect_%s_%d", fAA ? "aa" : "noaa", fDegrees);
121 name->append(suffix);
122 }
123
124 void makePath(SkPath* path) override {
125 SkRect r = { 10, 10, 20, 20 };
126 path->addRect(r);
127 SkMatrix rotateMatrix;
128 rotateMatrix.setRotate((SkScalar)fDegrees);
129 path->transform(rotateMatrix);
130 }
131
John Stiles1cf2c8d2020-08-13 22:58:04 -0400132 void setupPaint(SkPaint* paint) override {
liyuqiana27f6692016-06-20 14:05:27 -0700133 PathBench::setupPaint(paint);
134 paint->setAntiAlias(fAA);
135 }
136private:
John Stiles7571f9e2020-09-02 22:42:33 -0400137 using INHERITED = PathBench;
liyuqiana27f6692016-06-20 14:05:27 -0700138 int fDegrees;
139 bool fAA;
140};
141
reed@google.comd34658a2011-04-11 13:12:51 +0000142class OvalPathBench : public PathBench {
143public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000144 OvalPathBench(Flags flags) : INHERITED(flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000145
mtklein36352bf2015-03-25 18:17:31 -0700146 void appendName(SkString* name) override {
reed@google.comd34658a2011-04-11 13:12:51 +0000147 name->append("oval");
148 }
mtklein36352bf2015-03-25 18:17:31 -0700149 void makePath(SkPath* path) override {
jvanverth@google.come2bfd8b2013-01-24 15:45:35 +0000150 SkRect r = { 10, 10, 23, 20 };
reed@google.comd34658a2011-04-11 13:12:51 +0000151 path->addOval(r);
152 }
153private:
John Stiles7571f9e2020-09-02 22:42:33 -0400154 using INHERITED = PathBench;
reed@google.comd34658a2011-04-11 13:12:51 +0000155};
156
bsalomon@google.com1647a192012-04-11 15:34:46 +0000157class CirclePathBench: public PathBench {
158public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000159 CirclePathBench(Flags flags) : INHERITED(flags) {}
bsalomon@google.com1647a192012-04-11 15:34:46 +0000160
mtklein36352bf2015-03-25 18:17:31 -0700161 void appendName(SkString* name) override {
bsalomon@google.com1647a192012-04-11 15:34:46 +0000162 name->append("circle");
163 }
mtklein36352bf2015-03-25 18:17:31 -0700164 void makePath(SkPath* path) override {
bsalomon@google.com1647a192012-04-11 15:34:46 +0000165 path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
166 SkIntToScalar(10));
167 }
168private:
John Stiles7571f9e2020-09-02 22:42:33 -0400169 using INHERITED = PathBench;
bsalomon@google.com1647a192012-04-11 15:34:46 +0000170};
171
Yuqian Li8eedbfc2017-01-11 13:55:49 +0000172class NonAACirclePathBench: public CirclePathBench {
173public:
174 NonAACirclePathBench(Flags flags) : INHERITED(flags) {}
175
176 void appendName(SkString* name) override {
177 name->append("nonaacircle");
178 }
179
180 void setupPaint(SkPaint* paint) override {
181 CirclePathBench::setupPaint(paint);
182 paint->setAntiAlias(false);
183 }
184
185private:
John Stiles7571f9e2020-09-02 22:42:33 -0400186 using INHERITED = CirclePathBench;
Yuqian Li8eedbfc2017-01-11 13:55:49 +0000187};
188
Yuqian Li131c1fb2016-12-12 16:24:47 -0500189// Test max speedup of Analytic AA for concave paths
190class AAAConcavePathBench : public PathBench {
191public:
192 AAAConcavePathBench(Flags flags) : INHERITED(flags) {}
193
194 void appendName(SkString* name) override {
195 name->append("concave_aaa");
196 }
197
198 void makePath(SkPath* path) override {
199 path->moveTo(10, 10);
200 path->lineTo(15, 10);
201 path->lineTo(15, 5);
202 path->lineTo(40, 40);
203 path->close();
204 }
205
206private:
John Stiles7571f9e2020-09-02 22:42:33 -0400207 using INHERITED = PathBench;
Yuqian Li131c1fb2016-12-12 16:24:47 -0500208};
209
210// Test max speedup of Analytic AA for convex paths
211class AAAConvexPathBench : public PathBench {
212public:
213 AAAConvexPathBench(Flags flags) : INHERITED(flags) {}
214
215 void appendName(SkString* name) override {
216 name->append("convex_aaa");
217 }
218
219 void makePath(SkPath* path) override {
220 path->moveTo(10, 10);
221 path->lineTo(15, 10);
222 path->lineTo(40, 50);
223 path->close();
224 }
225
226private:
John Stiles7571f9e2020-09-02 22:42:33 -0400227 using INHERITED = PathBench;
Yuqian Li131c1fb2016-12-12 16:24:47 -0500228};
229
reed@google.comd34658a2011-04-11 13:12:51 +0000230class SawToothPathBench : public PathBench {
231public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000232 SawToothPathBench(Flags flags) : INHERITED(flags) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000233
mtklein36352bf2015-03-25 18:17:31 -0700234 void appendName(SkString* name) override {
reed@google.comd34658a2011-04-11 13:12:51 +0000235 name->append("sawtooth");
236 }
mtkleinf0599002015-07-13 06:18:39 -0700237 void makePath(SkPath* path) override {
reed@google.comd34658a2011-04-11 13:12:51 +0000238 SkScalar x = SkIntToScalar(20);
239 SkScalar y = SkIntToScalar(20);
240 const SkScalar x0 = x;
241 const SkScalar dx = SK_Scalar1 * 5;
242 const SkScalar dy = SK_Scalar1 * 10;
243
244 path->moveTo(x, y);
245 for (int i = 0; i < 32; i++) {
246 x += dx;
247 path->lineTo(x, y - dy);
248 x += dx;
249 path->lineTo(x, y + dy);
250 }
251 path->lineTo(x, y + 2 * dy);
252 path->lineTo(x0, y + 2 * dy);
253 path->close();
254 }
mtklein36352bf2015-03-25 18:17:31 -0700255 int complexity() override { return 1; }
reed@google.comd34658a2011-04-11 13:12:51 +0000256private:
John Stiles7571f9e2020-09-02 22:42:33 -0400257 using INHERITED = PathBench;
reed@google.comd34658a2011-04-11 13:12:51 +0000258};
259
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000260class LongCurvedPathBench : public PathBench {
261public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000262 LongCurvedPathBench(Flags flags) : INHERITED(flags) {}
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000263
mtklein36352bf2015-03-25 18:17:31 -0700264 void appendName(SkString* name) override {
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000265 name->append("long_curved");
266 }
mtklein36352bf2015-03-25 18:17:31 -0700267 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000268 SkRandom rand (12);
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000269 int i;
270 for (i = 0; i < 100; i++) {
Mike Reeddf85c382017-02-14 10:59:19 -0500271 path->quadTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480,
272 rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000273 }
274 path->close();
275 }
mtklein36352bf2015-03-25 18:17:31 -0700276 int complexity() override { return 2; }
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000277private:
John Stiles7571f9e2020-09-02 22:42:33 -0400278 using INHERITED = PathBench;
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000279};
280
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000281class LongLinePathBench : public PathBench {
282public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000283 LongLinePathBench(Flags flags) : INHERITED(flags) {}
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000284
mtklein36352bf2015-03-25 18:17:31 -0700285 void appendName(SkString* name) override {
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000286 name->append("long_line");
287 }
mtklein36352bf2015-03-25 18:17:31 -0700288 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000289 SkRandom rand;
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000290 path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
291 for (size_t i = 1; i < 100; i++) {
292 path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
293 }
294 }
mtklein36352bf2015-03-25 18:17:31 -0700295 int complexity() override { return 2; }
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000296private:
John Stiles7571f9e2020-09-02 22:42:33 -0400297 using INHERITED = PathBench;
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +0000298};
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000299
tfarinaf168b862014-06-19 12:32:29 -0700300class RandomPathBench : public Benchmark {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000301public:
mtklein36352bf2015-03-25 18:17:31 -0700302 bool isSuitableFor(Backend backend) override {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000303 return backend == kNonRendering_Backend;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000304 }
305
306protected:
307 void createData(int minVerbs,
308 int maxVerbs,
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000309 bool allowMoves = true,
halcanary96fcdcc2015-08-27 07:41:13 -0700310 SkRect* bounds = nullptr) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000311 SkRect tempBounds;
halcanary96fcdcc2015-08-27 07:41:13 -0700312 if (nullptr == bounds) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000313 tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
314 bounds = &tempBounds;
315 }
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000316 fVerbCnts.reset(kNumVerbCnts);
317 for (int i = 0; i < kNumVerbCnts; ++i) {
318 fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
319 }
320 fVerbs.reset(kNumVerbs);
321 for (int i = 0; i < kNumVerbs; ++i) {
322 do {
323 fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
324 } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
325 }
326 fPoints.reset(kNumPoints);
327 for (int i = 0; i < kNumPoints; ++i) {
328 fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
329 fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000330 }
331 this->restartMakingPaths();
332 }
333
334 void restartMakingPaths() {
335 fCurrPath = 0;
336 fCurrVerb = 0;
337 fCurrPoint = 0;
338 }
339
340 void makePath(SkPath* path) {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000341 int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000342 for (int v = 0; v < vCount; ++v) {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000343 int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
344 switch (verb) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000345 case SkPath::kMove_Verb:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000346 path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000347 break;
348 case SkPath::kLine_Verb:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000349 path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000350 break;
351 case SkPath::kQuad_Verb:
bsalomon@google.com373ebc62012-09-26 13:08:56 +0000352 path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
353 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
354 fCurrPoint += 2;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000355 break;
reed@google.com277c3f82013-05-31 15:17:50 +0000356 case SkPath::kConic_Verb:
357 path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
358 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
359 SK_ScalarHalf);
360 fCurrPoint += 2;
361 break;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000362 case SkPath::kCubic_Verb:
bsalomon@google.com373ebc62012-09-26 13:08:56 +0000363 path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
364 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
365 fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
366 fCurrPoint += 3;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000367 break;
368 case SkPath::kClose_Verb:
369 path->close();
370 break;
371 default:
372 SkDEBUGFAIL("Unexpected path verb");
373 break;
374 }
375 }
376 }
377
378 void finishedMakingPaths() {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000379 fVerbCnts.reset(0);
380 fVerbs.reset(0);
381 fPoints.reset(0);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000382 }
383
384private:
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000385 enum {
386 // these should all be pow 2
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000387 kNumVerbCnts = 1 << 5,
388 kNumVerbs = 1 << 5,
389 kNumPoints = 1 << 5,
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000390 };
391 SkAutoTArray<int> fVerbCnts;
392 SkAutoTArray<SkPath::Verb> fVerbs;
393 SkAutoTArray<SkPoint> fPoints;
394 int fCurrPath;
395 int fCurrVerb;
396 int fCurrPoint;
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000397 SkRandom fRandom;
John Stiles7571f9e2020-09-02 22:42:33 -0400398 using INHERITED = Benchmark;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000399};
400
401class PathCreateBench : public RandomPathBench {
402public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000403 PathCreateBench() {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000404 }
405
406protected:
mtklein36352bf2015-03-25 18:17:31 -0700407 const char* onGetName() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000408 return "path_create";
409 }
410
joshualitt8a6697a2015-09-30 12:11:07 -0700411 void onDelayedSetup() override {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000412 this->createData(10, 100);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000413 }
414
mtkleina1ebeb22015-10-01 09:43:39 -0700415 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000416 for (int i = 0; i < loops; ++i) {
commit-bot@chromium.org8f881172014-01-06 20:19:14 +0000417 if (i % 1000 == 0) {
418 fPath.reset(); // PathRef memory can grow without bound otherwise.
419 }
420 this->makePath(&fPath);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000421 }
422 this->restartMakingPaths();
423 }
424
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000425private:
commit-bot@chromium.org8f881172014-01-06 20:19:14 +0000426 SkPath fPath;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000427
John Stiles7571f9e2020-09-02 22:42:33 -0400428 using INHERITED = RandomPathBench;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000429};
430
431class PathCopyBench : public RandomPathBench {
432public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000433 PathCopyBench() {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000434 }
435
436protected:
mtklein36352bf2015-03-25 18:17:31 -0700437 const char* onGetName() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000438 return "path_copy";
439 }
joshualitt8a6697a2015-09-30 12:11:07 -0700440 void onDelayedSetup() override {
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000441 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000442 fPaths.reset(kPathCnt);
443 fCopies.reset(kPathCnt);
444 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000445 this->makePath(&fPaths[i]);
446 }
447 this->finishedMakingPaths();
448 }
mtkleina1ebeb22015-10-01 09:43:39 -0700449 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000450 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000451 int idx = i & (kPathCnt - 1);
452 fCopies[idx] = fPaths[idx];
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000453 }
454 }
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000455
456private:
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000457 enum {
458 // must be a pow 2
459 kPathCnt = 1 << 5,
460 };
461 SkAutoTArray<SkPath> fPaths;
462 SkAutoTArray<SkPath> fCopies;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000463
John Stiles7571f9e2020-09-02 22:42:33 -0400464 using INHERITED = RandomPathBench;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000465};
466
467class PathTransformBench : public RandomPathBench {
468public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000469 PathTransformBench(bool inPlace) : fInPlace(inPlace) {}
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000470
471protected:
mtklein36352bf2015-03-25 18:17:31 -0700472 const char* onGetName() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000473 return fInPlace ? "path_transform_in_place" : "path_transform_copy";
474 }
475
joshualitt8a6697a2015-09-30 12:11:07 -0700476 void onDelayedSetup() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000477 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000478 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000479 fPaths.reset(kPathCnt);
480 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000481 this->makePath(&fPaths[i]);
482 }
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000483 this->finishedMakingPaths();
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000484 if (!fInPlace) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000485 fTransformed.reset(kPathCnt);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000486 }
487 }
488
mtkleina1ebeb22015-10-01 09:43:39 -0700489 void onDraw(int loops, SkCanvas*) override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000490 if (fInPlace) {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000491 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000492 fPaths[i & (kPathCnt - 1)].transform(fMatrix);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000493 }
494 } else {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000495 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000496 int idx = i & (kPathCnt - 1);
497 fPaths[idx].transform(fMatrix, &fTransformed[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000498 }
499 }
500 }
501
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000502private:
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000503 enum {
504 // must be a pow 2
505 kPathCnt = 1 << 5,
506 };
507 SkAutoTArray<SkPath> fPaths;
508 SkAutoTArray<SkPath> fTransformed;
509
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000510 SkMatrix fMatrix;
511 bool fInPlace;
John Stiles7571f9e2020-09-02 22:42:33 -0400512 using INHERITED = RandomPathBench;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000513};
514
515class PathEqualityBench : public RandomPathBench {
516public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000517 PathEqualityBench() { }
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000518
519protected:
mtklein36352bf2015-03-25 18:17:31 -0700520 const char* onGetName() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000521 return "path_equality_50%";
522 }
523
joshualitt8a6697a2015-09-30 12:11:07 -0700524 void onDelayedSetup() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000525 fParity = 0;
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000526 this->createData(10, 100);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000527 fPaths.reset(kPathCnt);
528 fCopies.reset(kPathCnt);
529 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000530 this->makePath(&fPaths[i]);
531 fCopies[i] = fPaths[i];
532 }
533 this->finishedMakingPaths();
534 }
535
mtkleina1ebeb22015-10-01 09:43:39 -0700536 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000537 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000538 int idx = i & (kPathCnt - 1);
539 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000540 }
541 }
542
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000543private:
544 bool fParity; // attempt to keep compiler from optimizing out the ==
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000545 enum {
546 // must be a pow 2
547 kPathCnt = 1 << 5,
548 };
549 SkAutoTArray<SkPath> fPaths;
550 SkAutoTArray<SkPath> fCopies;
John Stiles7571f9e2020-09-02 22:42:33 -0400551 using INHERITED = RandomPathBench;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000552};
553
554class SkBench_AddPathTest : public RandomPathBench {
555public:
556 enum AddType {
557 kAdd_AddType,
558 kAddTrans_AddType,
559 kAddMatrix_AddType,
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000560 kReverseAdd_AddType,
561 kReversePathTo_AddType,
562 };
563
mtklein@google.com410e6e82013-09-13 19:52:27 +0000564 SkBench_AddPathTest(AddType type) : fType(type) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000565 fMatrix.setRotate(60 * SK_Scalar1);
566 }
567
568protected:
mtklein36352bf2015-03-25 18:17:31 -0700569 const char* onGetName() override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000570 switch (fType) {
571 case kAdd_AddType:
572 return "path_add_path";
573 case kAddTrans_AddType:
574 return "path_add_path_trans";
575 case kAddMatrix_AddType:
576 return "path_add_path_matrix";
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000577 case kReverseAdd_AddType:
578 return "path_reverse_add_path";
579 case kReversePathTo_AddType:
580 return "path_reverse_path_to";
581 default:
582 SkDEBUGFAIL("Bad add type");
583 return "";
584 }
585 }
586
joshualitt8a6697a2015-09-30 12:11:07 -0700587 void onDelayedSetup() override {
commit-bot@chromium.orga1a097e2013-11-14 16:53:22 +0000588 // reversePathTo assumes a single contour path.
589 bool allowMoves = kReversePathTo_AddType != fType;
bsalomon@google.com6d552ee2012-08-14 15:10:09 +0000590 this->createData(10, 100, allowMoves);
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000591 fPaths0.reset(kPathCnt);
592 fPaths1.reset(kPathCnt);
593 for (int i = 0; i < kPathCnt; ++i) {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000594 this->makePath(&fPaths0[i]);
595 this->makePath(&fPaths1[i]);
596 }
597 this->finishedMakingPaths();
598 }
599
mtkleina1ebeb22015-10-01 09:43:39 -0700600 void onDraw(int loops, SkCanvas*) override {
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000601 switch (fType) {
602 case kAdd_AddType:
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000603 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000604 int idx = i & (kPathCnt - 1);
605 SkPath result = fPaths0[idx];
606 result.addPath(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000607 }
608 break;
609 case kAddTrans_AddType:
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000610 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000611 int idx = i & (kPathCnt - 1);
612 SkPath result = fPaths0[idx];
613 result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000614 }
615 break;
616 case kAddMatrix_AddType:
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000617 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000618 int idx = i & (kPathCnt - 1);
619 SkPath result = fPaths0[idx];
620 result.addPath(fPaths1[idx], fMatrix);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000621 }
622 break;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000623 case kReverseAdd_AddType:
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000624 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000625 int idx = i & (kPathCnt - 1);
626 SkPath result = fPaths0[idx];
627 result.reverseAddPath(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000628 }
629 break;
630 case kReversePathTo_AddType:
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000631 for (int i = 0; i < loops; ++i) {
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000632 int idx = i & (kPathCnt - 1);
633 SkPath result = fPaths0[idx];
634 result.reversePathTo(fPaths1[idx]);
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000635 }
636 break;
637 }
638 }
639
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000640private:
641 AddType fType; // or reverseAddPath
bsalomon@google.comb5e47032012-08-14 17:49:46 +0000642 enum {
643 // must be a pow 2
644 kPathCnt = 1 << 5,
645 };
646 SkAutoTArray<SkPath> fPaths0;
647 SkAutoTArray<SkPath> fPaths1;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000648 SkMatrix fMatrix;
John Stiles7571f9e2020-09-02 22:42:33 -0400649 using INHERITED = RandomPathBench;
bsalomon@google.com30e6d2c2012-08-13 14:03:31 +0000650};
tomhudson@google.com6e8d3352011-06-22 17:16:35 +0000651
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000652
tfarinaf168b862014-06-19 12:32:29 -0700653class CirclesBench : public Benchmark {
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000654protected:
655 SkString fName;
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000656 Flags fFlags;
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000657
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000658public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000659 CirclesBench(Flags flags) : fFlags(flags) {
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000660 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000661 }
662
663protected:
mtklein36352bf2015-03-25 18:17:31 -0700664 const char* onGetName() override {
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000665 return fName.c_str();
666 }
667
mtkleina1ebeb22015-10-01 09:43:39 -0700668 void onDraw(int loops, SkCanvas* canvas) override {
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000669 SkPaint paint;
670
671 paint.setColor(SK_ColorBLACK);
672 paint.setAntiAlias(true);
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000673 if (fFlags & kStroke_Flag) {
674 paint.setStyle(SkPaint::kStroke_Style);
675 }
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000676
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000677 SkRandom rand;
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000678
679 SkRect r;
680
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000681 for (int i = 0; i < loops; ++i) {
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000682 SkScalar radius = rand.nextUScalar1() * 3;
683 r.fLeft = rand.nextUScalar1() * 300;
684 r.fTop = rand.nextUScalar1() * 300;
685 r.fRight = r.fLeft + 2 * radius;
686 r.fBottom = r.fTop + 2 * radius;
687
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000688 if (fFlags & kStroke_Flag) {
689 paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
690 }
691
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000692 SkPath temp;
693
694 // mimic how Chrome does circles
695 temp.arcTo(r, 0, 0, false);
Mike Reed30bc5272019-11-22 18:34:02 +0000696 temp.addOval(r, SkPathDirection::kCCW);
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000697 temp.arcTo(r, 360, 0, true);
698 temp.close();
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000699
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000700 canvas->drawPath(temp, paint);
701 }
702 }
703
704private:
John Stiles7571f9e2020-09-02 22:42:33 -0400705 using INHERITED = Benchmark;
robertphillips@google.com17bb4582012-08-20 17:24:16 +0000706};
707
jvanverth@google.com46d3d392013-01-22 13:34:01 +0000708
robertphillips@google.com158618e2012-10-23 16:56:56 +0000709// Chrome creates its own round rects with each corner possibly being different.
710// In its "zero radius" incarnation it creates degenerate round rects.
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000711// Note: PathTest::test_arb_round_rect_is_convex and
robertphillips@google.com158618e2012-10-23 16:56:56 +0000712// test_arb_zero_rad_round_rect_is_rect perform almost exactly
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000713// the same test (but with no drawing)
tfarinaf168b862014-06-19 12:32:29 -0700714class ArbRoundRectBench : public Benchmark {
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000715protected:
716 SkString fName;
717
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000718public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000719 ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) {
robertphillips@google.com158618e2012-10-23 16:56:56 +0000720 if (zeroRad) {
721 fName.printf("zeroradroundrect");
722 } else {
723 fName.printf("arbroundrect");
724 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000725 }
726
727protected:
mtklein36352bf2015-03-25 18:17:31 -0700728 const char* onGetName() override {
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000729 return fName.c_str();
730 }
731
skia.committer@gmail.com989a95e2012-10-18 02:01:23 +0000732 static void add_corner_arc(SkPath* path, const SkRect& rect,
733 SkScalar xIn, SkScalar yIn,
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000734 int startAngle)
735 {
736
Brian Osman116b33e2020-02-05 13:34:09 -0500737 SkScalar rx = std::min(rect.width(), xIn);
738 SkScalar ry = std::min(rect.height(), yIn);
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000739
740 SkRect arcRect;
Mike Reed92b33352019-08-24 19:39:13 -0400741 arcRect.setLTRB(-rx, -ry, rx, ry);
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000742 switch (startAngle) {
743 case 0:
744 arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
745 break;
746 case 90:
747 arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
748 break;
749 case 180:
750 arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
751 break;
752 case 270:
753 arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
754 break;
755 default:
756 break;
757 }
758
759 path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
760 }
761
skia.committer@gmail.com989a95e2012-10-18 02:01:23 +0000762 static void make_arb_round_rect(SkPath* path, const SkRect& r,
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000763 SkScalar xCorner, SkScalar yCorner) {
764 // we are lazy here and use the same x & y for each corner
765 add_corner_arc(path, r, xCorner, yCorner, 270);
766 add_corner_arc(path, r, xCorner, yCorner, 0);
767 add_corner_arc(path, r, xCorner, yCorner, 90);
768 add_corner_arc(path, r, xCorner, yCorner, 180);
robertphillips@google.com158618e2012-10-23 16:56:56 +0000769 path->close();
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000770
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000771 SkASSERT(path->isConvex());
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000772 }
773
mtkleina1ebeb22015-10-01 09:43:39 -0700774 void onDraw(int loops, SkCanvas* canvas) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000775 SkRandom rand;
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000776 SkRect r;
777
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000778 for (int i = 0; i < loops; ++i) {
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000779 SkPaint paint;
780 paint.setColor(0xff000000 | rand.nextU());
781 paint.setAntiAlias(true);
782
robertphillips@google.com158618e2012-10-23 16:56:56 +0000783 SkScalar size = rand.nextUScalar1() * 30;
784 if (size < SK_Scalar1) {
robertphillips@google.comb95eaa82012-10-18 15:26:12 +0000785 continue;
786 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000787 r.fLeft = rand.nextUScalar1() * 300;
788 r.fTop = rand.nextUScalar1() * 300;
robertphillips@google.com158618e2012-10-23 16:56:56 +0000789 r.fRight = r.fLeft + 2 * size;
790 r.fBottom = r.fTop + 2 * size;
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000791
792 SkPath temp;
793
robertphillips@google.com158618e2012-10-23 16:56:56 +0000794 if (fZeroRad) {
795 make_arb_round_rect(&temp, r, 0, 0);
796
halcanary96fcdcc2015-08-27 07:41:13 -0700797 SkASSERT(temp.isRect(nullptr));
robertphillips@google.com158618e2012-10-23 16:56:56 +0000798 } else {
799 make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
800 }
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000801
802 canvas->drawPath(temp, paint);
803 }
804 }
805
806private:
robertphillips@google.com158618e2012-10-23 16:56:56 +0000807 bool fZeroRad; // should 0 radius rounds rects be tested?
808
John Stiles7571f9e2020-09-02 22:42:33 -0400809 using INHERITED = Benchmark;
robertphillips@google.comf6fc3fc2012-10-17 15:23:21 +0000810};
811
tfarinaf168b862014-06-19 12:32:29 -0700812class ConservativelyContainsBench : public Benchmark {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000813public:
814 enum Type {
815 kRect_Type,
816 kRoundRect_Type,
817 kOval_Type,
818 };
819
mtklein@google.com410e6e82013-09-13 19:52:27 +0000820 ConservativelyContainsBench(Type type) {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000821 fParity = false;
822 fName = "conservatively_contains_";
823 switch (type) {
824 case kRect_Type:
825 fName.append("rect");
826 fPath.addRect(kBaseRect);
827 break;
828 case kRoundRect_Type:
829 fName.append("round_rect");
Mike Reed4241f5e2019-09-14 19:13:23 +0000830 fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000831 break;
832 case kOval_Type:
833 fName.append("oval");
834 fPath.addOval(kBaseRect);
835 break;
836 }
837 }
838
mtklein36352bf2015-03-25 18:17:31 -0700839 bool isSuitableFor(Backend backend) override {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000840 return backend == kNonRendering_Backend;
841 }
842
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000843private:
mtklein36352bf2015-03-25 18:17:31 -0700844 const char* onGetName() override {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000845 return fName.c_str();
846 }
847
mtkleina1ebeb22015-10-01 09:43:39 -0700848 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000849 for (int i = 0; i < loops; ++i) {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000850 const SkRect& rect = fQueryRects[i % kQueryRectCnt];
851 fParity = fParity != fPath.conservativelyContainsRect(rect);
852 }
853 }
854
joshualitt8a6697a2015-09-30 12:11:07 -0700855 void onDelayedSetup() override {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000856 fQueryRects.setCount(kQueryRectCnt);
857
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000858 SkRandom rand;
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000859 for (int i = 0; i < kQueryRectCnt; ++i) {
860 SkSize size;
861 SkPoint xy;
862 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth);
863 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
864 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
865 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
866
867 fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
868 }
869 }
870
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000871 enum {
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000872 kQueryRectCnt = 400,
873 };
874 static const SkRect kBounds; // bounds for all random query rects
875 static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
876 static const SkSize kQueryMax; // max query rect size, should < kBounds
877 static const SkRect kBaseRect; // rect that is used to construct the path
878 static const SkScalar kRRRadii[2]; // x and y radii for round rect
879
880 SkString fName;
881 SkPath fPath;
882 bool fParity;
883 SkTDArray<SkRect> fQueryRects;
884
John Stiles7571f9e2020-09-02 22:42:33 -0400885 using INHERITED = Benchmark;
bsalomon@google.com9bee33a2012-11-13 21:51:38 +0000886};
887
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000888///////////////////////////////////////////////////////////////////////////////
889
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500890#include "src/core/SkGeometry.h"
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000891
reed55011032015-03-26 09:10:22 -0700892class ConicBench_Chop : public Benchmark {
reedb6402032015-03-20 13:23:43 -0700893protected:
894 SkConic fRQ, fDst[2];
895 SkString fName;
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000896public:
reed55011032015-03-26 09:10:22 -0700897 ConicBench_Chop() : fName("conic-chop") {
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000898 fRQ.fPts[0].set(0, 0);
899 fRQ.fPts[1].set(100, 0);
900 fRQ.fPts[2].set(100, 100);
901 fRQ.fW = SkScalarCos(SK_ScalarPI/4);
reedb6402032015-03-20 13:23:43 -0700902 }
903
mtklein36352bf2015-03-25 18:17:31 -0700904 bool isSuitableFor(Backend backend) override {
reedb6402032015-03-20 13:23:43 -0700905 return backend == kNonRendering_Backend;
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000906 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000907
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000908private:
mtklein36352bf2015-03-25 18:17:31 -0700909 const char* onGetName() override { return fName.c_str(); }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000910
mtkleina1ebeb22015-10-01 09:43:39 -0700911 void onDraw(int loops, SkCanvas*) override {
reed55011032015-03-26 09:10:22 -0700912 for (int i = 0; i < loops; ++i) {
913 fRQ.chop(fDst);
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000914 }
915 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +0000916
John Stiles7571f9e2020-09-02 22:42:33 -0400917 using INHERITED = Benchmark;
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000918};
reed55011032015-03-26 09:10:22 -0700919DEF_BENCH( return new ConicBench_Chop; )
reedb6402032015-03-20 13:23:43 -0700920
reed55011032015-03-26 09:10:22 -0700921class ConicBench_EvalPos : public ConicBench_Chop {
922 const bool fUseV2;
reedb6402032015-03-20 13:23:43 -0700923public:
reed55011032015-03-26 09:10:22 -0700924 ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
reedb6402032015-03-20 13:23:43 -0700925 fName.printf("conic-eval-pos%d", useV2);
926 }
mtkleina1ebeb22015-10-01 09:43:39 -0700927 void onDraw(int loops, SkCanvas*) override {
reedb6402032015-03-20 13:23:43 -0700928 if (fUseV2) {
929 for (int i = 0; i < loops; ++i) {
930 for (int j = 0; j < 1000; ++j) {
931 fDst[0].fPts[0] = fRQ.evalAt(0.4f);
932 }
933 }
934 } else {
935 for (int i = 0; i < loops; ++i) {
936 for (int j = 0; j < 1000; ++j) {
halcanary96fcdcc2015-08-27 07:41:13 -0700937 fRQ.evalAt(0.4f, &fDst[0].fPts[0], nullptr);
reedb6402032015-03-20 13:23:43 -0700938 }
939 }
940 }
941 }
942};
943DEF_BENCH( return new ConicBench_EvalPos(false); )
944DEF_BENCH( return new ConicBench_EvalPos(true); )
945
reed55011032015-03-26 09:10:22 -0700946class ConicBench_EvalTan : public ConicBench_Chop {
947 const bool fUseV2;
reedb6402032015-03-20 13:23:43 -0700948public:
reed55011032015-03-26 09:10:22 -0700949 ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
reedb6402032015-03-20 13:23:43 -0700950 fName.printf("conic-eval-tan%d", useV2);
951 }
mtkleina1ebeb22015-10-01 09:43:39 -0700952 void onDraw(int loops, SkCanvas*) override {
reedb6402032015-03-20 13:23:43 -0700953 if (fUseV2) {
954 for (int i = 0; i < loops; ++i) {
955 for (int j = 0; j < 1000; ++j) {
956 fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f);
957 }
958 }
959 } else {
960 for (int i = 0; i < loops; ++i) {
961 for (int j = 0; j < 1000; ++j) {
halcanary96fcdcc2015-08-27 07:41:13 -0700962 fRQ.evalAt(0.4f, nullptr, &fDst[0].fPts[0]);
reedb6402032015-03-20 13:23:43 -0700963 }
964 }
965 }
966 }
967};
968DEF_BENCH( return new ConicBench_EvalTan(false); )
969DEF_BENCH( return new ConicBench_EvalTan(true); )
mike@reedtribe.org8d551012013-04-14 02:40:50 +0000970
Tyler Denniston60fc6502020-08-10 11:09:47 -0400971class ConicBench_TinyError : public Benchmark {
972protected:
973 SkString fName;
974
975public:
976 ConicBench_TinyError() : fName("conic-tinyerror") {}
977
978protected:
979 const char* onGetName() override { return fName.c_str(); }
980
981 void onDraw(int loops, SkCanvas*) override {
982 SkPaint paint;
983 paint.setColor(SK_ColorBLACK);
984 paint.setAntiAlias(true);
985 paint.setStyle(SkPaint::kStroke_Style);
986 paint.setStrokeWidth(2);
987
988 SkPath path;
989 path.moveTo(-100, 1);
990 path.cubicTo(-101, 1, -118, -47, -138, -44);
991
992 // The large y scale factor produces a tiny error threshold.
993 const SkMatrix mtx = SkMatrix::MakeAll(3.07294035f, 0.833333373f, 361.111115f, 0.0f,
994 6222222.5f, 28333.334f, 0.0f, 0.0f, 1.0f);
995 for (int i = 0; i < loops; ++i) {
996 SkPath dst;
997 paint.getFillPath(path, &dst, nullptr, SkDraw::ComputeResScaleForStroking(mtx));
998 }
999 }
1000
1001private:
John Stiles7571f9e2020-09-02 22:42:33 -04001002 using INHERITED = Benchmark;
Tyler Denniston60fc6502020-08-10 11:09:47 -04001003};
1004DEF_BENCH( return new ConicBench_TinyError; )
1005
mike@reedtribe.org8d551012013-04-14 02:40:50 +00001006///////////////////////////////////////////////////////////////////////////////
1007
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +00001008static void rand_conic(SkConic* conic, SkRandom& rand) {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001009 for (int i = 0; i < 3; ++i) {
1010 conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
1011 }
1012 if (rand.nextUScalar1() > 0.5f) {
1013 conic->fW = rand.nextUScalar1();
1014 } else {
1015 conic->fW = 1 + rand.nextUScalar1() * 4;
1016 }
1017}
1018
tfarinaf168b862014-06-19 12:32:29 -07001019class ConicBench : public Benchmark {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001020public:
mtklein@google.com410e6e82013-09-13 19:52:27 +00001021 ConicBench() {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +00001022 SkRandom rand;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001023 for (int i = 0; i < CONICS; ++i) {
1024 rand_conic(&fConics[i], rand);
1025 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +00001026 }
1027
mtklein36352bf2015-03-25 18:17:31 -07001028 bool isSuitableFor(Backend backend) override {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +00001029 return backend == kNonRendering_Backend;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001030 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001031
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001032protected:
1033 enum {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001034 CONICS = 100
1035 };
1036 SkConic fConics[CONICS];
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001037
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001038private:
John Stiles7571f9e2020-09-02 22:42:33 -04001039 using INHERITED = Benchmark;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001040};
1041
1042class ConicBench_ComputeError : public ConicBench {
1043public:
mtklein@google.com410e6e82013-09-13 19:52:27 +00001044 ConicBench_ComputeError() {}
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001045
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001046protected:
mtklein36352bf2015-03-25 18:17:31 -07001047 const char* onGetName() override {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001048 return "conic-compute-error";
1049 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001050
mtkleina1ebeb22015-10-01 09:43:39 -07001051 void onDraw(int loops, SkCanvas*) override {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001052 SkVector err;
commit-bot@chromium.org33614712013-12-03 18:17:16 +00001053 for (int i = 0; i < loops; ++i) {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001054 for (int j = 0; j < CONICS; ++j) {
1055 fConics[j].computeAsQuadError(&err);
1056 }
1057 }
1058 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001059
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001060private:
John Stiles7571f9e2020-09-02 22:42:33 -04001061 using INHERITED = ConicBench;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001062};
1063
1064class ConicBench_asQuadTol : public ConicBench {
1065public:
mtklein@google.com410e6e82013-09-13 19:52:27 +00001066 ConicBench_asQuadTol() {}
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001067
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001068protected:
mtklein36352bf2015-03-25 18:17:31 -07001069 const char* onGetName() override {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001070 return "conic-asQuadTol";
1071 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001072
mtkleina1ebeb22015-10-01 09:43:39 -07001073 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +00001074 for (int i = 0; i < loops; ++i) {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001075 for (int j = 0; j < CONICS; ++j) {
1076 fConics[j].asQuadTol(SK_ScalarHalf);
1077 }
1078 }
1079 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001080
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001081private:
John Stiles7571f9e2020-09-02 22:42:33 -04001082 using INHERITED = ConicBench;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001083};
1084
1085class ConicBench_quadPow2 : public ConicBench {
1086public:
mtklein@google.com410e6e82013-09-13 19:52:27 +00001087 ConicBench_quadPow2() {}
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001088
1089protected:
mtklein36352bf2015-03-25 18:17:31 -07001090 const char* onGetName() override {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001091 return "conic-quadPow2";
1092 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001093
mtkleina1ebeb22015-10-01 09:43:39 -07001094 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.org33614712013-12-03 18:17:16 +00001095 for (int i = 0; i < loops; ++i) {
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001096 for (int j = 0; j < CONICS; ++j) {
1097 fConics[j].computeQuadPOW2(SK_ScalarHalf);
1098 }
1099 }
1100 }
skia.committer@gmail.com81521132013-04-30 07:01:03 +00001101
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001102private:
John Stiles7571f9e2020-09-02 22:42:33 -04001103 using INHERITED = ConicBench;
mike@reedtribe.orgaf5c5062013-04-30 02:14:58 +00001104};
1105
1106///////////////////////////////////////////////////////////////////////////////
1107
Mike Reed0d7dac82017-02-02 17:45:56 -08001108class TightBoundsBench : public Benchmark {
1109 SkPath fPath;
1110 SkString fName;
Mike Reed8d3196b2017-02-03 11:34:13 -05001111 SkRect (*fProc)(const SkPath&);
Mike Reed0d7dac82017-02-02 17:45:56 -08001112
1113public:
Mike Reed8d3196b2017-02-03 11:34:13 -05001114 TightBoundsBench(SkRect (*proc)(const SkPath&), const char suffix[]) : fProc(proc) {
Mike Reed0d7dac82017-02-02 17:45:56 -08001115 fName.printf("tight_bounds_%s", suffix);
Yuqian Li9d5dcda2017-06-23 16:44:34 -04001116
Mike Reed0d7dac82017-02-02 17:45:56 -08001117 const int N = 100;
1118 SkRandom rand;
1119 for (int i = 0; i < N; ++i) {
1120 fPath.moveTo(rand.nextF()*100, rand.nextF()*100);
1121 fPath.lineTo(rand.nextF()*100, rand.nextF()*100);
1122 fPath.quadTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100);
1123 fPath.conicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
1124 rand.nextF()*10);
1125 fPath.cubicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
1126 rand.nextF()*100, rand.nextF()*100);
1127 }
1128 }
1129
1130protected:
1131 bool isSuitableFor(Backend backend) override {
1132 return backend == kNonRendering_Backend;
1133 }
1134
1135 const char* onGetName() override { return fName.c_str(); }
Yuqian Li9d5dcda2017-06-23 16:44:34 -04001136
Mike Reed0d7dac82017-02-02 17:45:56 -08001137 void onDraw(int loops, SkCanvas* canvas) override {
Mike Reed0d7dac82017-02-02 17:45:56 -08001138 for (int i = 0; i < loops*100; ++i) {
Mike Reed8d3196b2017-02-03 11:34:13 -05001139 fProc(fPath);
Mike Reed0d7dac82017-02-02 17:45:56 -08001140 }
1141 }
Yuqian Li9d5dcda2017-06-23 16:44:34 -04001142
Mike Reed0d7dac82017-02-02 17:45:56 -08001143private:
John Stiles7571f9e2020-09-02 22:42:33 -04001144 using INHERITED = Benchmark;
Mike Reed0d7dac82017-02-02 17:45:56 -08001145};
1146
1147
bsalomon@google.com9bee33a2012-11-13 21:51:38 +00001148const SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
Hal Canaryfafe1352017-04-11 12:12:02 -04001149const SkSize ConservativelyContainsBench::kQueryMin = {SkIntToScalar(1), SkIntToScalar(1)};
1150const SkSize ConservativelyContainsBench::kQueryMax = {SkIntToScalar(40), SkIntToScalar(40)};
bsalomon@google.com9bee33a2012-11-13 21:51:38 +00001151const SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
1152const SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
1153
mtklein@google.com410e6e82013-09-13 19:52:27 +00001154DEF_BENCH( return new TrianglePathBench(FLAGS00); )
1155DEF_BENCH( return new TrianglePathBench(FLAGS01); )
1156DEF_BENCH( return new TrianglePathBench(FLAGS10); )
1157DEF_BENCH( return new TrianglePathBench(FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001158
mtklein@google.com410e6e82013-09-13 19:52:27 +00001159DEF_BENCH( return new RectPathBench(FLAGS00); )
1160DEF_BENCH( return new RectPathBench(FLAGS01); )
1161DEF_BENCH( return new RectPathBench(FLAGS10); )
1162DEF_BENCH( return new RectPathBench(FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001163
liyuqiana27f6692016-06-20 14:05:27 -07001164DEF_BENCH( return new RotatedRectBench(FLAGS00, false, 45));
1165DEF_BENCH( return new RotatedRectBench(FLAGS10, false, 45));
1166DEF_BENCH( return new RotatedRectBench(FLAGS00, true, 45));
1167DEF_BENCH( return new RotatedRectBench(FLAGS10, true, 45));
1168
mtklein@google.com410e6e82013-09-13 19:52:27 +00001169DEF_BENCH( return new OvalPathBench(FLAGS00); )
1170DEF_BENCH( return new OvalPathBench(FLAGS01); )
1171DEF_BENCH( return new OvalPathBench(FLAGS10); )
1172DEF_BENCH( return new OvalPathBench(FLAGS11); )
reed@google.comd34658a2011-04-11 13:12:51 +00001173
mtklein@google.com410e6e82013-09-13 19:52:27 +00001174DEF_BENCH( return new CirclePathBench(FLAGS00); )
1175DEF_BENCH( return new CirclePathBench(FLAGS01); )
1176DEF_BENCH( return new CirclePathBench(FLAGS10); )
1177DEF_BENCH( return new CirclePathBench(FLAGS11); )
bsalomon@google.com1647a192012-04-11 15:34:46 +00001178
Yuqian Li8eedbfc2017-01-11 13:55:49 +00001179DEF_BENCH( return new NonAACirclePathBench(FLAGS00); )
1180DEF_BENCH( return new NonAACirclePathBench(FLAGS10); )
1181
Yuqian Li131c1fb2016-12-12 16:24:47 -05001182DEF_BENCH( return new AAAConcavePathBench(FLAGS00); )
1183DEF_BENCH( return new AAAConcavePathBench(FLAGS10); )
1184DEF_BENCH( return new AAAConvexPathBench(FLAGS00); )
1185DEF_BENCH( return new AAAConvexPathBench(FLAGS10); )
1186
mtklein@google.com410e6e82013-09-13 19:52:27 +00001187DEF_BENCH( return new SawToothPathBench(FLAGS00); )
1188DEF_BENCH( return new SawToothPathBench(FLAGS01); )
reed@google.comd34658a2011-04-11 13:12:51 +00001189
mtklein@google.com410e6e82013-09-13 19:52:27 +00001190DEF_BENCH( return new LongCurvedPathBench(FLAGS00); )
1191DEF_BENCH( return new LongCurvedPathBench(FLAGS01); )
1192DEF_BENCH( return new LongLinePathBench(FLAGS00); )
1193DEF_BENCH( return new LongLinePathBench(FLAGS01); )
tomhudson@google.com6e8d3352011-06-22 17:16:35 +00001194
mtklein@google.com410e6e82013-09-13 19:52:27 +00001195DEF_BENCH( return new PathCreateBench(); )
1196DEF_BENCH( return new PathCopyBench(); )
1197DEF_BENCH( return new PathTransformBench(true); )
1198DEF_BENCH( return new PathTransformBench(false); )
1199DEF_BENCH( return new PathEqualityBench(); )
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +00001200
mtklein@google.com410e6e82013-09-13 19:52:27 +00001201DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); )
1202DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); )
1203DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); )
mtklein@google.com410e6e82013-09-13 19:52:27 +00001204DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); )
1205DEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); )
senorblanco@chromium.orge50f7362012-01-12 19:10:35 +00001206
mtklein@google.com410e6e82013-09-13 19:52:27 +00001207DEF_BENCH( return new CirclesBench(FLAGS00); )
1208DEF_BENCH( return new CirclesBench(FLAGS01); )
1209DEF_BENCH( return new ArbRoundRectBench(false); )
1210DEF_BENCH( return new ArbRoundRectBench(true); )
1211DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); )
1212DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
1213DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
mike@reedtribe.org8d551012013-04-14 02:40:50 +00001214
Mike Kleinc0bd9f92019-04-23 12:05:21 -05001215#include "include/pathops/SkPathOps.h"
1216#include "src/core/SkPathPriv.h"
Hal Canary8a001442018-09-19 11:31:27 -04001217
Mike Reed8d3196b2017-02-03 11:34:13 -05001218DEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();},
1219 "priv"); )
1220DEF_BENCH( return new TightBoundsBench([](const SkPath& path) {
1221 SkRect bounds; TightBounds(path, &bounds); return bounds;
1222 }, "pathops"); )
reedb6402032015-03-20 13:23:43 -07001223
Mike Klein3f376a52014-07-16 20:23:43 -04001224// These seem to be optimized away, which is troublesome for timing.
1225/*
mtklein@google.com410e6e82013-09-13 19:52:27 +00001226DEF_BENCH( return new ConicBench_Chop5() )
mtklein@google.com410e6e82013-09-13 19:52:27 +00001227DEF_BENCH( return new ConicBench_ComputeError() )
1228DEF_BENCH( return new ConicBench_asQuadTol() )
1229DEF_BENCH( return new ConicBench_quadPow2() )
Mike Klein3f376a52014-07-16 20:23:43 -04001230*/
Mike Reed646107f2018-12-07 13:32:18 -05001231
1232class CommonConvexBench : public Benchmark {
1233protected:
1234 SkString fName;
1235 SkPath fPath;
1236 const bool fAA;
1237
1238public:
1239 CommonConvexBench(int w, int h, bool forceConcave, bool aa) : fAA(aa) {
1240 fName.printf("convex_path_%d_%d_%d_%d", w, h, forceConcave, aa);
1241
1242 SkRect r = SkRect::MakeXYWH(10, 10, w*1.0f, h*1.0f);
1243 fPath.addRRect(SkRRect::MakeRectXY(r, w/8.0f, h/8.0f));
1244
1245 if (forceConcave) {
Mike Reed3872c982020-08-29 17:46:51 -04001246 SkPathPriv::SetConvexity(fPath, SkPathConvexity::kConcave);
Mike Reed646107f2018-12-07 13:32:18 -05001247 SkASSERT(!fPath.isConvex());
1248 } else {
1249 SkASSERT(fPath.isConvex());
1250 }
1251 }
1252
1253protected:
1254 const char* onGetName() override {
1255 return fName.c_str();
1256 }
1257
1258 void onDraw(int loops, SkCanvas* canvas) override {
1259 SkPaint paint;
1260 paint.setAntiAlias(fAA);
1261
1262 for (int i = 0; i < loops; ++i) {
1263 for (int inner = 0; inner < 100; ++inner) {
1264 canvas->drawPath(fPath, paint);
1265 }
1266 }
1267 }
1268
1269private:
John Stiles7571f9e2020-09-02 22:42:33 -04001270 using INHERITED = Benchmark;
Mike Reed646107f2018-12-07 13:32:18 -05001271};
1272
1273DEF_BENCH( return new CommonConvexBench( 16, 16, false, false); )
1274DEF_BENCH( return new CommonConvexBench( 16, 16, true, false); )
1275DEF_BENCH( return new CommonConvexBench( 16, 16, false, true); )
1276DEF_BENCH( return new CommonConvexBench( 16, 16, true, true); )
1277
1278DEF_BENCH( return new CommonConvexBench(200, 16, false, false); )
1279DEF_BENCH( return new CommonConvexBench(200, 16, true, false); )
1280DEF_BENCH( return new CommonConvexBench(200, 16, false, true); )
1281DEF_BENCH( return new CommonConvexBench(200, 16, true, true); )