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