OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBlurImageFilter.h" | 8 #include "SkBlurImageFilter.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 if (!found) { | 570 if (!found) { |
571 SkData* data = SkPictureUtils::GatherPixelRefs(pic, r); | 571 SkData* data = SkPictureUtils::GatherPixelRefs(pic, r); |
572 size_t dataSize = data ? data->size() : 0; | 572 size_t dataSize = data ? data->size() : 0; |
573 } | 573 } |
574 #endif | 574 #endif |
575 } | 575 } |
576 } | 576 } |
577 } | 577 } |
578 } | 578 } |
579 | 579 |
| 580 #define GENERATE_CANVAS(recorder, x) \ |
| 581 (x) ? recorder.EXPERIMENTAL_beginRecording(100, 100) \ |
| 582 : recorder.beginRecording(100,100); |
| 583 |
| 584 /* Hit a few SkPicture::Analysis cases not handled elsewhere. */ |
| 585 static void test_analysis(skiatest::Reporter* reporter, bool useNewPath) { |
| 586 SkPictureRecorder recorder; |
| 587 |
| 588 SkCanvas* canvas = GENERATE_CANVAS(recorder, useNewPath); |
| 589 { |
| 590 canvas->drawRect(SkRect::MakeWH(10, 10), SkPaint ()); |
| 591 } |
| 592 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
| 593 REPORTER_ASSERT(reporter, !picture->willPlayBackBitmaps()); |
| 594 |
| 595 canvas = GENERATE_CANVAS(recorder, useNewPath); |
| 596 { |
| 597 SkPaint paint; |
| 598 // CreateBitmapShader is too smart for us; an empty (or 1x1) bitmap shad
er |
| 599 // gets optimized into a non-bitmap form, so we create a 2x2 bitmap here
. |
| 600 SkBitmap bitmap; |
| 601 bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2)); |
| 602 bitmap.eraseColor(SK_ColorBLUE); |
| 603 *(bitmap.getAddr32(0, 0)) = SK_ColorGREEN; |
| 604 SkShader* shader = SkShader::CreateBitmapShader(bitmap, SkShader::kClamp
_TileMode, |
| 605 SkShader::kClamp_TileMod
e); |
| 606 paint.setShader(shader)->unref(); |
| 607 REPORTER_ASSERT(reporter, |
| 608 shader->asABitmap(NULL, NULL, NULL) == SkShader::kDefaul
t_BitmapType); |
| 609 |
| 610 canvas->drawRect(SkRect::MakeWH(10, 10), paint); |
| 611 } |
| 612 picture.reset(recorder.endRecording()); |
| 613 REPORTER_ASSERT(reporter, picture->willPlayBackBitmaps()); |
| 614 } |
| 615 |
| 616 #undef GENERATE_CANVAS |
| 617 |
580 static void test_gatherpixelrefsandrects(skiatest::Reporter* reporter) { | 618 static void test_gatherpixelrefsandrects(skiatest::Reporter* reporter) { |
581 const int IW = 32; | 619 const int IW = 32; |
582 const int IH = IW; | 620 const int IH = IW; |
583 const SkScalar W = SkIntToScalar(IW); | 621 const SkScalar W = SkIntToScalar(IW); |
584 const SkScalar H = W; | 622 const SkScalar H = W; |
585 | 623 |
586 static const int N = 4; | 624 static const int N = 4; |
587 SkBitmap bm[2*N]; | 625 SkBitmap bm[2*N]; |
588 SkPixelRef* refs[2*N]; | 626 SkPixelRef* refs[2*N]; |
589 SkTDArray<SkPixelRef*> analytic[N]; | 627 SkTDArray<SkPixelRef*> analytic[N]; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 } else if (unit <= 0.9) { | 736 } else if (unit <= 0.9) { |
699 // SkDebugf("clip\n"); | 737 // SkDebugf("clip\n"); |
700 canvas->clipRect(rect); | 738 canvas->clipRect(rect); |
701 } else { | 739 } else { |
702 // SkDebugf("draw\n"); | 740 // SkDebugf("draw\n"); |
703 canvas->drawPaint(paint); | 741 canvas->drawPaint(paint); |
704 } | 742 } |
705 } | 743 } |
706 | 744 |
707 #if SK_SUPPORT_GPU | 745 #if SK_SUPPORT_GPU |
708 static void test_gpu_veto(skiatest::Reporter* reporter) { | 746 #define GENERATE_CANVAS(recorder, x) \ |
| 747 (x) ? recorder.EXPERIMENTAL_beginRecording(100, 100) \ |
| 748 : recorder.beginRecording(100,100); |
| 749 |
| 750 static void test_gpu_veto(skiatest::Reporter* reporter, |
| 751 bool useNewPath) { |
709 | 752 |
710 SkPictureRecorder recorder; | 753 SkPictureRecorder recorder; |
711 | 754 |
712 SkCanvas* canvas = recorder.beginRecording(100, 100); | 755 SkCanvas* canvas = GENERATE_CANVAS(recorder, useNewPath); |
713 { | 756 { |
714 SkPath path; | 757 SkPath path; |
715 path.moveTo(0, 0); | 758 path.moveTo(0, 0); |
716 path.lineTo(50, 50); | 759 path.lineTo(50, 50); |
717 | 760 |
718 SkScalar intervals[] = { 1.0f, 1.0f }; | 761 SkScalar intervals[] = { 1.0f, 1.0f }; |
719 SkAutoTUnref<SkDashPathEffect> dash(SkDashPathEffect::Create(intervals,
2, 0)); | 762 SkAutoTUnref<SkDashPathEffect> dash(SkDashPathEffect::Create(intervals,
2, 0)); |
720 | 763 |
721 SkPaint paint; | 764 SkPaint paint; |
722 paint.setStyle(SkPaint::kStroke_Style); | 765 paint.setStyle(SkPaint::kStroke_Style); |
723 paint.setPathEffect(dash); | 766 paint.setPathEffect(dash); |
724 | 767 |
725 canvas->drawPath(path, paint); | 768 canvas->drawPath(path, paint); |
726 } | 769 } |
727 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 770 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
728 // path effects currently render an SkPicture undesireable for GPU rendering | 771 // path effects currently render an SkPicture undesireable for GPU rendering |
729 | 772 |
730 const char *reason = NULL; | 773 const char *reason = NULL; |
731 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL, &reaso
n)); | 774 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL, &reaso
n)); |
732 REPORTER_ASSERT(reporter, NULL != reason); | 775 REPORTER_ASSERT(reporter, NULL != reason); |
733 | 776 |
734 canvas = recorder.beginRecording(100, 100); | 777 canvas = GENERATE_CANVAS(recorder, useNewPath); |
735 { | 778 { |
736 SkPath path; | 779 SkPath path; |
737 | 780 |
738 path.moveTo(0, 0); | 781 path.moveTo(0, 0); |
739 path.lineTo(0, 50); | 782 path.lineTo(0, 50); |
740 path.lineTo(25, 25); | 783 path.lineTo(25, 25); |
741 path.lineTo(50, 50); | 784 path.lineTo(50, 50); |
742 path.lineTo(50, 0); | 785 path.lineTo(50, 0); |
743 path.close(); | 786 path.close(); |
744 REPORTER_ASSERT(reporter, !path.isConvex()); | 787 REPORTER_ASSERT(reporter, !path.isConvex()); |
745 | 788 |
746 SkPaint paint; | 789 SkPaint paint; |
747 paint.setAntiAlias(true); | 790 paint.setAntiAlias(true); |
748 for (int i = 0; i < 50; ++i) { | 791 for (int i = 0; i < 50; ++i) { |
749 canvas->drawPath(path, paint); | 792 canvas->drawPath(path, paint); |
750 } | 793 } |
751 } | 794 } |
752 picture.reset(recorder.endRecording()); | 795 picture.reset(recorder.endRecording()); |
753 // A lot of AA concave paths currently render an SkPicture undesireable for
GPU rendering | 796 // A lot of AA concave paths currently render an SkPicture undesireable for
GPU rendering |
754 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); | 797 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); |
755 | 798 |
756 canvas = recorder.beginRecording(100, 100); | 799 canvas = GENERATE_CANVAS(recorder, useNewPath); |
757 { | 800 { |
758 SkPath path; | 801 SkPath path; |
759 | 802 |
760 path.moveTo(0, 0); | 803 path.moveTo(0, 0); |
761 path.lineTo(0, 50); | 804 path.lineTo(0, 50); |
762 path.lineTo(25, 25); | 805 path.lineTo(25, 25); |
763 path.lineTo(50, 50); | 806 path.lineTo(50, 50); |
764 path.lineTo(50, 0); | 807 path.lineTo(50, 0); |
765 path.close(); | 808 path.close(); |
766 REPORTER_ASSERT(reporter, !path.isConvex()); | 809 REPORTER_ASSERT(reporter, !path.isConvex()); |
767 | 810 |
768 SkPaint paint; | 811 SkPaint paint; |
769 paint.setAntiAlias(true); | 812 paint.setAntiAlias(true); |
770 paint.setStyle(SkPaint::kStroke_Style); | 813 paint.setStyle(SkPaint::kStroke_Style); |
771 paint.setStrokeWidth(0); | 814 paint.setStrokeWidth(0); |
772 for (int i = 0; i < 50; ++i) { | 815 for (int i = 0; i < 50; ++i) { |
773 canvas->drawPath(path, paint); | 816 canvas->drawPath(path, paint); |
774 } | 817 } |
775 } | 818 } |
776 picture.reset(recorder.endRecording()); | 819 picture.reset(recorder.endRecording()); |
777 // hairline stroked AA concave paths are fine for GPU rendering | 820 // hairline stroked AA concave paths are fine for GPU rendering |
778 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); | 821 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); |
| 822 |
| 823 canvas = GENERATE_CANVAS(recorder, useNewPath); |
| 824 { |
| 825 SkPaint paint; |
| 826 SkScalar intervals [] = { 10, 20 }; |
| 827 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); |
| 828 paint.setPathEffect(pe)->unref(); |
| 829 |
| 830 SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; |
| 831 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint); |
| 832 } |
| 833 picture.reset(recorder.endRecording()); |
| 834 // fast-path dashed effects are fine for GPU rendering ... |
| 835 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); |
| 836 |
| 837 canvas = GENERATE_CANVAS(recorder, useNewPath); |
| 838 { |
| 839 SkPaint paint; |
| 840 SkScalar intervals [] = { 10, 20 }; |
| 841 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); |
| 842 paint.setPathEffect(pe)->unref(); |
| 843 |
| 844 canvas->drawRect(SkRect::MakeWH(10, 10), paint); |
| 845 } |
| 846 picture.reset(recorder.endRecording()); |
| 847 // ... but only when applied to drawPoint() calls |
| 848 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); |
779 } | 849 } |
780 | 850 |
| 851 #undef GENERATE_CANVAS |
| 852 |
781 static void test_gpu_picture_optimization(skiatest::Reporter* reporter, | 853 static void test_gpu_picture_optimization(skiatest::Reporter* reporter, |
782 GrContextFactory* factory) { | 854 GrContextFactory* factory) { |
783 for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { | 855 for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { |
784 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; | 856 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; |
785 | 857 |
786 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { | 858 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
787 continue; | 859 continue; |
788 } | 860 } |
789 | 861 |
790 GrContext* context = factory->get(glCtxType); | 862 GrContext* context = factory->get(glCtxType); |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1552 DEF_TEST(Picture, reporter) { | 1624 DEF_TEST(Picture, reporter) { |
1553 #ifdef SK_DEBUG | 1625 #ifdef SK_DEBUG |
1554 test_deleting_empty_picture(); | 1626 test_deleting_empty_picture(); |
1555 test_serializing_empty_picture(); | 1627 test_serializing_empty_picture(); |
1556 #else | 1628 #else |
1557 test_bad_bitmap(); | 1629 test_bad_bitmap(); |
1558 #endif | 1630 #endif |
1559 test_unbalanced_save_restores(reporter); | 1631 test_unbalanced_save_restores(reporter); |
1560 test_peephole(); | 1632 test_peephole(); |
1561 #if SK_SUPPORT_GPU | 1633 #if SK_SUPPORT_GPU |
1562 test_gpu_veto(reporter); | 1634 test_gpu_veto(reporter, false); |
| 1635 test_gpu_veto(reporter, true); |
1563 #endif | 1636 #endif |
| 1637 test_analysis(reporter, false); |
| 1638 test_analysis(reporter, true); |
1564 test_gatherpixelrefs(reporter); | 1639 test_gatherpixelrefs(reporter); |
1565 test_gatherpixelrefsandrects(reporter); | 1640 test_gatherpixelrefsandrects(reporter); |
1566 test_bitmap_with_encoded_data(reporter); | 1641 test_bitmap_with_encoded_data(reporter); |
1567 test_draw_empty(reporter); | 1642 test_draw_empty(reporter); |
1568 test_clip_bound_opt(reporter); | 1643 test_clip_bound_opt(reporter); |
1569 test_clip_expansion(reporter); | 1644 test_clip_expansion(reporter); |
1570 test_hierarchical(reporter); | 1645 test_hierarchical(reporter); |
1571 test_gen_id(reporter); | 1646 test_gen_id(reporter); |
1572 } | 1647 } |
1573 | 1648 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 make_bm(&replayBM, 100, 100, SK_ColorBLACK, false); | 1726 make_bm(&replayBM, 100, 100, SK_ColorBLACK, false); |
1652 SkCanvas replayCanvas(replayBM); | 1727 SkCanvas replayCanvas(replayBM); |
1653 picture->draw(&replayCanvas); | 1728 picture->draw(&replayCanvas); |
1654 replayCanvas.flush(); | 1729 replayCanvas.flush(); |
1655 | 1730 |
1656 // With the bug present, at (55, 55) we would get a fully opaque red | 1731 // With the bug present, at (55, 55) we would get a fully opaque red |
1657 // intead of a dark red. | 1732 // intead of a dark red. |
1658 REPORTER_ASSERT(reporter, replayBM.getColor(30, 30) == 0xff000080); | 1733 REPORTER_ASSERT(reporter, replayBM.getColor(30, 30) == 0xff000080); |
1659 REPORTER_ASSERT(reporter, replayBM.getColor(55, 55) == 0xff800000); | 1734 REPORTER_ASSERT(reporter, replayBM.getColor(55, 55) == 0xff800000); |
1660 } | 1735 } |
OLD | NEW |