aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/images/SkImageEncoderFns.h2
-rw-r--r--src/images/SkJpegEncoder.cpp12
-rw-r--r--src/images/SkWebpEncoder.cpp12
3 files changed, 21 insertions, 5 deletions
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<SkEncoder> 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<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 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<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;