diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-14 07:11:04 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-14 07:11:04 +0000 |
commit | 1923776ac891c5cd810ec7feee6088ee168601a7 (patch) | |
tree | f7cf4537fbd7b1c834681114ee6c5667a82dd0c6 | |
parent | 285f5db565ad64f9314025e2c619f3d323c694cc (diff) | |
parent | a24e12f1fd51c0c7cabd5e6220ae961eadb5e52e (diff) | |
download | skia-1923776ac891c5cd810ec7feee6088ee168601a7.tar.gz |
release-request-0b3ce0b0-0f38-494b-a590-b594ba11c2d2-for-git_oc-release-4098933 snap-temp-L41500000074000728
Change-Id: I835e4e96417869f2354e778f8399866609381695
-rw-r--r-- | src/images/SkImageEncoderFns.h | 16 | ||||
-rw-r--r-- | src/images/SkJPEGImageEncoder.cpp | 28 | ||||
-rw-r--r-- | src/images/SkPNGImageEncoder.cpp | 14 | ||||
-rw-r--r-- | src/images/SkWEBPImageEncoder.cpp | 2 |
4 files changed, 34 insertions, 26 deletions
diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h index 5120570c48..cfac46e66e 100644 --- a/src/images/SkImageEncoderFns.h +++ b/src/images/SkImageEncoderFns.h @@ -15,6 +15,7 @@ #include "SkBitmap.h" #include "SkColor.h" #include "SkColorPriv.h" +#include "SkColorSpace_Base.h" #include "SkICC.h" #include "SkPreConfig.h" #include "SkRasterPipeline.h" @@ -276,10 +277,21 @@ static inline void transform_scanline_F16_premul_to_8888(char* SK_RESTRICT dst, p.run(0, width); } -static inline sk_sp<SkData> icc_from_color_space(const SkColorSpace& cs) { +static inline sk_sp<SkData> icc_from_color_space(const SkImageInfo& info) { + SkColorSpace* cs = info.colorSpace(); + if (!cs) { + return nullptr; + } + + sk_sp<SkColorSpace> owned; + if (kRGBA_F16_SkColorType == info.colorType()) { + owned = as_CSB(cs)->makeSRGBGamma(); + cs = owned.get(); + } + SkColorSpaceTransferFn fn; SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor); - if (cs.isNumericalTransferFn(&fn) && cs.toXYZD50(&toXYZD50)) { + if (cs->isNumericalTransferFn(&fn) && cs->toXYZD50(&toXYZD50)) { return SkICC::WriteToICC(fn, toXYZD50); } diff --git a/src/images/SkJPEGImageEncoder.cpp b/src/images/SkJPEGImageEncoder.cpp index 764e9c43b0..1524de3c33 100644 --- a/src/images/SkJPEGImageEncoder.cpp +++ b/src/images/SkJPEGImageEncoder.cpp @@ -136,21 +136,19 @@ bool SkEncodeImageAsJPEG(SkWStream* stream, const SkPixmap& pixmap, int quality) jpeg_start_compress(&cinfo, TRUE); - if (pixmap.colorSpace()) { - sk_sp<SkData> icc = icc_from_color_space(*pixmap.colorSpace()); - if (icc) { - // Create a contiguous block of memory with the icc signature followed by the profile. - sk_sp<SkData> markerData = - SkData::MakeUninitialized(kICCMarkerHeaderSize + icc->size()); - uint8_t* ptr = (uint8_t*) markerData->writable_data(); - memcpy(ptr, kICCSig, sizeof(kICCSig)); - ptr += sizeof(kICCSig); - *ptr++ = 1; // This is the first marker. - *ptr++ = 1; // Out of one total markers. - memcpy(ptr, icc->data(), icc->size()); - - jpeg_write_marker(&cinfo, kICCMarker, markerData->bytes(), markerData->size()); - } + sk_sp<SkData> icc = icc_from_color_space(pixmap.info()); + if (icc) { + // Create a contiguous block of memory with the icc signature followed by the profile. + sk_sp<SkData> markerData = + SkData::MakeUninitialized(kICCMarkerHeaderSize + icc->size()); + uint8_t* ptr = (uint8_t*) markerData->writable_data(); + memcpy(ptr, kICCSig, sizeof(kICCSig)); + ptr += sizeof(kICCSig); + *ptr++ = 1; // This is the first marker. + *ptr++ = 1; // Out of one total markers. + memcpy(ptr, icc->data(), icc->size()); + + jpeg_write_marker(&cinfo, kICCMarker, markerData->bytes(), markerData->size()); } if (proc) { diff --git a/src/images/SkPNGImageEncoder.cpp b/src/images/SkPNGImageEncoder.cpp index b57c32a0fc..eb08fa4b83 100644 --- a/src/images/SkPNGImageEncoder.cpp +++ b/src/images/SkPNGImageEncoder.cpp @@ -347,14 +347,12 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, int pngColorTyp } } - if (pixmap.colorSpace()) { - if (pixmap.colorSpace()->isSRGB()) { - png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL); - } else { - sk_sp<SkData> icc = icc_from_color_space(*pixmap.colorSpace()); - if (icc) { - set_icc(png_ptr, info_ptr, std::move(icc)); - } + if (pixmap.colorSpace() && pixmap.colorSpace()->isSRGB()) { + png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL); + } else { + sk_sp<SkData> icc = icc_from_color_space(pixmap.info()); + if (icc) { + set_icc(png_ptr, info_ptr, std::move(icc)); } } diff --git a/src/images/SkWEBPImageEncoder.cpp b/src/images/SkWEBPImageEncoder.cpp index c0cd4a6cae..f77e17fb09 100644 --- a/src/images/SkWEBPImageEncoder.cpp +++ b/src/images/SkWEBPImageEncoder.cpp @@ -180,7 +180,7 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkEncodeO // 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 = icc_from_color_space(pixmap.info()); SkDynamicMemoryWStream tmp; pic.custom_ptr = icc ? (void*)&tmp : (void*)stream; |