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