Change quality settings on SkImageDecoder_libjpeg
authormsarett <msarett@google.com>
Fri, 6 Nov 2015 19:02:06 +0000 (11:02 -0800)
committerCommit bot <commit-bot@chromium.org>
Fri, 6 Nov 2015 19:02:06 +0000 (11:02 -0800)
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

src/images/SkImageDecoder_libjpeg.cpp

index 7216239..9de1733 100644 (file)
@@ -383,35 +383,11 @@ static void set_error_mgr(jpeg_decompress_struct* cinfo, skjpeg_error_mgr* error
 }
 
 /**
- *  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;