From 9f226bf8c3da517c6c671badbb67518ac98b054a Mon Sep 17 00:00:00 2001 From: Pascal Massimino Date: Tue, 6 Oct 2015 00:15:18 -0700 Subject: [PATCH] rescaler: better handling of the fxy_scale=0 special case. Change-Id: I1d1852d989519d40e672995be4f08706265271f5 --- src/utils/rescaler.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils/rescaler.c b/src/utils/rescaler.c index 78e26837..a0c5898c 100644 --- a/src/utils/rescaler.c +++ b/src/utils/rescaler.c @@ -48,9 +48,15 @@ void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height, wrk->y_sub = wrk->y_expand ? y_sub - 1 : y_sub; wrk->y_accum = wrk->y_expand ? wrk->y_sub : wrk->y_add; if (!wrk->y_expand) { - // note the very special case where x_add = y_add = 1 cannot be represented. - // We special-case fxy_scale = 0 in this case, in WebPRescalerExportRow(). - wrk->fxy_scale = WEBP_RESCALER_FRAC(dst_height, wrk->x_add * wrk->y_add); + // this is WEBP_RESCALER_FRAC(1, x_add * y_add) without the cast. + const uint64_t ratio = WEBP_RESCALER_ONE / (wrk->x_add * wrk->y_add); + if (ratio != (uint32_t)ratio) { + // We can't represent the ratio with the current fixed-point precision. + // => We special-case fxy_scale = 0, in WebPRescalerExportRow(). + wrk->fxy_scale = 0; + } else { + wrk->fxy_scale = (uint32_t)ratio; + } wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->y_sub); } else { wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->x_add);