blob: e421ce07b19933668a7996603f782a0fcb475aff [file] [log] [blame]
egdaniel@google.coma3088832013-07-17 19:30:41 +00001/*
2 * Copyright 2013 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 */
commit-bot@chromium.org78dd91d2014-01-27 19:52:51 +00007
tfarinaf168b862014-06-19 12:32:29 -07008#include "Benchmark.h"
egdaniel@google.coma3088832013-07-17 19:30:41 +00009#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkRandom.h"
12#include "SkShader.h"
13#include "SkString.h"
14
15enum Flags {
16 kBig_Flag = 1 << 0,
17 kAA_Flag = 1 << 1
18};
19
20#define FLAGS00 Flags(0)
21#define FLAGS01 Flags(kBig_Flag)
22#define FLAGS10 Flags(kAA_Flag)
23#define FLAGS11 Flags(kBig_Flag | kAA_Flag)
24
25static const int points[] = {
26 10, 10, 15, 5, 20, 20,
27 30, 5, 25, 20, 15, 12,
28 21, 21, 30, 30, 12, 4,
29 32, 28, 20, 18, 12, 10
30};
31
32static const int kMaxPathSize = 10;
33
tfarinaf168b862014-06-19 12:32:29 -070034class HairlinePathBench : public Benchmark {
egdaniel@google.coma3088832013-07-17 19:30:41 +000035public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000036 HairlinePathBench(Flags flags) : fFlags(flags) {
egdaniel@google.coma3088832013-07-17 19:30:41 +000037 fPaint.setStyle(SkPaint::kStroke_Style);
38 fPaint.setStrokeWidth(SkIntToScalar(0));
39 }
40
41 virtual void appendName(SkString*) = 0;
42 virtual void makePath(SkPath*) = 0;
43
44protected:
mtklein36352bf2015-03-25 18:17:31 -070045 const char* onGetName() override {
egdaniel@google.coma3088832013-07-17 19:30:41 +000046 fName.printf("path_hairline_%s_%s_",
47 fFlags & kBig_Flag ? "big" : "small",
48 fFlags & kAA_Flag ? "AA" : "noAA");
49 this->appendName(&fName);
50 return fName.c_str();
51 }
52
mtklein36352bf2015-03-25 18:17:31 -070053 void onDraw(const int loops, SkCanvas* canvas) override {
egdaniel@google.coma3088832013-07-17 19:30:41 +000054 SkPaint paint(fPaint);
55 this->setupPaint(&paint);
56
57 paint.setAntiAlias(fFlags & kAA_Flag ? true : false);
skia.committer@gmail.comf7d01ce2013-07-18 07:00:56 +000058
egdaniel@google.coma3088832013-07-17 19:30:41 +000059 SkPath path;
60 this->makePath(&path);
61 if (fFlags & kBig_Flag) {
robertphillips1d24b8d2015-03-26 19:57:08 -070062 const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(3), SkIntToScalar(3));
egdaniel@google.coma3088832013-07-17 19:30:41 +000063 path.transform(m);
64 }
65
commit-bot@chromium.org33614712013-12-03 18:17:16 +000066 for (int i = 0; i < loops; i++) {
reed9645ce12015-04-13 11:12:06 -070067 for (int j = 0; j < 100; ++j) {
68 canvas->drawPath(path, paint);
69 }
egdaniel@google.coma3088832013-07-17 19:30:41 +000070 }
71 }
72
73private:
74 SkPaint fPaint;
75 SkString fName;
76 Flags fFlags;
tfarinaf168b862014-06-19 12:32:29 -070077 typedef Benchmark INHERITED;
egdaniel@google.coma3088832013-07-17 19:30:41 +000078};
79
80class LinePathBench : public HairlinePathBench {
81public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000082 LinePathBench(Flags flags) : INHERITED(flags) {}
egdaniel@google.coma3088832013-07-17 19:30:41 +000083
mtklein36352bf2015-03-25 18:17:31 -070084 void appendName(SkString* name) override {
egdaniel@google.coma3088832013-07-17 19:30:41 +000085 name->append("line");
86 }
mtklein36352bf2015-03-25 18:17:31 -070087 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000088 SkRandom rand;
egdaniel@google.coma3088832013-07-17 19:30:41 +000089 int size = SK_ARRAY_COUNT(points);
90 int hSize = size / 2;
91 for (int i = 0; i < kMaxPathSize; ++i) {
92 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
93 int yTrans = 0;
94 if (i > kMaxPathSize/2 - 1) {
95 yTrans = 40;
96 }
97 int base1 = 2 * rand.nextULessThan(hSize);
98 int base2 = 2 * rand.nextULessThan(hSize);
99 int base3 = 2 * rand.nextULessThan(hSize);
100 path->moveTo(SkIntToScalar(points[base1] + xTrans),
101 SkIntToScalar(points[base1+1] + yTrans));
102 path->lineTo(SkIntToScalar(points[base2] + xTrans),
103 SkIntToScalar(points[base2+1] + yTrans));
104 path->lineTo(SkIntToScalar(points[base3] + xTrans),
105 SkIntToScalar(points[base3+1] + yTrans));
106 }
107 }
108private:
109 typedef HairlinePathBench INHERITED;
110};
111
112class QuadPathBench : public HairlinePathBench {
113public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000114 QuadPathBench(Flags flags) : INHERITED(flags) {}
egdaniel@google.coma3088832013-07-17 19:30:41 +0000115
mtklein36352bf2015-03-25 18:17:31 -0700116 void appendName(SkString* name) override {
egdaniel@google.coma3088832013-07-17 19:30:41 +0000117 name->append("quad");
118 }
mtklein36352bf2015-03-25 18:17:31 -0700119 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000120 SkRandom rand;
egdaniel@google.coma3088832013-07-17 19:30:41 +0000121 int size = SK_ARRAY_COUNT(points);
122 int hSize = size / 2;
123 for (int i = 0; i < kMaxPathSize; ++i) {
124 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
125 int yTrans = 0;
126 if (i > kMaxPathSize/2 - 1) {
127 yTrans = 40;
128 }
129 int base1 = 2 * rand.nextULessThan(hSize);
130 int base2 = 2 * rand.nextULessThan(hSize);
131 int base3 = 2 * rand.nextULessThan(hSize);
132 path->moveTo(SkIntToScalar(points[base1] + xTrans),
133 SkIntToScalar(points[base1+1] + yTrans));
134 path->quadTo(SkIntToScalar(points[base2] + xTrans),
135 SkIntToScalar(points[base2+1] + yTrans),
136 SkIntToScalar(points[base3] + xTrans),
137 SkIntToScalar(points[base3+1] + yTrans));
138 }
139 }
140private:
141 typedef HairlinePathBench INHERITED;
142};
143
144class ConicPathBench : public HairlinePathBench {
145public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000146 ConicPathBench(Flags flags) : INHERITED(flags) {}
egdaniel@google.coma3088832013-07-17 19:30:41 +0000147
mtklein36352bf2015-03-25 18:17:31 -0700148 void appendName(SkString* name) override {
egdaniel@google.coma3088832013-07-17 19:30:41 +0000149 name->append("conic");
150 }
mtklein36352bf2015-03-25 18:17:31 -0700151 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000152 SkRandom rand;
153 SkRandom randWeight;
egdaniel@google.coma3088832013-07-17 19:30:41 +0000154 int size = SK_ARRAY_COUNT(points);
155 int hSize = size / 2;
156 for (int i = 0; i < kMaxPathSize; ++i) {
157 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
158 int yTrans = 0;
159 if (i > kMaxPathSize/2 - 1) {
160 yTrans = 40;
161 }
162 int base1 = 2 * rand.nextULessThan(hSize);
163 int base2 = 2 * rand.nextULessThan(hSize);
164 int base3 = 2 * rand.nextULessThan(hSize);
165 float weight = randWeight.nextRangeF(0.0f, 2.0f);
166 path->moveTo(SkIntToScalar(points[base1] + xTrans),
167 SkIntToScalar(points[base1+1] + yTrans));
168 path->conicTo(SkIntToScalar(points[base2] + xTrans),
169 SkIntToScalar(points[base2+1] + yTrans),
170 SkIntToScalar(points[base3] + xTrans),
171 SkIntToScalar(points[base3+1] + yTrans),
172 weight);
173 }
174 }
commit-bot@chromium.org78dd91d2014-01-27 19:52:51 +0000175
egdaniel@google.coma3088832013-07-17 19:30:41 +0000176private:
177 typedef HairlinePathBench INHERITED;
178};
179
180class CubicPathBench : public HairlinePathBench {
181public:
mtklein@google.com410e6e82013-09-13 19:52:27 +0000182 CubicPathBench(Flags flags) : INHERITED(flags) {}
egdaniel@google.coma3088832013-07-17 19:30:41 +0000183
mtklein36352bf2015-03-25 18:17:31 -0700184 void appendName(SkString* name) override {
egdaniel@google.coma3088832013-07-17 19:30:41 +0000185 name->append("cubic");
186 }
mtklein36352bf2015-03-25 18:17:31 -0700187 void makePath(SkPath* path) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000188 SkRandom rand;
egdaniel@google.coma3088832013-07-17 19:30:41 +0000189 int size = SK_ARRAY_COUNT(points);
190 int hSize = size / 2;
191 for (int i = 0; i < kMaxPathSize; ++i) {
192 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
193 int yTrans = 0;
194 if (i > kMaxPathSize/2 - 1) {
195 yTrans = 40;
196 }
197 int base1 = 2 * rand.nextULessThan(hSize);
198 int base2 = 2 * rand.nextULessThan(hSize);
199 int base3 = 2 * rand.nextULessThan(hSize);
200 int base4 = 2 * rand.nextULessThan(hSize);
201 path->moveTo(SkIntToScalar(points[base1] + xTrans),
202 SkIntToScalar(points[base1+1] + yTrans));
203 path->cubicTo(SkIntToScalar(points[base2] + xTrans),
204 SkIntToScalar(points[base2+1] + yTrans),
205 SkIntToScalar(points[base3] + xTrans),
206 SkIntToScalar(points[base3+1] + yTrans),
207 SkIntToScalar(points[base4] + xTrans),
208 SkIntToScalar(points[base4+1] + yTrans));
209 }
210 }
211private:
212 typedef HairlinePathBench INHERITED;
213};
214
215// FLAG00 - no AA, small
216// FLAG01 - no AA, small
217// FLAG10 - AA, big
218// FLAG11 - AA, big
219
mtklein@google.com410e6e82013-09-13 19:52:27 +0000220DEF_BENCH( return new LinePathBench(FLAGS00); )
221DEF_BENCH( return new LinePathBench(FLAGS01); )
222DEF_BENCH( return new LinePathBench(FLAGS10); )
223DEF_BENCH( return new LinePathBench(FLAGS11); )
egdaniel@google.coma3088832013-07-17 19:30:41 +0000224
mtklein@google.com410e6e82013-09-13 19:52:27 +0000225DEF_BENCH( return new QuadPathBench(FLAGS00); )
226DEF_BENCH( return new QuadPathBench(FLAGS01); )
227DEF_BENCH( return new QuadPathBench(FLAGS10); )
228DEF_BENCH( return new QuadPathBench(FLAGS11); )
egdaniel@google.coma3088832013-07-17 19:30:41 +0000229
230// Don't have default path renderer for conics yet on GPU, so must use AA
mtklein@google.com410e6e82013-09-13 19:52:27 +0000231// DEF_BENCH( return new ConicPathBench(FLAGS00); )
232// DEF_BENCH( return new ConicPathBench(FLAGS01); )
233DEF_BENCH( return new ConicPathBench(FLAGS10); )
234DEF_BENCH( return new ConicPathBench(FLAGS11); )
egdaniel@google.coma3088832013-07-17 19:30:41 +0000235
mtklein@google.com410e6e82013-09-13 19:52:27 +0000236DEF_BENCH( return new CubicPathBench(FLAGS00); )
237DEF_BENCH( return new CubicPathBench(FLAGS01); )
238DEF_BENCH( return new CubicPathBench(FLAGS10); )
239DEF_BENCH( return new CubicPathBench(FLAGS11); )