void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height, uint8_t* const dst, int dst_width, int dst_height, int dst_stride, int num_channels, int x_add, int x_sub, int y_add, int y_sub, int32_t* const work) { wrk->x_expand = (src_width < dst_width); wrk->src_width = src_width; wrk->src_height = src_height; wrk->dst_width = dst_width; wrk->dst_height = dst_height; wrk->dst = dst; wrk->dst_stride = dst_stride; wrk->num_channels = num_channels; // for 'x_expand', we use bilinear interpolation wrk->x_add = wrk->x_expand ? (x_sub - 1) : x_add - x_sub; wrk->x_sub = wrk->x_expand ? (x_add - 1) : x_sub; wrk->y_accum = y_add; wrk->y_add = y_add; wrk->y_sub = y_sub; wrk->fx_scale = (1 << WEBP_RESCALER_RFIX) / x_sub; wrk->fy_scale = (1 << WEBP_RESCALER_RFIX) / y_sub; wrk->fxy_scale = wrk->x_expand ? ((int64_t)dst_height << WEBP_RESCALER_RFIX) / (x_sub * src_height) : ((int64_t)dst_height << WEBP_RESCALER_RFIX) / (x_add * src_height); wrk->irow = work; wrk->frow = work + num_channels * dst_width; WebPRescalerDspInit(); }
void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height, uint8_t* const dst, int dst_width, int dst_height, int dst_stride, int num_channels, rescaler_t* const work) { const int x_add = src_width, x_sub = dst_width; const int y_add = src_height, y_sub = dst_height; wrk->x_expand = (src_width < dst_width); wrk->y_expand = (src_height < dst_height); wrk->src_width = src_width; wrk->src_height = src_height; wrk->dst_width = dst_width; wrk->dst_height = dst_height; wrk->src_y = 0; wrk->dst_y = 0; wrk->dst = dst; wrk->dst_stride = dst_stride; wrk->num_channels = num_channels; // for 'x_expand', we use bilinear interpolation wrk->x_add = wrk->x_expand ? (x_sub - 1) : x_add; wrk->x_sub = wrk->x_expand ? (x_add - 1) : x_sub; if (!wrk->x_expand) { // fx_scale is not used otherwise wrk->fx_scale = WEBP_RESCALER_FRAC(1, wrk->x_sub); } // vertical scaling parameters wrk->y_add = wrk->y_expand ? y_add - 1 : y_add; 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) { // this is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast. const uint64_t ratio = (uint64_t)dst_height * 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); // wrk->fxy_scale is unused here. } wrk->irow = work; wrk->frow = work + num_channels * dst_width; memset(work, 0, 2 * dst_width * num_channels * sizeof(*work)); WebPRescalerDspInit(); }
void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height, uint8_t* const dst, int dst_width, int dst_height, int dst_stride, int num_channels, rescaler_t* const work) { const int x_add = src_width, x_sub = dst_width; const int y_add = src_height, y_sub = dst_height; wrk->x_expand = (src_width < dst_width); wrk->y_expand = (src_height < dst_height); wrk->src_width = src_width; wrk->src_height = src_height; wrk->dst_width = dst_width; wrk->dst_height = dst_height; wrk->src_y = 0; wrk->dst_y = 0; wrk->dst = dst; wrk->dst_stride = dst_stride; wrk->num_channels = num_channels; // for 'x_expand', we use bilinear interpolation wrk->x_add = wrk->x_expand ? (x_sub - 1) : x_add; wrk->x_sub = wrk->x_expand ? (x_add - 1) : x_sub; if (!wrk->x_expand) { // fx_scale is not used otherwise wrk->fx_scale = WEBP_RESCALER_FRAC(1, wrk->x_sub); } // vertical scaling parameters wrk->y_add = wrk->y_expand ? y_add - 1 : y_add; 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); wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->y_sub); } else { wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->x_add); // wrk->fxy_scale is unused here. } wrk->irow = work; wrk->frow = work + num_channels * dst_width; memset(work, 0, 2 * dst_width * num_channels * sizeof(*work)); WebPRescalerDspInit(); }