aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-02-12 12:35:48 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-12 12:35:49 -0800
commit70e418b468b1656feae3e84851562b22e5d25660 (patch)
tree38b88d69c7c3c1f0a0fb223b3ab902af67221c09 /src
parente6af96a88901b3c6f0c27575197a93db6cb04042 (diff)
Make SkJpegCodec compatible with libjpeg
Diffstat (limited to 'src')
-rw-r--r--src/codec/SkCodec.cpp4
-rw-r--r--src/codec/SkJpegCodec.cpp35
2 files changed, 27 insertions, 12 deletions
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index f5a6d36e3b..0da36bb171 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -11,9 +11,7 @@
#include "SkData.h"
#include "SkGifCodec.h"
#include "SkIcoCodec.h"
-#if !defined(GOOGLE3)
#include "SkJpegCodec.h"
-#endif
#include "SkPngCodec.h"
#ifdef SK_CODEC_DECODES_RAW
#include "SkRawCodec.h"
@@ -28,9 +26,7 @@ struct DecoderProc {
};
static const DecoderProc gDecoderProcs[] = {
-#if !defined(GOOGLE3)
{ SkJpegCodec::IsJpeg, SkJpegCodec::NewFromStream },
-#endif
{ SkWebpCodec::IsWebp, SkWebpCodec::NewFromStream },
{ SkGifCodec::IsGif, SkGifCodec::NewFromStream },
{ SkIcoCodec::IsIco, SkIcoCodec::NewFromStream },
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index 50186e7213..f920c98f69 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -86,7 +86,12 @@ SkJpegCodec::SkJpegCodec(const SkImageInfo& srcInfo, SkStream* stream,
* Return the row bytes of a particular image type and width
*/
static size_t get_row_bytes(const j_decompress_ptr dinfo) {
- size_t colorBytes = (dinfo->out_color_space == JCS_RGB565) ? 2 : dinfo->out_color_components;
+#ifdef TURBO_HAS_565
+ const size_t colorBytes = (dinfo->out_color_space == JCS_RGB565) ? 2 :
+ dinfo->out_color_components;
+#else
+ const size_t colorBytes = dinfo->out_color_components;
+#endif
return dinfo->output_width * colorBytes;
}
@@ -184,12 +189,16 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) {
if (isCMYK) {
fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
} else {
- // Check the byte ordering of the RGBA color space for the
- // current platform
-#if defined(SK_PMCOLOR_IS_RGBA)
- fDecoderMgr->dinfo()->out_color_space = JCS_EXT_RGBA;
+#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
+ fDecoderMgr->dinfo()->out_color_space = JCS_EXT_BGRA;
+ #endif
#else
- fDecoderMgr->dinfo()->out_color_space = JCS_EXT_BGRA;
+ fDecoderMgr->dinfo()->out_color_space = JCS_RGB;
#endif
}
return true;
@@ -197,8 +206,12 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dst) {
if (isCMYK) {
fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
} else {
+#ifdef TURBO_HAS_565
fDecoderMgr->dinfo()->dither_mode = JDITHER_NONE;
fDecoderMgr->dinfo()->out_color_space = JCS_RGB565;
+#else
+ fDecoderMgr->dinfo()->out_color_space = JCS_RGB;
+#endif
}
return true;
case kGray_8_SkColorType:
@@ -290,7 +303,8 @@ SkCodec::Result SkJpegCodec::onGetPixels(const SkImageInfo& dstInfo,
// If it's not, we want to know because it means our strategy is not optimal.
SkASSERT(1 == dinfo->rec_outbuf_height);
- if (JCS_CMYK == dinfo->out_color_space) {
+ J_COLOR_SPACE colorSpace = dinfo->out_color_space;
+ if (JCS_CMYK == colorSpace || JCS_RGB == colorSpace) {
this->initializeSwizzler(dstInfo, options);
}
@@ -353,6 +367,10 @@ void SkJpegCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options&
}
}
+ if (JCS_RGB == fDecoderMgr->dinfo()->out_color_space) {
+ srcConfig = SkSwizzler::kRGB;
+ }
+
fSwizzler.reset(SkSwizzler::CreateSwizzler(srcConfig, nullptr, dstInfo, options));
fStorage.reset(get_row_bytes(fDecoderMgr->dinfo()));
fSrcRow = fStorage.get();
@@ -394,7 +412,8 @@ SkCodec::Result SkJpegCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
// We will need a swizzler if we are performing a subset decode or
// converting from CMYK.
- if (options.fSubset || JCS_CMYK == fDecoderMgr->dinfo()->out_color_space) {
+ J_COLOR_SPACE colorSpace = fDecoderMgr->dinfo()->out_color_space;
+ if (options.fSubset || JCS_CMYK == colorSpace || JCS_RGB == colorSpace) {
this->initializeSwizzler(dstInfo, options);
}