From b9187242802279fdcf910e91bda2e82d6c0ca6cf Mon Sep 17 00:00:00 2001 From: James Zern Date: Thu, 13 Aug 2015 20:50:38 -0700 Subject: [PATCH] utils/rescaler: add WebPRescalerGetScaledDimensions + use it in WebPPictureRescale() Change-Id: I491bea8cd56f0eb1ac8bf0829b9f36c77804219a --- src/enc/picture_rescale.c | 12 +++--------- src/utils/rescaler.c | 28 ++++++++++++++++++++++++++++ src/utils/rescaler.h | 8 ++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/enc/picture_rescale.c b/src/enc/picture_rescale.c index 60339ac8..633d1dd6 100644 --- a/src/enc/picture_rescale.c +++ b/src/enc/picture_rescale.c @@ -211,16 +211,10 @@ int WebPPictureRescale(WebPPicture* pic, int width, int height) { if (pic == NULL) return 0; prev_width = pic->width; prev_height = pic->height; - // if width is unspecified, scale original proportionally to height ratio. - if (width == 0) { - width = (prev_width * height + prev_height / 2) / prev_height; + if (!WebPRescalerGetScaledDimensions( + prev_width, prev_height, &width, &height)) { + return 0; } - // if height is unspecified, scale original proportionally to width ratio. - if (height == 0) { - height = (prev_height * width + prev_width / 2) / prev_width; - } - // Check if the overall dimensions still make sense. - if (width <= 0 || height <= 0) return 0; PictureGrabSpecs(pic, &tmp); tmp.width = width; diff --git a/src/utils/rescaler.c b/src/utils/rescaler.c index ffb5f575..375cc549 100644 --- a/src/utils/rescaler.c +++ b/src/utils/rescaler.c @@ -50,6 +50,34 @@ void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height, WebPRescalerDspInit(); } +int WebPRescalerGetScaledDimensions(int src_width, int src_height, + int* const scaled_width, + int* const scaled_height) { + assert(scaled_width != NULL); + assert(scaled_height != NULL); + { + int width = *scaled_width; + int height = *scaled_height; + + // if width is unspecified, scale original proportionally to height ratio. + if (width == 0) { + width = (src_width * height + src_height / 2) / src_height; + } + // if height is unspecified, scale original proportionally to width ratio. + if (height == 0) { + height = (src_height * width + src_width / 2) / src_width; + } + // Check if the overall dimensions still make sense. + if (width <= 0 || height <= 0) { + return 0; + } + + *scaled_width = width; + *scaled_height = height; + return 1; + } +} + //------------------------------------------------------------------------------ // all-in-one calls diff --git a/src/utils/rescaler.h b/src/utils/rescaler.h index 42a544d0..b85eae56 100644 --- a/src/utils/rescaler.h +++ b/src/utils/rescaler.h @@ -48,6 +48,14 @@ void WebPRescalerInit(WebPRescaler* const rescaler, int num_channels, int32_t* const work); +// If either 'scaled_width' or 'scaled_height' (but not both) is 0 the value +// will be calculated preserving the aspect ratio, otherwise the values are +// left unmodified. Returns true on success, false if either value is 0 after +// performing the scaling calculation. +int WebPRescalerGetScaledDimensions(int src_width, int src_height, + int* const scaled_width, + int* const scaled_height); + // Returns the number of input lines needed next to produce one output line, // considering that the maximum available input lines are 'max_num_lines'. int WebPRescaleNeededLines(const WebPRescaler* const rescaler,