diff options
-rw-r--r-- | src/core/SkImageInfoPriv.h | 2 | ||||
-rw-r--r-- | src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp | 4 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 4 | ||||
-rw-r--r-- | src/image/SkSurface_Raster.cpp | 2 | ||||
-rw-r--r-- | tests/SurfaceTest.cpp | 2 |
5 files changed, 8 insertions, 6 deletions
diff --git a/src/core/SkImageInfoPriv.h b/src/core/SkImageInfoPriv.h index 38de97f8a2..716c35d43d 100644 --- a/src/core/SkImageInfoPriv.h +++ b/src/core/SkImageInfoPriv.h @@ -34,7 +34,7 @@ static inline bool SkImageInfoIsValidCommon(const SkImageInfo& info) { } if (kRGBA_F16_SkColorType == info.colorType() && - (!info.colorSpace() || !info.colorSpace()->gammaIsLinear())) { + (info.colorSpace() && (!info.colorSpace()->gammaIsLinear()))) { return false; } diff --git a/src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp b/src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp index bfa2ed77df..c0573e915a 100644 --- a/src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp +++ b/src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp @@ -63,7 +63,9 @@ public: transferFnBody.appendf("float E = %s[4];", coeffsName); transferFnBody.appendf("float F = %s[5];", coeffsName); transferFnBody.appendf("float G = %s[6];", coeffsName); - transferFnBody.appendf("return (x < D) ? (C * x) + F : pow(A * x + B, G) + E;"); + transferFnBody.append("float s = sign(x);"); + transferFnBody.append("x = abs(x);"); + transferFnBody.appendf("return s * ((x < D) ? (C * x) + F : pow(A * x + B, G) + E);"); fragBuilder->emitFunction(kFloat_GrSLType, fnName, SK_ARRAY_COUNT(gTransferFnFuncArgs), gTransferFnFuncArgs, transferFnBody.c_str(), &tfFuncNames[i]); } diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index 143a6039f0..a474ffe518 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -161,7 +161,7 @@ bool SkSurface_Gpu::onWait(int numSemaphores, const GrBackendSemaphore* waitSema bool SkSurface_Gpu::Valid(const SkImageInfo& info) { switch (info.colorType()) { case kRGBA_F16_SkColorType: - return info.colorSpace() && info.colorSpace()->gammaIsLinear(); + return (!info.colorSpace()) || info.colorSpace()->gammaIsLinear(); case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: return !info.colorSpace() || info.colorSpace()->gammaCloseToSRGB(); @@ -173,7 +173,7 @@ bool SkSurface_Gpu::Valid(const SkImageInfo& info) { bool SkSurface_Gpu::Valid(GrContext* context, GrPixelConfig config, SkColorSpace* colorSpace) { switch (config) { case kRGBA_half_GrPixelConfig: - return colorSpace && colorSpace->gammaIsLinear(); + return (!colorSpace) || colorSpace->gammaIsLinear(); case kSRGBA_8888_GrPixelConfig: case kSBGRA_8888_GrPixelConfig: return context->caps()->srgbSupport() && colorSpace && colorSpace->gammaCloseToSRGB(); diff --git a/src/image/SkSurface_Raster.cpp b/src/image/SkSurface_Raster.cpp index 51b9487d88..38694876c3 100644 --- a/src/image/SkSurface_Raster.cpp +++ b/src/image/SkSurface_Raster.cpp @@ -63,7 +63,7 @@ bool SkSurfaceValidateRasterInfo(const SkImageInfo& info, size_t rowBytes) { shift = 2; break; case kRGBA_F16_SkColorType: - if (!info.colorSpace() || !info.colorSpace()->gammaIsLinear()) { + if (info.colorSpace() && (!info.colorSpace()->gammaIsLinear())) { return false; } shift = 3; diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index 797750f3b1..202df58f3c 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -837,7 +837,7 @@ static void test_surface_creation_and_snapshot_with_color_space( { 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, nullptr, true, "F16-nullptr" }, { kRGBA_F16_SkColorType, linearColorSpace, true, "F16-linear" }, { kRGBA_F16_SkColorType, srgbColorSpace, false, "F16-srgb" }, { kRGBA_F16_SkColorType, adobeColorSpace, false, "F16-adobe" }, |