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