Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2051)

Unified Diff: tests/SurfaceTest.cpp

Issue 2270823002: Some tests around surface creation and snapshotting with color space (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/image/SkSurface_Raster.cpp ('k') | tests/TestConfigParsing.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/SurfaceTest.cpp
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 2703b541fc59854b2ac27989bfcea59adad2db0c..27b1524388795a928846962e0431edcfddf368ce 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -7,6 +7,7 @@
#include <functional>
#include "SkCanvas.h"
+#include "SkColorSpace_Base.h"
#include "SkData.h"
#include "SkDevice.h"
#include "SkImage_Base.h"
@@ -21,6 +22,7 @@
#include "GrDrawContext.h"
#include "GrGpu.h"
#include "GrResourceProvider.h"
+#include <vector>
#endif
#include <initializer_list>
@@ -910,3 +912,105 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SurfaceAttachStencil_Gpu, reporter, ctxInf
}
}
#endif
+
+static void test_surface_creation_and_snapshot_with_color_space(
+ skiatest::Reporter* reporter,
+ const char* prefix,
+ bool f16Support,
+ std::function<sk_sp<SkSurface>(const SkImageInfo&)> surfaceMaker) {
+
+ auto srgbColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+ auto adobeColorSpace = SkColorSpace::NewNamed(SkColorSpace::kAdobeRGB_Named);
+ SkMatrix44 srgbMatrix = srgbColorSpace->xyz();
+ const float oddGamma[] = { 2.4f, 2.4f, 2.4f };
+ auto oddColorSpace = SkColorSpace_Base::NewRGB(oddGamma, srgbMatrix);
+ auto linearColorSpace = srgbColorSpace->makeLinearGamma();
+
+ const struct {
+ SkColorType fColorType;
+ sk_sp<SkColorSpace> fColorSpace;
+ bool fShouldWork;
+ const char* fDescription;
+ } testConfigs[] = {
+ { kN32_SkColorType, nullptr, true, "N32-nullptr" },
+ { kN32_SkColorType, linearColorSpace, false, "N32-linear" },
+ { kN32_SkColorType, srgbColorSpace, true, "N32-srgb" },
+ { kN32_SkColorType, adobeColorSpace, true, "N32-adobe" },
+ { kN32_SkColorType, oddColorSpace, false, "N32-odd" },
+ { kRGBA_F16_SkColorType, nullptr, false, "F16-nullptr" },
+ { kRGBA_F16_SkColorType, linearColorSpace, true, "F16-linear" },
+ { kRGBA_F16_SkColorType, srgbColorSpace, false, "F16-srgb" },
+ { kRGBA_F16_SkColorType, adobeColorSpace, false, "F16-adobe" },
+ { kRGBA_F16_SkColorType, oddColorSpace, false, "F16-odd" },
+ { kRGB_565_SkColorType, srgbColorSpace, false, "565-srgb" },
+ { kAlpha_8_SkColorType, srgbColorSpace, false, "A8-srgb" },
+ };
+
+ for (auto& testConfig : testConfigs) {
+ SkString fullTestName = SkStringPrintf("%s-%s", prefix, testConfig.fDescription);
+ SkImageInfo info = SkImageInfo::Make(10, 10, testConfig.fColorType, kPremul_SkAlphaType,
+ testConfig.fColorSpace);
+
+ // For some GPU contexts (eg ANGLE), we don't have f16 support, so we should fail to create
+ // any surface of that type:
+ bool shouldWork = testConfig.fShouldWork &&
+ (f16Support || kRGBA_F16_SkColorType != testConfig.fColorType);
+
+ auto surface(surfaceMaker(info));
+ REPORTER_ASSERT_MESSAGE(reporter, SkToBool(surface) == shouldWork, fullTestName.c_str());
+
+ if (shouldWork && surface) {
+ sk_sp<SkImage> image(surface->makeImageSnapshot());
+ REPORTER_ASSERT_MESSAGE(reporter, image, testConfig.fDescription);
+ SkColorSpace* imageColorSpace = as_IB(image)->onImageInfo().colorSpace();
+ REPORTER_ASSERT_MESSAGE(reporter, imageColorSpace == testConfig.fColorSpace.get(),
+ fullTestName.c_str());
+ }
+ }
+}
+
+DEF_TEST(SurfaceCreationWithColorSpace, reporter) {
+ auto surfaceMaker = [](const SkImageInfo& info) {
+ return SkSurface::MakeRaster(info);
+ };
+
+ test_surface_creation_and_snapshot_with_color_space(reporter, "raster", true, surfaceMaker);
+}
+
+#if SK_SUPPORT_GPU
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SurfaceCreationWithColorSpace_Gpu, reporter, ctxInfo) {
bsalomon 2016/08/30 13:10:17 ..FOR_ALL_CONTEXTS?
+ GrContext* context = ctxInfo.grContext();
+ bool f16Support = context->caps()->isConfigRenderable(kRGBA_half_GrPixelConfig, false);
+ auto surfaceMaker = [context](const SkImageInfo& info) {
+ return SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info);
+ };
+
+ test_surface_creation_and_snapshot_with_color_space(reporter, "gpu", f16Support, surfaceMaker);
+
+ std::vector<GrBackendObject> textureHandles;
+ auto wrappedSurfaceMaker = [context,&textureHandles](const SkImageInfo& info) {
+ GrBackendTextureDesc desc;
+ desc.fConfig = SkImageInfo2GrPixelConfig(info, *context->caps());
+ desc.fWidth = 10;
+ desc.fHeight = 10;
+ desc.fFlags = kRenderTarget_GrBackendTextureFlag;
+ desc.fTextureHandle = context->getGpu()->createTestingOnlyBackendTexture(
+ nullptr, desc.fWidth, desc.fHeight, desc.fConfig, true);
+
+ if (!desc.fTextureHandle) {
+ return sk_sp<SkSurface>(nullptr);
+ }
+ textureHandles.push_back(desc.fTextureHandle);
+
+ return SkSurface::MakeFromBackendTexture(context, desc, sk_ref_sp(info.colorSpace()),
+ nullptr);
+ };
+
+ test_surface_creation_and_snapshot_with_color_space(reporter, "wrapped", f16Support,
+ wrappedSurfaceMaker);
+
+ for (auto textureHandle : textureHandles) {
+ context->getGpu()->deleteTestingOnlyBackendTexture(textureHandle);
+ }
+}
+#endif
« no previous file with comments | « src/image/SkSurface_Raster.cpp ('k') | tests/TestConfigParsing.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698