| Index: src/codec/SkJpegCodec.cpp
|
| diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
|
| index 292c653b8cfb82b66624d0189e30b75212ad17ea..0200031aeaf3bf3d3fdf8682d251b19d302b94f4 100644
|
| --- a/src/codec/SkJpegCodec.cpp
|
| +++ b/src/codec/SkJpegCodec.cpp
|
| @@ -356,18 +356,23 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) {
|
|
|
| // Check for valid color types and set the output color space
|
| switch (dst.colorType()) {
|
| - case kN32_SkColorType:
|
| + case kRGBA_8888_SkColorType:
|
| if (isCMYK) {
|
| fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
|
| } else {
|
| #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
|
| +#else
|
| + fDecoderMgr->dinfo()->out_color_space = JCS_RGB;
|
| +#endif
|
| + }
|
| + return true;
|
| + case kBGRA_8888_SkColorType:
|
| + if (isCMYK) {
|
| + fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
|
| + } else {
|
| +#ifdef LIBJPEG_TURBO_VERSION
|
| fDecoderMgr->dinfo()->out_color_space = JCS_EXT_BGRA;
|
| - #endif
|
| #else
|
| fDecoderMgr->dinfo()->out_color_space = JCS_RGB;
|
| #endif
|
| @@ -516,30 +521,35 @@ SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo,
|
| }
|
|
|
| void SkJpegCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& options) {
|
| - SkSwizzler::SrcConfig srcConfig = SkSwizzler::kUnknown;
|
| - if (JCS_CMYK == fDecoderMgr->dinfo()->out_color_space) {
|
| - srcConfig = SkSwizzler::kCMYK;
|
| - } else {
|
| - // If the out_color_space is not CMYK, the only reason we would need a swizzler is
|
| - // for sampling and/or subsetting.
|
| - switch (dstInfo.colorType()) {
|
| - case kGray_8_SkColorType:
|
| - srcConfig = SkSwizzler::kNoOp8;
|
| - break;
|
| - case kN32_SkColorType:
|
| - srcConfig = SkSwizzler::kNoOp32;
|
| - break;
|
| - case kRGB_565_SkColorType:
|
| - srcConfig = SkSwizzler::kNoOp16;
|
| - break;
|
| - default:
|
| - // This function should only be called if the colorType is supported by jpeg
|
| - SkASSERT(false);
|
| - }
|
| - }
|
| -
|
| - if (JCS_RGB == fDecoderMgr->dinfo()->out_color_space) {
|
| - srcConfig = SkSwizzler::kRGB;
|
| + // libjpeg-turbo may have already performed color conversion. In this
|
| + // case, we must indicate to the swizzler the appropriate encoded format.
|
| + SkEncodedInfo encodedInfo;
|
| + switch (fDecoderMgr->dinfo()->out_color_space) {
|
| + case JCS_GRAYSCALE:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kGray_Color);
|
| + break;
|
| + case JCS_RGB:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kRGB_Color);
|
| + break;
|
| +#ifdef LIBJPEG_TURBO_VERSION
|
| + case JCS_EXT_RGBA:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kRGBA_Color);
|
| + break;
|
| + case JCS_EXT_BGRA:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kBGRA_Color);
|
| + break;
|
| +#endif
|
| + case JCS_CMYK:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kInvertedCMYK_Color);
|
| + break;
|
| +#ifdef TURBO_HAS_565
|
| + case JCS_RGB565:
|
| + encodedInfo = this->getEncodedInfo().makeColor(SkEncodedInfo::kUnknown_Color);
|
| + break;
|
| +#endif
|
| + default:
|
| + SkASSERT(false);
|
| + break;
|
| }
|
|
|
| Options swizzlerOptions = options;
|
| @@ -551,7 +561,7 @@ void SkJpegCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options&
|
| fSwizzlerSubset.width() == options.fSubset->width());
|
| swizzlerOptions.fSubset = &fSwizzlerSubset;
|
| }
|
| - fSwizzler.reset(SkSwizzler::CreateSwizzler(srcConfig, nullptr, dstInfo, swizzlerOptions));
|
| + fSwizzler.reset(SkSwizzler::CreateSwizzler(encodedInfo, nullptr, dstInfo, swizzlerOptions));
|
| SkASSERT(fSwizzler);
|
| fStorage.reset(get_row_bytes(fDecoderMgr->dinfo()));
|
| fSrcRow = fStorage.get();
|
|
|