Index: src/images/SkJpegUtility.cpp |
diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp |
index 19db0186d27fd392f9c58605b9d6d4f127de88f1..89a0472380b444118e422e28ee2e9aaea8c5d891 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); |
} |