diff options
author | Joseph Wen <josephwen@google.com> | 2010-09-09 11:18:26 +0800 |
---|---|---|
committer | Joseph Wen <josephwen@google.com> | 2010-09-09 14:23:51 +0800 |
commit | ea22e42026418b6b9919a94ff04930c978c4c777 (patch) | |
tree | 9eb704fe59baa90427c1e68c397da7c85a763a51 /src | |
parent | 5c51fb3a5a68fbed0ece985c6a0eb5c56a96a27f (diff) | |
download | external_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.cpp | 16 |
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; |