Use non-linear color spaces for Android decode outputs
BUG=skia:
Change-Id: Ic4bce28f4bc45f73cbfcacc3630140d11fa9c41f
Reviewed-on: https://skia-review.googlesource.com/8530
Reviewed-by: Leon Scroggins <scroggo@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Matt Sarett <msarett@google.com>
diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp
index c1f12fa..571cf2b 100644
--- a/src/codec/SkAndroidCodec.cpp
+++ b/src/codec/SkAndroidCodec.cpp
@@ -176,10 +176,13 @@
case kIndex_8_SkColorType:
if (is_wide_gamut(fCodec->getInfo().colorSpace())) {
return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
- SkColorSpace::kDCIP3_D65_Gamut);
+ SkColorSpace::kDCIP3_D65_Gamut,
+ SkColorSpace::kNonLinearBlending_ColorSpaceFlag);
}
- return SkColorSpace::MakeSRGB();
+ return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ SkColorSpace::kSRGB_Gamut,
+ SkColorSpace::kNonLinearBlending_ColorSpaceFlag);
case kRGBA_F16_SkColorType:
return SkColorSpace::MakeSRGBLinear();
default:
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index e9eeb45..c31d533 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -474,7 +474,17 @@
}
}
-bool SkCodec::initializeColorXform(const SkImageInfo& dstInfo) {
+bool SkCodec::initializeColorXform(const SkImageInfo& info) {
+ // TODO (msarett):
+ // Handle equality checking and legacy behavior for flagged SkColorSpaces.
+ // Until this is implemented, remove any flags on output color spaces. This
+ // will prevent strange behaviors. Ex: sRGB != sRGB + flag, but we don't want
+ // this to trigger a color xform.
+ SkImageInfo dstInfo = info;
+ if (dstInfo.colorSpace()) {
+ dstInfo = info.makeColorSpace(as_CSB(dstInfo.colorSpace())->makeWithoutFlags());
+ }
+
fColorXform = nullptr;
bool needsPremul = needs_premul(dstInfo, fEncodedInfo);
if (needs_color_xform(dstInfo, fSrcInfo, needsPremul)) {
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
index 18eede3..b24a8d67 100644
--- a/src/core/SkColorSpace.cpp
+++ b/src/core/SkColorSpace.cpp
@@ -297,6 +297,19 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
+sk_sp<SkColorSpace> SkColorSpace_Base::makeWithoutFlags() {
+ if (!fFlags) {
+ return sk_ref_sp(this);
+ }
+
+ SkASSERT(Type::kXYZ == this->type());
+ SkColorSpaceTransferFn fn;
+ SkAssertResult(this->onIsNumericalTransferFn(&fn));
+ return SkColorSpace::MakeRGB(fn, *this->toXYZD50(), 0);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
enum Version {
k0_Version, // Initial version, header + flags for matrix and profile
};
diff --git a/src/core/SkColorSpace_Base.h b/src/core/SkColorSpace_Base.h
index 1d3c272..4cc4207 100644
--- a/src/core/SkColorSpace_Base.h
+++ b/src/core/SkColorSpace_Base.h
@@ -178,6 +178,8 @@
*/
virtual sk_sp<SkColorSpace> makeSRGBGamma() = 0;
+ sk_sp<SkColorSpace> makeWithoutFlags();
+
enum class Type : uint8_t {
kXYZ,
kA2B