aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoseph Wen <josephwen@google.com>2010-09-09 11:18:26 +0800
committerJoseph Wen <josephwen@google.com>2010-09-09 14:23:51 +0800
commitea22e42026418b6b9919a94ff04930c978c4c777 (patch)
tree9eb704fe59baa90427c1e68c397da7c85a763a51 /src
parent5c51fb3a5a68fbed0ece985c6a0eb5c56a96a27f (diff)
downloadexternal_skia-ea22e42026418b6b9919a94ff04930c978c4c777.zip
external_skia-ea22e42026418b6b9919a94ff04930c978c4c777.tar.gz
external_skia-ea22e42026418b6b9919a94ff04930c978c4c777.tar.bz2
Fix bug in SkImageDecoder.buildTileIndex()
We can not determined the input SkStream length by getLength() Change-Id: I2c0420f4312736ec742da4af9b4315af3418e2c7
Diffstat (limited to 'src')
-rw-r--r--src/images/SkJpegUtility.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp
index aaf87db..a3a6bcd 100644
--- a/src/images/SkJpegUtility.cpp
+++ b/src/images/SkJpegUtility.cpp
@@ -134,12 +134,22 @@ skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder,
bool copyStream, bool ownStream) : fStream(stream) {
fDecoder = decoder;
const void* baseAddr = stream->getMemoryBase();
+ size_t bufferSize = 4096;
+ size_t len;
fMemoryBase = NULL;
fUnrefStream = ownStream;
if (copyStream) {
- fMemoryBaseSize = stream->getLength();
- fMemoryBase = sk_malloc_throw(fMemoryBaseSize);
- stream->read(fMemoryBase, fMemoryBaseSize);
+ fMemoryBaseSize = 0;
+ fMemoryBase = sk_malloc_throw(bufferSize);
+ while ((len = stream->read(fMemoryBase + fMemoryBaseSize,
+ bufferSize - fMemoryBaseSize)) != 0) {
+ fMemoryBaseSize += len;
+ if (fMemoryBaseSize == bufferSize) {
+ bufferSize *= 2;
+ fMemoryBase = sk_realloc_throw(fMemoryBase, bufferSize);
+ }
+ }
+ fMemoryBase = sk_realloc_throw(fMemoryBase, fMemoryBaseSize);
init_source = skmem_init_source;
fill_input_buffer = skmem_fill_input_buffer;