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:
parent
8e26604262
commit
69ad6a9d03
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user