[U-Boot] [PATCH 4/6] fsl_diu_fb.c: add support for RLE8 bitmaps

Anatolij Gustschin agust at denx.de
Tue Feb 23 23:37:08 CET 2010


Allow displaying run length encoded bitmaps.

Signed-off-by: Anatolij Gustschin <agust at denx.de>
---
 board/freescale/common/fsl_diu_fb.c |   78 +++++++++++++++++++++++++++++++++++
 1 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/board/freescale/common/fsl_diu_fb.c b/board/freescale/common/fsl_diu_fb.c
index 2fc878b..d7c55b5 100644
--- a/board/freescale/common/fsl_diu_fb.c
+++ b/board/freescale/common/fsl_diu_fb.c
@@ -26,6 +26,7 @@
 #include <common.h>
 #include <i2c.h>
 #include <malloc.h>
+#include <bmp_layout.h>
 
 #include "fsl_diu_fb.h"
 
@@ -464,6 +465,78 @@ static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
 	return 0;
 }
 
+int display_rle8_bitmap(unsigned char *bmp, unsigned int *palette,
+			int yoff, int xoff)
+{
+	struct fb_info *info = &fsl_fb_info;
+	bmp_header_t *im = (bmp_header_t *)bmp;
+	unsigned char *bm;
+	unsigned int *fbp;
+	unsigned int cnt;
+	int decode = 1;
+	int x, y, bpp, i;
+
+	x = 0;
+	y = __le32_to_cpu(im->height) - 1;
+	bpp = info->var.bits_per_pixel / 8;
+	fbp = (unsigned int *) ((unsigned int)info->screen_base +
+				(((y + yoff) * info->var.xres) + xoff) * bpp);
+	bm = bmp + __le32_to_cpu(im->data_offset);
+
+	while (decode) {
+		switch (bm[0]) {
+		case 0:
+			switch (bm[1]) {
+			case 0:
+				/* scan line end marker */
+				bm += 2;
+				x = 0;
+				y--;
+				fbp = (unsigned int *)
+					((unsigned int)info->screen_base +
+					 (((y + yoff) * info->var.xres) +
+					  xoff) * bpp);
+				continue;
+			case 1:
+				/* end of bitmap data marker */
+				decode = 0;
+				break;
+			case 2:
+				/* run offset marker */
+				x += bm[2];
+				y -= bm[3];
+				fbp = (unsigned int *)
+					((unsigned int)info->screen_base +
+					 (((y + yoff) * info->var.xres) +
+					  x + xoff) * bpp);
+				bm += 4;
+				break;
+			default:
+				/* unencoded run */
+				cnt = bm[1];
+				bm += 2;
+				for (i = 0; i < cnt; i++) {
+					*fbp++ = palette[bm[0]];
+					bm++;
+					x++;
+				}
+				if (cnt & 1)
+					bm++;
+			}
+			break;
+		default:
+			/* encoded run */
+			for (i = 0; i < bm[0]; i++) {
+				*fbp++ = palette[bm[1]];
+				x++;
+			}
+			bm += 2;
+			break;
+		}
+	}
+	return __le32_to_cpu(im->height);
+}
+
 int fsl_diu_display_bmp(unsigned char *bmp,
 			int xoffset,
 			int yoffset,
@@ -544,6 +617,11 @@ int fsl_diu_display_bmp(unsigned char *bmp,
 		}
 		break;
 	case 8:
+		if (bmp[30] == BMP_BI_RLE8) {
+			return display_rle8_bitmap(bmp, palette, yoffset,
+						   xoffset);
+		}
+
 		for (y = height - 1; y >= 0; y--) {
 			fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp);
 			for (x = 0; x < width; x++) {
-- 
1.6.3.3



More information about the U-Boot mailing list