diff options
author | 2013-03-20 17:45:27 +0000 | |
---|---|---|
committer | 2013-03-20 17:45:27 +0000 | |
commit | 113994051b41366a7b25851d05cd56e89866a33b (patch) | |
tree | 373fe1104f36909ce35ad6b4d9afeca26c01e7b4 /src/images/SkJpegUtility.cpp | |
parent | 4d9853288bd726f8def70dc13b15ca2ce36326dc (diff) |
Upstream changes from Android for decoding jpeg images.
Review URL: https://codereview.chromium.org/12438025
git-svn-id: http://skia.googlecode.com/svn/trunk@8267 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/images/SkJpegUtility.cpp')
-rw-r--r-- | src/images/SkJpegUtility.cpp | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp index 19db0186d2..89a0472380 100644 --- a/src/images/SkJpegUtility.cpp +++ b/src/images/SkJpegUtility.cpp @@ -9,14 +9,41 @@ #include "SkJpegUtility.h" +// Uncomment to enable the code path used by the Android framework with their +// custom image decoders. +//#if defined(SK_BUILD_FOR_ANDROID) && defined(SK_DEBUG) +// #define SK_BUILD_FOR_ANDROID_FRAMEWORK +//#endif + ///////////////////////////////////////////////////////////////////// static void sk_init_source(j_decompress_ptr cinfo) { skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; src->next_input_byte = (const JOCTET*)src->fBuffer; src->bytes_in_buffer = 0; +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + src->current_offset = 0; +#endif src->fStream->rewind(); } +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK +static boolean sk_seek_input_data(j_decompress_ptr cinfo, long byte_offset) { + skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; + + if (byte_offset > src->current_offset) { + (void)src->fStream->skip(byte_offset - src->current_offset); + } else { + src->fStream->rewind(); + (void)src->fStream->skip(byte_offset); + } + + src->current_offset = byte_offset; + src->next_input_byte = (const JOCTET*)src->fBuffer; + src->bytes_in_buffer = 0; + return true; +} +#endif + static boolean sk_fill_input_buffer(j_decompress_ptr cinfo) { skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; if (src->fDecoder != NULL && src->fDecoder->shouldCancelDecode()) { @@ -29,6 +56,9 @@ static boolean sk_fill_input_buffer(j_decompress_ptr cinfo) { return FALSE; } +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + src->current_offset += bytes; +#endif src->next_input_byte = (const JOCTET*)src->fBuffer; src->bytes_in_buffer = bytes; return TRUE; @@ -46,6 +76,9 @@ static void sk_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { cinfo->err->error_exit((j_common_ptr)cinfo); return; } +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + src->current_offset += bytes; +#endif bytesToSkip -= bytes; } src->next_input_byte = (const JOCTET*)src->fBuffer; @@ -74,40 +107,11 @@ static boolean sk_resync_to_restart(j_decompress_ptr cinfo, int desired) { static void sk_term_source(j_decompress_ptr /*cinfo*/) {} -#if 0 // UNUSED -static void skmem_init_source(j_decompress_ptr cinfo) { - skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; - src->next_input_byte = (const JOCTET*)src->fMemoryBase; - src->bytes_in_buffer = src->fMemoryBaseSize; -} - -static boolean skmem_fill_input_buffer(j_decompress_ptr cinfo) { - SkDebugf("xxxxxxxxxxxxxx skmem_fill_input_buffer called\n"); - return FALSE; -} - -static void skmem_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { - skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; -// SkDebugf("xxxxxxxxxxxxxx skmem_skip_input_data called %d\n", num_bytes); - src->next_input_byte = (const JOCTET*)((const char*)src->next_input_byte + num_bytes); - src->bytes_in_buffer -= num_bytes; -} - -static boolean skmem_resync_to_restart(j_decompress_ptr cinfo, int desired) { - SkDebugf("xxxxxxxxxxxxxx skmem_resync_to_restart called\n"); - return TRUE; -} - -static void skmem_term_source(j_decompress_ptr /*cinfo*/) {} -#endif - - /////////////////////////////////////////////////////////////////////////////// skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, bool ownStream) : fStream(stream) { fDecoder = decoder; - // const void* baseAddr = stream->getMemoryBase(); fMemoryBase = NULL; fUnrefStream = ownStream; fMemoryBaseSize = 0; @@ -117,6 +121,9 @@ skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, skip_input_data = sk_skip_input_data; resync_to_restart = sk_resync_to_restart; term_source = sk_term_source; +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + seek_input_data = sk_seek_input_data; +#endif // SkDebugf("**************** use memorybase %p %d\n", fMemoryBase, fMemoryBaseSize); } |