OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 <functional> | 8 #include <functional> |
9 #include <initializer_list> | 9 #include <initializer_list> |
| 10 #include <vector> |
10 #include "DMGpuSupport.h" | 11 #include "DMGpuSupport.h" |
11 | 12 |
12 #include "SkAutoPixmapStorage.h" | 13 #include "SkAutoPixmapStorage.h" |
13 #include "SkBitmap.h" | 14 #include "SkBitmap.h" |
14 #include "SkCanvas.h" | 15 #include "SkCanvas.h" |
15 #include "SkData.h" | 16 #include "SkData.h" |
16 #include "SkImageEncoder.h" | 17 #include "SkImageEncoder.h" |
17 #include "SkImageGenerator.h" | 18 #include "SkImageGenerator.h" |
18 #include "SkImage_Base.h" | 19 #include "SkImage_Base.h" |
19 #include "SkPicture.h" | 20 #include "SkPicture.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 SkPaint paint; | 61 SkPaint paint; |
61 paint.setColor(SK_ColorBLACK); | 62 paint.setColor(SK_ColorBLACK); |
62 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint); | 63 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint); |
63 } | 64 } |
64 static sk_sp<SkImage> create_image() { | 65 static sk_sp<SkImage> create_image() { |
65 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); | 66 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); |
66 auto surface(SkSurface::MakeRaster(info)); | 67 auto surface(SkSurface::MakeRaster(info)); |
67 draw_image_test_pattern(surface->getCanvas()); | 68 draw_image_test_pattern(surface->getCanvas()); |
68 return surface->makeImageSnapshot(); | 69 return surface->makeImageSnapshot(); |
69 } | 70 } |
| 71 static sk_sp<SkImage> create_image_large() { |
| 72 const SkImageInfo info = SkImageInfo::MakeN32(32000, 32, kOpaque_SkAlphaType
); |
| 73 auto surface(SkSurface::MakeRaster(info)); |
| 74 surface->getCanvas()->clear(SK_ColorWHITE); |
| 75 SkPaint paint; |
| 76 paint.setColor(SK_ColorBLACK); |
| 77 surface->getCanvas()->drawRect(SkRect::MakeXYWH(4000, 2, 28000, 30), paint); |
| 78 return surface->makeImageSnapshot(); |
| 79 } |
70 | 80 |
71 static SkData* create_image_data(SkImageInfo* info) { | 81 static SkData* create_image_data(SkImageInfo* info) { |
72 *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); | 82 *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); |
73 const size_t rowBytes = info->minRowBytes(); | 83 const size_t rowBytes = info->minRowBytes(); |
74 SkAutoTUnref<SkData> data(SkData::NewUninitialized(rowBytes * info->height()
)); | 84 SkAutoTUnref<SkData> data(SkData::NewUninitialized(rowBytes * info->height()
)); |
75 { | 85 { |
76 SkBitmap bm; | 86 SkBitmap bm; |
77 bm.installPixels(*info, data->writable_data(), rowBytes); | 87 bm.installPixels(*info, data->writable_data(), rowBytes); |
78 SkCanvas canvas(bm); | 88 SkCanvas canvas(bm); |
79 draw_image_test_pattern(&canvas); | 89 draw_image_test_pattern(&canvas); |
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 sk_gpu_test::TestContext* testContext = ctxInfo.testContext(); | 840 sk_gpu_test::TestContext* testContext = ctxInfo.testContext(); |
831 SkAutoTUnref<GrContextThreadSafeProxy> proxy(context->threadSafeProxy()); | 841 SkAutoTUnref<GrContextThreadSafeProxy> proxy(context->threadSafeProxy()); |
832 | 842 |
833 GrContextFactory otherFactory; | 843 GrContextFactory otherFactory; |
834 ContextInfo otherContextInfo = | 844 ContextInfo otherContextInfo = |
835 otherFactory.getContextInfo(GrContextFactory::kNativeGL_ContextType); | 845 otherFactory.getContextInfo(GrContextFactory::kNativeGL_ContextType); |
836 | 846 |
837 testContext->makeCurrent(); | 847 testContext->makeCurrent(); |
838 REPORTER_ASSERT(reporter, proxy); | 848 REPORTER_ASSERT(reporter, proxy); |
839 struct { | 849 struct { |
840 std::function<sk_sp<SkImage> ()> fImageFactory; | 850 std::function<sk_sp<SkImage> ()> fImageFactory; |
841 bool fExpectation; | 851 std::vector<SkImage::DeferredTextureImageUsageParams> fParams; |
| 852 SkFilterQuality fExpectedQuality; |
| 853 int fExpectedScaleFact
or; |
| 854 bool fExpectation; |
842 } testCases[] = { | 855 } testCases[] = { |
843 { create_image, true }, | 856 { create_image, {{}}, kNone_SkFilterQuality, 1, true }, |
844 { create_codec_image, true }, | 857 { create_codec_image, {{}}, kNone_SkFilterQuality, 1, true }, |
845 { create_data_image, true }, | 858 { create_data_image, {{}}, kNone_SkFilterQuality, 1, true }, |
846 { create_picture_image, false }, | 859 { create_picture_image, {{}}, kNone_SkFilterQuality, 1, false }, |
847 { [context] { return create_gpu_image(context); }, false }, | 860 { [context] { return create_gpu_image(context); }, {{}}, kNone_SkFilterQ
uality, 1, false }, |
848 // Create a texture image in a another GrContext. | 861 // Create a texture image in a another GrContext. |
849 { [testContext, otherContextInfo] { | 862 { [testContext, otherContextInfo] { |
850 otherContextInfo.testContext()->makeCurrent(); | 863 otherContextInfo.testContext()->makeCurrent(); |
851 sk_sp<SkImage> otherContextImage = create_gpu_image(otherContextInfo
.grContext()); | 864 sk_sp<SkImage> otherContextImage = create_gpu_image(otherContextInfo
.grContext()); |
852 testContext->makeCurrent(); | 865 testContext->makeCurrent(); |
853 return otherContextImage; | 866 return otherContextImage; |
854 }, false }, | 867 }, {{}}, kNone_SkFilterQuality, 1, false }, |
| 868 // Create an image that is too large to upload. |
| 869 { create_image_large, {{}}, kNone_SkFilterQuality, 1, false }, |
| 870 // Create an image that is too large, but is scaled to an acceptable siz
e. |
| 871 { create_image_large, {{SkMatrix::I(), kMedium_SkFilterQuality, 4}}, |
| 872 kMedium_SkFilterQuality, 16, true}, |
| 873 // Create an image with multiple low filter qualities, make sure we roun
d up. |
| 874 { create_image_large, {{SkMatrix::I(), kNone_SkFilterQuality, 4}, |
| 875 {SkMatrix::I(), kMedium_SkFilterQuality, 4}}, |
| 876 kMedium_SkFilterQuality, 16, true}, |
| 877 // Create an image with multiple prescale levels, make sure we chose the
minimum scale. |
| 878 { create_image_large, {{SkMatrix::I(), kMedium_SkFilterQuality, 5}, |
| 879 {SkMatrix::I(), kMedium_SkFilterQuality, 4}}, |
| 880 kMedium_SkFilterQuality, 16, true}, |
855 }; | 881 }; |
856 | 882 |
857 | 883 |
858 for (auto testCase : testCases) { | 884 for (auto testCase : testCases) { |
859 sk_sp<SkImage> image(testCase.fImageFactory()); | 885 sk_sp<SkImage> image(testCase.fImageFactory()); |
860 | 886 size_t size = image->getDeferredTextureImageData(*proxy, testCase.fParam
s.data(), |
861 // This isn't currently used in the implementation, just set any old val
ues. | 887 testCase.fParams.size()
, nullptr); |
862 SkImage::DeferredTextureImageUsageParams params; | |
863 params.fQuality = kLow_SkFilterQuality; | |
864 params.fMatrix = SkMatrix::I(); | |
865 | |
866 size_t size = image->getDeferredTextureImageData(*proxy, ¶ms, 1, nul
lptr); | |
867 | 888 |
868 static const char *const kFS[] = { "fail", "succeed" }; | 889 static const char *const kFS[] = { "fail", "succeed" }; |
869 if (SkToBool(size) != testCase.fExpectation) { | 890 if (SkToBool(size) != testCase.fExpectation) { |
870 ERRORF(reporter, "This image was expected to %s but did not.", | 891 ERRORF(reporter, "This image was expected to %s but did not.", |
871 kFS[testCase.fExpectation]); | 892 kFS[testCase.fExpectation]); |
872 } | 893 } |
873 if (size) { | 894 if (size) { |
874 void* buffer = sk_malloc_throw(size); | 895 void* buffer = sk_malloc_throw(size); |
875 void* misaligned = reinterpret_cast<void*>(reinterpret_cast<intptr_t
>(buffer) + 3); | 896 void* misaligned = reinterpret_cast<void*>(reinterpret_cast<intptr_t
>(buffer) + 3); |
876 if (image->getDeferredTextureImageData(*proxy, ¶ms, 1, misaligne
d)) { | 897 if (image->getDeferredTextureImageData(*proxy, testCase.fParams.data
(), |
| 898 testCase.fParams.size(), misa
ligned)) { |
877 ERRORF(reporter, "Should fail when buffer is misaligned."); | 899 ERRORF(reporter, "Should fail when buffer is misaligned."); |
878 } | 900 } |
879 if (!image->getDeferredTextureImageData(*proxy, ¶ms, 1, buffer))
{ | 901 if (!image->getDeferredTextureImageData(*proxy, testCase.fParams.dat
a(), |
| 902 testCase.fParams.size(), buf
fer)) { |
880 ERRORF(reporter, "deferred image size succeeded but creation fai
led."); | 903 ERRORF(reporter, "deferred image size succeeded but creation fai
led."); |
881 } else { | 904 } else { |
882 for (auto budgeted : { SkBudgeted::kNo, SkBudgeted::kYes }) { | 905 for (auto budgeted : { SkBudgeted::kNo, SkBudgeted::kYes }) { |
883 sk_sp<SkImage> newImage( | 906 sk_sp<SkImage> newImage( |
884 SkImage::MakeFromDeferredTextureImageData(context, buffe
r, budgeted)); | 907 SkImage::MakeFromDeferredTextureImageData(context, buffe
r, budgeted)); |
885 REPORTER_ASSERT(reporter, newImage != nullptr); | 908 REPORTER_ASSERT(reporter, newImage != nullptr); |
886 if (newImage) { | 909 if (newImage) { |
887 check_images_same(reporter, image.get(), newImage.get())
; | 910 // Scale the image in software for comparison. |
| 911 SkImageInfo scaled_info = SkImageInfo::MakeN32( |
| 912 image->width() / testCase.fExpectedScaleFactor, |
| 913 image->height() / testCase.fExpectedScaleFactor, |
| 914 image->isOpaque() ? kOpaque_SkAlphaType : kPremu
l_SkAlphaType); |
| 915 SkAutoPixmapStorage scaled; |
| 916 scaled.alloc(scaled_info); |
| 917 image->scalePixels(scaled, testCase.fExpectedQuality); |
| 918 sk_sp<SkImage> scaledImage = SkImage::MakeRasterCopy(sca
led); |
| 919 check_images_same(reporter, scaledImage.get(), newImage.
get()); |
888 } | 920 } |
889 // The other context should not be able to create images fro
m texture data | 921 // The other context should not be able to create images fro
m texture data |
890 // created by the original context. | 922 // created by the original context. |
891 sk_sp<SkImage> newImage2(SkImage::MakeFromDeferredTextureIma
geData( | 923 sk_sp<SkImage> newImage2(SkImage::MakeFromDeferredTextureIma
geData( |
892 otherContextInfo.grContext(), buffer, budgeted)); | 924 otherContextInfo.grContext(), buffer, budgeted)); |
893 REPORTER_ASSERT(reporter, !newImage2); | 925 REPORTER_ASSERT(reporter, !newImage2); |
894 testContext->makeCurrent(); | 926 testContext->makeCurrent(); |
895 } | 927 } |
896 } | 928 } |
897 sk_free(buffer); | 929 sk_free(buffer); |
898 } | 930 } |
899 } | 931 } |
900 } | 932 } |
901 #endif | 933 #endif |
OLD | NEW |