| Index: src/images/SkImageDecoder_libwebp.cpp
|
| diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp
|
| index 4691d0d13eefd3a419edfd99d75b3f7b8ff9c610..9f1116e5d5bbbd51c8e168f12d8db99d585f07f6 100644
|
| --- a/src/images/SkImageDecoder_libwebp.cpp
|
| +++ b/src/images/SkImageDecoder_libwebp.cpp
|
| @@ -60,16 +60,24 @@ static const size_t WEBP_IDECODE_BUFFER_SZ = (1 << 16);
|
| // Parse headers of RIFF container, and check for valid Webp (VP8) content.
|
| static bool webp_parse_header(SkStream* stream, int* width, int* height, int* alpha) {
|
| unsigned char buffer[WEBP_VP8_HEADER_SIZE];
|
| - const uint32_t contentSize = stream->getLength();
|
| - const size_t len = stream->read(buffer, WEBP_VP8_HEADER_SIZE);
|
| - const uint32_t read_bytes =
|
| - (contentSize < WEBP_VP8_HEADER_SIZE) ? contentSize : WEBP_VP8_HEADER_SIZE;
|
| - if (len != read_bytes) {
|
| - return false; // can't read enough
|
| - }
|
| + size_t bytesToRead = WEBP_VP8_HEADER_SIZE;
|
| + size_t totalBytesRead = 0;
|
| + do {
|
| + unsigned char* dst = buffer + totalBytesRead;
|
| + const size_t bytesRead = stream->read(dst, bytesToRead);
|
| + if (0 == bytesRead) {
|
| + // Could not read any bytes. Check to see if we are at the end (exit
|
| + // condition), and continue reading if not. Important for streams
|
| + // that do not have all the data ready.
|
| + continue;
|
| + }
|
| + bytesToRead -= bytesRead;
|
| + totalBytesRead += bytesRead;
|
| + SkASSERT(bytesToRead + totalBytesRead == WEBP_VP8_HEADER_SIZE);
|
| + } while (!stream->isAtEnd() && bytesToRead > 0);
|
|
|
| WebPBitstreamFeatures features;
|
| - VP8StatusCode status = WebPGetFeatures(buffer, read_bytes, &features);
|
| + VP8StatusCode status = WebPGetFeatures(buffer, totalBytesRead, &features);
|
| if (VP8_STATUS_OK != status) {
|
| return false; // Invalid WebP file.
|
| }
|
| @@ -192,9 +200,8 @@ static bool webp_idecode(SkStream* stream, WebPDecoderConfig* config) {
|
| }
|
|
|
| stream->rewind();
|
| - const uint32_t contentSize = stream->getLength();
|
| - const uint32_t readBufferSize = (contentSize < WEBP_IDECODE_BUFFER_SZ) ?
|
| - contentSize : WEBP_IDECODE_BUFFER_SZ;
|
| + const size_t readBufferSize = stream->hasLength() ?
|
| + SkTMin(stream->getLength(), WEBP_IDECODE_BUFFER_SZ) : WEBP_IDECODE_BUFFER_SZ;
|
| SkAutoMalloc srcStorage(readBufferSize);
|
| unsigned char* input = (uint8_t*)srcStorage.get();
|
| if (NULL == input) {
|
|
|