Index: src/images/SkImageDecoder_libjpeg.cpp |
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp |
index 9de17337038d47dfc1b6b2f02605d7eb18de15d7..7216239e80b14b0f6e81dad66bdbfdcc4875a6d2 100644 |
--- a/src/images/SkImageDecoder_libjpeg.cpp |
+++ b/src/images/SkImageDecoder_libjpeg.cpp |
@@ -383,11 +383,35 @@ |
} |
/** |
+ * 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) { |
@@ -556,6 +580,8 @@ |
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; |
@@ -881,6 +907,8 @@ |
SkASSERT(1 == cinfo.scale_num); |
cinfo.scale_denom = 1; |
+ turn_off_visual_optimizations(&cinfo); |
+ |
#ifdef ANDROID_RGB |
cinfo.dither_mode = JDITHER_NONE; |
#endif |
@@ -954,6 +982,8 @@ |
// jpeg_init_read_tile_scanline will check out_color_space again after |
// 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()) { |