diff --git a/payloads/libpayload/drivers/video/graphics.c b/payloads/libpayload/drivers/video/graphics.c index b4cdcdea69..52c003511c 100644 --- a/payloads/libpayload/drivers/video/graphics.c +++ b/payloads/libpayload/drivers/video/graphics.c @@ -611,3 +611,34 @@ int draw_bitmap_direct(const void *bitmap, size_t size, return draw_bitmap_v3(top_left, &scale, &dim, &dim, &header, palette, pixel_array); } + +int get_bitmap_dimension(const void *bitmap, size_t sz, struct scale *dim_rel) +{ + struct bitmap_header_v3 header; + const struct bitmap_palette_element_v3 *palette; + const uint8_t *pixel_array; + struct vector dim, dim_org; + int rv; + + if (cbgfx_init()) + return CBGFX_ERROR_INIT; + + /* Only v3 is supported now */ + rv = parse_bitmap_header_v3(bitmap, sz, + &header, &palette, &pixel_array, &dim_org); + if (rv) + return rv; + + /* Calculate height and width of the image */ + rv = calculate_dimension(&dim_org, dim_rel, &dim); + if (rv) + return rv; + + /* Calculate size relative to the canvas */ + dim_rel->x.n = dim.width; + dim_rel->x.d = canvas.size.width; + dim_rel->y.n = dim.height; + dim_rel->y.d = canvas.size.height; + + return CBGFX_SUCCESS; +} diff --git a/payloads/libpayload/include/cbgfx.h b/payloads/libpayload/include/cbgfx.h index 54d395395a..4ab4943075 100644 --- a/payloads/libpayload/include/cbgfx.h +++ b/payloads/libpayload/include/cbgfx.h @@ -148,3 +148,22 @@ int draw_bitmap(const void *bitmap, size_t size, */ int draw_bitmap_direct(const void *bitmap, size_t size, const struct vector *top_left); + +/** + * Get width and height of projected image + * + * @param[in] bitmap Pointer to the bitmap data, starting from file header + * @param[in] sz Size of the bitmap data + * @param[i/o] dim_rel Width and height of the image relative to the canvas + * width and height. They must not exceed 1 (=100%). + * On return, it contains automatically calculated width + * and/or height. + * + * @return CBGFX_* error codes + * + * It returns the width and height of the projected image. If the input height + * is zero, it's derived from the input width to keep the aspect ratio, and vice + * versa. If both are zero, the width and the height which can project the image + * in the original size are returned. + */ +int get_bitmap_dimension(const void *bitmap, size_t sz, struct scale *dim_rel);