| 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 static_cast<int>(testCa
se.fParams.size()), |
| 862 SkImage::DeferredTextureImageUsageParams params; | 888 nullptr); |
| 863 params.fQuality = kLow_SkFilterQuality; | |
| 864 params.fMatrix = SkMatrix::I(); | |
| 865 | |
| 866 size_t size = image->getDeferredTextureImageData(*proxy, ¶ms, 1, nul
lptr); | |
| 867 | 889 |
| 868 static const char *const kFS[] = { "fail", "succeed" }; | 890 static const char *const kFS[] = { "fail", "succeed" }; |
| 869 if (SkToBool(size) != testCase.fExpectation) { | 891 if (SkToBool(size) != testCase.fExpectation) { |
| 870 ERRORF(reporter, "This image was expected to %s but did not.", | 892 ERRORF(reporter, "This image was expected to %s but did not.", |
| 871 kFS[testCase.fExpectation]); | 893 kFS[testCase.fExpectation]); |
| 872 } | 894 } |
| 873 if (size) { | 895 if (size) { |
| 874 void* buffer = sk_malloc_throw(size); | 896 void* buffer = sk_malloc_throw(size); |
| 875 void* misaligned = reinterpret_cast<void*>(reinterpret_cast<intptr_t
>(buffer) + 3); | 897 void* misaligned = reinterpret_cast<void*>(reinterpret_cast<intptr_t
>(buffer) + 3); |
| 876 if (image->getDeferredTextureImageData(*proxy, ¶ms, 1, misaligne
d)) { | 898 if (image->getDeferredTextureImageData(*proxy, testCase.fParams.data
(), |
| 899 static_cast<int>(testCase.fPa
rams.size()), |
| 900 misaligned)) { |
| 877 ERRORF(reporter, "Should fail when buffer is misaligned."); | 901 ERRORF(reporter, "Should fail when buffer is misaligned."); |
| 878 } | 902 } |
| 879 if (!image->getDeferredTextureImageData(*proxy, ¶ms, 1, buffer))
{ | 903 if (!image->getDeferredTextureImageData(*proxy, testCase.fParams.dat
a(), |
| 904 static_cast<int>(testCase.fP
arams.size()), |
| 905 buffer)) { |
| 880 ERRORF(reporter, "deferred image size succeeded but creation fai
led."); | 906 ERRORF(reporter, "deferred image size succeeded but creation fai
led."); |
| 881 } else { | 907 } else { |
| 882 for (auto budgeted : { SkBudgeted::kNo, SkBudgeted::kYes }) { | 908 for (auto budgeted : { SkBudgeted::kNo, SkBudgeted::kYes }) { |
| 883 sk_sp<SkImage> newImage( | 909 sk_sp<SkImage> newImage( |
| 884 SkImage::MakeFromDeferredTextureImageData(context, buffe
r, budgeted)); | 910 SkImage::MakeFromDeferredTextureImageData(context, buffe
r, budgeted)); |
| 885 REPORTER_ASSERT(reporter, newImage != nullptr); | 911 REPORTER_ASSERT(reporter, newImage != nullptr); |
| 886 if (newImage) { | 912 if (newImage) { |
| 887 check_images_same(reporter, image.get(), newImage.get())
; | 913 // Scale the image in software for comparison. |
| 914 SkImageInfo scaled_info = SkImageInfo::MakeN32( |
| 915 image->width() / testCase.fExpectedScaleFactor, |
| 916 image->height() / testCase.fExpectedScaleFactor, |
| 917 image->isOpaque() ? kOpaque_SkAlphaType : kPremu
l_SkAlphaType); |
| 918 SkAutoPixmapStorage scaled; |
| 919 scaled.alloc(scaled_info); |
| 920 image->scalePixels(scaled, testCase.fExpectedQuality); |
| 921 sk_sp<SkImage> scaledImage = SkImage::MakeRasterCopy(sca
led); |
| 922 check_images_same(reporter, scaledImage.get(), newImage.
get()); |
| 888 } | 923 } |
| 889 // The other context should not be able to create images fro
m texture data | 924 // The other context should not be able to create images fro
m texture data |
| 890 // created by the original context. | 925 // created by the original context. |
| 891 sk_sp<SkImage> newImage2(SkImage::MakeFromDeferredTextureIma
geData( | 926 sk_sp<SkImage> newImage2(SkImage::MakeFromDeferredTextureIma
geData( |
| 892 otherContextInfo.grContext(), buffer, budgeted)); | 927 otherContextInfo.grContext(), buffer, budgeted)); |
| 893 REPORTER_ASSERT(reporter, !newImage2); | 928 REPORTER_ASSERT(reporter, !newImage2); |
| 894 testContext->makeCurrent(); | 929 testContext->makeCurrent(); |
| 895 } | 930 } |
| 896 } | 931 } |
| 897 sk_free(buffer); | 932 sk_free(buffer); |
| 898 } | 933 } |
| 899 } | 934 } |
| 900 } | 935 } |
| 901 #endif | 936 #endif |
| OLD | NEW |