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 "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 *usedPixRefs->append() = bm.pixelRef(); | 296 *usedPixRefs->append() = bm.pixelRef(); |
297 } | 297 } |
298 | 298 |
299 // Return a picture with the bitmaps drawn at the specified positions. | 299 // Return a picture with the bitmaps drawn at the specified positions. |
300 static SkPicture* record_bitmaps(const SkBitmap bm[], | 300 static SkPicture* record_bitmaps(const SkBitmap bm[], |
301 const SkPoint pos[], | 301 const SkPoint pos[], |
302 SkTDArray<SkPixelRef*> analytic[], | 302 SkTDArray<SkPixelRef*> analytic[], |
303 int count, | 303 int count, |
304 DrawBitmapProc proc) { | 304 DrawBitmapProc proc) { |
305 SkPictureRecorder recorder; | 305 SkPictureRecorder recorder; |
306 SkCanvas* canvas = recorder.beginRecording(1000, 1000); | 306 SkCanvas* canvas = recorder.beginRecording(1000, 1000, NULL, 0); |
307 for (int i = 0; i < count; ++i) { | 307 for (int i = 0; i < count; ++i) { |
308 analytic[i].rewind(); | 308 analytic[i].rewind(); |
309 canvas->save(); | 309 canvas->save(); |
310 SkRect clipRect = SkRect::MakeXYWH(pos[i].fX, pos[i].fY, | 310 SkRect clipRect = SkRect::MakeXYWH(pos[i].fX, pos[i].fY, |
311 SkIntToScalar(bm[i].width()), | 311 SkIntToScalar(bm[i].width()), |
312 SkIntToScalar(bm[i].height())); | 312 SkIntToScalar(bm[i].height())); |
313 canvas->clipRect(clipRect, SkRegion::kIntersect_Op); | 313 canvas->clipRect(clipRect, SkRegion::kIntersect_Op); |
314 proc(canvas, bm[i], bm[count+i], pos[i], &analytic[i]); | 314 proc(canvas, bm[i], bm[count+i], pos[i], &analytic[i]); |
315 canvas->restore(); | 315 canvas->restore(); |
316 } | 316 } |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 } | 652 } |
653 } | 653 } |
654 } | 654 } |
655 | 655 |
656 #ifdef SK_DEBUG | 656 #ifdef SK_DEBUG |
657 // Ensure that deleting SkPicturePlayback does not assert. Asserts only fire in
debug mode, so only | 657 // Ensure that deleting SkPicturePlayback does not assert. Asserts only fire in
debug mode, so only |
658 // run in debug mode. | 658 // run in debug mode. |
659 static void test_deleting_empty_playback() { | 659 static void test_deleting_empty_playback() { |
660 SkPictureRecorder recorder; | 660 SkPictureRecorder recorder; |
661 // Creates an SkPictureRecord | 661 // Creates an SkPictureRecord |
662 recorder.beginRecording(0, 0); | 662 recorder.beginRecording(0, 0, NULL, 0); |
663 // Turns that into an SkPicturePlayback | 663 // Turns that into an SkPicturePlayback |
664 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 664 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
665 // Deletes the old SkPicturePlayback, and creates a new SkPictureRecord | 665 // Deletes the old SkPicturePlayback, and creates a new SkPictureRecord |
666 recorder.beginRecording(0, 0); | 666 recorder.beginRecording(0, 0, NULL, 0); |
667 } | 667 } |
668 | 668 |
669 // Ensure that serializing an empty picture does not assert. Likewise only runs
in debug mode. | 669 // Ensure that serializing an empty picture does not assert. Likewise only runs
in debug mode. |
670 static void test_serializing_empty_picture() { | 670 static void test_serializing_empty_picture() { |
671 SkPictureRecorder recorder; | 671 SkPictureRecorder recorder; |
672 recorder.beginRecording(0, 0); | 672 recorder.beginRecording(0, 0, NULL, 0); |
673 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 673 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
674 SkDynamicMemoryWStream stream; | 674 SkDynamicMemoryWStream stream; |
675 picture->serialize(&stream); | 675 picture->serialize(&stream); |
676 } | 676 } |
677 #endif | 677 #endif |
678 | 678 |
679 static void rand_op(SkCanvas* canvas, SkRandom& rand) { | 679 static void rand_op(SkCanvas* canvas, SkRandom& rand) { |
680 SkPaint paint; | 680 SkPaint paint; |
681 SkRect rect = SkRect::MakeWH(50, 50); | 681 SkRect rect = SkRect::MakeWH(50, 50); |
682 | 682 |
(...skipping 26 matching lines...) Expand all Loading... |
709 | 709 |
710 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); | 710 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); |
711 | 711 |
712 SkPaint paint; | 712 SkPaint paint; |
713 SkRect rect = SkRect::MakeLTRB(-10000000, -10000000, 10000000, 10000000); | 713 SkRect rect = SkRect::MakeLTRB(-10000000, -10000000, 10000000, 10000000); |
714 | 714 |
715 SkPictureRecorder recorder; | 715 SkPictureRecorder recorder; |
716 | 716 |
717 { | 717 { |
718 // Create picture with 2 unbalanced saves | 718 // Create picture with 2 unbalanced saves |
719 SkCanvas* canvas = recorder.beginRecording(100, 100); | 719 SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); |
720 canvas->save(); | 720 canvas->save(); |
721 canvas->translate(10, 10); | 721 canvas->translate(10, 10); |
722 canvas->drawRect(rect, paint); | 722 canvas->drawRect(rect, paint); |
723 canvas->save(); | 723 canvas->save(); |
724 canvas->translate(10, 10); | 724 canvas->translate(10, 10); |
725 canvas->drawRect(rect, paint); | 725 canvas->drawRect(rect, paint); |
726 SkAutoTUnref<SkPicture> extraSavePicture(recorder.endRecording()); | 726 SkAutoTUnref<SkPicture> extraSavePicture(recorder.endRecording()); |
727 | 727 |
728 testCanvas.drawPicture(*extraSavePicture); | 728 testCanvas.drawPicture(*extraSavePicture); |
729 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); | 729 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); |
730 } | 730 } |
731 | 731 |
732 set_canvas_to_save_count_4(&testCanvas); | 732 set_canvas_to_save_count_4(&testCanvas); |
733 | 733 |
734 { | 734 { |
735 // Create picture with 2 unbalanced restores | 735 // Create picture with 2 unbalanced restores |
736 SkCanvas* canvas = recorder.beginRecording(100, 100); | 736 SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); |
737 canvas->save(); | 737 canvas->save(); |
738 canvas->translate(10, 10); | 738 canvas->translate(10, 10); |
739 canvas->drawRect(rect, paint); | 739 canvas->drawRect(rect, paint); |
740 canvas->save(); | 740 canvas->save(); |
741 canvas->translate(10, 10); | 741 canvas->translate(10, 10); |
742 canvas->drawRect(rect, paint); | 742 canvas->drawRect(rect, paint); |
743 canvas->restore(); | 743 canvas->restore(); |
744 canvas->restore(); | 744 canvas->restore(); |
745 canvas->restore(); | 745 canvas->restore(); |
746 canvas->restore(); | 746 canvas->restore(); |
747 SkAutoTUnref<SkPicture> extraRestorePicture(recorder.endRecording()); | 747 SkAutoTUnref<SkPicture> extraRestorePicture(recorder.endRecording()); |
748 | 748 |
749 testCanvas.drawPicture(*extraRestorePicture); | 749 testCanvas.drawPicture(*extraRestorePicture); |
750 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); | 750 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); |
751 } | 751 } |
752 | 752 |
753 set_canvas_to_save_count_4(&testCanvas); | 753 set_canvas_to_save_count_4(&testCanvas); |
754 | 754 |
755 { | 755 { |
756 SkCanvas* canvas = recorder.beginRecording(100, 100); | 756 SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); |
757 canvas->translate(10, 10); | 757 canvas->translate(10, 10); |
758 canvas->drawRect(rect, paint); | 758 canvas->drawRect(rect, paint); |
759 SkAutoTUnref<SkPicture> noSavePicture(recorder.endRecording()); | 759 SkAutoTUnref<SkPicture> noSavePicture(recorder.endRecording()); |
760 | 760 |
761 testCanvas.drawPicture(*noSavePicture); | 761 testCanvas.drawPicture(*noSavePicture); |
762 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); | 762 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); |
763 REPORTER_ASSERT(reporter, testCanvas.getTotalMatrix().isIdentity()); | 763 REPORTER_ASSERT(reporter, testCanvas.getTotalMatrix().isIdentity()); |
764 } | 764 } |
765 } | 765 } |
766 | 766 |
767 static void test_peephole() { | 767 static void test_peephole() { |
768 SkRandom rand; | 768 SkRandom rand; |
769 | 769 |
770 SkPictureRecorder recorder; | 770 SkPictureRecorder recorder; |
771 | 771 |
772 for (int j = 0; j < 100; j++) { | 772 for (int j = 0; j < 100; j++) { |
773 SkRandom rand2(rand); // remember the seed | 773 SkRandom rand2(rand); // remember the seed |
774 | 774 |
775 SkCanvas* canvas = recorder.beginRecording(100, 100); | 775 SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); |
776 | 776 |
777 for (int i = 0; i < 1000; ++i) { | 777 for (int i = 0; i < 1000; ++i) { |
778 rand_op(canvas, rand); | 778 rand_op(canvas, rand); |
779 } | 779 } |
780 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 780 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
781 | 781 |
782 rand = rand2; | 782 rand = rand2; |
783 } | 783 } |
784 | 784 |
785 { | 785 { |
786 SkCanvas* canvas = recorder.beginRecording(100, 100); | 786 SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); |
787 SkRect rect = SkRect::MakeWH(50, 50); | 787 SkRect rect = SkRect::MakeWH(50, 50); |
788 | 788 |
789 for (int i = 0; i < 100; ++i) { | 789 for (int i = 0; i < 100; ++i) { |
790 canvas->save(); | 790 canvas->save(); |
791 } | 791 } |
792 while (canvas->getSaveCount() > 1) { | 792 while (canvas->getSaveCount() > 1) { |
793 canvas->clipRect(rect); | 793 canvas->clipRect(rect); |
794 canvas->restore(); | 794 canvas->restore(); |
795 } | 795 } |
796 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 796 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
797 } | 797 } |
798 } | 798 } |
799 | 799 |
800 #ifndef SK_DEBUG | 800 #ifndef SK_DEBUG |
801 // Only test this is in release mode. We deliberately crash in debug mode, since
a valid caller | 801 // Only test this is in release mode. We deliberately crash in debug mode, since
a valid caller |
802 // should never do this. | 802 // should never do this. |
803 static void test_bad_bitmap() { | 803 static void test_bad_bitmap() { |
804 // This bitmap has a width and height but no pixels. As a result, attempting
to record it will | 804 // This bitmap has a width and height but no pixels. As a result, attempting
to record it will |
805 // fail. | 805 // fail. |
806 SkBitmap bm; | 806 SkBitmap bm; |
807 bm.setConfig(SkImageInfo::MakeN32Premul(100, 100)); | 807 bm.setConfig(SkImageInfo::MakeN32Premul(100, 100)); |
808 SkPictureRecorder recorder; | 808 SkPictureRecorder recorder; |
809 SkCanvas* recordingCanvas = recorder.beginRecording(100, 100); | 809 SkCanvas* recordingCanvas = recorder.beginRecording(100, 100, NULL, 0); |
810 recordingCanvas->drawBitmap(bm, 0, 0); | 810 recordingCanvas->drawBitmap(bm, 0, 0); |
811 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 811 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
812 | 812 |
813 SkCanvas canvas; | 813 SkCanvas canvas; |
814 canvas.drawPicture(*picture); | 814 canvas.drawPicture(*picture); |
815 } | 815 } |
816 #endif | 816 #endif |
817 | 817 |
818 static SkData* encode_bitmap_to_data(size_t*, const SkBitmap& bm) { | 818 static SkData* encode_bitmap_to_data(size_t*, const SkBitmap& bm) { |
819 return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100); | 819 return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100); |
820 } | 820 } |
821 | 821 |
822 static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) { | 822 static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) { |
823 SkPictureRecorder recorder; | 823 SkPictureRecorder recorder; |
824 SkCanvas* canvas = recorder.beginRecording(bitmap.width(), bitmap.height()); | 824 SkCanvas* canvas = recorder.beginRecording(bitmap.width(), bitmap.height(),
NULL, 0); |
825 canvas->drawBitmap(bitmap, 0, 0); | 825 canvas->drawBitmap(bitmap, 0, 0); |
826 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 826 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
827 | 827 |
828 SkDynamicMemoryWStream wStream; | 828 SkDynamicMemoryWStream wStream; |
829 picture->serialize(&wStream, &encode_bitmap_to_data); | 829 picture->serialize(&wStream, &encode_bitmap_to_data); |
830 return wStream.copyToData(); | 830 return wStream.copyToData(); |
831 } | 831 } |
832 | 832 |
833 struct ErrorContext { | 833 struct ErrorContext { |
834 int fErrors; | 834 int fErrors; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
880 SkClearLastError(); | 880 SkClearLastError(); |
881 SkSetErrorCallback(NULL, NULL); | 881 SkSetErrorCallback(NULL, NULL); |
882 } | 882 } |
883 | 883 |
884 static void test_clone_empty(skiatest::Reporter* reporter) { | 884 static void test_clone_empty(skiatest::Reporter* reporter) { |
885 // This is a regression test for crbug.com/172062 | 885 // This is a regression test for crbug.com/172062 |
886 // Before the fix, we used to crash accessing a null pointer when we | 886 // Before the fix, we used to crash accessing a null pointer when we |
887 // had a picture with no paints. This test passes by not crashing. | 887 // had a picture with no paints. This test passes by not crashing. |
888 { | 888 { |
889 SkPictureRecorder recorder; | 889 SkPictureRecorder recorder; |
890 recorder.beginRecording(1, 1); | 890 recorder.beginRecording(1, 1, NULL, 0); |
891 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 891 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
892 SkAutoTUnref<SkPicture> destPicture(picture->clone()); | 892 SkAutoTUnref<SkPicture> destPicture(picture->clone()); |
893 REPORTER_ASSERT(reporter, NULL != destPicture); | 893 REPORTER_ASSERT(reporter, NULL != destPicture); |
894 } | 894 } |
895 } | 895 } |
896 | 896 |
897 static void test_draw_empty(skiatest::Reporter* reporter) { | 897 static void test_draw_empty(skiatest::Reporter* reporter) { |
898 SkBitmap result; | 898 SkBitmap result; |
899 make_bm(&result, 2, 2, SK_ColorBLACK, false); | 899 make_bm(&result, 2, 2, SK_ColorBLACK, false); |
900 | 900 |
901 SkCanvas canvas(result); | 901 SkCanvas canvas(result); |
902 | 902 |
903 { | 903 { |
904 // stock SkPicture | 904 // stock SkPicture |
905 SkPictureRecorder recorder; | 905 SkPictureRecorder recorder; |
906 recorder.beginRecording(1, 1); | 906 recorder.beginRecording(1, 1, NULL, 0); |
907 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 907 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
908 | 908 |
909 canvas.drawPicture(*picture); | 909 canvas.drawPicture(*picture); |
910 } | 910 } |
911 | 911 |
912 { | 912 { |
913 // tile grid | 913 // tile grid |
914 SkTileGridPicture::TileGridInfo gridInfo; | 914 SkTileGridFactory::TileGridInfo gridInfo; |
915 gridInfo.fMargin.setEmpty(); | 915 gridInfo.fMargin.setEmpty(); |
916 gridInfo.fOffset.setZero(); | 916 gridInfo.fOffset.setZero(); |
917 gridInfo.fTileInterval.set(1, 1); | 917 gridInfo.fTileInterval.set(1, 1); |
918 | 918 |
919 SkAutoTUnref<SkPictureFactory> factory(SkNEW_ARGS(SkTileGridPictureFacto
ry, (gridInfo))); | 919 SkTileGridFactory factory(gridInfo); |
920 SkPictureRecorder recorder(factory); | 920 SkPictureRecorder recorder; |
921 recorder.beginRecording(1, 1); | 921 recorder.beginRecording(1, 1, &factory, 0); |
922 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 922 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
923 | 923 |
924 canvas.drawPicture(*picture); | 924 canvas.drawPicture(*picture); |
925 } | 925 } |
926 | 926 |
927 { | 927 { |
928 // RTree | 928 // RTree |
929 SkAutoTUnref<SkPictureFactory> factory(SkNEW(SkRTreePictureFactory)); | 929 SkRTreeFactory factory; |
930 SkPictureRecorder recorder(factory); | 930 SkPictureRecorder recorder; |
931 recorder.beginRecording(1, 1); | 931 recorder.beginRecording(1, 1, &factory, 0); |
932 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 932 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
933 | 933 |
934 canvas.drawPicture(*picture); | 934 canvas.drawPicture(*picture); |
935 } | 935 } |
936 | 936 |
937 { | 937 { |
938 // quad tree | 938 // quad tree |
939 SkAutoTUnref<SkPictureFactory> factory(SkNEW(SkQuadTreePictureFactory)); | 939 SkQuadTreeFactory factory; |
940 SkPictureRecorder recorder(factory); | 940 SkPictureRecorder recorder; |
941 recorder.beginRecording(1, 1); | 941 recorder.beginRecording(1, 1, &factory, 0); |
942 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 942 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
943 | 943 |
944 canvas.drawPicture(*picture); | 944 canvas.drawPicture(*picture); |
945 } | 945 } |
946 } | 946 } |
947 | 947 |
948 static void test_clip_bound_opt(skiatest::Reporter* reporter) { | 948 static void test_clip_bound_opt(skiatest::Reporter* reporter) { |
949 // Test for crbug.com/229011 | 949 // Test for crbug.com/229011 |
950 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), | 950 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), |
951 SkIntToScalar(2), SkIntToScalar(2)); | 951 SkIntToScalar(2), SkIntToScalar(2)); |
952 SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(7), SkIntToScalar(7), | 952 SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(7), SkIntToScalar(7), |
953 SkIntToScalar(1), SkIntToScalar(1)); | 953 SkIntToScalar(1), SkIntToScalar(1)); |
954 SkRect rect3 = SkRect::MakeXYWH(SkIntToScalar(6), SkIntToScalar(6), | 954 SkRect rect3 = SkRect::MakeXYWH(SkIntToScalar(6), SkIntToScalar(6), |
955 SkIntToScalar(1), SkIntToScalar(1)); | 955 SkIntToScalar(1), SkIntToScalar(1)); |
956 | 956 |
957 SkPath invPath; | 957 SkPath invPath; |
958 invPath.addOval(rect1); | 958 invPath.addOval(rect1); |
959 invPath.setFillType(SkPath::kInverseEvenOdd_FillType); | 959 invPath.setFillType(SkPath::kInverseEvenOdd_FillType); |
960 SkPath path; | 960 SkPath path; |
961 path.addOval(rect2); | 961 path.addOval(rect2); |
962 SkPath path2; | 962 SkPath path2; |
963 path2.addOval(rect3); | 963 path2.addOval(rect3); |
964 SkIRect clipBounds; | 964 SkIRect clipBounds; |
965 SkPictureRecorder recorder; | 965 SkPictureRecorder recorder; |
966 // Minimalist test set for 100% code coverage of | 966 // Minimalist test set for 100% code coverage of |
967 // SkPictureRecord::updateClipConservativelyUsingBounds | 967 // SkPictureRecord::updateClipConservativelyUsingBounds |
968 { | 968 { |
969 SkCanvas* canvas = recorder.beginRecording(10, 10, | 969 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
970 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 970 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
971 canvas->clipPath(invPath, SkRegion::kIntersect_Op); | 971 canvas->clipPath(invPath, SkRegion::kIntersect_Op); |
972 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 972 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
973 REPORTER_ASSERT(reporter, true == nonEmpty); | 973 REPORTER_ASSERT(reporter, true == nonEmpty); |
974 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 974 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
975 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 975 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
976 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 976 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
977 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 977 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
978 } | 978 } |
979 { | 979 { |
980 SkCanvas* canvas = recorder.beginRecording(10, 10, | 980 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
981 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 981 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
982 canvas->clipPath(path, SkRegion::kIntersect_Op); | 982 canvas->clipPath(path, SkRegion::kIntersect_Op); |
983 canvas->clipPath(invPath, SkRegion::kIntersect_Op); | 983 canvas->clipPath(invPath, SkRegion::kIntersect_Op); |
984 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 984 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
985 REPORTER_ASSERT(reporter, true == nonEmpty); | 985 REPORTER_ASSERT(reporter, true == nonEmpty); |
986 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); | 986 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); |
987 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); | 987 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); |
988 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 988 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
989 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 989 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
990 } | 990 } |
991 { | 991 { |
992 SkCanvas* canvas = recorder.beginRecording(10, 10, | 992 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
993 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 993 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
994 canvas->clipPath(path, SkRegion::kIntersect_Op); | 994 canvas->clipPath(path, SkRegion::kIntersect_Op); |
995 canvas->clipPath(invPath, SkRegion::kUnion_Op); | 995 canvas->clipPath(invPath, SkRegion::kUnion_Op); |
996 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 996 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
997 REPORTER_ASSERT(reporter, true == nonEmpty); | 997 REPORTER_ASSERT(reporter, true == nonEmpty); |
998 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 998 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
999 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 999 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
1000 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 1000 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
1001 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 1001 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
1002 } | 1002 } |
1003 { | 1003 { |
1004 SkCanvas* canvas = recorder.beginRecording(10, 10, | 1004 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
1005 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 1005 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
1006 canvas->clipPath(path, SkRegion::kDifference_Op); | 1006 canvas->clipPath(path, SkRegion::kDifference_Op); |
1007 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1007 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1008 REPORTER_ASSERT(reporter, true == nonEmpty); | 1008 REPORTER_ASSERT(reporter, true == nonEmpty); |
1009 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); | 1009 REPORTER_ASSERT(reporter, 0 == clipBounds.fLeft); |
1010 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); | 1010 REPORTER_ASSERT(reporter, 0 == clipBounds.fTop); |
1011 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); | 1011 REPORTER_ASSERT(reporter, 10 == clipBounds.fBottom); |
1012 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); | 1012 REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); |
1013 } | 1013 } |
1014 { | 1014 { |
1015 SkCanvas* canvas = recorder.beginRecording(10, 10, | 1015 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
1016 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 1016 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
1017 canvas->clipPath(path, SkRegion::kReverseDifference_Op); | 1017 canvas->clipPath(path, SkRegion::kReverseDifference_Op); |
1018 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1018 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1019 // True clip is actually empty in this case, but the best | 1019 // True clip is actually empty in this case, but the best |
1020 // determination we can make using only bounds as input is that the | 1020 // determination we can make using only bounds as input is that the |
1021 // clip is included in the bounds of 'path'. | 1021 // clip is included in the bounds of 'path'. |
1022 REPORTER_ASSERT(reporter, true == nonEmpty); | 1022 REPORTER_ASSERT(reporter, true == nonEmpty); |
1023 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); | 1023 REPORTER_ASSERT(reporter, 7 == clipBounds.fLeft); |
1024 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); | 1024 REPORTER_ASSERT(reporter, 7 == clipBounds.fTop); |
1025 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 1025 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
1026 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 1026 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
1027 } | 1027 } |
1028 { | 1028 { |
1029 SkCanvas* canvas = recorder.beginRecording(10, 10, | 1029 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, |
1030 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 1030 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
1031 canvas->clipPath(path, SkRegion::kIntersect_Op); | 1031 canvas->clipPath(path, SkRegion::kIntersect_Op); |
1032 canvas->clipPath(path2, SkRegion::kXOR_Op); | 1032 canvas->clipPath(path2, SkRegion::kXOR_Op); |
1033 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); | 1033 bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); |
1034 REPORTER_ASSERT(reporter, true == nonEmpty); | 1034 REPORTER_ASSERT(reporter, true == nonEmpty); |
1035 REPORTER_ASSERT(reporter, 6 == clipBounds.fLeft); | 1035 REPORTER_ASSERT(reporter, 6 == clipBounds.fLeft); |
1036 REPORTER_ASSERT(reporter, 6 == clipBounds.fTop); | 1036 REPORTER_ASSERT(reporter, 6 == clipBounds.fTop); |
1037 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); | 1037 REPORTER_ASSERT(reporter, 8 == clipBounds.fBottom); |
1038 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); | 1038 REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); |
1039 } | 1039 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 unsigned getClipCount() const { return fClipCount; } | 1078 unsigned getClipCount() const { return fClipCount; } |
1079 | 1079 |
1080 private: | 1080 private: |
1081 unsigned fClipCount; | 1081 unsigned fClipCount; |
1082 | 1082 |
1083 typedef SkCanvas INHERITED; | 1083 typedef SkCanvas INHERITED; |
1084 }; | 1084 }; |
1085 | 1085 |
1086 static void test_clip_expansion(skiatest::Reporter* reporter) { | 1086 static void test_clip_expansion(skiatest::Reporter* reporter) { |
1087 SkPictureRecorder recorder; | 1087 SkPictureRecorder recorder; |
1088 SkCanvas* canvas = recorder.beginRecording(10, 10, 0); | 1088 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); |
1089 | 1089 |
1090 canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); | 1090 canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); |
1091 // The following expanding clip should not be skipped. | 1091 // The following expanding clip should not be skipped. |
1092 canvas->clipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op); | 1092 canvas->clipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op); |
1093 // Draw something so the optimizer doesn't just fold the world. | 1093 // Draw something so the optimizer doesn't just fold the world. |
1094 SkPaint p; | 1094 SkPaint p; |
1095 p.setColor(SK_ColorBLUE); | 1095 p.setColor(SK_ColorBLUE); |
1096 canvas->drawPaint(p); | 1096 canvas->drawPaint(p); |
1097 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 1097 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
1098 | 1098 |
1099 ClipCountingCanvas testCanvas(10, 10); | 1099 ClipCountingCanvas testCanvas(10, 10); |
1100 picture->draw(&testCanvas); | 1100 picture->draw(&testCanvas); |
1101 | 1101 |
1102 // Both clips should be present on playback. | 1102 // Both clips should be present on playback. |
1103 REPORTER_ASSERT(reporter, testCanvas.getClipCount() == 2); | 1103 REPORTER_ASSERT(reporter, testCanvas.getClipCount() == 2); |
1104 } | 1104 } |
1105 | 1105 |
1106 static void test_hierarchical(skiatest::Reporter* reporter) { | 1106 static void test_hierarchical(skiatest::Reporter* reporter) { |
1107 SkBitmap bm; | 1107 SkBitmap bm; |
1108 make_bm(&bm, 10, 10, SK_ColorRED, true); | 1108 make_bm(&bm, 10, 10, SK_ColorRED, true); |
1109 | 1109 |
1110 SkPictureRecorder recorder; | 1110 SkPictureRecorder recorder; |
1111 | 1111 |
1112 recorder.beginRecording(10, 10); | 1112 recorder.beginRecording(10, 10, NULL, 0); |
1113 SkAutoTUnref<SkPicture> childPlain(recorder.endRecording()); | 1113 SkAutoTUnref<SkPicture> childPlain(recorder.endRecording()); |
1114 REPORTER_ASSERT(reporter, !childPlain->willPlayBackBitmaps()); // 0 | 1114 REPORTER_ASSERT(reporter, !childPlain->willPlayBackBitmaps()); // 0 |
1115 | 1115 |
1116 recorder.beginRecording(10, 10)->drawBitmap(bm, 0, 0); | 1116 recorder.beginRecording(10, 10, NULL, 0)->drawBitmap(bm, 0, 0); |
1117 SkAutoTUnref<SkPicture> childWithBitmap(recorder.endRecording()); | 1117 SkAutoTUnref<SkPicture> childWithBitmap(recorder.endRecording()); |
1118 REPORTER_ASSERT(reporter, childWithBitmap->willPlayBackBitmaps()); // 1 | 1118 REPORTER_ASSERT(reporter, childWithBitmap->willPlayBackBitmaps()); // 1 |
1119 | 1119 |
1120 { | 1120 { |
1121 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1121 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); |
1122 canvas->drawPicture(*childPlain); | 1122 canvas->drawPicture(*childPlain); |
1123 SkAutoTUnref<SkPicture> parentPP(recorder.endRecording()); | 1123 SkAutoTUnref<SkPicture> parentPP(recorder.endRecording()); |
1124 REPORTER_ASSERT(reporter, !parentPP->willPlayBackBitmaps()); // 0 | 1124 REPORTER_ASSERT(reporter, !parentPP->willPlayBackBitmaps()); // 0 |
1125 } | 1125 } |
1126 { | 1126 { |
1127 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1127 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); |
1128 canvas->drawPicture(*childWithBitmap); | 1128 canvas->drawPicture(*childWithBitmap); |
1129 SkAutoTUnref<SkPicture> parentPWB(recorder.endRecording()); | 1129 SkAutoTUnref<SkPicture> parentPWB(recorder.endRecording()); |
1130 REPORTER_ASSERT(reporter, parentPWB->willPlayBackBitmaps()); // 1 | 1130 REPORTER_ASSERT(reporter, parentPWB->willPlayBackBitmaps()); // 1 |
1131 } | 1131 } |
1132 { | 1132 { |
1133 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1133 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); |
1134 canvas->drawBitmap(bm, 0, 0); | 1134 canvas->drawBitmap(bm, 0, 0); |
1135 canvas->drawPicture(*childPlain); | 1135 canvas->drawPicture(*childPlain); |
1136 SkAutoTUnref<SkPicture> parentWBP(recorder.endRecording()); | 1136 SkAutoTUnref<SkPicture> parentWBP(recorder.endRecording()); |
1137 REPORTER_ASSERT(reporter, parentWBP->willPlayBackBitmaps()); // 1 | 1137 REPORTER_ASSERT(reporter, parentWBP->willPlayBackBitmaps()); // 1 |
1138 } | 1138 } |
1139 { | 1139 { |
1140 SkCanvas* canvas = recorder.beginRecording(10, 10); | 1140 SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); |
1141 canvas->drawBitmap(bm, 0, 0); | 1141 canvas->drawBitmap(bm, 0, 0); |
1142 canvas->drawPicture(*childWithBitmap); | 1142 canvas->drawPicture(*childWithBitmap); |
1143 SkAutoTUnref<SkPicture> parentWBWB(recorder.endRecording()); | 1143 SkAutoTUnref<SkPicture> parentWBWB(recorder.endRecording()); |
1144 REPORTER_ASSERT(reporter, parentWBWB->willPlayBackBitmaps()); // 2 | 1144 REPORTER_ASSERT(reporter, parentWBWB->willPlayBackBitmaps()); // 2 |
1145 } | 1145 } |
1146 } | 1146 } |
1147 | 1147 |
1148 static void test_gen_id(skiatest::Reporter* reporter) { | 1148 static void test_gen_id(skiatest::Reporter* reporter) { |
1149 | 1149 |
1150 SkPicture empty; | 1150 SkPicture empty; |
1151 | 1151 |
1152 // Empty pictures should still have a valid ID | 1152 // Empty pictures should still have a valid ID |
1153 REPORTER_ASSERT(reporter, empty.uniqueID() != SK_InvalidGenID); | 1153 REPORTER_ASSERT(reporter, empty.uniqueID() != SK_InvalidGenID); |
1154 | 1154 |
1155 SkPictureRecorder recorder; | 1155 SkPictureRecorder recorder; |
1156 | 1156 |
1157 SkCanvas* canvas = recorder.beginRecording(1, 1); | 1157 SkCanvas* canvas = recorder.beginRecording(1, 1, NULL, 0); |
1158 canvas->drawARGB(255, 255, 255, 255); | 1158 canvas->drawARGB(255, 255, 255, 255); |
1159 SkAutoTUnref<SkPicture> hasData(recorder.endRecording()); | 1159 SkAutoTUnref<SkPicture> hasData(recorder.endRecording()); |
1160 // picture should have a non-zero id after recording | 1160 // picture should have a non-zero id after recording |
1161 REPORTER_ASSERT(reporter, hasData->uniqueID() != SK_InvalidGenID); | 1161 REPORTER_ASSERT(reporter, hasData->uniqueID() != SK_InvalidGenID); |
1162 | 1162 |
1163 // both pictures should have different ids | 1163 // both pictures should have different ids |
1164 REPORTER_ASSERT(reporter, hasData->uniqueID() != empty.uniqueID()); | 1164 REPORTER_ASSERT(reporter, hasData->uniqueID() != empty.uniqueID()); |
1165 | 1165 |
1166 // test out copy constructor | 1166 // test out copy constructor |
1167 SkPicture copyWithData(*hasData); | 1167 SkPicture copyWithData(*hasData); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 | 1225 |
1226 static void test_draw_bitmaps(SkCanvas* canvas) { | 1226 static void test_draw_bitmaps(SkCanvas* canvas) { |
1227 SkBitmap empty; | 1227 SkBitmap empty; |
1228 draw_bitmaps(empty, canvas); | 1228 draw_bitmaps(empty, canvas); |
1229 empty.setConfig(SkImageInfo::MakeN32Premul(10, 10)); | 1229 empty.setConfig(SkImageInfo::MakeN32Premul(10, 10)); |
1230 draw_bitmaps(empty, canvas); | 1230 draw_bitmaps(empty, canvas); |
1231 } | 1231 } |
1232 | 1232 |
1233 DEF_TEST(Picture_EmptyBitmap, r) { | 1233 DEF_TEST(Picture_EmptyBitmap, r) { |
1234 SkPictureRecorder recorder; | 1234 SkPictureRecorder recorder; |
1235 test_draw_bitmaps(recorder.beginRecording(10, 10)); | 1235 test_draw_bitmaps(recorder.beginRecording(10, 10, NULL, 0)); |
1236 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 1236 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
1237 } | 1237 } |
1238 | 1238 |
1239 DEF_TEST(Canvas_EmptyBitmap, r) { | 1239 DEF_TEST(Canvas_EmptyBitmap, r) { |
1240 SkBitmap dst; | 1240 SkBitmap dst; |
1241 dst.allocN32Pixels(10, 10); | 1241 dst.allocN32Pixels(10, 10); |
1242 SkCanvas canvas(dst); | 1242 SkCanvas canvas(dst); |
1243 | 1243 |
1244 test_draw_bitmaps(&canvas); | 1244 test_draw_bitmaps(&canvas); |
1245 } | 1245 } |
OLD | NEW |