aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-02-28 15:36:42 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-01 16:59:31 +0000
commit9341c98113c91e3cf6ba2ca19833c01392c37cc8 (patch)
treeb27c8bd5196faab7e4cd1c06290a1cd54f5d9b0e /src
parent1ac8fd25381a043681a24dc3171189db535c587d (diff)
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 <scroggo@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/codec/SkAndroidCodec.cpp13
-rw-r--r--src/core/SkColorSpace.cpp15
-rw-r--r--src/core/SkColorSpace_Base.h1
3 files changed, 27 insertions, 2 deletions
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<SkColorSpace> 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<SkColorSpace> 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> SkColorSpace_Base::makeWithoutFlags() {
return SkColorSpace::MakeRGB(fn, *this->toXYZD50(), 0);
}
+sk_sp<SkColorSpace> 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<SkColorSpace> makeSRGBGamma() = 0;
sk_sp<SkColorSpace> makeWithoutFlags();
+ sk_sp<SkColorSpace> makeWithNonLinearBlending();
enum class Type : uint8_t {
kXYZ,