Change quality settings on SkImageDecoder_libjpeg

It has been demonstrated that higher quality settings
really do make a difference in the visual quality of
the output image.
https://code.google.com/p/chromium/issues/detail?id=385515
https://code.google.com/p/skia/issues/detail?id=3770

We are planning to replace SkImageDecoder with SkCodec,
and SkCodec will use the higher quality settings.  As
a first step, we are using SkCodec as the underlying
implementation for BitmapRegionDecoder.  CTS tests require
that BitmapRegionDecoder be a close match to BitmapFactory
(which uses SkImageDecoder), so we must also update the
quality of SkImageDecoder to maintain CTS compatibility.

BUG=skia:

Review URL: https://codereview.chromium.org/1412803009
This commit is contained in:
msarett 2015-11-06 11:02:06 -08:00 committed by Commit bot
parent 8e26604262
commit 69ad6a9d03

View File

@ -382,36 +382,12 @@ static void set_error_mgr(jpeg_decompress_struct* cinfo, skjpeg_error_mgr* error
errorManager->error_exit = skjpeg_error_exit;
}
/**
* Common code for turning off upsampling and smoothing. Turning these
* off helps performance without showing noticable differences in the
* resulting bitmap.
*/
static void turn_off_visual_optimizations(jpeg_decompress_struct* cinfo) {
SkASSERT(cinfo != nullptr);
/* this gives about 30% performance improvement. In theory it may
reduce the visual quality, in practice I'm not seeing a difference
*/
cinfo->do_fancy_upsampling = 0;
/* this gives another few percents */
cinfo->do_block_smoothing = 0;
}
/**
* Common code for setting the dct method.
*/
static void set_dct_method(const SkImageDecoder& decoder, jpeg_decompress_struct* cinfo) {
SkASSERT(cinfo != nullptr);
#ifdef DCT_IFAST_SUPPORTED
if (decoder.getPreferQualityOverSpeed()) {
cinfo->dct_method = JDCT_ISLOW;
} else {
cinfo->dct_method = JDCT_IFAST;
}
#else
cinfo->dct_method = JDCT_ISLOW;
#endif
}
SkColorType SkJPEGImageDecoder::getBitmapColorType(jpeg_decompress_struct* cinfo) {
@ -580,8 +556,6 @@ SkImageDecoder::Result SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap*
SkASSERT(1 == cinfo.scale_num);
cinfo.scale_denom = sampleSize;
turn_off_visual_optimizations(&cinfo);
const SkColorType colorType = this->getBitmapColorType(&cinfo);
const SkAlphaType alphaType = kAlpha_8_SkColorType == colorType ?
kPremul_SkAlphaType : kOpaque_SkAlphaType;
@ -907,8 +881,6 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS
SkASSERT(1 == cinfo.scale_num);
cinfo.scale_denom = 1;
turn_off_visual_optimizations(&cinfo);
#ifdef ANDROID_RGB
cinfo.dither_mode = JDITHER_NONE;
#endif
@ -983,8 +955,6 @@ bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width
// that change (when it calls jinit_color_deconverter).
(void) this->getBitmapColorType(cinfo);
turn_off_visual_optimizations(cinfo);
// instead of jpeg_start_decompress() we start a tiled decompress
if (!imageIndex->startTileDecompress()) {
return false;