video: bmp: support 8bits BMP drawing on 24/32 bpp framebuffer

Update video bmp code so that we can display 8 bits logo on
24 or 32 bpp framebuffer.

Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
Tested-by: Jagan Teki <jagan@amarulasolutions.com> # bpi-m1+, bpi-m64
This commit is contained in:
Ye Li 2020-06-10 02:52:23 -07:00 committed by Anatolij Gustschin
parent eae62ae8de
commit bab68b2d88

View File

@ -233,6 +233,8 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
*/ */
if (bpix != bmp_bpix && if (bpix != bmp_bpix &&
!(bmp_bpix == 8 && bpix == 16) && !(bmp_bpix == 8 && bpix == 16) &&
!(bmp_bpix == 8 && bpix == 24) &&
!(bmp_bpix == 8 && bpix == 32) &&
!(bmp_bpix == 24 && bpix == 16) && !(bmp_bpix == 24 && bpix == 16) &&
!(bmp_bpix == 24 && bpix == 32)) { !(bmp_bpix == 24 && bpix == 32)) {
printf("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", 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) { switch (bmp_bpix) {
case 1: case 1:
case 8: { case 8: {
struct bmp_color_table_entry *cte;
cmap_base = priv->cmap; cmap_base = priv->cmap;
#ifdef CONFIG_VIDEO_BMP_RLE8 #ifdef CONFIG_VIDEO_BMP_RLE8
u32 compression = get_unaligned_le32(&bmp->header.compression); u32 compression = get_unaligned_le32(&bmp->header.compression);
@ -280,21 +283,33 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
break; break;
} }
#endif #endif
byte_width = width * (bpix / 8);
if (bpix != 16) if (!byte_width)
byte_width = width; byte_width = width;
else
byte_width = width * 2;
for (i = 0; i < height; ++i) { for (i = 0; i < height; ++i) {
WATCHDOG_RESET(); WATCHDOG_RESET();
for (j = 0; j < width; j++) { for (j = 0; j < width; j++) {
if (bpix != 16) { if (bpix == 8) {
fb_put_byte(&fb, &bmap); fb_put_byte(&fb, &bmap);
} else { } else if (bpix == 16) {
*(uint16_t *)fb = cmap_base[*bmap]; *(uint16_t *)fb = cmap_base[*bmap];
bmap++; bmap++;
fb += sizeof(uint16_t) / sizeof(*fb); fb += sizeof(uint16_t) / sizeof(*fb);
} else {
/* Only support big endian */
cte = &palette[*bmap];
bmap++;
if (bpix == 24) {
*(fb++) = cte->red;
*(fb++) = cte->green;
*(fb++) = cte->blue;
} else {
*(fb++) = cte->blue;
*(fb++) = cte->green;
*(fb++) = cte->red;
*(fb++) = 0;
}
} }
} }
bmap += (padded_width - width); bmap += (padded_width - width);