aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-02-10 13:49:36 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-10 13:49:36 -0800
commitd5951b1d8562b7c8bd8f5108c2021cbe81e9ba98 (patch)
treeb4c83b24f6fc9c9bc66855f66976e226be4dfc4f
parent02b407b744d40f93ecc978bb9f64a5ffb075b82e (diff)
More efficient Jpeg skipScanlines for older versions of libjpeg-turbo
-rw-r--r--src/codec/SkJpegCodec.cpp28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index aefe264f1a..50186e7213 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -438,27 +438,27 @@ int SkJpegCodec::onGetScanlines(void* dst, int count, size_t dstRowBytes) {
return count;
}
-#ifndef TURBO_HAS_SKIP
-// TODO (msarett): Avoid reallocating the memory buffer on each call to skip.
-static uint32_t jpeg_skip_scanlines(jpeg_decompress_struct* dinfo, int count) {
- SkAutoTMalloc<uint8_t> storage(get_row_bytes(dinfo));
- uint8_t* storagePtr = storage.get();
- for (int y = 0; y < count; y++) {
- if (1 != jpeg_read_scanlines(dinfo, &storagePtr, 1)) {
- return y;
- }
- }
- return count;
-}
-#endif
-
bool SkJpegCodec::onSkipScanlines(int count) {
// Set the jump location for libjpeg errors
if (setjmp(fDecoderMgr->getJmpBuf())) {
return fDecoderMgr->returnFalse("setjmp");
}
+#ifdef TURBO_HAS_SKIP
return (uint32_t) count == jpeg_skip_scanlines(fDecoderMgr->dinfo(), count);
+#else
+ if (!fSrcRow) {
+ fStorage.reset(get_row_bytes(fDecoderMgr->dinfo()));
+ fSrcRow = fStorage.get();
+ }
+
+ for (int y = 0; y < count; y++) {
+ if (1 != jpeg_read_scanlines(fDecoderMgr->dinfo(), &fSrcRow, 1)) {
+ return false;
+ }
+ }
+ return true;
+#endif
}
static bool is_yuv_supported(jpeg_decompress_struct* dinfo) {