diff options
author | 2016-02-12 12:35:48 -0800 | |
---|---|---|
committer | 2016-02-12 12:35:49 -0800 | |
commit | 70e418b468b1656feae3e84851562b22e5d25660 (patch) | |
tree | 38b88d69c7c3c1f0a0fb223b3ab902af67221c09 /src | |
parent | e6af96a88901b3c6f0c27575197a93db6cb04042 (diff) |
Make SkJpegCodec compatible with libjpeg
BUG=skia:4470
BUG=skia:4520
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1687863003
Review URL: https://codereview.chromium.org/1687863003
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkCodec.cpp | 4 | ||||
-rw-r--r-- | src/codec/SkJpegCodec.cpp | 35 |
2 files changed, 27 insertions, 12 deletions
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp index f5a6d36e3b..0da36bb171 100644 --- a/src/codec/SkCodec.cpp +++ b/src/codec/SkCodec.cpp @@ -11,9 +11,7 @@ #include "SkData.h" #include "SkGifCodec.h" #include "SkIcoCodec.h" -#if !defined(GOOGLE3) #include "SkJpegCodec.h" -#endif #include "SkPngCodec.h" #ifdef SK_CODEC_DECODES_RAW #include "SkRawCodec.h" @@ -28,9 +26,7 @@ struct DecoderProc { }; static const DecoderProc gDecoderProcs[] = { -#if !defined(GOOGLE3) { SkJpegCodec::IsJpeg, SkJpegCodec::NewFromStream }, -#endif { SkWebpCodec::IsWebp, SkWebpCodec::NewFromStream }, { SkGifCodec::IsGif, SkGifCodec::NewFromStream }, { SkIcoCodec::IsIco, SkIcoCodec::NewFromStream }, diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp index 50186e7213..f920c98f69 100644 --- a/src/codec/SkJpegCodec.cpp +++ b/src/codec/SkJpegCodec.cpp @@ -86,7 +86,12 @@ SkJpegCodec::SkJpegCodec(const SkImageInfo& srcInfo, SkStream* stream, * Return the row bytes of a particular image type and width */ static size_t get_row_bytes(const j_decompress_ptr dinfo) { - size_t colorBytes = (dinfo->out_color_space == JCS_RGB565) ? 2 : dinfo->out_color_components; +#ifdef TURBO_HAS_565 + const size_t colorBytes = (dinfo->out_color_space == JCS_RGB565) ? 2 : + dinfo->out_color_components; +#else + const size_t colorBytes = dinfo->out_color_components; +#endif return dinfo->output_width * colorBytes; } @@ -184,12 +189,16 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) { if (isCMYK) { fDecoderMgr->dinfo()->out_color_space = JCS_CMYK; } else { - // Check the byte ordering of the RGBA color space for the - // current platform -#if defined(SK_PMCOLOR_IS_RGBA) - fDecoderMgr->dinfo()->out_color_space = JCS_EXT_RGBA; +#ifdef LIBJPEG_TURBO_VERSION + // Check the byte ordering of the RGBA color space for the + // current platform + #ifdef SK_PMCOLOR_IS_RGBA + fDecoderMgr->dinfo()->out_color_space = JCS_EXT_RGBA; + #else + fDecoderMgr->dinfo()->out_color_space = JCS_EXT_BGRA; + #endif #else - fDecoderMgr->dinfo()->out_color_space = JCS_EXT_BGRA; + fDecoderMgr->dinfo()->out_color_space = JCS_RGB; #endif } return true; @@ -197,8 +206,12 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) { if (isCMYK) { fDecoderMgr->dinfo()->out_color_space = JCS_CMYK; } else { +#ifdef TURBO_HAS_565 fDecoderMgr->dinfo()->dither_mode = JDITHER_NONE; fDecoderMgr->dinfo()->out_color_space = JCS_RGB565; +#else + fDecoderMgr->dinfo()->out_color_space = JCS_RGB; +#endif } return true; case kGray_8_SkColorType: @@ -290,7 +303,8 @@ SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo, // If it's not, we want to know because it means our strategy is not optimal. SkASSERT(1 == dinfo->rec_outbuf_height); - if (JCS_CMYK == dinfo->out_color_space) { + J_COLOR_SPACE colorSpace = dinfo->out_color_space; + if (JCS_CMYK == colorSpace || JCS_RGB == colorSpace) { this->initializeSwizzler(dstInfo, options); } @@ -353,6 +367,10 @@ void SkJpegCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& } } + if (JCS_RGB == fDecoderMgr->dinfo()->out_color_space) { + srcConfig = SkSwizzler::kRGB; + } + fSwizzler.reset(SkSwizzler::CreateSwizzler(srcConfig, nullptr, dstInfo, options)); fStorage.reset(get_row_bytes(fDecoderMgr->dinfo())); fSrcRow = fStorage.get(); @@ -394,7 +412,8 @@ SkCodec::Result SkJpegCodec::onStartScanlineDecode(const SkImageInfo& dstInfo, // We will need a swizzler if we are performing a subset decode or // converting from CMYK. - if (options.fSubset || JCS_CMYK == fDecoderMgr->dinfo()->out_color_space) { + J_COLOR_SPACE colorSpace = fDecoderMgr->dinfo()->out_color_space; + if (options.fSubset || JCS_CMYK == colorSpace || JCS_RGB == colorSpace) { this->initializeSwizzler(dstInfo, options); } |