| Index: third_party/libwebp/dec/frame.c
|
| diff --git a/third_party/libwebp/dec/frame.c b/third_party/libwebp/dec/frame.c
|
| index b882133eabbc002b6f1e2aa3b80858ba054aed33..22d291d2cd8a0b3f451aed8f1acb2d154890efbf 100644
|
| --- a/third_party/libwebp/dec/frame.c
|
| +++ b/third_party/libwebp/dec/frame.c
|
| @@ -316,6 +316,9 @@ static void PrecomputeFilterStrengths(VP8Decoder* const dec) {
|
| //------------------------------------------------------------------------------
|
| // Dithering
|
|
|
| +// minimal amp that will provide a non-zero dithering effect
|
| +#define MIN_DITHER_AMP 4
|
| +
|
| #define DITHER_AMP_TAB_SIZE 12
|
| static const int kQuantToDitherAmp[DITHER_AMP_TAB_SIZE] = {
|
| // roughly, it's dqm->uv_mat_[1]
|
| @@ -356,27 +359,14 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
|
| }
|
| }
|
|
|
| -// minimal amp that will provide a non-zero dithering effect
|
| -#define MIN_DITHER_AMP 4
|
| -#define DITHER_DESCALE 4
|
| -#define DITHER_DESCALE_ROUNDER (1 << (DITHER_DESCALE - 1))
|
| -#define DITHER_AMP_BITS 8
|
| -#define DITHER_AMP_CENTER (1 << DITHER_AMP_BITS)
|
| -
|
| +// Convert to range: [-2,2] for dither=50, [-4,4] for dither=100
|
| static void Dither8x8(VP8Random* const rg, uint8_t* dst, int bps, int amp) {
|
| - int i, j;
|
| - for (j = 0; j < 8; ++j) {
|
| - for (i = 0; i < 8; ++i) {
|
| - // TODO: could be made faster with SSE2
|
| - const int bits =
|
| - VP8RandomBits2(rg, DITHER_AMP_BITS + 1, amp) - DITHER_AMP_CENTER;
|
| - // Convert to range: [-2,2] for dither=50, [-4,4] for dither=100
|
| - const int delta = (bits + DITHER_DESCALE_ROUNDER) >> DITHER_DESCALE;
|
| - const int v = (int)dst[i] + delta;
|
| - dst[i] = (v < 0) ? 0 : (v > 255) ? 255u : (uint8_t)v;
|
| - }
|
| - dst += bps;
|
| + uint8_t dither[64];
|
| + int i;
|
| + for (i = 0; i < 8 * 8; ++i) {
|
| + dither[i] = VP8RandomBits2(rg, VP8_DITHER_AMP_BITS + 1, amp);
|
| }
|
| + VP8DitherCombine8x8(dither, dst, bps);
|
| }
|
|
|
| static void DitherRow(VP8Decoder* const dec) {
|
| @@ -462,7 +452,7 @@ static int FinishRow(VP8Decoder* const dec, VP8Io* const io) {
|
| if (dec->alpha_data_ != NULL && y_start < y_end) {
|
| // TODO(skal): testing presence of alpha with dec->alpha_data_ is not a
|
| // good idea.
|
| - io->a = VP8DecompressAlphaRows(dec, y_start, y_end - y_start);
|
| + io->a = VP8DecompressAlphaRows(dec, io, y_start, y_end - y_start);
|
| if (io->a == NULL) {
|
| return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR,
|
| "Could not decode alpha data.");
|
|
|