From: Antonio Ospite Date: Thu, 15 Mar 2012 13:05:25 +0000 (+0100) Subject: am7xxx: add am7xxx_calc_scaled_image_dimensions() X-Git-Tag: v0.1.0~1^2~16 X-Git-Url: https://git.ao2.it/libam7xxx.git/commitdiff_plain/323d6d0521ae5a60d046df5945e076e7d07211ca?ds=sidebyside;hp=a2b087687a00a0b9b810f33e67b388a4496a6cdb am7xxx: add am7xxx_calc_scaled_image_dimensions() This function is useful to calculate the dimensions of an image which will be sent with am7xxx_send_image() in a way that keeps the original image aspect ratio. --- diff --git a/src/am7xxx.c b/src/am7xxx.c index f04b638..a840589 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -690,6 +690,68 @@ int am7xxx_get_device_info(am7xxx_device *dev, return 0; } +int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev, + unsigned int upscale, + unsigned int original_width, + unsigned int original_height, + unsigned int *scaled_width, + unsigned int *scaled_height) +{ + + am7xxx_device_info device_info; + float width_ratio; + float height_ratio; + int ret; + + ret = am7xxx_get_device_info(dev, &device_info); + if (ret < 0) { + error(dev->ctx, "cannot get device info\n"); + return ret; + } + + /* + * Check if we need to rescale; if the input image fits the native + * dimensions there is no need to, unless we want to upscale. + */ + if (!upscale && + original_width <= device_info.native_width && + original_height <= device_info.native_height ) { + debug(dev->ctx, "CASE 0, no rescaling, the original image fits already\n"); + *scaled_width = original_width; + *scaled_height = original_height; + return 0; + } + + /* Input dimensions relative to the device native dimensions */ + width_ratio = (float)original_width / device_info.native_width; + height_ratio = (float)original_height / device_info.native_height; + + if (width_ratio > height_ratio) { + /* + * The input is proportionally "wider" than the device viewport + * so it's height needs to be adjusted + */ + debug(dev->ctx, "CASE 1, original image wider, adjust the scaled height\n"); + *scaled_width = device_info.native_width; + *scaled_height = (unsigned int)(original_height / width_ratio); + } else if (width_ratio < height_ratio) { + /* + * The input is proportionally "taller" than the device viewport + * so its width needs to be adjusted + */ + debug(dev->ctx, "CASE 2 original image taller, adjust the scaled width\n"); + *scaled_width = (unsigned int)(original_width / height_ratio); + *scaled_height = device_info.native_height; + } else { + debug(dev->ctx, "CASE 3, just rescale, same aspect ratio already\n"); + *scaled_width = device_info.native_width; + *scaled_height = device_info.native_height; + } + debug(dev->ctx, "scaled dimensions: %dx%d\n", *scaled_width, *scaled_height); + + return 0; +} + int am7xxx_send_image(am7xxx_device *dev, am7xxx_image_format format, unsigned int width, diff --git a/src/am7xxx.h b/src/am7xxx.h index 4fe9b00..79d960a 100644 --- a/src/am7xxx.h +++ b/src/am7xxx.h @@ -179,6 +179,28 @@ int am7xxx_get_device_info(am7xxx_device *dev, am7xxx_device_info *device_info); /** + * Calculate the dimensions of an image to be shown on an am7xxx device. + * + * Before sending images bigger than the device native dimensions the user + * needs to rescale them, this utility function does the calculation in a way + * that the original image aspect ratio is preserved. + * + * @param[in] dev A pointer to the structure representing the device to get info of + * @param[in] upscale Whether to calculate scaled dimensions for images smaller than the native dimesions + * @param[in] original_width The width of the original image + * @param[in] original_height The height of the original image + * @param[out] scaled_width The width the rescaled image should have + * @param[out] scaled_height The height the rescaled image should have + * + * @return 0 on success, a negative value on error + */ +int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev, + unsigned int upscale, + unsigned int original_width, + unsigned int original_height, + unsigned int *scaled_width, + unsigned int *scaled_height); +/** * Send an image for display on a am7xxx device. * * This is the function that actually makes the device display something.