video: bmp: Support rgba8888 pixel format
Adding the support for RGBA8888 format for BMP decoding.
Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com>
Signed-off-by: Michal Simek <michal.simek@amd.com>
Link: https://lore.kernel.org/r/322910eb24692f6140a001796501270eb1c53d9a.1684312924.git.michal.simek@amd.com
diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c
index 47e52c4..45f003c 100644
--- a/drivers/video/video_bmp.c
+++ b/drivers/video/video_bmp.c
@@ -43,6 +43,18 @@
}
/**
+ * get_bmp_col_rgba8888() - Convert a colour-table entry into a rgba8888 pixel value
+ *
+ * Return: value to write to the rgba8888 frame buffer for this palette entry
+ */
+static u32 get_bmp_col_rgba8888(struct bmp_color_table_entry *cte)
+{
+ return ((cte->red) |
+ (cte->green << 8U) |
+ (cte->blue << 16U) | 0xff << 24U);
+}
+
+/**
* write_pix8() - Write a pixel from a BMP image into the framebuffer
*
* This handles frame buffers with 8, 16, 24 or 32 bits per pixel
@@ -71,6 +83,8 @@
*fb++ = cte->blue;
} else if (eformat == VIDEO_X2R10G10B10) {
*(u32 *)fb = get_bmp_col_x2r10g10b10(cte);
+ } else if (eformat == VIDEO_RGBA8888) {
+ *(u32 *)fb = get_bmp_col_rgba8888(cte);
} else {
*fb++ = cte->blue;
*fb++ = cte->green;
@@ -382,6 +396,17 @@
*fb++ = (pix >> 8) & 0xff;
*fb++ = (pix >> 16) & 0xff;
*fb++ = pix >> 24;
+ } else if (eformat == VIDEO_RGBA8888) {
+ u32 pix;
+
+ pix = *bmap++ << 8U; /* blue */
+ pix |= *bmap++ << 16U; /* green */
+ pix |= *bmap++ << 24U; /* red */
+
+ *fb++ = (pix >> 24) & 0xff;
+ *fb++ = (pix >> 16) & 0xff;
+ *fb++ = (pix >> 8) & 0xff;
+ *fb++ = 0xff;
} else {
*fb++ = *bmap++;
*fb++ = *bmap++;
@@ -409,6 +434,17 @@
*fb++ = (pix >> 8) & 0xff;
*fb++ = (pix >> 16) & 0xff;
*fb++ = pix >> 24;
+ } else if (eformat == VIDEO_RGBA8888) {
+ u32 pix;
+
+ pix = *bmap++ << 8U; /* blue */
+ pix |= *bmap++ << 16U; /* green */
+ pix |= *bmap++ << 24U; /* red */
+ bmap++;
+ *fb++ = (pix >> 24) & 0xff;
+ *fb++ = (pix >> 16) & 0xff;
+ *fb++ = (pix >> 8) & 0xff;
+ *fb++ = 0xff; /* opacity */
} else {
*fb++ = *bmap++;
*fb++ = *bmap++;