diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-15 07:27:27 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-06-15 07:27:27 +0000 |
commit | f0fbbbf36967d02a43d7931d8a7022bd4a639b90 (patch) | |
tree | 644cb33ac44e5c7a692febbc77e766730980ef20 | |
parent | 44e1b0f3cd843f02e8c278f8324acce4d55d092d (diff) | |
parent | be34bc4fc9c2368d554f0a9e162d224de83eb49c (diff) | |
download | skia-oreo-dr2-release.tar.gz |
release-request-0d3671bf-a9ef-4fb8-89d3-8a6e0c96256d-for-git_oc-dr1-release-4102280 snap-temp-L05500000074342108android-8.0.0_r34android-8.0.0_r33android-8.0.0_r27android-8.0.0_r26android-8.0.0_r25android-8.0.0_r24android-8.0.0_r23android-8.0.0_r22android-8.0.0_r21oreo-dr3-releaseoreo-dr2-releaseoreo-dr1-release
Change-Id: Idca523ddc00e244fb00657bb5208a4567f1b5641
-rw-r--r-- | src/images/SkImageEncoderFns.h | 16 | ||||
-rw-r--r-- | src/images/SkJpegEncoder.cpp | 30 | ||||
-rw-r--r-- | src/images/SkPngEncoder.cpp | 20 | ||||
-rw-r--r-- | src/images/SkWebpEncoder.cpp | 3 |
4 files changed, 39 insertions, 30 deletions
diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h index f5a33e5d67..6012a45697 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 "SkOpts.h" #include "SkPreConfig.h" @@ -314,10 +315,21 @@ static inline void transform_scanline_F16_to_premul_8888(char* SK_RESTRICT dst, p.run(0,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/SkJpegEncoder.cpp b/src/images/SkJpegEncoder.cpp index 8b1dd960e2..a0ee398615 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,22 +207,19 @@ 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 (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(encoderMgr->cinfo(), kICCMarker, markerData->bytes(), - markerData->size()); - } + sk_sp<SkData> icc = icc_from_color_space(src.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(encoderMgr->cinfo(), kICCMarker, markerData->bytes(), markerData->size()); } return std::unique_ptr<SkJpegEncoder>(new SkJpegEncoder(std::move(encoderMgr), src)); diff --git a/src/images/SkPngEncoder.cpp b/src/images/SkPngEncoder.cpp index d28657f008..7a1bfcfd7c 100644 --- a/src/images/SkPngEncoder.cpp +++ b/src/images/SkPngEncoder.cpp @@ -53,7 +53,7 @@ public: bool setHeader(const SkImageInfo& srcInfo, const SkPngEncoder::Options& options); bool setPalette(const SkImageInfo& srcInfo, SkColorTable* colorTable, SkTransferFunctionBehavior); - bool setColorSpace(SkColorSpace* colorSpace); + bool setColorSpace(const SkImageInfo& info); bool writeInfo(const SkImageInfo& srcInfo); void chooseProc(const SkImageInfo& srcInfo, SkTransferFunctionBehavior unpremulBehavior); @@ -327,8 +327,8 @@ bool SkPngEncoderMgr::setPalette(const SkImageInfo& srcInfo, SkColorTable* color return true; } -static void set_icc(png_structp png_ptr, png_infop info_ptr, const SkColorSpace& colorSpace) { - sk_sp<SkData> icc = icc_from_color_space(colorSpace); +static void set_icc(png_structp png_ptr, png_infop info_ptr, const SkImageInfo& info) { + sk_sp<SkData> icc = icc_from_color_space(info); if (!icc) { return; } @@ -344,17 +344,15 @@ static void set_icc(png_structp png_ptr, png_infop info_ptr, const SkColorSpace& png_set_iCCP(png_ptr, info_ptr, name, 0, iccPtr, icc->size()); } -bool SkPngEncoderMgr::setColorSpace(SkColorSpace* colorSpace) { +bool SkPngEncoderMgr::setColorSpace(const SkImageInfo& info) { if (setjmp(png_jmpbuf(fPngPtr))) { return false; } - if (colorSpace) { - if (colorSpace->isSRGB()) { - png_set_sRGB(fPngPtr, fInfoPtr, PNG_sRGB_INTENT_PERCEPTUAL); - } else { - set_icc(fPngPtr, fInfoPtr, *colorSpace); - } + if (info.colorSpace() && info.colorSpace()->isSRGB()) { + png_set_sRGB(fPngPtr, fInfoPtr, PNG_sRGB_INTENT_PERCEPTUAL); + } else { + set_icc(fPngPtr, fInfoPtr, info); } return true; @@ -401,7 +399,7 @@ std::unique_ptr<SkEncoder> SkPngEncoder::Make(SkWStream* dst, const SkPixmap& sr return nullptr; } - if (!encoderMgr->setColorSpace(src.colorSpace())) { + if (!encoderMgr->setColorSpace(src.info())) { return nullptr; } diff --git a/src/images/SkWebpEncoder.cpp b/src/images/SkWebpEncoder.cpp index 38e6773d92..296d4f4cf0 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,7 @@ 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 = icc_from_color_space(pixmap.info()); SkDynamicMemoryWStream tmp; pic.custom_ptr = icc ? (void*)&tmp : (void*)stream; |