Fix assertions in WebPRescalerExportRow()

Change-Id: I25711dd54e71c90a25f7b18e0ef9155e8151a15e
This commit is contained in:
Hui Su 2016-08-11 18:28:40 +00:00 committed by James Zern
parent 74f6f9e793
commit 27b5d991e2
2 changed files with 8 additions and 4 deletions

View File

@ -173,10 +173,10 @@ void WebPRescalerExportRow(WebPRescaler* const wrk) {
WebPRescalerExportRowExpand(wrk); WebPRescalerExportRowExpand(wrk);
} else if (wrk->fxy_scale) { } else if (wrk->fxy_scale) {
WebPRescalerExportRowShrink(wrk); WebPRescalerExportRowShrink(wrk);
} else { // very special case for src = dst = 1x1 } else { // special case
int i; int i;
assert(wrk->src_height == wrk->dst_height && wrk->x_add == 1);
assert(wrk->src_width == 1 && wrk->dst_width <= 2); assert(wrk->src_width == 1 && wrk->dst_width <= 2);
assert(wrk->src_height == 1 && wrk->dst_height == 1);
for (i = 0; i < wrk->num_channels * wrk->dst_width; ++i) { for (i = 0; i < wrk->num_channels * wrk->dst_width; ++i) {
wrk->dst[i] = wrk->irow[i]; wrk->dst[i] = wrk->irow[i];
wrk->irow[i] = 0; wrk->irow[i] = 0;

View File

@ -48,11 +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_sub = wrk->y_expand ? y_sub - 1 : y_sub;
wrk->y_accum = wrk->y_expand ? wrk->y_sub : wrk->y_add; wrk->y_accum = wrk->y_expand ? wrk->y_sub : wrk->y_add;
if (!wrk->y_expand) { if (!wrk->y_expand) {
// this is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast. // This is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast.
// Its value is <= WEBP_RESCALER_ONE, because dst_height <= wrk->y_add, and
// wrk->x_add >= 1;
const uint64_t ratio = const uint64_t ratio =
(uint64_t)dst_height * WEBP_RESCALER_ONE / (wrk->x_add * wrk->y_add); (uint64_t)dst_height * WEBP_RESCALER_ONE / (wrk->x_add * wrk->y_add);
if (ratio != (uint32_t)ratio) { if (ratio != (uint32_t)ratio) {
// We can't represent the ratio with the current fixed-point precision. // When ratio == WEBP_RESCALER_ONE, we can't represent the ratio with the
// current fixed-point precision. This happens when src_height ==
// wrk->y_add (which == src_height), and wrk->x_add == 1.
// => We special-case fxy_scale = 0, in WebPRescalerExportRow(). // => We special-case fxy_scale = 0, in WebPRescalerExportRow().
wrk->fxy_scale = 0; wrk->fxy_scale = 0;
} else { } else {