aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@google.com>2015-11-08 16:30:08 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-08 16:30:08 -0800
commit236364904dda3e0b8c7b497adc32b026b0a640f6 (patch)
treea9c2454e33cd22cbd08ea406cec97e14af88a6b1 /src/images
parent629162dd8ef127f793c9cedf0f47a1d4de4d3a3d (diff)
Revert of Change quality settings on SkImageDecoder_libjpeg (patchset #1 id:40001 of https://codereview.chromium.org/1412803009/ )
Reason for revert: Valgrind failures: http://build.chromium.org/p/client.skia/builders/Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Valgrind/builds/631/steps/nanobench/logs/stdio ==14022== Conditional jump or move depends on uninitialised value(s) ==14022== at 0x6A1DD6: S32A_Opaque_BlitRow32_SSE4(unsigned int*, unsigned int const*, int, unsigned int) (SkBlitRow_opts_SSE4.cpp:47) ==14022== by 0x5A7EEA: Sprite_D32_S32::blitRect(int, int, int, int) (SkSpriteBlitter_ARGB32.cpp:47) ==14022== by 0x57DD8A: SkScan::FillIRect(SkIRect const&, SkRegion const*, SkBlitter*) (SkScan.cpp:15) ==14022== by 0x57DEDC: SkScan::FillIRect(SkIRect const&, SkRasterClip const&, SkBlitter*) (SkScan.cpp:73) ==14022== by 0x536072: SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const (SkDraw.cpp:1286) ==14022== by 0x59CC50: SkBitmapDevice::drawBitmap(SkDraw const&, SkBitmap const&, SkMatrix const&, SkPaint const&) (SkBitmapDevice.cpp:248) ==14022== by 0x52F0DC: SkBaseDevice::drawImage(SkDraw const&, SkImage const*, float, float, SkPaint const&) (SkDevice.cpp:150) ==14022== by 0x525139: SkCanvas::onDrawImage(SkImage const*, float, float, SkPaint const*) (SkCanvas.cpp:2180) ==14022== by 0x5279A0: SkCanvas::drawImage(SkImage const*, float, float, SkPaint const*) (SkCanvas.cpp:1864) ==14022== by 0x441C83: SKPBench::onPerCanvasPostDraw(SkCanvas*) (SKPBench.cpp:95) ==14022== by 0x40A3FF: Benchmark::perCanvasPostDraw(SkCanvas*) (Benchmark.cpp:53) ==14022== by 0x44C527: nanobench_main() (nanobench.cpp:1254) ==14022== by 0x44D1E6: main (nanobench.cpp:1344) ==14022== Uninitialised value was created by a heap allocation ==14022== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==14022== by 0x602DAC: chromium_jpeg_get_large (jmemnobs.c:57) ==14022== by 0x602818: alloc_large (jmemmgr.c:376) ==14022== by 0x602A2E: alloc_sarray (jmemmgr.c:453) ==14022== by 0x614983: chromium_jinit_d_main_controller (jdmainct.c:450) ==14022== by 0x5FD3A0: chromium_jinit_master_decompress (jdmaster.c:577) ==14022== by 0x5F9198: chromium_jpeg_start_decompress (jdapistd.c:46) ==14022== by 0x680C22: SkJPEGImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode) (SkImageDecoder_libjpeg.cpp:575) ==14022== by 0x67BCE8: SkImageDecoder::decode(SkStream*, SkBitmap*, SkColorType, SkImageDecoder::Mode) (SkImageDecoder.cpp:138) ==14022== by 0x6845E3: SkImageDecoderGenerator::onGetPixels(SkImageInfo const&, void*, unsigned long, unsigned int*, int*) (SkImageGenerator_skia.cpp:59) ==14022== by 0x53D4C7: SkImageGenerator::getPixels(SkImageInfo const&, void*, unsigned long, unsigned int*, int*) (SkImageGenerator.cpp:40) ==14022== by 0x53D6DF: SkImageGenerator::tryGenerateBitmap(SkBitmap*, SkImageInfo const*, SkBitmap::Allocator*) (SkImageGenerator.cpp:179) ==14022== by 0x53D334: SkImageCacherator::generateBitmap(SkBitmap*) (SkImageGenerator.h:174) ==14022== by 0x53D3A1: SkImageCacherator::tryLockAsBitmap(SkBitmap*, SkImage const*) (SkImageCacherator.cpp:118) ==14022== by 0x53D3EA: SkImageCacherator::lockAsBitmap(SkBitmap*, SkImage const*) (SkImageCacherator.cpp:132) ==14022== by 0x58EDCF: SkImage_Generator::getROPixels(SkBitmap*) const (SkImage_Generator.cpp:59) ==14022== by 0x52F007: SkBaseDevice::drawImageRect(SkDraw const&, SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) (SkDevice.cpp:159) ==14022== by 0x5255E0: SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) (SkCanvas.cpp:2209) ==14022== by 0x5279DC: SkCanvas::drawImageRect(SkImage const*, SkRect const&, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) (SkCanvas.cpp:1872) Original issue's description: > 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: > > Committed: https://skia.googlesource.com/skia/+/69ad6a9d03dd6f14b7c730465319313725a7c903 TBR=scroggo@google.com,msarett@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia: Review URL: https://codereview.chromium.org/1432863002
Diffstat (limited to 'src/images')
-rw-r--r--src/images/SkImageDecoder_libjpeg.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index f270cae611..914bdea5c8 100644
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -379,11 +379,35 @@ 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) {
@@ -552,6 +576,8 @@ 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;
@@ -877,6 +903,8 @@ 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
@@ -951,6 +979,8 @@ 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;