From 9341c98113c91e3cf6ba2ca19833c01392c37cc8 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Tue, 28 Feb 2017 15:36:42 -0500 Subject: SkAndroidCodec: Leave pixels in encoded colorspace when tf is numerical Color space conversion will be deferred until later. Change-Id: I0fbade9bb374fe2ee9328f87284a2d86a199f7b4 Reviewed-on: https://skia-review.googlesource.com/9080 Reviewed-by: Leon Scroggins Commit-Queue: Matt Sarett --- src/codec/SkAndroidCodec.cpp | 13 +++++++++++-- src/core/SkColorSpace.cpp | 15 +++++++++++++++ src/core/SkColorSpace_Base.h | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp index 571cf2bcf8..76ad0f94e7 100644 --- a/src/codec/SkAndroidCodec.cpp +++ b/src/codec/SkAndroidCodec.cpp @@ -173,8 +173,16 @@ sk_sp SkAndroidCodec::computeOutputColorSpace(SkColorType outputCo switch (outputColorType) { case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: - case kIndex_8_SkColorType: - if (is_wide_gamut(fCodec->getInfo().colorSpace())) { + case kIndex_8_SkColorType: { + SkColorSpace* encodedSpace = fCodec->getInfo().colorSpace(); + SkColorSpaceTransferFn fn; + if (encodedSpace->isNumericalTransferFn(&fn)) { + // Leave the pixels in the encoded color space. Color space conversion + // will be handled after decode time. + return as_CSB(encodedSpace)->makeWithNonLinearBlending(); + } + + if (is_wide_gamut(encodedSpace)) { return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kDCIP3_D65_Gamut, SkColorSpace::kNonLinearBlending_ColorSpaceFlag); @@ -183,6 +191,7 @@ sk_sp SkAndroidCodec::computeOutputColorSpace(SkColorType outputCo return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut, SkColorSpace::kNonLinearBlending_ColorSpaceFlag); + } case kRGBA_F16_SkColorType: return SkColorSpace::MakeSRGBLinear(); default: diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp index c9dbf67851..e059bebc99 100644 --- a/src/core/SkColorSpace.cpp +++ b/src/core/SkColorSpace.cpp @@ -312,6 +312,21 @@ sk_sp SkColorSpace_Base::makeWithoutFlags() { return SkColorSpace::MakeRGB(fn, *this->toXYZD50(), 0); } +sk_sp SkColorSpace_Base::makeWithNonLinearBlending() { + if (SkToBool(SkColorSpace::kNonLinearBlending_ColorSpaceFlag & fFlags)) { + return sk_ref_sp(this); + } + + // This should only be called on XYZ color spaces. A2B color spaces are never + // allowed to be destinations - which means that this flag does not make any + // sense for them. + SkASSERT(Type::kXYZ == this->type()); + SkColorSpaceTransferFn fn; + SkAssertResult(this->onIsNumericalTransferFn(&fn)); + return SkColorSpace::MakeRGB(fn, *this->toXYZD50(), + SkColorSpace::kNonLinearBlending_ColorSpaceFlag); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// enum Version { diff --git a/src/core/SkColorSpace_Base.h b/src/core/SkColorSpace_Base.h index 128bebae76..f9ef360706 100644 --- a/src/core/SkColorSpace_Base.h +++ b/src/core/SkColorSpace_Base.h @@ -181,6 +181,7 @@ public: virtual sk_sp makeSRGBGamma() = 0; sk_sp makeWithoutFlags(); + sk_sp makeWithNonLinearBlending(); enum class Type : uint8_t { kXYZ, -- cgit v1.2.3