fix f16 encoding

We'll encode F16 .pngs at 16-bit linear, so don't to_srgb them.
We'll encode F16 .jpgs and .webps as 8-bit sRGB, so tag them as sRGB.

Change-Id: Ibc5b5e2d3aea68cdf1531026cbe8b6191f7e39ea
Reviewed-on: https://skia-review.googlesource.com/19498
Reviewed-by: Matt Sarett <msarett@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>
(cherry picked from commit 5e819cac114b7286c50c9c3040fca259cd4b06fb)
Reviewed-on: https://skia-review.googlesource.com/19813
diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h
index dfe5001..b01f1cd 100644
--- a/src/images/SkImageEncoderFns.h
+++ b/src/images/SkImageEncoderFns.h
@@ -256,7 +256,6 @@
                                           int width, int, const SkPMColor*) {
     SkRasterPipeline_<256> p;
     p.append(SkRasterPipeline::load_f16, (const void**) &src);
-    p.append(SkRasterPipeline::to_srgb);
     p.append(SkRasterPipeline::store_u16_be, (void**) &dst);
     p.run(0, width);
 }
@@ -269,7 +268,6 @@
     SkRasterPipeline_<256> p;
     p.append(SkRasterPipeline::load_f16, (const void**) &src);
     p.append(SkRasterPipeline::unpremul);
-    p.append(SkRasterPipeline::to_srgb);
     p.append(SkRasterPipeline::store_u16_be, (void**) &dst);
     p.run(0, width);
 }
diff --git a/src/images/SkJpegEncoder.cpp b/src/images/SkJpegEncoder.cpp
index 8b1dd96..eaea77e 100644
--- a/src/images/SkJpegEncoder.cpp
+++ b/src/images/SkJpegEncoder.cpp
@@ -10,6 +10,7 @@
 #ifdef SK_HAS_JPEG_LIBRARY
 
 #include "SkColorPriv.h"
+#include "SkColorSpace_Base.h"
 #include "SkImageEncoderFns.h"
 #include "SkImageInfoPriv.h"
 #include "SkJpegEncoder.h"
@@ -206,8 +207,15 @@
     jpeg_set_quality(encoderMgr->cinfo(), options.fQuality, TRUE);
     jpeg_start_compress(encoderMgr->cinfo(), TRUE);
 
-    if (src.colorSpace()) {
-        sk_sp<SkData> icc = icc_from_color_space(*src.colorSpace());
+    if (SkColorSpace* cs = src.colorSpace()) {
+        sk_sp<SkColorSpace> owned;
+        if (src.colorType() == kRGBA_F16_SkColorType) {
+            // We'll be converting to 8-bit sRGB, so we'd better tag it that way.
+            owned = as_CSB(src.colorSpace())->makeSRGBGamma();
+            cs = owned.get();
+        }
+
+        sk_sp<SkData> icc = icc_from_color_space(*cs);
         if (icc) {
             // Create a contiguous block of memory with the icc signature followed by the profile.
             sk_sp<SkData> markerData =
diff --git a/src/images/SkWebpEncoder.cpp b/src/images/SkWebpEncoder.cpp
index 38e6773..81ed7e1 100644
--- a/src/images/SkWebpEncoder.cpp
+++ b/src/images/SkWebpEncoder.cpp
@@ -20,6 +20,7 @@
 
 #include "SkBitmap.h"
 #include "SkColorPriv.h"
+#include "SkColorSpace_Base.h"
 #include "SkImageEncoderFns.h"
 #include "SkStream.h"
 #include "SkTemplates.h"
@@ -193,7 +194,16 @@
     // If there is no need to embed an ICC profile, we write directly to the input stream.
     // Otherwise, we will first encode to |tmp| and use a mux to add the ICC chunk.  libwebp
     // forces us to have an encoded image before we can add a profile.
-    sk_sp<SkData> icc = pixmap.colorSpace() ? icc_from_color_space(*pixmap.colorSpace()) : nullptr;
+    sk_sp<SkData> icc;
+    if (SkColorSpace* cs = pixmap.colorSpace()) {
+        sk_sp<SkColorSpace> owned;
+        if (pixmap.colorType() == kRGBA_F16_SkColorType) {
+            // We'll be converting to 8-bit sRGB, so we'd better tag it that way.
+            owned = as_CSB(pixmap.colorSpace())->makeSRGBGamma();
+            cs = owned.get();
+        }
+        icc = icc_from_color_space(*cs);
+    }
     SkDynamicMemoryWStream tmp;
     pic.custom_ptr = icc ? (void*)&tmp : (void*)stream;