video: cfb_console: add support for 4bpp bitmaps with GDF_32BIT_X888RGB
authorTimur Tabi <timur@freescale.com>
Mon, 23 Aug 2010 21:58:00 +0000 (16:58 -0500)
committerAnatolij Gustschin <agust@denx.de>
Tue, 21 Sep 2010 20:44:59 +0000 (22:44 +0200)
Add support for 4bpp bitmaps, currently only for GDF_32BIT_X888RGB
frame buffer format.

Signed-off-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
drivers/video/cfb_console.c

index fae54177cb40757f3b8529aabe3c665a08cb0805..268bacf2323706c996f9803a13994d2c59a215be 100644 (file)
@@ -1114,8 +1114,44 @@ int video_display_bitmap (ulong bmp_image, int x, int y)
        }
 #endif
 
-       /* We handle only 8bpp or 24 bpp bitmap */
+       /* We handle only 4, 8, or 24 bpp bitmaps */
        switch (le16_to_cpu (bmp->header.bit_count)) {
+       case 4:
+               padded_line -= width / 2;
+               ycount = height;
+
+               switch (VIDEO_DATA_FORMAT) {
+               case GDF_32BIT_X888RGB:
+                       while (ycount--) {
+                               WATCHDOG_RESET ();
+                               /*
+                                * Don't assume that 'width' is an
+                                * even number
+                                */
+                               for (xcount = 0; xcount < width; xcount++) {
+                                       uchar idx;
+
+                                       if (xcount & 1) {
+                                               idx = *bmap & 0xF;
+                                               bmap++;
+                                       } else
+                                               idx = *bmap >> 4;
+                                       cte = bmp->color_table[idx];
+                                       FILL_32BIT_X888RGB(cte.red, cte.green,
+                                                          cte.blue);
+                               }
+                               bmap += padded_line;
+                               fb -= (VIDEO_VISIBLE_COLS + width) *
+                                     VIDEO_PIXEL_SIZE;
+                       }
+                       break;
+               default:
+                       puts("4bpp bitmap unsupported with current "
+                            "video mode\n");
+                       break;
+               }
+               break;
+
        case 8:
                padded_line -= width;
                if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) {