Chromium Code Reviews| Index: src/codec/SkJpegCodec.cpp |
| diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp |
| index 88b7fcbde1b17c8c97209663e18f5b7b86dbec1c..fb422cdd437bc47b444212784160ef1dc44e57f3 100644 |
| --- a/src/codec/SkJpegCodec.cpp |
| +++ b/src/codec/SkJpegCodec.cpp |
| @@ -510,30 +510,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); |
|
scroggo
2016/04/21 15:09:11
If you don't add a new color type for this, I thin
msarett
2016/04/21 16:03:41
Using kPreSwizzled.
|
| + break; |
| +#endif |
| + default: |
| + SkASSERT(false); |
| + break; |
| } |
| Options swizzlerOptions = options; |
| @@ -545,7 +550,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(); |