summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--payloads/libpayload/drivers/video/graphics.c31
-rw-r--r--payloads/libpayload/include/cbgfx.h19
2 files changed, 50 insertions, 0 deletions
diff --git a/payloads/libpayload/drivers/video/graphics.c b/payloads/libpayload/drivers/video/graphics.c
index b4cdcdea69e8..52c003511cf5 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 54d395395ac0..4ab49430759b 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);