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)) {