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 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 canvas->drawPath(path, paint); | 773 canvas->drawPath(path, paint); |
774 } | 774 } |
775 } | 775 } |
776 picture.reset(recorder.endRecording()); | 776 picture.reset(recorder.endRecording()); |
777 // hairline stroked AA concave paths are fine for GPU rendering | 777 // hairline stroked AA concave paths are fine for GPU rendering |
778 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); | 778 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); |
779 } | 779 } |
780 | 780 |
781 static void test_gpu_picture_optimization(skiatest::Reporter* reporter, | 781 static void test_gpu_picture_optimization(skiatest::Reporter* reporter, |
782 GrContextFactory* factory) { | 782 GrContextFactory* factory) { |
| 783 for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { |
| 784 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; |
783 | 785 |
784 GrContext* context = factory->get(GrContextFactory::kNative_GLContextType); | 786 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
785 | 787 continue; |
786 static const int kWidth = 100; | |
787 static const int kHeight = 100; | |
788 | |
789 SkAutoTUnref<SkPicture> pict; | |
790 | |
791 // create a picture with the structure: | |
792 // 1) | |
793 // SaveLayer | |
794 // Restore | |
795 // 2) | |
796 // SaveLayer | |
797 // Translate | |
798 // SaveLayer w/ bound | |
799 // Restore | |
800 // Restore | |
801 // 3) | |
802 // SaveLayer w/ copyable paint | |
803 // Restore | |
804 // 4) | |
805 // SaveLayer w/ non-copyable paint | |
806 // Restore | |
807 { | |
808 SkPictureRecorder recorder; | |
809 | |
810 SkCanvas* c = recorder.beginRecording(kWidth, kHeight); | |
811 // 1) | |
812 c->saveLayer(NULL, NULL); | |
813 c->restore(); | |
814 | |
815 // 2) | |
816 c->saveLayer(NULL, NULL); | |
817 c->translate(kWidth/2, kHeight/2); | |
818 SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); | |
819 c->saveLayer(&r, NULL); | |
820 c->restore(); | |
821 c->restore(); | |
822 | |
823 // 3) | |
824 { | |
825 SkPaint p; | |
826 p.setColor(SK_ColorRED); | |
827 c->saveLayer(NULL, &p); | |
828 c->restore(); | |
829 } | |
830 // 4) | |
831 // TODO: this case will need to be removed once the paint's are immutabl
e | |
832 { | |
833 SkPaint p; | |
834 SkAutoTUnref<SkColorFilter> cf(SkLumaColorFilter::Create()); | |
835 p.setImageFilter(SkColorFilterImageFilter::Create(cf.get()))->unref(
); | |
836 c->saveLayer(NULL, &p); | |
837 c->restore(); | |
838 } | 788 } |
839 | 789 |
840 pict.reset(recorder.endRecording()); | 790 GrContext* context = factory->get(glCtxType); |
841 } | |
842 | 791 |
843 // Now test out the SaveLayer extraction | 792 if (NULL == context) { |
844 { | 793 continue; |
845 SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight); | 794 } |
846 | 795 |
847 SkAutoTUnref<SkSurface> surface(SkSurface::NewScratchRenderTarget(contex
t, info)); | 796 static const int kWidth = 100; |
| 797 static const int kHeight = 100; |
848 | 798 |
849 SkCanvas* canvas = surface->getCanvas(); | 799 SkAutoTUnref<SkPicture> pict; |
850 | 800 |
851 canvas->EXPERIMENTAL_optimize(pict); | 801 // create a picture with the structure: |
| 802 // 1) |
| 803 // SaveLayer |
| 804 // Restore |
| 805 // 2) |
| 806 // SaveLayer |
| 807 // Translate |
| 808 // SaveLayer w/ bound |
| 809 // Restore |
| 810 // Restore |
| 811 // 3) |
| 812 // SaveLayer w/ copyable paint |
| 813 // Restore |
| 814 // 4) |
| 815 // SaveLayer w/ non-copyable paint |
| 816 // Restore |
| 817 { |
| 818 SkPictureRecorder recorder; |
852 | 819 |
853 SkPicture::AccelData::Key key = GPUAccelData::ComputeAccelDataKey(); | 820 SkCanvas* c = recorder.beginRecording(kWidth, kHeight); |
| 821 // 1) |
| 822 c->saveLayer(NULL, NULL); |
| 823 c->restore(); |
854 | 824 |
855 const SkPicture::AccelData* data = pict->EXPERIMENTAL_getAccelData(key); | 825 // 2) |
856 REPORTER_ASSERT(reporter, NULL != data); | 826 c->saveLayer(NULL, NULL); |
| 827 c->translate(kWidth/2, kHeight/2); |
| 828 SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); |
| 829 c->saveLayer(&r, NULL); |
| 830 c->restore(); |
| 831 c->restore(); |
857 | 832 |
858 const GPUAccelData *gpuData = static_cast<const GPUAccelData*>(data); | 833 // 3) |
859 REPORTER_ASSERT(reporter, 5 == gpuData->numSaveLayers()); | 834 { |
| 835 SkPaint p; |
| 836 p.setColor(SK_ColorRED); |
| 837 c->saveLayer(NULL, &p); |
| 838 c->restore(); |
| 839 } |
| 840 // 4) |
| 841 // TODO: this case will need to be removed once the paint's are immu
table |
| 842 { |
| 843 SkPaint p; |
| 844 SkAutoTUnref<SkColorFilter> cf(SkLumaColorFilter::Create()); |
| 845 p.setImageFilter(SkColorFilterImageFilter::Create(cf.get()))->un
ref(); |
| 846 c->saveLayer(NULL, &p); |
| 847 c->restore(); |
| 848 } |
860 | 849 |
861 const GPUAccelData::SaveLayerInfo& info0 = gpuData->saveLayerInfo(0); | 850 pict.reset(recorder.endRecording()); |
862 // The parent/child layer appear in reverse order | 851 } |
863 const GPUAccelData::SaveLayerInfo& info1 = gpuData->saveLayerInfo(2); | 852 |
864 const GPUAccelData::SaveLayerInfo& info2 = gpuData->saveLayerInfo(1); | 853 // Now test out the SaveLayer extraction |
865 const GPUAccelData::SaveLayerInfo& info3 = gpuData->saveLayerInfo(3); | 854 { |
| 855 SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight); |
| 856 |
| 857 SkAutoTUnref<SkSurface> surface(SkSurface::NewScratchRenderTarget(co
ntext, info)); |
| 858 |
| 859 SkCanvas* canvas = surface->getCanvas(); |
| 860 |
| 861 canvas->EXPERIMENTAL_optimize(pict); |
| 862 |
| 863 SkPicture::AccelData::Key key = GPUAccelData::ComputeAccelDataKey(); |
| 864 |
| 865 const SkPicture::AccelData* data = pict->EXPERIMENTAL_getAccelData(k
ey); |
| 866 REPORTER_ASSERT(reporter, NULL != data); |
| 867 |
| 868 const GPUAccelData *gpuData = static_cast<const GPUAccelData*>(data)
; |
| 869 REPORTER_ASSERT(reporter, 5 == gpuData->numSaveLayers()); |
| 870 |
| 871 const GPUAccelData::SaveLayerInfo& info0 = gpuData->saveLayerInfo(0)
; |
| 872 // The parent/child layer appear in reverse order |
| 873 const GPUAccelData::SaveLayerInfo& info1 = gpuData->saveLayerInfo(2)
; |
| 874 const GPUAccelData::SaveLayerInfo& info2 = gpuData->saveLayerInfo(1)
; |
| 875 const GPUAccelData::SaveLayerInfo& info3 = gpuData->saveLayerInfo(3)
; |
866 // const GPUAccelData::SaveLayerInfo& info4 = gpuData->saveLayerInfo(4); | 876 // const GPUAccelData::SaveLayerInfo& info4 = gpuData->saveLayerInfo(4); |
867 | 877 |
868 REPORTER_ASSERT(reporter, info0.fValid); | 878 REPORTER_ASSERT(reporter, info0.fValid); |
869 REPORTER_ASSERT(reporter, kWidth == info0.fSize.fWidth && kHeight == inf
o0.fSize.fHeight); | 879 REPORTER_ASSERT(reporter, kWidth == info0.fSize.fWidth && kHeight ==
info0.fSize.fHeight); |
870 REPORTER_ASSERT(reporter, info0.fCTM.isIdentity()); | 880 REPORTER_ASSERT(reporter, info0.fCTM.isIdentity()); |
871 REPORTER_ASSERT(reporter, 0 == info0.fOffset.fX && 0 == info0.fOffset.fY
); | 881 REPORTER_ASSERT(reporter, 0 == info0.fOffset.fX && 0 == info0.fOffse
t.fY); |
872 REPORTER_ASSERT(reporter, NULL != info0.fPaint); | 882 REPORTER_ASSERT(reporter, NULL != info0.fPaint); |
873 REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayers); | 883 REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayer
s); |
874 | 884 |
875 REPORTER_ASSERT(reporter, info1.fValid); | 885 REPORTER_ASSERT(reporter, info1.fValid); |
876 REPORTER_ASSERT(reporter, kWidth == info1.fSize.fWidth && kHeight == inf
o1.fSize.fHeight); | 886 REPORTER_ASSERT(reporter, kWidth == info1.fSize.fWidth && kHeight ==
info1.fSize.fHeight); |
877 REPORTER_ASSERT(reporter, info1.fCTM.isIdentity()); | 887 REPORTER_ASSERT(reporter, info1.fCTM.isIdentity()); |
878 REPORTER_ASSERT(reporter, 0 == info1.fOffset.fX && 0 == info1.fOffset.fY
); | 888 REPORTER_ASSERT(reporter, 0 == info1.fOffset.fX && 0 == info1.fOffse
t.fY); |
879 REPORTER_ASSERT(reporter, NULL != info1.fPaint); | 889 REPORTER_ASSERT(reporter, NULL != info1.fPaint); |
880 REPORTER_ASSERT(reporter, !info1.fIsNested && info1.fHasNestedLayers); /
/ has a nested SL | 890 REPORTER_ASSERT(reporter, !info1.fIsNested && info1.fHasNestedLayers
); // has a nested SL |
881 | 891 |
882 REPORTER_ASSERT(reporter, info2.fValid); | 892 REPORTER_ASSERT(reporter, info2.fValid); |
883 REPORTER_ASSERT(reporter, kWidth/2 == info2.fSize.fWidth && | 893 REPORTER_ASSERT(reporter, kWidth/2 == info2.fSize.fWidth && |
884 kHeight/2 == info2.fSize.fHeight); // bound re
duces size | 894 kHeight/2 == info2.fSize.fHeight); // boun
d reduces size |
885 REPORTER_ASSERT(reporter, info2.fCTM.isIdentity()); // translate
d | 895 REPORTER_ASSERT(reporter, info2.fCTM.isIdentity()); // trans
lated |
886 REPORTER_ASSERT(reporter, kWidth/2 == info2.fOffset.fX && | 896 REPORTER_ASSERT(reporter, kWidth/2 == info2.fOffset.fX && |
887 kHeight/2 == info2.fOffset.fY); | 897 kHeight/2 == info2.fOffset.fY); |
888 REPORTER_ASSERT(reporter, NULL != info1.fPaint); | 898 REPORTER_ASSERT(reporter, NULL != info1.fPaint); |
889 REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers); /
/ is nested | 899 REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers
); // is nested |
890 | 900 |
891 REPORTER_ASSERT(reporter, info3.fValid); | 901 REPORTER_ASSERT(reporter, info3.fValid); |
892 REPORTER_ASSERT(reporter, kWidth == info3.fSize.fWidth && kHeight == inf
o3.fSize.fHeight); | 902 REPORTER_ASSERT(reporter, kWidth == info3.fSize.fWidth && kHeight ==
info3.fSize.fHeight); |
893 REPORTER_ASSERT(reporter, info3.fCTM.isIdentity()); | 903 REPORTER_ASSERT(reporter, info3.fCTM.isIdentity()); |
894 REPORTER_ASSERT(reporter, 0 == info3.fOffset.fX && 0 == info3.fOffset.fY
); | 904 REPORTER_ASSERT(reporter, 0 == info3.fOffset.fX && 0 == info3.fOffse
t.fY); |
895 REPORTER_ASSERT(reporter, NULL != info3.fPaint); | 905 REPORTER_ASSERT(reporter, NULL != info3.fPaint); |
896 REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayers); | 906 REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayer
s); |
897 | 907 |
898 #if 0 // needs more though for GrGatherCanvas | 908 #if 0 // needs more though for GrGatherCanvas |
899 REPORTER_ASSERT(reporter, !info4.fValid); // paint is/wa
s uncopyable | 909 REPORTER_ASSERT(reporter, !info4.fValid); // paint i
s/was uncopyable |
900 REPORTER_ASSERT(reporter, kWidth == info4.fSize.fWidth && kHeight == inf
o4.fSize.fHeight); | 910 REPORTER_ASSERT(reporter, kWidth == info4.fSize.fWidth && kHeight ==
info4.fSize.fHeight); |
901 REPORTER_ASSERT(reporter, 0 == info4.fOffset.fX && 0 == info4.fOffset.fY
); | 911 REPORTER_ASSERT(reporter, 0 == info4.fOffset.fX && 0 == info4.fOffse
t.fY); |
902 REPORTER_ASSERT(reporter, info4.fCTM.isIdentity()); | 912 REPORTER_ASSERT(reporter, info4.fCTM.isIdentity()); |
903 REPORTER_ASSERT(reporter, NULL == info4.fPaint); // paint is/was unc
opyable | 913 REPORTER_ASSERT(reporter, NULL == info4.fPaint); // paint is/was
uncopyable |
904 REPORTER_ASSERT(reporter, !info4.fIsNested && !info4.fHasNestedLayers); | 914 REPORTER_ASSERT(reporter, !info4.fIsNested && !info4.fHasNestedLayer
s); |
905 #endif | 915 #endif |
| 916 } |
906 } | 917 } |
907 } | 918 } |
908 | 919 |
909 #endif | 920 #endif |
910 | 921 |
911 static void set_canvas_to_save_count_4(SkCanvas* canvas) { | 922 static void set_canvas_to_save_count_4(SkCanvas* canvas) { |
912 canvas->restoreToCount(1); | 923 canvas->restoreToCount(1); |
913 canvas->save(); | 924 canvas->save(); |
914 canvas->save(); | 925 canvas->save(); |
915 canvas->save(); | 926 canvas->save(); |
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 1603 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
1593 } | 1604 } |
1594 | 1605 |
1595 DEF_TEST(Canvas_EmptyBitmap, r) { | 1606 DEF_TEST(Canvas_EmptyBitmap, r) { |
1596 SkBitmap dst; | 1607 SkBitmap dst; |
1597 dst.allocN32Pixels(10, 10); | 1608 dst.allocN32Pixels(10, 10); |
1598 SkCanvas canvas(dst); | 1609 SkCanvas canvas(dst); |
1599 | 1610 |
1600 test_draw_bitmaps(&canvas); | 1611 test_draw_bitmaps(&canvas); |
1601 } | 1612 } |
OLD | NEW |