From patchwork Wed Jun 10 09:52:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 242040 List-Id: U-Boot discussion From: ye.li at nxp.com (Ye Li) Date: Wed, 10 Jun 2020 02:52:23 -0700 Subject: [PATCH] video: bmp: Support 8bits BMP to 24/32 bits display In-Reply-To: <1591782743-22846-1-git-send-email-ye.li@nxp.com> References: <1591782743-22846-1-git-send-email-ye.li@nxp.com> Message-ID: <1591782743-22846-3-git-send-email-ye.li@nxp.com> Update video bmp codes to support 8 bits BMP to 32 bits conversion so that we can display 8 bits logo on 24 bits or 32 bits display Signed-off-by: Ye Li Reviewed-by: Jagan Teki Tested-by: Jagan Teki # bpi-m1+, bpi-m64 --- drivers/video/video_bmp.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index eb96365..283e699 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -233,6 +233,8 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, */ if (bpix != bmp_bpix && !(bmp_bpix == 8 && bpix == 16) && + !(bmp_bpix == 8 && bpix == 24) && + !(bmp_bpix == 8 && bpix == 32) && !(bmp_bpix == 24 && bpix == 16) && !(bmp_bpix == 24 && bpix == 32)) { printf("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", @@ -265,6 +267,7 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, switch (bmp_bpix) { case 1: case 8: { + struct bmp_color_table_entry *cte; cmap_base = priv->cmap; #ifdef CONFIG_VIDEO_BMP_RLE8 u32 compression = get_unaligned_le32(&bmp->header.compression); @@ -281,20 +284,39 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, } #endif - if (bpix != 16) + if (bpix == 8) byte_width = width; - else + else if (bpix == 16) byte_width = width * 2; + else if (bpix == 24) + byte_width = width * 3; + else /* 32 */ + byte_width = width * 4; for (i = 0; i < height; ++i) { WATCHDOG_RESET(); for (j = 0; j < width; j++) { - if (bpix != 16) { + if (bpix == 8) { fb_put_byte(&fb, &bmap); - } else { + } else if (bpix == 16) { *(uint16_t *)fb = cmap_base[*bmap]; bmap++; fb += sizeof(uint16_t) / sizeof(*fb); + } else if (bpix == 24) { + /* Only support big endian */ + cte = &palette[*bmap]; + bmap++; + *(fb++) = cte->red; + *(fb++) = cte->green; + *(fb++) = cte->blue; + } else if (bpix == 32) { + /* Only support big endian */ + cte = &palette[*bmap]; + bmap++; + *(fb++) = cte->blue; + *(fb++) = cte->green; + *(fb++) = cte->red; + *(fb++) = 0; } } bmap += (padded_width - width);