mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-28 07:30:26 +09:00
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:
parent
eae62ae8de
commit
bab68b2d88
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user