Chromium Code Reviews| Index: src/codec/SkWebpCodec.cpp |
| diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp |
| index b02015c7a7684ca10ae9ce802762c104feab954a..7299d14cc248a2b8546c9de993e9fe2cfd3c1e22 100644 |
| --- a/src/codec/SkWebpCodec.cpp |
| +++ b/src/codec/SkWebpCodec.cpp |
| @@ -18,6 +18,7 @@ |
| // 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" |
| bool SkWebpCodec::IsWebp(SkStream* stream) { |
| @@ -43,15 +44,31 @@ static bool webp_parse_header(SkStream* stream, SkImageInfo* info) { |
| return false; |
| } |
| - WebPBitstreamFeatures features; |
| - VP8StatusCode status = WebPGetFeatures(buffer, WEBP_VP8_HEADER_SIZE, &features); |
| - if (VP8_STATUS_OK != status) { |
| - return false; // Invalid WebP file. |
| + WebPData demuxData = { buffer, WEBP_VP8_HEADER_SIZE }; |
| + WebPDemuxState demuxState; |
| + WebPDemuxer* demuxer = WebPDemuxPartial(&demuxData, &demuxState); |
| + if (!demuxer) { |
| + return false; |
| } |
| + SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> autoDeleter(demuxer); |
| + switch (demuxState) { |
| + case WEBP_DEMUX_PARSE_ERROR: |
| + case WEBP_DEMUX_PARSING_HEADER: |
| + return false; |
| + default: |
| + // Header parsed. |
| + break; |
| + } |
| + |
| + uint32_t width = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_WIDTH); |
| + uint32_t height = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_HEIGHT); |
| + uint32_t formatFlags = WebPDemuxGetI(demuxer, WEBP_FF_FORMAT_FLAGS); |
| + bool hasAlpha = SkToBool(formatFlags & ALPHA_FLAG) ? 1 : 0; |
|
msarett
2015/06/19 12:07:46
Can this be simpler?
bool hasAlpha = SkToBool(form
scroggo
2015/06/19 18:59:58
Lol yes. This was copied from SkImageDecoder_libwe
|
| + |
| // sanity check for image size that's about to be decoded. |
| { |
| - const int64_t size = sk_64_mul(features.width, features.height); |
| + const int64_t size = sk_64_mul(width, height); |
| if (!sk_64_isS32(size)) { |
| return false; |
| } |
| @@ -66,9 +83,9 @@ static bool webp_parse_header(SkStream* stream, SkImageInfo* info) { |
| // Is unpremul the right type? Clients of SkImageGenerator may assume it's the |
| // best type, when Skia currently cannot draw unpremul (and raster is faster |
| // with premul). |
| - *info = SkImageInfo::Make(features.width, features.height, kN32_SkColorType, |
| - SkToBool(features.has_alpha) ? kUnpremul_SkAlphaType |
| - : kOpaque_SkAlphaType); |
| + *info = SkImageInfo::Make(width, height, kN32_SkColorType, |
| + hasAlpha ? kUnpremul_SkAlphaType |
| + : kOpaque_SkAlphaType); |
| } |
| return true; |
| } |