Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: src/codec/SkJpegCodec.cpp

Issue 1835083002: Support RGBA/BGRA swizzles using SkEncodedInfo (Closed) Base URL: https://skia.googlesource.com/skia.git@skencodedinfo
Patch Set: Fix bugs Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/codec/SkGifCodec.cpp ('k') | src/codec/SkPngCodec.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « src/codec/SkGifCodec.cpp ('k') | src/codec/SkPngCodec.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698