From 5e819cac114b7286c50c9c3040fca259cd4b06fb Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Mon, 12 Jun 2017 13:07:22 -0400 Subject: 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 Commit-Queue: Mike Klein --- src/images/SkImageEncoderFns.h | 2 -- src/images/SkJpegEncoder.cpp | 12 ++++++++++-- src/images/SkWebpEncoder.cpp | 12 +++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h index f5a33e5d67..6a917d0db6 100644 --- a/src/images/SkImageEncoderFns.h +++ b/src/images/SkImageEncoderFns.h @@ -256,7 +256,6 @@ static inline void transform_scanline_F16(char* SK_RESTRICT dst, const char* SK_ 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,0, width); } @@ -269,7 +268,6 @@ static inline void transform_scanline_F16_premul(char* SK_RESTRICT dst, const ch 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,0, width); } diff --git a/src/images/SkJpegEncoder.cpp b/src/images/SkJpegEncoder.cpp index 8b1dd960e2..eaea77e0e0 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 @@ std::unique_ptr SkJpegEncoder::Make(SkWStream* dst, const SkPixmap& s jpeg_set_quality(encoderMgr->cinfo(), options.fQuality, TRUE); jpeg_start_compress(encoderMgr->cinfo(), TRUE); - if (src.colorSpace()) { - sk_sp icc = icc_from_color_space(*src.colorSpace()); + if (SkColorSpace* cs = src.colorSpace()) { + sk_sp 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 icc = icc_from_color_space(*cs); if (icc) { // Create a contiguous block of memory with the icc signature followed by the profile. sk_sp markerData = diff --git a/src/images/SkWebpEncoder.cpp b/src/images/SkWebpEncoder.cpp index 38e6773d92..81ed7e1845 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 @@ bool SkWebpEncoder::Encode(SkWStream* stream, const SkPixmap& pixmap, const Opti // 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 icc = pixmap.colorSpace() ? icc_from_color_space(*pixmap.colorSpace()) : nullptr; + sk_sp icc; + if (SkColorSpace* cs = pixmap.colorSpace()) { + sk_sp 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; -- cgit v1.2.3