Index: third_party/libwebp/dec/webp.c |
diff --git a/third_party/libwebp/dec/webp.c b/third_party/libwebp/dec/webp.c |
index b8eb9993b6bee8de39b8369f48866f5216640615..78220433777f69f12d11d84f428f0ee964ab4c1c 100644 |
--- a/third_party/libwebp/dec/webp.c |
+++ b/third_party/libwebp/dec/webp.c |
@@ -16,6 +16,7 @@ |
#include "./vp8i.h" |
#include "./vp8li.h" |
#include "./webpi.h" |
+#include "../utils/utils.h" |
#include "../webp/mux_types.h" // ALPHA_FLAG |
//------------------------------------------------------------------------------ |
@@ -43,14 +44,6 @@ |
// All sizes are in little-endian order. |
// Note: chunk data size must be padded to multiple of 2 when written. |
-static WEBP_INLINE uint32_t get_le24(const uint8_t* const data) { |
- return data[0] | (data[1] << 8) | (data[2] << 16); |
-} |
- |
-static WEBP_INLINE uint32_t get_le32(const uint8_t* const data) { |
- return (uint32_t)get_le24(data) | (data[3] << 24); |
-} |
- |
// Validates the RIFF container (if detected) and skips over it. |
// If a RIFF container is detected, returns: |
// VP8_STATUS_BITSTREAM_ERROR for invalid header, |
@@ -70,7 +63,7 @@ static VP8StatusCode ParseRIFF(const uint8_t** const data, |
if (memcmp(*data + 8, "WEBP", TAG_SIZE)) { |
return VP8_STATUS_BITSTREAM_ERROR; // Wrong image file signature. |
} else { |
- const uint32_t size = get_le32(*data + TAG_SIZE); |
+ const uint32_t size = GetLE32(*data + TAG_SIZE); |
// Check that we have at least one chunk (i.e "WEBP" + "VP8?nnnn"). |
if (size < TAG_SIZE + CHUNK_HEADER_SIZE) { |
return VP8_STATUS_BITSTREAM_ERROR; |
@@ -116,7 +109,7 @@ static VP8StatusCode ParseVP8X(const uint8_t** const data, |
if (!memcmp(*data, "VP8X", TAG_SIZE)) { |
int width, height; |
uint32_t flags; |
- const uint32_t chunk_size = get_le32(*data + TAG_SIZE); |
+ const uint32_t chunk_size = GetLE32(*data + TAG_SIZE); |
if (chunk_size != VP8X_CHUNK_SIZE) { |
return VP8_STATUS_BITSTREAM_ERROR; // Wrong chunk size. |
} |
@@ -125,9 +118,9 @@ static VP8StatusCode ParseVP8X(const uint8_t** const data, |
if (*data_size < vp8x_size) { |
return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. |
} |
- flags = get_le32(*data + 8); |
- width = 1 + get_le24(*data + 12); |
- height = 1 + get_le24(*data + 15); |
+ flags = GetLE32(*data + 8); |
+ width = 1 + GetLE24(*data + 12); |
+ height = 1 + GetLE24(*data + 15); |
if (width * (uint64_t)height >= MAX_IMAGE_AREA) { |
return VP8_STATUS_BITSTREAM_ERROR; // image is too large |
} |
@@ -181,7 +174,7 @@ static VP8StatusCode ParseOptionalChunks(const uint8_t** const data, |
return VP8_STATUS_NOT_ENOUGH_DATA; |
} |
- chunk_size = get_le32(buf + TAG_SIZE); |
+ chunk_size = GetLE32(buf + TAG_SIZE); |
if (chunk_size > MAX_CHUNK_PAYLOAD) { |
return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size. |
} |
@@ -247,7 +240,7 @@ static VP8StatusCode ParseVP8Header(const uint8_t** const data_ptr, |
if (is_vp8 || is_vp8l) { |
// Bitstream contains VP8/VP8L header. |
- const uint32_t size = get_le32(data + TAG_SIZE); |
+ const uint32_t size = GetLE32(data + TAG_SIZE); |
if ((riff_size >= minimal_size) && (size > riff_size - minimal_size)) { |
return VP8_STATUS_BITSTREAM_ERROR; // Inconsistent size information. |
} |
@@ -509,11 +502,9 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size, |
WebPFreeDecBuffer(params->output); |
} |
-#if WEBP_DECODER_ABI_VERSION > 0x0203 |
if (params->options != NULL && params->options->flip) { |
status = WebPFlipBuffer(params->output); |
} |
-#endif |
return status; |
} |
@@ -796,11 +787,13 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options, |
// Scaling |
io->use_scaling = (options != NULL) && (options->use_scaling > 0); |
if (io->use_scaling) { |
- if (options->scaled_width <= 0 || options->scaled_height <= 0) { |
+ int scaled_width = options->scaled_width; |
+ int scaled_height = options->scaled_height; |
+ if (!WebPRescalerGetScaledDimensions(w, h, &scaled_width, &scaled_height)) { |
return 0; |
} |
- io->scaled_width = options->scaled_width; |
- io->scaled_height = options->scaled_height; |
+ io->scaled_width = scaled_width; |
+ io->scaled_height = scaled_height; |
} |
// Filter |