OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "Benchmark.h" | 8 #include "Benchmark.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 SkPaint::kFill_Style); | 35 SkPaint::kFill_Style); |
36 fPaint.setStrokeWidth(SkIntToScalar(5)); | 36 fPaint.setStrokeWidth(SkIntToScalar(5)); |
37 fPaint.setStrokeJoin(SkPaint::kBevel_Join); | 37 fPaint.setStrokeJoin(SkPaint::kBevel_Join); |
38 } | 38 } |
39 | 39 |
40 virtual void appendName(SkString*) = 0; | 40 virtual void appendName(SkString*) = 0; |
41 virtual void makePath(SkPath*) = 0; | 41 virtual void makePath(SkPath*) = 0; |
42 virtual int complexity() { return 0; } | 42 virtual int complexity() { return 0; } |
43 | 43 |
44 protected: | 44 protected: |
45 virtual const char* onGetName() SK_OVERRIDE { | 45 const char* onGetName() SK_OVERRIDE { |
46 fName.printf("path_%s_%s_", | 46 fName.printf("path_%s_%s_", |
47 fFlags & kStroke_Flag ? "stroke" : "fill", | 47 fFlags & kStroke_Flag ? "stroke" : "fill", |
48 fFlags & kBig_Flag ? "big" : "small"); | 48 fFlags & kBig_Flag ? "big" : "small"); |
49 this->appendName(&fName); | 49 this->appendName(&fName); |
50 return fName.c_str(); | 50 return fName.c_str(); |
51 } | 51 } |
52 | 52 |
53 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { | 53 void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
54 SkPaint paint(fPaint); | 54 SkPaint paint(fPaint); |
55 this->setupPaint(&paint); | 55 this->setupPaint(&paint); |
56 | 56 |
57 SkPath path; | 57 SkPath path; |
58 this->makePath(&path); | 58 this->makePath(&path); |
59 if (fFlags & kBig_Flag) { | 59 if (fFlags & kBig_Flag) { |
60 SkMatrix m; | 60 SkMatrix m; |
61 m.setScale(SkIntToScalar(10), SkIntToScalar(10)); | 61 m.setScale(SkIntToScalar(10), SkIntToScalar(10)); |
62 path.transform(m); | 62 path.transform(m); |
63 } | 63 } |
(...skipping 10 matching lines...) Expand all Loading... |
74 } | 74 } |
75 | 75 |
76 private: | 76 private: |
77 typedef Benchmark INHERITED; | 77 typedef Benchmark INHERITED; |
78 }; | 78 }; |
79 | 79 |
80 class TrianglePathBench : public PathBench { | 80 class TrianglePathBench : public PathBench { |
81 public: | 81 public: |
82 TrianglePathBench(Flags flags) : INHERITED(flags) {} | 82 TrianglePathBench(Flags flags) : INHERITED(flags) {} |
83 | 83 |
84 virtual void appendName(SkString* name) SK_OVERRIDE { | 84 void appendName(SkString* name) SK_OVERRIDE { |
85 name->append("triangle"); | 85 name->append("triangle"); |
86 } | 86 } |
87 virtual void makePath(SkPath* path) SK_OVERRIDE { | 87 void makePath(SkPath* path) SK_OVERRIDE { |
88 static const int gCoord[] = { | 88 static const int gCoord[] = { |
89 10, 10, 15, 5, 20, 20 | 89 10, 10, 15, 5, 20, 20 |
90 }; | 90 }; |
91 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); | 91 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); |
92 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); | 92 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); |
93 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); | 93 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); |
94 path->close(); | 94 path->close(); |
95 } | 95 } |
96 private: | 96 private: |
97 typedef PathBench INHERITED; | 97 typedef PathBench INHERITED; |
98 }; | 98 }; |
99 | 99 |
100 class RectPathBench : public PathBench { | 100 class RectPathBench : public PathBench { |
101 public: | 101 public: |
102 RectPathBench(Flags flags) : INHERITED(flags) {} | 102 RectPathBench(Flags flags) : INHERITED(flags) {} |
103 | 103 |
104 virtual void appendName(SkString* name) SK_OVERRIDE { | 104 void appendName(SkString* name) SK_OVERRIDE { |
105 name->append("rect"); | 105 name->append("rect"); |
106 } | 106 } |
107 virtual void makePath(SkPath* path) SK_OVERRIDE { | 107 void makePath(SkPath* path) SK_OVERRIDE { |
108 SkRect r = { 10, 10, 20, 20 }; | 108 SkRect r = { 10, 10, 20, 20 }; |
109 path->addRect(r); | 109 path->addRect(r); |
110 } | 110 } |
111 private: | 111 private: |
112 typedef PathBench INHERITED; | 112 typedef PathBench INHERITED; |
113 }; | 113 }; |
114 | 114 |
115 class OvalPathBench : public PathBench { | 115 class OvalPathBench : public PathBench { |
116 public: | 116 public: |
117 OvalPathBench(Flags flags) : INHERITED(flags) {} | 117 OvalPathBench(Flags flags) : INHERITED(flags) {} |
118 | 118 |
119 virtual void appendName(SkString* name) SK_OVERRIDE { | 119 void appendName(SkString* name) SK_OVERRIDE { |
120 name->append("oval"); | 120 name->append("oval"); |
121 } | 121 } |
122 virtual void makePath(SkPath* path) SK_OVERRIDE { | 122 void makePath(SkPath* path) SK_OVERRIDE { |
123 SkRect r = { 10, 10, 23, 20 }; | 123 SkRect r = { 10, 10, 23, 20 }; |
124 path->addOval(r); | 124 path->addOval(r); |
125 } | 125 } |
126 private: | 126 private: |
127 typedef PathBench INHERITED; | 127 typedef PathBench INHERITED; |
128 }; | 128 }; |
129 | 129 |
130 class CirclePathBench: public PathBench { | 130 class CirclePathBench: public PathBench { |
131 public: | 131 public: |
132 CirclePathBench(Flags flags) : INHERITED(flags) {} | 132 CirclePathBench(Flags flags) : INHERITED(flags) {} |
133 | 133 |
134 virtual void appendName(SkString* name) SK_OVERRIDE { | 134 void appendName(SkString* name) SK_OVERRIDE { |
135 name->append("circle"); | 135 name->append("circle"); |
136 } | 136 } |
137 virtual void makePath(SkPath* path) SK_OVERRIDE { | 137 void makePath(SkPath* path) SK_OVERRIDE { |
138 path->addCircle(SkIntToScalar(20), SkIntToScalar(20), | 138 path->addCircle(SkIntToScalar(20), SkIntToScalar(20), |
139 SkIntToScalar(10)); | 139 SkIntToScalar(10)); |
140 } | 140 } |
141 private: | 141 private: |
142 typedef PathBench INHERITED; | 142 typedef PathBench INHERITED; |
143 }; | 143 }; |
144 | 144 |
145 class SawToothPathBench : public PathBench { | 145 class SawToothPathBench : public PathBench { |
146 public: | 146 public: |
147 SawToothPathBench(Flags flags) : INHERITED(flags) {} | 147 SawToothPathBench(Flags flags) : INHERITED(flags) {} |
148 | 148 |
149 virtual void appendName(SkString* name) SK_OVERRIDE { | 149 void appendName(SkString* name) SK_OVERRIDE { |
150 name->append("sawtooth"); | 150 name->append("sawtooth"); |
151 } | 151 } |
152 virtual void makePath(SkPath* path) { | 152 virtual void makePath(SkPath* path) { |
153 SkScalar x = SkIntToScalar(20); | 153 SkScalar x = SkIntToScalar(20); |
154 SkScalar y = SkIntToScalar(20); | 154 SkScalar y = SkIntToScalar(20); |
155 const SkScalar x0 = x; | 155 const SkScalar x0 = x; |
156 const SkScalar dx = SK_Scalar1 * 5; | 156 const SkScalar dx = SK_Scalar1 * 5; |
157 const SkScalar dy = SK_Scalar1 * 10; | 157 const SkScalar dy = SK_Scalar1 * 10; |
158 | 158 |
159 path->moveTo(x, y); | 159 path->moveTo(x, y); |
160 for (int i = 0; i < 32; i++) { | 160 for (int i = 0; i < 32; i++) { |
161 x += dx; | 161 x += dx; |
162 path->lineTo(x, y - dy); | 162 path->lineTo(x, y - dy); |
163 x += dx; | 163 x += dx; |
164 path->lineTo(x, y + dy); | 164 path->lineTo(x, y + dy); |
165 } | 165 } |
166 path->lineTo(x, y + 2 * dy); | 166 path->lineTo(x, y + 2 * dy); |
167 path->lineTo(x0, y + 2 * dy); | 167 path->lineTo(x0, y + 2 * dy); |
168 path->close(); | 168 path->close(); |
169 } | 169 } |
170 virtual int complexity() SK_OVERRIDE { return 1; } | 170 int complexity() SK_OVERRIDE { return 1; } |
171 private: | 171 private: |
172 typedef PathBench INHERITED; | 172 typedef PathBench INHERITED; |
173 }; | 173 }; |
174 | 174 |
175 class LongCurvedPathBench : public PathBench { | 175 class LongCurvedPathBench : public PathBench { |
176 public: | 176 public: |
177 LongCurvedPathBench(Flags flags) : INHERITED(flags) {} | 177 LongCurvedPathBench(Flags flags) : INHERITED(flags) {} |
178 | 178 |
179 virtual void appendName(SkString* name) SK_OVERRIDE { | 179 void appendName(SkString* name) SK_OVERRIDE { |
180 name->append("long_curved"); | 180 name->append("long_curved"); |
181 } | 181 } |
182 virtual void makePath(SkPath* path) SK_OVERRIDE { | 182 void makePath(SkPath* path) SK_OVERRIDE { |
183 SkRandom rand (12); | 183 SkRandom rand (12); |
184 int i; | 184 int i; |
185 for (i = 0; i < 100; i++) { | 185 for (i = 0; i < 100; i++) { |
186 path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), | 186 path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), |
187 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)), | 187 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)), |
188 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), | 188 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), |
189 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480))); | 189 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480))); |
190 } | 190 } |
191 path->close(); | 191 path->close(); |
192 } | 192 } |
193 virtual int complexity() SK_OVERRIDE { return 2; } | 193 int complexity() SK_OVERRIDE { return 2; } |
194 private: | 194 private: |
195 typedef PathBench INHERITED; | 195 typedef PathBench INHERITED; |
196 }; | 196 }; |
197 | 197 |
198 class LongLinePathBench : public PathBench { | 198 class LongLinePathBench : public PathBench { |
199 public: | 199 public: |
200 LongLinePathBench(Flags flags) : INHERITED(flags) {} | 200 LongLinePathBench(Flags flags) : INHERITED(flags) {} |
201 | 201 |
202 virtual void appendName(SkString* name) SK_OVERRIDE { | 202 void appendName(SkString* name) SK_OVERRIDE { |
203 name->append("long_line"); | 203 name->append("long_line"); |
204 } | 204 } |
205 virtual void makePath(SkPath* path) SK_OVERRIDE { | 205 void makePath(SkPath* path) SK_OVERRIDE { |
206 SkRandom rand; | 206 SkRandom rand; |
207 path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); | 207 path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); |
208 for (size_t i = 1; i < 100; i++) { | 208 for (size_t i = 1; i < 100; i++) { |
209 path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); | 209 path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); |
210 } | 210 } |
211 } | 211 } |
212 virtual int complexity() SK_OVERRIDE { return 2; } | 212 int complexity() SK_OVERRIDE { return 2; } |
213 private: | 213 private: |
214 typedef PathBench INHERITED; | 214 typedef PathBench INHERITED; |
215 }; | 215 }; |
216 | 216 |
217 class RandomPathBench : public Benchmark { | 217 class RandomPathBench : public Benchmark { |
218 public: | 218 public: |
219 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { | 219 bool isSuitableFor(Backend backend) SK_OVERRIDE { |
220 return backend == kNonRendering_Backend; | 220 return backend == kNonRendering_Backend; |
221 } | 221 } |
222 | 222 |
223 protected: | 223 protected: |
224 void createData(int minVerbs, | 224 void createData(int minVerbs, |
225 int maxVerbs, | 225 int maxVerbs, |
226 bool allowMoves = true, | 226 bool allowMoves = true, |
227 SkRect* bounds = NULL) { | 227 SkRect* bounds = NULL) { |
228 SkRect tempBounds; | 228 SkRect tempBounds; |
229 if (NULL == bounds) { | 229 if (NULL == bounds) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 SkRandom fRandom; | 314 SkRandom fRandom; |
315 typedef Benchmark INHERITED; | 315 typedef Benchmark INHERITED; |
316 }; | 316 }; |
317 | 317 |
318 class PathCreateBench : public RandomPathBench { | 318 class PathCreateBench : public RandomPathBench { |
319 public: | 319 public: |
320 PathCreateBench() { | 320 PathCreateBench() { |
321 } | 321 } |
322 | 322 |
323 protected: | 323 protected: |
324 virtual const char* onGetName() SK_OVERRIDE { | 324 const char* onGetName() SK_OVERRIDE { |
325 return "path_create"; | 325 return "path_create"; |
326 } | 326 } |
327 | 327 |
328 virtual void onPreDraw() SK_OVERRIDE { | 328 void onPreDraw() SK_OVERRIDE { |
329 this->createData(10, 100); | 329 this->createData(10, 100); |
330 } | 330 } |
331 | 331 |
332 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 332 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
333 for (int i = 0; i < loops; ++i) { | 333 for (int i = 0; i < loops; ++i) { |
334 if (i % 1000 == 0) { | 334 if (i % 1000 == 0) { |
335 fPath.reset(); // PathRef memory can grow without bound otherwi
se. | 335 fPath.reset(); // PathRef memory can grow without bound otherwi
se. |
336 } | 336 } |
337 this->makePath(&fPath); | 337 this->makePath(&fPath); |
338 } | 338 } |
339 this->restartMakingPaths(); | 339 this->restartMakingPaths(); |
340 } | 340 } |
341 | 341 |
342 private: | 342 private: |
343 SkPath fPath; | 343 SkPath fPath; |
344 | 344 |
345 typedef RandomPathBench INHERITED; | 345 typedef RandomPathBench INHERITED; |
346 }; | 346 }; |
347 | 347 |
348 class PathCopyBench : public RandomPathBench { | 348 class PathCopyBench : public RandomPathBench { |
349 public: | 349 public: |
350 PathCopyBench() { | 350 PathCopyBench() { |
351 } | 351 } |
352 | 352 |
353 protected: | 353 protected: |
354 virtual const char* onGetName() SK_OVERRIDE { | 354 const char* onGetName() SK_OVERRIDE { |
355 return "path_copy"; | 355 return "path_copy"; |
356 } | 356 } |
357 virtual void onPreDraw() SK_OVERRIDE { | 357 void onPreDraw() SK_OVERRIDE { |
358 this->createData(10, 100); | 358 this->createData(10, 100); |
359 fPaths.reset(kPathCnt); | 359 fPaths.reset(kPathCnt); |
360 fCopies.reset(kPathCnt); | 360 fCopies.reset(kPathCnt); |
361 for (int i = 0; i < kPathCnt; ++i) { | 361 for (int i = 0; i < kPathCnt; ++i) { |
362 this->makePath(&fPaths[i]); | 362 this->makePath(&fPaths[i]); |
363 } | 363 } |
364 this->finishedMakingPaths(); | 364 this->finishedMakingPaths(); |
365 } | 365 } |
366 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 366 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
367 for (int i = 0; i < loops; ++i) { | 367 for (int i = 0; i < loops; ++i) { |
368 int idx = i & (kPathCnt - 1); | 368 int idx = i & (kPathCnt - 1); |
369 fCopies[idx] = fPaths[idx]; | 369 fCopies[idx] = fPaths[idx]; |
370 } | 370 } |
371 } | 371 } |
372 | 372 |
373 private: | 373 private: |
374 enum { | 374 enum { |
375 // must be a pow 2 | 375 // must be a pow 2 |
376 kPathCnt = 1 << 5, | 376 kPathCnt = 1 << 5, |
377 }; | 377 }; |
378 SkAutoTArray<SkPath> fPaths; | 378 SkAutoTArray<SkPath> fPaths; |
379 SkAutoTArray<SkPath> fCopies; | 379 SkAutoTArray<SkPath> fCopies; |
380 | 380 |
381 typedef RandomPathBench INHERITED; | 381 typedef RandomPathBench INHERITED; |
382 }; | 382 }; |
383 | 383 |
384 class PathTransformBench : public RandomPathBench { | 384 class PathTransformBench : public RandomPathBench { |
385 public: | 385 public: |
386 PathTransformBench(bool inPlace) : fInPlace(inPlace) {} | 386 PathTransformBench(bool inPlace) : fInPlace(inPlace) {} |
387 | 387 |
388 protected: | 388 protected: |
389 virtual const char* onGetName() SK_OVERRIDE { | 389 const char* onGetName() SK_OVERRIDE { |
390 return fInPlace ? "path_transform_in_place" : "path_transform_copy"; | 390 return fInPlace ? "path_transform_in_place" : "path_transform_copy"; |
391 } | 391 } |
392 | 392 |
393 virtual void onPreDraw() SK_OVERRIDE { | 393 void onPreDraw() SK_OVERRIDE { |
394 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); | 394 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); |
395 this->createData(10, 100); | 395 this->createData(10, 100); |
396 fPaths.reset(kPathCnt); | 396 fPaths.reset(kPathCnt); |
397 for (int i = 0; i < kPathCnt; ++i) { | 397 for (int i = 0; i < kPathCnt; ++i) { |
398 this->makePath(&fPaths[i]); | 398 this->makePath(&fPaths[i]); |
399 } | 399 } |
400 this->finishedMakingPaths(); | 400 this->finishedMakingPaths(); |
401 if (!fInPlace) { | 401 if (!fInPlace) { |
402 fTransformed.reset(kPathCnt); | 402 fTransformed.reset(kPathCnt); |
403 } | 403 } |
404 } | 404 } |
405 | 405 |
406 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 406 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
407 if (fInPlace) { | 407 if (fInPlace) { |
408 for (int i = 0; i < loops; ++i) { | 408 for (int i = 0; i < loops; ++i) { |
409 fPaths[i & (kPathCnt - 1)].transform(fMatrix); | 409 fPaths[i & (kPathCnt - 1)].transform(fMatrix); |
410 } | 410 } |
411 } else { | 411 } else { |
412 for (int i = 0; i < loops; ++i) { | 412 for (int i = 0; i < loops; ++i) { |
413 int idx = i & (kPathCnt - 1); | 413 int idx = i & (kPathCnt - 1); |
414 fPaths[idx].transform(fMatrix, &fTransformed[idx]); | 414 fPaths[idx].transform(fMatrix, &fTransformed[idx]); |
415 } | 415 } |
416 } | 416 } |
(...skipping 10 matching lines...) Expand all Loading... |
427 SkMatrix fMatrix; | 427 SkMatrix fMatrix; |
428 bool fInPlace; | 428 bool fInPlace; |
429 typedef RandomPathBench INHERITED; | 429 typedef RandomPathBench INHERITED; |
430 }; | 430 }; |
431 | 431 |
432 class PathEqualityBench : public RandomPathBench { | 432 class PathEqualityBench : public RandomPathBench { |
433 public: | 433 public: |
434 PathEqualityBench() { } | 434 PathEqualityBench() { } |
435 | 435 |
436 protected: | 436 protected: |
437 virtual const char* onGetName() SK_OVERRIDE { | 437 const char* onGetName() SK_OVERRIDE { |
438 return "path_equality_50%"; | 438 return "path_equality_50%"; |
439 } | 439 } |
440 | 440 |
441 virtual void onPreDraw() SK_OVERRIDE { | 441 void onPreDraw() SK_OVERRIDE { |
442 fParity = 0; | 442 fParity = 0; |
443 this->createData(10, 100); | 443 this->createData(10, 100); |
444 fPaths.reset(kPathCnt); | 444 fPaths.reset(kPathCnt); |
445 fCopies.reset(kPathCnt); | 445 fCopies.reset(kPathCnt); |
446 for (int i = 0; i < kPathCnt; ++i) { | 446 for (int i = 0; i < kPathCnt; ++i) { |
447 this->makePath(&fPaths[i]); | 447 this->makePath(&fPaths[i]); |
448 fCopies[i] = fPaths[i]; | 448 fCopies[i] = fPaths[i]; |
449 } | 449 } |
450 this->finishedMakingPaths(); | 450 this->finishedMakingPaths(); |
451 } | 451 } |
452 | 452 |
453 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 453 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
454 for (int i = 0; i < loops; ++i) { | 454 for (int i = 0; i < loops; ++i) { |
455 int idx = i & (kPathCnt - 1); | 455 int idx = i & (kPathCnt - 1); |
456 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); | 456 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); |
457 } | 457 } |
458 } | 458 } |
459 | 459 |
460 private: | 460 private: |
461 bool fParity; // attempt to keep compiler from optimizing out the == | 461 bool fParity; // attempt to keep compiler from optimizing out the == |
462 enum { | 462 enum { |
463 // must be a pow 2 | 463 // must be a pow 2 |
(...skipping 12 matching lines...) Expand all Loading... |
476 kAddMatrix_AddType, | 476 kAddMatrix_AddType, |
477 kReverseAdd_AddType, | 477 kReverseAdd_AddType, |
478 kReversePathTo_AddType, | 478 kReversePathTo_AddType, |
479 }; | 479 }; |
480 | 480 |
481 SkBench_AddPathTest(AddType type) : fType(type) { | 481 SkBench_AddPathTest(AddType type) : fType(type) { |
482 fMatrix.setRotate(60 * SK_Scalar1); | 482 fMatrix.setRotate(60 * SK_Scalar1); |
483 } | 483 } |
484 | 484 |
485 protected: | 485 protected: |
486 virtual const char* onGetName() SK_OVERRIDE { | 486 const char* onGetName() SK_OVERRIDE { |
487 switch (fType) { | 487 switch (fType) { |
488 case kAdd_AddType: | 488 case kAdd_AddType: |
489 return "path_add_path"; | 489 return "path_add_path"; |
490 case kAddTrans_AddType: | 490 case kAddTrans_AddType: |
491 return "path_add_path_trans"; | 491 return "path_add_path_trans"; |
492 case kAddMatrix_AddType: | 492 case kAddMatrix_AddType: |
493 return "path_add_path_matrix"; | 493 return "path_add_path_matrix"; |
494 case kReverseAdd_AddType: | 494 case kReverseAdd_AddType: |
495 return "path_reverse_add_path"; | 495 return "path_reverse_add_path"; |
496 case kReversePathTo_AddType: | 496 case kReversePathTo_AddType: |
497 return "path_reverse_path_to"; | 497 return "path_reverse_path_to"; |
498 default: | 498 default: |
499 SkDEBUGFAIL("Bad add type"); | 499 SkDEBUGFAIL("Bad add type"); |
500 return ""; | 500 return ""; |
501 } | 501 } |
502 } | 502 } |
503 | 503 |
504 virtual void onPreDraw() SK_OVERRIDE { | 504 void onPreDraw() SK_OVERRIDE { |
505 // reversePathTo assumes a single contour path. | 505 // reversePathTo assumes a single contour path. |
506 bool allowMoves = kReversePathTo_AddType != fType; | 506 bool allowMoves = kReversePathTo_AddType != fType; |
507 this->createData(10, 100, allowMoves); | 507 this->createData(10, 100, allowMoves); |
508 fPaths0.reset(kPathCnt); | 508 fPaths0.reset(kPathCnt); |
509 fPaths1.reset(kPathCnt); | 509 fPaths1.reset(kPathCnt); |
510 for (int i = 0; i < kPathCnt; ++i) { | 510 for (int i = 0; i < kPathCnt; ++i) { |
511 this->makePath(&fPaths0[i]); | 511 this->makePath(&fPaths0[i]); |
512 this->makePath(&fPaths1[i]); | 512 this->makePath(&fPaths1[i]); |
513 } | 513 } |
514 this->finishedMakingPaths(); | 514 this->finishedMakingPaths(); |
515 } | 515 } |
516 | 516 |
517 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 517 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
518 switch (fType) { | 518 switch (fType) { |
519 case kAdd_AddType: | 519 case kAdd_AddType: |
520 for (int i = 0; i < loops; ++i) { | 520 for (int i = 0; i < loops; ++i) { |
521 int idx = i & (kPathCnt - 1); | 521 int idx = i & (kPathCnt - 1); |
522 SkPath result = fPaths0[idx]; | 522 SkPath result = fPaths0[idx]; |
523 result.addPath(fPaths1[idx]); | 523 result.addPath(fPaths1[idx]); |
524 } | 524 } |
525 break; | 525 break; |
526 case kAddTrans_AddType: | 526 case kAddTrans_AddType: |
527 for (int i = 0; i < loops; ++i) { | 527 for (int i = 0; i < loops; ++i) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 protected: | 571 protected: |
572 SkString fName; | 572 SkString fName; |
573 Flags fFlags; | 573 Flags fFlags; |
574 | 574 |
575 public: | 575 public: |
576 CirclesBench(Flags flags) : fFlags(flags) { | 576 CirclesBench(Flags flags) : fFlags(flags) { |
577 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); | 577 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); |
578 } | 578 } |
579 | 579 |
580 protected: | 580 protected: |
581 virtual const char* onGetName() SK_OVERRIDE { | 581 const char* onGetName() SK_OVERRIDE { |
582 return fName.c_str(); | 582 return fName.c_str(); |
583 } | 583 } |
584 | 584 |
585 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { | 585 void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
586 SkPaint paint; | 586 SkPaint paint; |
587 | 587 |
588 paint.setColor(SK_ColorBLACK); | 588 paint.setColor(SK_ColorBLACK); |
589 paint.setAntiAlias(true); | 589 paint.setAntiAlias(true); |
590 if (fFlags & kStroke_Flag) { | 590 if (fFlags & kStroke_Flag) { |
591 paint.setStyle(SkPaint::kStroke_Style); | 591 paint.setStyle(SkPaint::kStroke_Style); |
592 } | 592 } |
593 | 593 |
594 SkRandom rand; | 594 SkRandom rand; |
595 | 595 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 public: | 635 public: |
636 ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { | 636 ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { |
637 if (zeroRad) { | 637 if (zeroRad) { |
638 fName.printf("zeroradroundrect"); | 638 fName.printf("zeroradroundrect"); |
639 } else { | 639 } else { |
640 fName.printf("arbroundrect"); | 640 fName.printf("arbroundrect"); |
641 } | 641 } |
642 } | 642 } |
643 | 643 |
644 protected: | 644 protected: |
645 virtual const char* onGetName() SK_OVERRIDE { | 645 const char* onGetName() SK_OVERRIDE { |
646 return fName.c_str(); | 646 return fName.c_str(); |
647 } | 647 } |
648 | 648 |
649 static void add_corner_arc(SkPath* path, const SkRect& rect, | 649 static void add_corner_arc(SkPath* path, const SkRect& rect, |
650 SkScalar xIn, SkScalar yIn, | 650 SkScalar xIn, SkScalar yIn, |
651 int startAngle) | 651 int startAngle) |
652 { | 652 { |
653 | 653 |
654 SkScalar rx = SkMinScalar(rect.width(), xIn); | 654 SkScalar rx = SkMinScalar(rect.width(), xIn); |
655 SkScalar ry = SkMinScalar(rect.height(), yIn); | 655 SkScalar ry = SkMinScalar(rect.height(), yIn); |
(...skipping 25 matching lines...) Expand all Loading... |
681 // we are lazy here and use the same x & y for each corner | 681 // we are lazy here and use the same x & y for each corner |
682 add_corner_arc(path, r, xCorner, yCorner, 270); | 682 add_corner_arc(path, r, xCorner, yCorner, 270); |
683 add_corner_arc(path, r, xCorner, yCorner, 0); | 683 add_corner_arc(path, r, xCorner, yCorner, 0); |
684 add_corner_arc(path, r, xCorner, yCorner, 90); | 684 add_corner_arc(path, r, xCorner, yCorner, 90); |
685 add_corner_arc(path, r, xCorner, yCorner, 180); | 685 add_corner_arc(path, r, xCorner, yCorner, 180); |
686 path->close(); | 686 path->close(); |
687 | 687 |
688 SkASSERT(path->isConvex()); | 688 SkASSERT(path->isConvex()); |
689 } | 689 } |
690 | 690 |
691 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { | 691 void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
692 SkRandom rand; | 692 SkRandom rand; |
693 SkRect r; | 693 SkRect r; |
694 | 694 |
695 for (int i = 0; i < loops; ++i) { | 695 for (int i = 0; i < loops; ++i) { |
696 SkPaint paint; | 696 SkPaint paint; |
697 paint.setColor(0xff000000 | rand.nextU()); | 697 paint.setColor(0xff000000 | rand.nextU()); |
698 paint.setAntiAlias(true); | 698 paint.setAntiAlias(true); |
699 | 699 |
700 SkScalar size = rand.nextUScalar1() * 30; | 700 SkScalar size = rand.nextUScalar1() * 30; |
701 if (size < SK_Scalar1) { | 701 if (size < SK_Scalar1) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 fName.append("round_rect"); | 746 fName.append("round_rect"); |
747 fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); | 747 fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); |
748 break; | 748 break; |
749 case kOval_Type: | 749 case kOval_Type: |
750 fName.append("oval"); | 750 fName.append("oval"); |
751 fPath.addOval(kBaseRect); | 751 fPath.addOval(kBaseRect); |
752 break; | 752 break; |
753 } | 753 } |
754 } | 754 } |
755 | 755 |
756 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { | 756 bool isSuitableFor(Backend backend) SK_OVERRIDE { |
757 return backend == kNonRendering_Backend; | 757 return backend == kNonRendering_Backend; |
758 } | 758 } |
759 | 759 |
760 private: | 760 private: |
761 virtual const char* onGetName() SK_OVERRIDE { | 761 const char* onGetName() SK_OVERRIDE { |
762 return fName.c_str(); | 762 return fName.c_str(); |
763 } | 763 } |
764 | 764 |
765 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 765 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
766 for (int i = 0; i < loops; ++i) { | 766 for (int i = 0; i < loops; ++i) { |
767 const SkRect& rect = fQueryRects[i % kQueryRectCnt]; | 767 const SkRect& rect = fQueryRects[i % kQueryRectCnt]; |
768 fParity = fParity != fPath.conservativelyContainsRect(rect); | 768 fParity = fParity != fPath.conservativelyContainsRect(rect); |
769 } | 769 } |
770 } | 770 } |
771 | 771 |
772 virtual void onPreDraw() SK_OVERRIDE { | 772 void onPreDraw() SK_OVERRIDE { |
773 fQueryRects.setCount(kQueryRectCnt); | 773 fQueryRects.setCount(kQueryRectCnt); |
774 | 774 |
775 SkRandom rand; | 775 SkRandom rand; |
776 for (int i = 0; i < kQueryRectCnt; ++i) { | 776 for (int i = 0; i < kQueryRectCnt; ++i) { |
777 SkSize size; | 777 SkSize size; |
778 SkPoint xy; | 778 SkPoint xy; |
779 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWid
th); | 779 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWid
th); |
780 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHe
ight); | 780 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHe
ight); |
781 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fW
idth); | 781 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fW
idth); |
782 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fH
eight); | 782 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fH
eight); |
(...skipping 27 matching lines...) Expand all Loading... |
810 SkConic fRQ; | 810 SkConic fRQ; |
811 public: | 811 public: |
812 ConicBench_Chop5() { | 812 ConicBench_Chop5() { |
813 fRQ.fPts[0].set(0, 0); | 813 fRQ.fPts[0].set(0, 0); |
814 fRQ.fPts[1].set(100, 0); | 814 fRQ.fPts[1].set(100, 0); |
815 fRQ.fPts[2].set(100, 100); | 815 fRQ.fPts[2].set(100, 100); |
816 fRQ.fW = SkScalarCos(SK_ScalarPI/4); | 816 fRQ.fW = SkScalarCos(SK_ScalarPI/4); |
817 } | 817 } |
818 | 818 |
819 private: | 819 private: |
820 virtual const char* onGetName() SK_OVERRIDE { | 820 const char* onGetName() SK_OVERRIDE { |
821 return "ratquad-chop-0.5"; | 821 return "ratquad-chop-0.5"; |
822 } | 822 } |
823 | 823 |
824 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 824 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
825 SkConic dst[2]; | 825 SkConic dst[2]; |
826 for (int i = 0; i < loops; ++i) { | 826 for (int i = 0; i < loops; ++i) { |
827 fRQ.chopAt(0.5f, dst); | 827 fRQ.chopAt(0.5f, dst); |
828 } | 828 } |
829 } | 829 } |
830 | 830 |
831 typedef Benchmark INHERITED; | 831 typedef Benchmark INHERITED; |
832 }; | 832 }; |
833 | 833 |
834 class ConicBench_ChopHalf : public Benchmark { | 834 class ConicBench_ChopHalf : public Benchmark { |
835 SkConic fRQ; | 835 SkConic fRQ; |
836 public: | 836 public: |
837 ConicBench_ChopHalf() { | 837 ConicBench_ChopHalf() { |
838 fRQ.fPts[0].set(0, 0); | 838 fRQ.fPts[0].set(0, 0); |
839 fRQ.fPts[1].set(100, 0); | 839 fRQ.fPts[1].set(100, 0); |
840 fRQ.fPts[2].set(100, 100); | 840 fRQ.fPts[2].set(100, 100); |
841 fRQ.fW = SkScalarCos(SK_ScalarPI/4); | 841 fRQ.fW = SkScalarCos(SK_ScalarPI/4); |
842 } | 842 } |
843 | 843 |
844 private: | 844 private: |
845 virtual const char* onGetName() SK_OVERRIDE { | 845 const char* onGetName() SK_OVERRIDE { |
846 return "ratquad-chop-half"; | 846 return "ratquad-chop-half"; |
847 } | 847 } |
848 | 848 |
849 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 849 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
850 SkConic dst[2]; | 850 SkConic dst[2]; |
851 for (int i = 0; i < loops; ++i) { | 851 for (int i = 0; i < loops; ++i) { |
852 fRQ.chop(dst); | 852 fRQ.chop(dst); |
853 } | 853 } |
854 } | 854 } |
855 | 855 |
856 typedef Benchmark INHERITED; | 856 typedef Benchmark INHERITED; |
857 }; | 857 }; |
858 | 858 |
859 /////////////////////////////////////////////////////////////////////////////// | 859 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 11 matching lines...) Expand all Loading... |
871 | 871 |
872 class ConicBench : public Benchmark { | 872 class ConicBench : public Benchmark { |
873 public: | 873 public: |
874 ConicBench() { | 874 ConicBench() { |
875 SkRandom rand; | 875 SkRandom rand; |
876 for (int i = 0; i < CONICS; ++i) { | 876 for (int i = 0; i < CONICS; ++i) { |
877 rand_conic(&fConics[i], rand); | 877 rand_conic(&fConics[i], rand); |
878 } | 878 } |
879 } | 879 } |
880 | 880 |
881 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { | 881 bool isSuitableFor(Backend backend) SK_OVERRIDE { |
882 return backend == kNonRendering_Backend; | 882 return backend == kNonRendering_Backend; |
883 } | 883 } |
884 | 884 |
885 protected: | 885 protected: |
886 enum { | 886 enum { |
887 CONICS = 100 | 887 CONICS = 100 |
888 }; | 888 }; |
889 SkConic fConics[CONICS]; | 889 SkConic fConics[CONICS]; |
890 | 890 |
891 private: | 891 private: |
892 typedef Benchmark INHERITED; | 892 typedef Benchmark INHERITED; |
893 }; | 893 }; |
894 | 894 |
895 class ConicBench_ComputeError : public ConicBench { | 895 class ConicBench_ComputeError : public ConicBench { |
896 public: | 896 public: |
897 ConicBench_ComputeError() {} | 897 ConicBench_ComputeError() {} |
898 | 898 |
899 protected: | 899 protected: |
900 virtual const char* onGetName() SK_OVERRIDE { | 900 const char* onGetName() SK_OVERRIDE { |
901 return "conic-compute-error"; | 901 return "conic-compute-error"; |
902 } | 902 } |
903 | 903 |
904 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 904 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
905 SkVector err; | 905 SkVector err; |
906 for (int i = 0; i < loops; ++i) { | 906 for (int i = 0; i < loops; ++i) { |
907 for (int j = 0; j < CONICS; ++j) { | 907 for (int j = 0; j < CONICS; ++j) { |
908 fConics[j].computeAsQuadError(&err); | 908 fConics[j].computeAsQuadError(&err); |
909 } | 909 } |
910 } | 910 } |
911 } | 911 } |
912 | 912 |
913 private: | 913 private: |
914 typedef ConicBench INHERITED; | 914 typedef ConicBench INHERITED; |
915 }; | 915 }; |
916 | 916 |
917 class ConicBench_asQuadTol : public ConicBench { | 917 class ConicBench_asQuadTol : public ConicBench { |
918 public: | 918 public: |
919 ConicBench_asQuadTol() {} | 919 ConicBench_asQuadTol() {} |
920 | 920 |
921 protected: | 921 protected: |
922 virtual const char* onGetName() SK_OVERRIDE { | 922 const char* onGetName() SK_OVERRIDE { |
923 return "conic-asQuadTol"; | 923 return "conic-asQuadTol"; |
924 } | 924 } |
925 | 925 |
926 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 926 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
927 for (int i = 0; i < loops; ++i) { | 927 for (int i = 0; i < loops; ++i) { |
928 for (int j = 0; j < CONICS; ++j) { | 928 for (int j = 0; j < CONICS; ++j) { |
929 fConics[j].asQuadTol(SK_ScalarHalf); | 929 fConics[j].asQuadTol(SK_ScalarHalf); |
930 } | 930 } |
931 } | 931 } |
932 } | 932 } |
933 | 933 |
934 private: | 934 private: |
935 typedef ConicBench INHERITED; | 935 typedef ConicBench INHERITED; |
936 }; | 936 }; |
937 | 937 |
938 class ConicBench_quadPow2 : public ConicBench { | 938 class ConicBench_quadPow2 : public ConicBench { |
939 public: | 939 public: |
940 ConicBench_quadPow2() {} | 940 ConicBench_quadPow2() {} |
941 | 941 |
942 protected: | 942 protected: |
943 virtual const char* onGetName() SK_OVERRIDE { | 943 const char* onGetName() SK_OVERRIDE { |
944 return "conic-quadPow2"; | 944 return "conic-quadPow2"; |
945 } | 945 } |
946 | 946 |
947 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { | 947 void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { |
948 for (int i = 0; i < loops; ++i) { | 948 for (int i = 0; i < loops; ++i) { |
949 for (int j = 0; j < CONICS; ++j) { | 949 for (int j = 0; j < CONICS; ++j) { |
950 fConics[j].computeQuadPOW2(SK_ScalarHalf); | 950 fConics[j].computeQuadPOW2(SK_ScalarHalf); |
951 } | 951 } |
952 } | 952 } |
953 } | 953 } |
954 | 954 |
955 private: | 955 private: |
956 typedef ConicBench INHERITED; | 956 typedef ConicBench INHERITED; |
957 }; | 957 }; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::k
Oval_Type); ) | 1013 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::k
Oval_Type); ) |
1014 | 1014 |
1015 // These seem to be optimized away, which is troublesome for timing. | 1015 // These seem to be optimized away, which is troublesome for timing. |
1016 /* | 1016 /* |
1017 DEF_BENCH( return new ConicBench_Chop5() ) | 1017 DEF_BENCH( return new ConicBench_Chop5() ) |
1018 DEF_BENCH( return new ConicBench_ChopHalf() ) | 1018 DEF_BENCH( return new ConicBench_ChopHalf() ) |
1019 DEF_BENCH( return new ConicBench_ComputeError() ) | 1019 DEF_BENCH( return new ConicBench_ComputeError() ) |
1020 DEF_BENCH( return new ConicBench_asQuadTol() ) | 1020 DEF_BENCH( return new ConicBench_asQuadTol() ) |
1021 DEF_BENCH( return new ConicBench_quadPow2() ) | 1021 DEF_BENCH( return new ConicBench_quadPow2() ) |
1022 */ | 1022 */ |
OLD | NEW |