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 "SkBenchmark.h" | 8 #include "SkBenchmark.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 #define FLAGS00 Flags(0) | 23 #define FLAGS00 Flags(0) |
24 #define FLAGS01 Flags(kStroke_Flag) | 24 #define FLAGS01 Flags(kStroke_Flag) |
25 #define FLAGS10 Flags(kBig_Flag) | 25 #define FLAGS10 Flags(kBig_Flag) |
26 #define FLAGS11 Flags(kStroke_Flag | kBig_Flag) | 26 #define FLAGS11 Flags(kStroke_Flag | kBig_Flag) |
27 | 27 |
28 class PathBench : public SkBenchmark { | 28 class PathBench : public SkBenchmark { |
29 SkPaint fPaint; | 29 SkPaint fPaint; |
30 SkString fName; | 30 SkString fName; |
31 Flags fFlags; | 31 Flags fFlags; |
32 enum { N = SkBENCHLOOP(1000) }; | |
33 public: | 32 public: |
34 PathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { | 33 PathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { |
35 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : | 34 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : |
36 SkPaint::kFill_Style); | 35 SkPaint::kFill_Style); |
37 fPaint.setStrokeWidth(SkIntToScalar(5)); | 36 fPaint.setStrokeWidth(SkIntToScalar(5)); |
38 fPaint.setStrokeJoin(SkPaint::kBevel_Join); | 37 fPaint.setStrokeJoin(SkPaint::kBevel_Join); |
39 } | 38 } |
40 | 39 |
41 virtual void appendName(SkString*) = 0; | 40 virtual void appendName(SkString*) = 0; |
42 virtual void makePath(SkPath*) = 0; | 41 virtual void makePath(SkPath*) = 0; |
(...skipping 13 matching lines...) Expand all Loading... |
56 this->setupPaint(&paint); | 55 this->setupPaint(&paint); |
57 | 56 |
58 SkPath path; | 57 SkPath path; |
59 this->makePath(&path); | 58 this->makePath(&path); |
60 if (fFlags & kBig_Flag) { | 59 if (fFlags & kBig_Flag) { |
61 SkMatrix m; | 60 SkMatrix m; |
62 m.setScale(SkIntToScalar(10), SkIntToScalar(10)); | 61 m.setScale(SkIntToScalar(10), SkIntToScalar(10)); |
63 path.transform(m); | 62 path.transform(m); |
64 } | 63 } |
65 | 64 |
66 int count = N; | 65 int count = this->getLoops(); |
67 if (fFlags & kBig_Flag) { | 66 if (fFlags & kBig_Flag) { |
68 count >>= 2; | 67 count >>= 2; |
69 } | 68 } |
70 count >>= (3 * complexity()); | 69 count >>= (3 * complexity()); |
71 | 70 |
72 for (int i = 0; i < count; i++) { | 71 for (int i = 0; i < count; i++) { |
73 canvas->drawPath(path, paint); | 72 canvas->drawPath(path, paint); |
74 } | 73 } |
75 } | 74 } |
76 | 75 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 SkRandom fRandom; | 318 SkRandom fRandom; |
320 typedef SkBenchmark INHERITED; | 319 typedef SkBenchmark INHERITED; |
321 }; | 320 }; |
322 | 321 |
323 class PathCreateBench : public RandomPathBench { | 322 class PathCreateBench : public RandomPathBench { |
324 public: | 323 public: |
325 PathCreateBench(void* param) : INHERITED(param) { | 324 PathCreateBench(void* param) : INHERITED(param) { |
326 } | 325 } |
327 | 326 |
328 protected: | 327 protected: |
329 enum { N = SkBENCHLOOP(5000) }; | |
330 | |
331 virtual const char* onGetName() SK_OVERRIDE { | 328 virtual const char* onGetName() SK_OVERRIDE { |
332 return "path_create"; | 329 return "path_create"; |
333 } | 330 } |
334 | 331 |
335 virtual void onPreDraw() SK_OVERRIDE { | 332 virtual void onPreDraw() SK_OVERRIDE { |
336 this->createData(10, 100); | 333 this->createData(10, 100); |
337 fPaths.reset(kPathCnt); | 334 fPaths.reset(kPathCnt); |
338 } | 335 } |
339 | 336 |
340 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 337 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
341 for (int i = 0; i < N; ++i) { | 338 for (int i = 0; i < this->getLoops(); ++i) { |
342 this->makePath(&fPaths[i & (kPathCnt - 1)]); | 339 this->makePath(&fPaths[i & (kPathCnt - 1)]); |
343 } | 340 } |
344 this->restartMakingPaths(); | 341 this->restartMakingPaths(); |
345 } | 342 } |
346 | 343 |
347 virtual void onPostDraw() SK_OVERRIDE { | 344 virtual void onPostDraw() SK_OVERRIDE { |
348 this->finishedMakingPaths(); | 345 this->finishedMakingPaths(); |
349 fPaths.reset(0); | 346 fPaths.reset(0); |
350 } | 347 } |
351 | 348 |
352 private: | 349 private: |
353 enum { | 350 enum { |
354 // must be a pow 2 | 351 // must be a pow 2 |
355 kPathCnt = 1 << 5, | 352 kPathCnt = 1 << 5, |
356 }; | 353 }; |
357 SkAutoTArray<SkPath> fPaths; | 354 SkAutoTArray<SkPath> fPaths; |
358 | 355 |
359 typedef RandomPathBench INHERITED; | 356 typedef RandomPathBench INHERITED; |
360 }; | 357 }; |
361 | 358 |
362 class PathCopyBench : public RandomPathBench { | 359 class PathCopyBench : public RandomPathBench { |
363 public: | 360 public: |
364 PathCopyBench(void* param) : INHERITED(param) { | 361 PathCopyBench(void* param) : INHERITED(param) { |
365 } | 362 } |
366 | 363 |
367 protected: | 364 protected: |
368 enum { N = SkBENCHLOOP(30000) }; | |
369 | |
370 virtual const char* onGetName() SK_OVERRIDE { | 365 virtual const char* onGetName() SK_OVERRIDE { |
371 return "path_copy"; | 366 return "path_copy"; |
372 } | 367 } |
373 virtual void onPreDraw() SK_OVERRIDE { | 368 virtual void onPreDraw() SK_OVERRIDE { |
374 this->createData(10, 100); | 369 this->createData(10, 100); |
375 fPaths.reset(kPathCnt); | 370 fPaths.reset(kPathCnt); |
376 fCopies.reset(kPathCnt); | 371 fCopies.reset(kPathCnt); |
377 for (int i = 0; i < kPathCnt; ++i) { | 372 for (int i = 0; i < kPathCnt; ++i) { |
378 this->makePath(&fPaths[i]); | 373 this->makePath(&fPaths[i]); |
379 } | 374 } |
380 this->finishedMakingPaths(); | 375 this->finishedMakingPaths(); |
381 } | 376 } |
382 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 377 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
383 for (int i = 0; i < N; ++i) { | 378 for (int i = 0; i < this->getLoops(); ++i) { |
384 int idx = i & (kPathCnt - 1); | 379 int idx = i & (kPathCnt - 1); |
385 fCopies[idx] = fPaths[idx]; | 380 fCopies[idx] = fPaths[idx]; |
386 } | 381 } |
387 } | 382 } |
388 virtual void onPostDraw() SK_OVERRIDE { | 383 virtual void onPostDraw() SK_OVERRIDE { |
389 fPaths.reset(0); | 384 fPaths.reset(0); |
390 fCopies.reset(0); | 385 fCopies.reset(0); |
391 } | 386 } |
392 | 387 |
393 private: | 388 private: |
394 enum { | 389 enum { |
395 // must be a pow 2 | 390 // must be a pow 2 |
396 kPathCnt = 1 << 5, | 391 kPathCnt = 1 << 5, |
397 }; | 392 }; |
398 SkAutoTArray<SkPath> fPaths; | 393 SkAutoTArray<SkPath> fPaths; |
399 SkAutoTArray<SkPath> fCopies; | 394 SkAutoTArray<SkPath> fCopies; |
400 | 395 |
401 typedef RandomPathBench INHERITED; | 396 typedef RandomPathBench INHERITED; |
402 }; | 397 }; |
403 | 398 |
404 class PathTransformBench : public RandomPathBench { | 399 class PathTransformBench : public RandomPathBench { |
405 public: | 400 public: |
406 PathTransformBench(bool inPlace, void* param) | 401 PathTransformBench(bool inPlace, void* param) |
407 : INHERITED(param) | 402 : INHERITED(param) |
408 , fInPlace(inPlace) { | 403 , fInPlace(inPlace) { |
409 } | 404 } |
410 | 405 |
411 protected: | 406 protected: |
412 enum { N = SkBENCHLOOP(30000) }; | |
413 | |
414 virtual const char* onGetName() SK_OVERRIDE { | 407 virtual const char* onGetName() SK_OVERRIDE { |
415 return fInPlace ? "path_transform_in_place" : "path_transform_copy"; | 408 return fInPlace ? "path_transform_in_place" : "path_transform_copy"; |
416 } | 409 } |
417 | 410 |
418 virtual void onPreDraw() SK_OVERRIDE { | 411 virtual void onPreDraw() SK_OVERRIDE { |
419 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); | 412 fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); |
420 this->createData(10, 100); | 413 this->createData(10, 100); |
421 fPaths.reset(kPathCnt); | 414 fPaths.reset(kPathCnt); |
422 for (int i = 0; i < kPathCnt; ++i) { | 415 for (int i = 0; i < kPathCnt; ++i) { |
423 this->makePath(&fPaths[i]); | 416 this->makePath(&fPaths[i]); |
424 } | 417 } |
425 this->finishedMakingPaths(); | 418 this->finishedMakingPaths(); |
426 if (!fInPlace) { | 419 if (!fInPlace) { |
427 fTransformed.reset(kPathCnt); | 420 fTransformed.reset(kPathCnt); |
428 } | 421 } |
429 } | 422 } |
430 | 423 |
431 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 424 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
432 if (fInPlace) { | 425 if (fInPlace) { |
433 for (int i = 0; i < N; ++i) { | 426 for (int i = 0; i < this->getLoops(); ++i) { |
434 fPaths[i & (kPathCnt - 1)].transform(fMatrix); | 427 fPaths[i & (kPathCnt - 1)].transform(fMatrix); |
435 } | 428 } |
436 } else { | 429 } else { |
437 for (int i = 0; i < N; ++i) { | 430 for (int i = 0; i < this->getLoops(); ++i) { |
438 int idx = i & (kPathCnt - 1); | 431 int idx = i & (kPathCnt - 1); |
439 fPaths[idx].transform(fMatrix, &fTransformed[idx]); | 432 fPaths[idx].transform(fMatrix, &fTransformed[idx]); |
440 } | 433 } |
441 } | 434 } |
442 } | 435 } |
443 | 436 |
444 virtual void onPostDraw() SK_OVERRIDE { | 437 virtual void onPostDraw() SK_OVERRIDE { |
445 fPaths.reset(0); | 438 fPaths.reset(0); |
446 fTransformed.reset(0); | 439 fTransformed.reset(0); |
447 } | 440 } |
(...skipping 11 matching lines...) Expand all Loading... |
459 typedef RandomPathBench INHERITED; | 452 typedef RandomPathBench INHERITED; |
460 }; | 453 }; |
461 | 454 |
462 class PathEqualityBench : public RandomPathBench { | 455 class PathEqualityBench : public RandomPathBench { |
463 public: | 456 public: |
464 PathEqualityBench(void* param) | 457 PathEqualityBench(void* param) |
465 : INHERITED(param) { | 458 : INHERITED(param) { |
466 } | 459 } |
467 | 460 |
468 protected: | 461 protected: |
469 enum { N = SkBENCHLOOP(40000) }; | |
470 | |
471 virtual const char* onGetName() SK_OVERRIDE { | 462 virtual const char* onGetName() SK_OVERRIDE { |
472 return "path_equality_50%"; | 463 return "path_equality_50%"; |
473 } | 464 } |
474 | 465 |
475 virtual void onPreDraw() SK_OVERRIDE { | 466 virtual void onPreDraw() SK_OVERRIDE { |
476 fParity = 0; | 467 fParity = 0; |
477 this->createData(10, 100); | 468 this->createData(10, 100); |
478 fPaths.reset(kPathCnt); | 469 fPaths.reset(kPathCnt); |
479 fCopies.reset(kPathCnt); | 470 fCopies.reset(kPathCnt); |
480 for (int i = 0; i < kPathCnt; ++i) { | 471 for (int i = 0; i < kPathCnt; ++i) { |
481 this->makePath(&fPaths[i]); | 472 this->makePath(&fPaths[i]); |
482 fCopies[i] = fPaths[i]; | 473 fCopies[i] = fPaths[i]; |
483 } | 474 } |
484 this->finishedMakingPaths(); | 475 this->finishedMakingPaths(); |
485 } | 476 } |
486 | 477 |
487 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 478 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
488 for (int i = 0; i < N; ++i) { | 479 for (int i = 0; i < this->getLoops(); ++i) { |
489 int idx = i & (kPathCnt - 1); | 480 int idx = i & (kPathCnt - 1); |
490 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); | 481 fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); |
491 } | 482 } |
492 } | 483 } |
493 | 484 |
494 virtual void onPostDraw() SK_OVERRIDE { | 485 virtual void onPostDraw() SK_OVERRIDE { |
495 fPaths.reset(0); | 486 fPaths.reset(0); |
496 fCopies.reset(0); | 487 fCopies.reset(0); |
497 } | 488 } |
498 | 489 |
(...skipping 19 matching lines...) Expand all Loading... |
518 kReversePathTo_AddType, | 509 kReversePathTo_AddType, |
519 }; | 510 }; |
520 | 511 |
521 SkBench_AddPathTest(AddType type, void* param) | 512 SkBench_AddPathTest(AddType type, void* param) |
522 : INHERITED(param) | 513 : INHERITED(param) |
523 , fType(type) { | 514 , fType(type) { |
524 fMatrix.setRotate(60 * SK_Scalar1); | 515 fMatrix.setRotate(60 * SK_Scalar1); |
525 } | 516 } |
526 | 517 |
527 protected: | 518 protected: |
528 enum { N = SkBENCHLOOP(15000) }; | |
529 | |
530 virtual const char* onGetName() SK_OVERRIDE { | 519 virtual const char* onGetName() SK_OVERRIDE { |
531 switch (fType) { | 520 switch (fType) { |
532 case kAdd_AddType: | 521 case kAdd_AddType: |
533 return "path_add_path"; | 522 return "path_add_path"; |
534 case kAddTrans_AddType: | 523 case kAddTrans_AddType: |
535 return "path_add_path_trans"; | 524 return "path_add_path_trans"; |
536 case kAddMatrix_AddType: | 525 case kAddMatrix_AddType: |
537 return "path_add_path_matrix"; | 526 return "path_add_path_matrix"; |
538 case kPathTo_AddType: | 527 case kPathTo_AddType: |
539 return "path_path_to"; | 528 return "path_path_to"; |
(...skipping 17 matching lines...) Expand all Loading... |
557 for (int i = 0; i < kPathCnt; ++i) { | 546 for (int i = 0; i < kPathCnt; ++i) { |
558 this->makePath(&fPaths0[i]); | 547 this->makePath(&fPaths0[i]); |
559 this->makePath(&fPaths1[i]); | 548 this->makePath(&fPaths1[i]); |
560 } | 549 } |
561 this->finishedMakingPaths(); | 550 this->finishedMakingPaths(); |
562 } | 551 } |
563 | 552 |
564 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 553 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
565 switch (fType) { | 554 switch (fType) { |
566 case kAdd_AddType: | 555 case kAdd_AddType: |
567 for (int i = 0; i < N; ++i) { | 556 for (int i = 0; i < this->getLoops(); ++i) { |
568 int idx = i & (kPathCnt - 1); | 557 int idx = i & (kPathCnt - 1); |
569 SkPath result = fPaths0[idx]; | 558 SkPath result = fPaths0[idx]; |
570 result.addPath(fPaths1[idx]); | 559 result.addPath(fPaths1[idx]); |
571 } | 560 } |
572 break; | 561 break; |
573 case kAddTrans_AddType: | 562 case kAddTrans_AddType: |
574 for (int i = 0; i < N; ++i) { | 563 for (int i = 0; i < this->getLoops(); ++i) { |
575 int idx = i & (kPathCnt - 1); | 564 int idx = i & (kPathCnt - 1); |
576 SkPath result = fPaths0[idx]; | 565 SkPath result = fPaths0[idx]; |
577 result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1)
; | 566 result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1)
; |
578 } | 567 } |
579 break; | 568 break; |
580 case kAddMatrix_AddType: | 569 case kAddMatrix_AddType: |
581 for (int i = 0; i < N; ++i) { | 570 for (int i = 0; i < this->getLoops(); ++i) { |
582 int idx = i & (kPathCnt - 1); | 571 int idx = i & (kPathCnt - 1); |
583 SkPath result = fPaths0[idx]; | 572 SkPath result = fPaths0[idx]; |
584 result.addPath(fPaths1[idx], fMatrix); | 573 result.addPath(fPaths1[idx], fMatrix); |
585 } | 574 } |
586 break; | 575 break; |
587 case kPathTo_AddType: | 576 case kPathTo_AddType: |
588 for (int i = 0; i < N; ++i) { | 577 for (int i = 0; i < this->getLoops(); ++i) { |
589 int idx = i & (kPathCnt - 1); | 578 int idx = i & (kPathCnt - 1); |
590 SkPath result = fPaths0[idx]; | 579 SkPath result = fPaths0[idx]; |
591 result.pathTo(fPaths1[idx]); | 580 result.pathTo(fPaths1[idx]); |
592 } | 581 } |
593 break; | 582 break; |
594 case kReverseAdd_AddType: | 583 case kReverseAdd_AddType: |
595 for (int i = 0; i < N; ++i) { | 584 for (int i = 0; i < this->getLoops(); ++i) { |
596 int idx = i & (kPathCnt - 1); | 585 int idx = i & (kPathCnt - 1); |
597 SkPath result = fPaths0[idx]; | 586 SkPath result = fPaths0[idx]; |
598 result.reverseAddPath(fPaths1[idx]); | 587 result.reverseAddPath(fPaths1[idx]); |
599 } | 588 } |
600 break; | 589 break; |
601 case kReversePathTo_AddType: | 590 case kReversePathTo_AddType: |
602 for (int i = 0; i < N; ++i) { | 591 for (int i = 0; i < this->getLoops(); ++i) { |
603 int idx = i & (kPathCnt - 1); | 592 int idx = i & (kPathCnt - 1); |
604 SkPath result = fPaths0[idx]; | 593 SkPath result = fPaths0[idx]; |
605 result.reversePathTo(fPaths1[idx]); | 594 result.reversePathTo(fPaths1[idx]); |
606 } | 595 } |
607 break; | 596 break; |
608 } | 597 } |
609 } | 598 } |
610 | 599 |
611 virtual void onPostDraw() SK_OVERRIDE { | 600 virtual void onPostDraw() SK_OVERRIDE { |
612 fPaths0.reset(0); | 601 fPaths0.reset(0); |
(...skipping 11 matching lines...) Expand all Loading... |
624 SkMatrix fMatrix; | 613 SkMatrix fMatrix; |
625 typedef RandomPathBench INHERITED; | 614 typedef RandomPathBench INHERITED; |
626 }; | 615 }; |
627 | 616 |
628 | 617 |
629 class CirclesBench : public SkBenchmark { | 618 class CirclesBench : public SkBenchmark { |
630 protected: | 619 protected: |
631 SkString fName; | 620 SkString fName; |
632 Flags fFlags; | 621 Flags fFlags; |
633 | 622 |
634 enum { | |
635 N = SkBENCHLOOP(100) | |
636 }; | |
637 public: | 623 public: |
638 CirclesBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { | 624 CirclesBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { |
639 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); | 625 fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); |
640 } | 626 } |
641 | 627 |
642 protected: | 628 protected: |
643 virtual const char* onGetName() SK_OVERRIDE { | 629 virtual const char* onGetName() SK_OVERRIDE { |
644 return fName.c_str(); | 630 return fName.c_str(); |
645 } | 631 } |
646 | 632 |
647 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 633 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
648 SkPaint paint; | 634 SkPaint paint; |
649 | 635 |
650 paint.setColor(SK_ColorBLACK); | 636 paint.setColor(SK_ColorBLACK); |
651 paint.setAntiAlias(true); | 637 paint.setAntiAlias(true); |
652 if (fFlags & kStroke_Flag) { | 638 if (fFlags & kStroke_Flag) { |
653 paint.setStyle(SkPaint::kStroke_Style); | 639 paint.setStyle(SkPaint::kStroke_Style); |
654 } | 640 } |
655 | 641 |
656 SkRandom rand; | 642 SkRandom rand; |
657 | 643 |
658 SkRect r; | 644 SkRect r; |
659 | 645 |
660 for (int i = 0; i < 5000; ++i) { | 646 for (int i = 0; i < this->getLoops(); ++i) { |
661 SkScalar radius = rand.nextUScalar1() * 3; | 647 SkScalar radius = rand.nextUScalar1() * 3; |
662 r.fLeft = rand.nextUScalar1() * 300; | 648 r.fLeft = rand.nextUScalar1() * 300; |
663 r.fTop = rand.nextUScalar1() * 300; | 649 r.fTop = rand.nextUScalar1() * 300; |
664 r.fRight = r.fLeft + 2 * radius; | 650 r.fRight = r.fLeft + 2 * radius; |
665 r.fBottom = r.fTop + 2 * radius; | 651 r.fBottom = r.fTop + 2 * radius; |
666 | 652 |
667 if (fFlags & kStroke_Flag) { | 653 if (fFlags & kStroke_Flag) { |
668 paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); | 654 paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); |
669 } | 655 } |
670 | 656 |
(...skipping 16 matching lines...) Expand all Loading... |
687 | 673 |
688 // Chrome creates its own round rects with each corner possibly being different. | 674 // Chrome creates its own round rects with each corner possibly being different. |
689 // In its "zero radius" incarnation it creates degenerate round rects. | 675 // In its "zero radius" incarnation it creates degenerate round rects. |
690 // Note: PathTest::test_arb_round_rect_is_convex and | 676 // Note: PathTest::test_arb_round_rect_is_convex and |
691 // test_arb_zero_rad_round_rect_is_rect perform almost exactly | 677 // test_arb_zero_rad_round_rect_is_rect perform almost exactly |
692 // the same test (but with no drawing) | 678 // the same test (but with no drawing) |
693 class ArbRoundRectBench : public SkBenchmark { | 679 class ArbRoundRectBench : public SkBenchmark { |
694 protected: | 680 protected: |
695 SkString fName; | 681 SkString fName; |
696 | 682 |
697 enum { | |
698 N = SkBENCHLOOP(100) | |
699 }; | |
700 public: | 683 public: |
701 ArbRoundRectBench(void* param, bool zeroRad) : INHERITED(param), fZeroRad(ze
roRad) { | 684 ArbRoundRectBench(void* param, bool zeroRad) : INHERITED(param), fZeroRad(ze
roRad) { |
702 if (zeroRad) { | 685 if (zeroRad) { |
703 fName.printf("zeroradroundrect"); | 686 fName.printf("zeroradroundrect"); |
704 } else { | 687 } else { |
705 fName.printf("arbroundrect"); | 688 fName.printf("arbroundrect"); |
706 } | 689 } |
707 } | 690 } |
708 | 691 |
709 protected: | 692 protected: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 add_corner_arc(path, r, xCorner, yCorner, 180); | 733 add_corner_arc(path, r, xCorner, yCorner, 180); |
751 path->close(); | 734 path->close(); |
752 | 735 |
753 SkASSERT(path->isConvex()); | 736 SkASSERT(path->isConvex()); |
754 } | 737 } |
755 | 738 |
756 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 739 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
757 SkRandom rand; | 740 SkRandom rand; |
758 SkRect r; | 741 SkRect r; |
759 | 742 |
760 for (int i = 0; i < 5000; ++i) { | 743 for (int i = 0; i < this->getLoops(); ++i) { |
761 SkPaint paint; | 744 SkPaint paint; |
762 paint.setColor(0xff000000 | rand.nextU()); | 745 paint.setColor(0xff000000 | rand.nextU()); |
763 paint.setAntiAlias(true); | 746 paint.setAntiAlias(true); |
764 | 747 |
765 SkScalar size = rand.nextUScalar1() * 30; | 748 SkScalar size = rand.nextUScalar1() * 30; |
766 if (size < SK_Scalar1) { | 749 if (size < SK_Scalar1) { |
767 continue; | 750 continue; |
768 } | 751 } |
769 r.fLeft = rand.nextUScalar1() * 300; | 752 r.fLeft = rand.nextUScalar1() * 300; |
770 r.fTop = rand.nextUScalar1() * 300; | 753 r.fTop = rand.nextUScalar1() * 300; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 break; | 801 break; |
819 } | 802 } |
820 } | 803 } |
821 | 804 |
822 private: | 805 private: |
823 virtual const char* onGetName() SK_OVERRIDE { | 806 virtual const char* onGetName() SK_OVERRIDE { |
824 return fName.c_str(); | 807 return fName.c_str(); |
825 } | 808 } |
826 | 809 |
827 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 810 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
828 for (int i = 0; i < N; ++i) { | 811 for (int i = 0; i < this->getLoops(); ++i) { |
829 const SkRect& rect = fQueryRects[i % kQueryRectCnt]; | 812 const SkRect& rect = fQueryRects[i % kQueryRectCnt]; |
830 fParity = fParity != fPath.conservativelyContainsRect(rect); | 813 fParity = fParity != fPath.conservativelyContainsRect(rect); |
831 } | 814 } |
832 } | 815 } |
833 | 816 |
834 virtual void onPreDraw() SK_OVERRIDE { | 817 virtual void onPreDraw() SK_OVERRIDE { |
835 fQueryRects.setCount(kQueryRectCnt); | 818 fQueryRects.setCount(kQueryRectCnt); |
836 | 819 |
837 SkRandom rand; | 820 SkRandom rand; |
838 for (int i = 0; i < kQueryRectCnt; ++i) { | 821 for (int i = 0; i < kQueryRectCnt; ++i) { |
839 SkSize size; | 822 SkSize size; |
840 SkPoint xy; | 823 SkPoint xy; |
841 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWid
th); | 824 size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWid
th); |
842 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHe
ight); | 825 size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHe
ight); |
843 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fW
idth); | 826 xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fW
idth); |
844 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fH
eight); | 827 xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fH
eight); |
845 | 828 |
846 fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fH
eight); | 829 fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fH
eight); |
847 } | 830 } |
848 } | 831 } |
849 | 832 |
850 virtual void onPostDraw() SK_OVERRIDE { | 833 virtual void onPostDraw() SK_OVERRIDE { |
851 fQueryRects.setCount(0); | 834 fQueryRects.setCount(0); |
852 } | 835 } |
853 | 836 |
854 enum { | 837 enum { |
855 N = SkBENCHLOOP(100000), | |
856 kQueryRectCnt = 400, | 838 kQueryRectCnt = 400, |
857 }; | 839 }; |
858 static const SkRect kBounds; // bounds for all random query rects | 840 static const SkRect kBounds; // bounds for all random query rects |
859 static const SkSize kQueryMin; // minimum query rect size, should be <= kQue
ryMax | 841 static const SkSize kQueryMin; // minimum query rect size, should be <= kQue
ryMax |
860 static const SkSize kQueryMax; // max query rect size, should < kBounds | 842 static const SkSize kQueryMax; // max query rect size, should < kBounds |
861 static const SkRect kBaseRect; // rect that is used to construct the path | 843 static const SkRect kBaseRect; // rect that is used to construct the path |
862 static const SkScalar kRRRadii[2]; // x and y radii for round rect | 844 static const SkScalar kRRRadii[2]; // x and y radii for round rect |
863 | 845 |
864 SkString fName; | 846 SkString fName; |
865 SkPath fPath; | 847 SkPath fPath; |
866 bool fParity; | 848 bool fParity; |
867 SkTDArray<SkRect> fQueryRects; | 849 SkTDArray<SkRect> fQueryRects; |
868 | 850 |
869 typedef SkBenchmark INHERITED; | 851 typedef SkBenchmark INHERITED; |
870 }; | 852 }; |
871 | 853 |
872 /////////////////////////////////////////////////////////////////////////////// | 854 /////////////////////////////////////////////////////////////////////////////// |
873 | 855 |
874 #include "SkGeometry.h" | 856 #include "SkGeometry.h" |
875 | 857 |
876 class ConicBench_Chop5 : public SkBenchmark { | 858 class ConicBench_Chop5 : public SkBenchmark { |
877 enum { | |
878 N = 100000 | |
879 }; | |
880 SkConic fRQ; | 859 SkConic fRQ; |
881 public: | 860 public: |
882 ConicBench_Chop5(void* param) : INHERITED(param) { | 861 ConicBench_Chop5(void* param) : INHERITED(param) { |
883 fRQ.fPts[0].set(0, 0); | 862 fRQ.fPts[0].set(0, 0); |
884 fRQ.fPts[1].set(100, 0); | 863 fRQ.fPts[1].set(100, 0); |
885 fRQ.fPts[2].set(100, 100); | 864 fRQ.fPts[2].set(100, 100); |
886 fRQ.fW = SkScalarCos(SK_ScalarPI/4); | 865 fRQ.fW = SkScalarCos(SK_ScalarPI/4); |
887 } | 866 } |
888 | 867 |
889 private: | 868 private: |
890 virtual const char* onGetName() SK_OVERRIDE { | 869 virtual const char* onGetName() SK_OVERRIDE { |
891 return "ratquad-chop-0.5"; | 870 return "ratquad-chop-0.5"; |
892 } | 871 } |
893 | 872 |
894 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 873 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
895 SkConic dst[2]; | 874 SkConic dst[2]; |
896 for (int i = 0; i < N; ++i) { | 875 for (int i = 0; i < this->getLoops(); ++i) { |
897 fRQ.chopAt(0.5f, dst); | 876 fRQ.chopAt(0.5f, dst); |
898 } | 877 } |
899 } | 878 } |
900 | 879 |
901 typedef SkBenchmark INHERITED; | 880 typedef SkBenchmark INHERITED; |
902 }; | 881 }; |
903 | 882 |
904 class ConicBench_ChopHalf : public SkBenchmark { | 883 class ConicBench_ChopHalf : public SkBenchmark { |
905 enum { | |
906 N = 100000 | |
907 }; | |
908 SkConic fRQ; | 884 SkConic fRQ; |
909 public: | 885 public: |
910 ConicBench_ChopHalf(void* param) : INHERITED(param) { | 886 ConicBench_ChopHalf(void* param) : INHERITED(param) { |
911 fRQ.fPts[0].set(0, 0); | 887 fRQ.fPts[0].set(0, 0); |
912 fRQ.fPts[1].set(100, 0); | 888 fRQ.fPts[1].set(100, 0); |
913 fRQ.fPts[2].set(100, 100); | 889 fRQ.fPts[2].set(100, 100); |
914 fRQ.fW = SkScalarCos(SK_ScalarPI/4); | 890 fRQ.fW = SkScalarCos(SK_ScalarPI/4); |
915 } | 891 } |
916 | 892 |
917 private: | 893 private: |
918 virtual const char* onGetName() SK_OVERRIDE { | 894 virtual const char* onGetName() SK_OVERRIDE { |
919 return "ratquad-chop-half"; | 895 return "ratquad-chop-half"; |
920 } | 896 } |
921 | 897 |
922 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 898 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
923 SkConic dst[2]; | 899 SkConic dst[2]; |
924 for (int i = 0; i < N; ++i) { | 900 for (int i = 0; i < this->getLoops(); ++i) { |
925 fRQ.chop(dst); | 901 fRQ.chop(dst); |
926 } | 902 } |
927 } | 903 } |
928 | 904 |
929 typedef SkBenchmark INHERITED; | 905 typedef SkBenchmark INHERITED; |
930 }; | 906 }; |
931 | 907 |
932 /////////////////////////////////////////////////////////////////////////////// | 908 /////////////////////////////////////////////////////////////////////////////// |
933 | 909 |
934 static void rand_conic(SkConic* conic, SkRandom& rand) { | 910 static void rand_conic(SkConic* conic, SkRandom& rand) { |
(...skipping 12 matching lines...) Expand all Loading... |
947 ConicBench(void* param) : INHERITED(param) { | 923 ConicBench(void* param) : INHERITED(param) { |
948 SkRandom rand; | 924 SkRandom rand; |
949 for (int i = 0; i < CONICS; ++i) { | 925 for (int i = 0; i < CONICS; ++i) { |
950 rand_conic(&fConics[i], rand); | 926 rand_conic(&fConics[i], rand); |
951 } | 927 } |
952 fIsRendering = false; | 928 fIsRendering = false; |
953 } | 929 } |
954 | 930 |
955 protected: | 931 protected: |
956 enum { | 932 enum { |
957 N = 20000, | |
958 CONICS = 100 | 933 CONICS = 100 |
959 }; | 934 }; |
960 SkConic fConics[CONICS]; | 935 SkConic fConics[CONICS]; |
961 | 936 |
962 private: | 937 private: |
963 typedef SkBenchmark INHERITED; | 938 typedef SkBenchmark INHERITED; |
964 }; | 939 }; |
965 | 940 |
966 class ConicBench_ComputeError : public ConicBench { | 941 class ConicBench_ComputeError : public ConicBench { |
967 public: | 942 public: |
968 ConicBench_ComputeError(void* param) : INHERITED(param) {} | 943 ConicBench_ComputeError(void* param) : INHERITED(param) {} |
969 | 944 |
970 protected: | 945 protected: |
971 virtual const char* onGetName() SK_OVERRIDE { | 946 virtual const char* onGetName() SK_OVERRIDE { |
972 return "conic-compute-error"; | 947 return "conic-compute-error"; |
973 } | 948 } |
974 | 949 |
975 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 950 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
976 SkVector err; | 951 SkVector err; |
977 for (int i = 0; i < N; ++i) { | 952 for (int i = 0; i < this->getLoops(); ++i) { |
978 for (int j = 0; j < CONICS; ++j) { | 953 for (int j = 0; j < CONICS; ++j) { |
979 fConics[j].computeAsQuadError(&err); | 954 fConics[j].computeAsQuadError(&err); |
980 } | 955 } |
981 } | 956 } |
982 } | 957 } |
983 | 958 |
984 private: | 959 private: |
985 typedef ConicBench INHERITED; | 960 typedef ConicBench INHERITED; |
986 }; | 961 }; |
987 | 962 |
988 class ConicBench_asQuadTol : public ConicBench { | 963 class ConicBench_asQuadTol : public ConicBench { |
989 public: | 964 public: |
990 ConicBench_asQuadTol(void* param) : INHERITED(param) {} | 965 ConicBench_asQuadTol(void* param) : INHERITED(param) {} |
991 | 966 |
992 protected: | 967 protected: |
993 virtual const char* onGetName() SK_OVERRIDE { | 968 virtual const char* onGetName() SK_OVERRIDE { |
994 return "conic-asQuadTol"; | 969 return "conic-asQuadTol"; |
995 } | 970 } |
996 | 971 |
997 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 972 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
998 for (int i = 0; i < N; ++i) { | 973 for (int i = 0; i < this->getLoops(); ++i) { |
999 for (int j = 0; j < CONICS; ++j) { | 974 for (int j = 0; j < CONICS; ++j) { |
1000 fConics[j].asQuadTol(SK_ScalarHalf); | 975 fConics[j].asQuadTol(SK_ScalarHalf); |
1001 } | 976 } |
1002 } | 977 } |
1003 } | 978 } |
1004 | 979 |
1005 private: | 980 private: |
1006 typedef ConicBench INHERITED; | 981 typedef ConicBench INHERITED; |
1007 }; | 982 }; |
1008 | 983 |
1009 class ConicBench_quadPow2 : public ConicBench { | 984 class ConicBench_quadPow2 : public ConicBench { |
1010 public: | 985 public: |
1011 ConicBench_quadPow2(void* param) : INHERITED(param) {} | 986 ConicBench_quadPow2(void* param) : INHERITED(param) {} |
1012 | 987 |
1013 protected: | 988 protected: |
1014 virtual const char* onGetName() SK_OVERRIDE { | 989 virtual const char* onGetName() SK_OVERRIDE { |
1015 return "conic-quadPow2"; | 990 return "conic-quadPow2"; |
1016 } | 991 } |
1017 | 992 |
1018 virtual void onDraw(SkCanvas*) SK_OVERRIDE { | 993 virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
1019 for (int i = 0; i < N; ++i) { | 994 for (int i = 0; i < this->getLoops(); ++i) { |
1020 for (int j = 0; j < CONICS; ++j) { | 995 for (int j = 0; j < CONICS; ++j) { |
1021 fConics[j].computeQuadPOW2(SK_ScalarHalf); | 996 fConics[j].computeQuadPOW2(SK_ScalarHalf); |
1022 } | 997 } |
1023 } | 998 } |
1024 } | 999 } |
1025 | 1000 |
1026 private: | 1001 private: |
1027 typedef ConicBench INHERITED; | 1002 typedef ConicBench INHERITED; |
1028 }; | 1003 }; |
1029 | 1004 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 DEF_BENCH( return new ArbRoundRectBench(p, true); ) | 1057 DEF_BENCH( return new ArbRoundRectBench(p, true); ) |
1083 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kRect_Type); ) | 1058 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kRect_Type); ) |
1084 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kRoundRect_Type); ) | 1059 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kRoundRect_Type); ) |
1085 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kOval_Type); ) | 1060 DEF_BENCH( return new ConservativelyContainsBench(p, ConservativelyContainsBench
::kOval_Type); ) |
1086 | 1061 |
1087 DEF_BENCH( return new ConicBench_Chop5(p) ) | 1062 DEF_BENCH( return new ConicBench_Chop5(p) ) |
1088 DEF_BENCH( return new ConicBench_ChopHalf(p) ) | 1063 DEF_BENCH( return new ConicBench_ChopHalf(p) ) |
1089 DEF_BENCH( return new ConicBench_ComputeError(p) ) | 1064 DEF_BENCH( return new ConicBench_ComputeError(p) ) |
1090 DEF_BENCH( return new ConicBench_asQuadTol(p) ) | 1065 DEF_BENCH( return new ConicBench_asQuadTol(p) ) |
1091 DEF_BENCH( return new ConicBench_quadPow2(p) ) | 1066 DEF_BENCH( return new ConicBench_quadPow2(p) ) |
OLD | NEW |