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(); |