2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
16 #include "GrDrawTargetCaps.h"
25 #define FLAGS00 Flags(0)
26 #define FLAGS01 Flags(kBig_Flag)
27 #define FLAGS10 Flags(kAA_Flag)
28 #define FLAGS11 Flags(kBig_Flag | kAA_Flag)
30 static const int points[] = {
31 10, 10, 15, 5, 20, 20,
32 30, 5, 25, 20, 15, 12,
33 21, 21, 30, 30, 12, 4,
34 32, 28, 20, 18, 12, 10
37 static const int kMaxPathSize = 10;
39 class HairlinePathBench : public Benchmark {
41 HairlinePathBench(Flags flags) : fFlags(flags) {
42 fPaint.setStyle(SkPaint::kStroke_Style);
43 fPaint.setStrokeWidth(SkIntToScalar(0));
46 virtual void appendName(SkString*) = 0;
47 virtual void makePath(SkPath*) = 0;
50 virtual const char* onGetName() SK_OVERRIDE {
51 fName.printf("path_hairline_%s_%s_",
52 fFlags & kBig_Flag ? "big" : "small",
53 fFlags & kAA_Flag ? "AA" : "noAA");
54 this->appendName(&fName);
58 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
59 SkPaint paint(fPaint);
60 this->setupPaint(&paint);
62 paint.setAntiAlias(fFlags & kAA_Flag ? true : false);
65 this->makePath(&path);
66 if (fFlags & kBig_Flag) {
68 m.setScale(SkIntToScalar(3), SkIntToScalar(3));
72 for (int i = 0; i < loops; i++) {
73 canvas->drawPath(path, paint);
81 typedef Benchmark INHERITED;
84 class LinePathBench : public HairlinePathBench {
86 LinePathBench(Flags flags) : INHERITED(flags) {}
88 virtual void appendName(SkString* name) SK_OVERRIDE {
91 virtual void makePath(SkPath* path) SK_OVERRIDE {
93 int size = SK_ARRAY_COUNT(points);
95 for (int i = 0; i < kMaxPathSize; ++i) {
96 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
98 if (i > kMaxPathSize/2 - 1) {
101 int base1 = 2 * rand.nextULessThan(hSize);
102 int base2 = 2 * rand.nextULessThan(hSize);
103 int base3 = 2 * rand.nextULessThan(hSize);
104 path->moveTo(SkIntToScalar(points[base1] + xTrans),
105 SkIntToScalar(points[base1+1] + yTrans));
106 path->lineTo(SkIntToScalar(points[base2] + xTrans),
107 SkIntToScalar(points[base2+1] + yTrans));
108 path->lineTo(SkIntToScalar(points[base3] + xTrans),
109 SkIntToScalar(points[base3+1] + yTrans));
113 typedef HairlinePathBench INHERITED;
116 class QuadPathBench : public HairlinePathBench {
118 QuadPathBench(Flags flags) : INHERITED(flags) {}
120 virtual void appendName(SkString* name) SK_OVERRIDE {
121 name->append("quad");
123 virtual void makePath(SkPath* path) SK_OVERRIDE {
125 int size = SK_ARRAY_COUNT(points);
126 int hSize = size / 2;
127 for (int i = 0; i < kMaxPathSize; ++i) {
128 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
130 if (i > kMaxPathSize/2 - 1) {
133 int base1 = 2 * rand.nextULessThan(hSize);
134 int base2 = 2 * rand.nextULessThan(hSize);
135 int base3 = 2 * rand.nextULessThan(hSize);
136 path->moveTo(SkIntToScalar(points[base1] + xTrans),
137 SkIntToScalar(points[base1+1] + yTrans));
138 path->quadTo(SkIntToScalar(points[base2] + xTrans),
139 SkIntToScalar(points[base2+1] + yTrans),
140 SkIntToScalar(points[base3] + xTrans),
141 SkIntToScalar(points[base3+1] + yTrans));
145 typedef HairlinePathBench INHERITED;
148 class ConicPathBench : public HairlinePathBench {
150 ConicPathBench(Flags flags) : INHERITED(flags) {}
152 virtual void appendName(SkString* name) SK_OVERRIDE {
153 name->append("conic");
155 virtual void makePath(SkPath* path) SK_OVERRIDE {
158 int size = SK_ARRAY_COUNT(points);
159 int hSize = size / 2;
160 for (int i = 0; i < kMaxPathSize; ++i) {
161 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
163 if (i > kMaxPathSize/2 - 1) {
166 int base1 = 2 * rand.nextULessThan(hSize);
167 int base2 = 2 * rand.nextULessThan(hSize);
168 int base3 = 2 * rand.nextULessThan(hSize);
169 float weight = randWeight.nextRangeF(0.0f, 2.0f);
170 path->moveTo(SkIntToScalar(points[base1] + xTrans),
171 SkIntToScalar(points[base1+1] + yTrans));
172 path->conicTo(SkIntToScalar(points[base2] + xTrans),
173 SkIntToScalar(points[base2+1] + yTrans),
174 SkIntToScalar(points[base3] + xTrans),
175 SkIntToScalar(points[base3+1] + yTrans),
180 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
182 GrContext* context = canvas->getGrContext();
183 // This is a workaround for skbug.com/2078. See also skbug.com/2033.
186 context->getTestTarget(&tt);
187 if (tt.target()->caps()->pathRenderingSupport()) {
192 INHERITED::onDraw(loops, canvas);
196 typedef HairlinePathBench INHERITED;
199 class CubicPathBench : public HairlinePathBench {
201 CubicPathBench(Flags flags) : INHERITED(flags) {}
203 virtual void appendName(SkString* name) SK_OVERRIDE {
204 name->append("cubic");
206 virtual void makePath(SkPath* path) SK_OVERRIDE {
208 int size = SK_ARRAY_COUNT(points);
209 int hSize = size / 2;
210 for (int i = 0; i < kMaxPathSize; ++i) {
211 int xTrans = 10 + 40 * (i%(kMaxPathSize/2));
213 if (i > kMaxPathSize/2 - 1) {
216 int base1 = 2 * rand.nextULessThan(hSize);
217 int base2 = 2 * rand.nextULessThan(hSize);
218 int base3 = 2 * rand.nextULessThan(hSize);
219 int base4 = 2 * rand.nextULessThan(hSize);
220 path->moveTo(SkIntToScalar(points[base1] + xTrans),
221 SkIntToScalar(points[base1+1] + yTrans));
222 path->cubicTo(SkIntToScalar(points[base2] + xTrans),
223 SkIntToScalar(points[base2+1] + yTrans),
224 SkIntToScalar(points[base3] + xTrans),
225 SkIntToScalar(points[base3+1] + yTrans),
226 SkIntToScalar(points[base4] + xTrans),
227 SkIntToScalar(points[base4+1] + yTrans));
231 typedef HairlinePathBench INHERITED;
234 // FLAG00 - no AA, small
235 // FLAG01 - no AA, small
239 DEF_BENCH( return new LinePathBench(FLAGS00); )
240 DEF_BENCH( return new LinePathBench(FLAGS01); )
241 DEF_BENCH( return new LinePathBench(FLAGS10); )
242 DEF_BENCH( return new LinePathBench(FLAGS11); )
244 DEF_BENCH( return new QuadPathBench(FLAGS00); )
245 DEF_BENCH( return new QuadPathBench(FLAGS01); )
246 DEF_BENCH( return new QuadPathBench(FLAGS10); )
247 DEF_BENCH( return new QuadPathBench(FLAGS11); )
249 // Don't have default path renderer for conics yet on GPU, so must use AA
250 // DEF_BENCH( return new ConicPathBench(FLAGS00); )
251 // DEF_BENCH( return new ConicPathBench(FLAGS01); )
252 DEF_BENCH( return new ConicPathBench(FLAGS10); )
253 DEF_BENCH( return new ConicPathBench(FLAGS11); )
255 DEF_BENCH( return new CubicPathBench(FLAGS00); )
256 DEF_BENCH( return new CubicPathBench(FLAGS01); )
257 DEF_BENCH( return new CubicPathBench(FLAGS10); )
258 DEF_BENCH( return new CubicPathBench(FLAGS11); )