| Index: third_party/libwebp/dec/alpha.c
|
| diff --git a/third_party/libwebp/dec/alpha.c b/third_party/libwebp/dec/alpha.c
|
| index 93729a035f1897290098656a3c42e17277a45ac7..f23ba7d6a68254ec5f6c1beb511ec02a252041a6 100644
|
| --- a/third_party/libwebp/dec/alpha.c
|
| +++ b/third_party/libwebp/dec/alpha.c
|
| @@ -16,13 +16,14 @@
|
| #include "./vp8i.h"
|
| #include "./vp8li.h"
|
| #include "../utils/quant_levels_dec.h"
|
| +#include "../utils/utils.h"
|
| #include "../webp/format_constants.h"
|
|
|
| //------------------------------------------------------------------------------
|
| // ALPHDecoder object.
|
|
|
| ALPHDecoder* ALPHNew(void) {
|
| - ALPHDecoder* const dec = (ALPHDecoder*)calloc(1, sizeof(*dec));
|
| + ALPHDecoder* const dec = (ALPHDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec));
|
| return dec;
|
| }
|
|
|
| @@ -30,7 +31,7 @@ void ALPHDelete(ALPHDecoder* const dec) {
|
| if (dec != NULL) {
|
| VP8LDelete(dec->vp8l_dec_);
|
| dec->vp8l_dec_ = NULL;
|
| - free(dec);
|
| + WebPSafeFree(dec);
|
| }
|
| }
|
|
|
| @@ -107,12 +108,6 @@ static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
|
| unfilter_func(width, height, width, row, num_rows, output);
|
| }
|
|
|
| - if (alph_dec->pre_processing_ == ALPHA_PREPROCESSED_LEVELS) {
|
| - if (!DequantizeLevels(output, width, height, row, num_rows)) {
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| if (row + num_rows == dec->pic_hdr_.height_) {
|
| dec->is_alpha_decoded_ = 1;
|
| }
|
| @@ -142,12 +137,22 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
|
| dec->alph_dec_ = NULL;
|
| return NULL;
|
| }
|
| + // if we allowed use of alpha dithering, check whether it's needed at all
|
| + if (dec->alph_dec_->pre_processing_ != ALPHA_PREPROCESSED_LEVELS) {
|
| + dec->alpha_dithering_ = 0; // disable dithering
|
| + } else {
|
| + num_rows = height; // decode everything in one pass
|
| + }
|
| }
|
|
|
| if (!dec->is_alpha_decoded_) {
|
| int ok = 0;
|
| assert(dec->alph_dec_ != NULL);
|
| ok = ALPHDecode(dec, row, num_rows);
|
| + if (ok && dec->alpha_dithering_ > 0) {
|
| + ok = WebPDequantizeLevels(dec->alpha_plane_, width, height,
|
| + dec->alpha_dithering_);
|
| + }
|
| if (!ok || dec->is_alpha_decoded_) {
|
| ALPHDelete(dec->alph_dec_);
|
| dec->alph_dec_ = NULL;
|
| @@ -158,4 +163,3 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
|
| // Return a pointer to the current decoded row.
|
| return dec->alpha_plane_ + row * width;
|
| }
|
| -
|
|
|