Index: src/images/SkImageDecoder_libwebp.cpp |
diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp |
index a7c9610d07ad0d7313406dd79d9a644cede5b22f..5b5e73e1a0b91bb5a34fbf95794ee820f9d9a11e 100644 |
--- a/src/images/SkImageDecoder_libwebp.cpp |
+++ b/src/images/SkImageDecoder_libwebp.cpp |
@@ -33,6 +33,7 @@ extern "C" { |
// If moving libwebp out of skia source tree, path for webp headers must be |
// updated accordingly. Here, we enforce using local copy in webp sub-directory. |
#include "webp/decode.h" |
+#include "webp/demux.h" |
#include "webp/encode.h" |
} |
@@ -67,14 +68,27 @@ static bool webp_parse_header(SkStream* stream, int* width, int* height, int* al |
SkASSERT(bytesToRead + totalBytesRead == WEBP_VP8_HEADER_SIZE); |
} while (!stream->isAtEnd() && bytesToRead > 0); |
- WebPBitstreamFeatures features; |
- VP8StatusCode status = WebPGetFeatures(buffer, totalBytesRead, &features); |
- if (VP8_STATUS_OK != status) { |
- return false; // Invalid WebP file. |
+ WebPData demuxData = { buffer, totalBytesRead }; |
+ WebPDemuxState demuxState; |
+ WebPDemuxer* demuxer = WebPDemuxPartial(&demuxData, &demuxState); |
+ if (!demuxer) { |
+ return false; |
} |
- *width = features.width; |
- *height = features.height; |
- *alpha = features.has_alpha; |
+ |
+ SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> autoDeleter(demuxer); |
+ switch (demuxState) { |
+ case WEBP_DEMUX_PARSE_ERROR: |
+ case WEBP_DEMUX_PARSING_HEADER: |
+ return false; |
+ default: |
+ // Header parsed. |
+ break; |
+ } |
+ |
+ *width = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_WIDTH); |
+ *height = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_HEIGHT); |
+ uint32_t format_flags = WebPDemuxGetI(demuxer, WEBP_FF_FORMAT_FLAGS); |
+ *alpha = SkToBool(format_flags & ALPHA_FLAG) ? 1 : 0; |
// sanity check for image size that's about to be decoded. |
{ |