From 80c077d8ac198a23963277747bf8a52dc9e67cdf Mon Sep 17 00:00:00 2001
From: Ilyes Gouta <ilyes.gouta@st.com>
Date: Fri, 30 Mar 2012 09:47:36 +0100
Subject: [PATCH 2/4] directfb: update the utility functions to cope with
 DSPF_LUT4

---
 src/core/surface_buffer.c |   21 +++++++++++++++++++++
 src/misc/gfx_util.c       |   19 +++++++++++++++++++
 src/misc/util.c           |    2 ++
 3 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/src/core/surface_buffer.c b/src/core/surface_buffer.c
index 1cb73e0..0a4ef69 100644
--- a/src/core/surface_buffer.c
+++ b/src/core/surface_buffer.c
@@ -700,6 +700,7 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer,
 
      /* Check pixel format. */
      switch (buffer->format) {
+          case DSPF_LUT4:
           case DSPF_LUT8:
                palette = surface->palette;
 
@@ -883,6 +884,18 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer,
                          buf_p[n3+2] = palette->entries[src8[n]].b;
                     }
                }
+               else if (buffer->format == DSPF_LUT4) {
+                    for (n=0, n3=0; n<(surface->config.size.w>>1); n+=1, n3+=6) {
+                         int i = src8[n] & 0xf; /* 4 lsbs */
+                         buf_p[n3+0] = palette->entries[i].r;
+                         buf_p[n3+1] = palette->entries[i].g;
+                         buf_p[n3+2] = palette->entries[i].b;
+                         i = src8[n] >> 4; /* 4 msbs */
+                         buf_p[n3+3] = palette->entries[i].r;
+                         buf_p[n3+4] = palette->entries[i].g;
+                         buf_p[n3+5] = palette->entries[i].b;
+                    }
+               }
                else
                     dfb_convert_to_rgb24( buffer->format, src8, lock.pitch, surface->config.size.h,
                                           buf_p, surface->config.size.w * 3, surface->config.size.w, 1 );
@@ -901,6 +914,14 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer,
                     for (n=0; n<surface->config.size.w; n++)
                          buf_g[n] = palette->entries[src8[n]].a;
                }
+               else if (buffer->format == DSPF_LUT4) {
+                    for (n=0; n<(surface->config.size.w>>1); n++) {
+                         int i = src8[n] & 0xf; /* 4 lsbs */
+                         buf_g[2 * n] = palette->entries[i].a;
+                         i = src8[n] >> 4; /* 4 msbs */
+                         buf_g[2 * n + 1] = palette->entries[i].a;
+                    }
+               }
                else
                     dfb_convert_to_a8( buffer->format, src8, lock.pitch, surface->config.size.h,
                                        buf_g, surface->config.size.w, surface->config.size.w, 1 );
diff --git a/src/misc/gfx_util.c b/src/misc/gfx_util.c
index 1575f29..a7d3b5c 100644
--- a/src/misc/gfx_util.c
+++ b/src/misc/gfx_util.c
@@ -277,6 +277,25 @@ static void write_argb_span (u32 *src, u8 *dst[], int len,
                     ((u32*)d)[i] = src[i] ^ 0xff000000;
                break;
 
+          case DSPF_LUT4:
+               if (palette) {
+                    for (i = 0; i < len; i += 2) {
+                         u8 pixel = 0;
+                         pixel = dfb_palette_search( palette,
+                                                     (src[i] >> 16) & 0xff,
+                                                     (src[i] >>  8) & 0xff,
+                                                     (src[i]      ) & 0xff,
+                                                     (src[i] >> 24) & 0xff );
+                         pixel |= (dfb_palette_search( palette,
+                                                       (src[i + 1] >> 16) & 0xff,
+                                                       (src[i + 1] >>  8) & 0xff,
+                                                       (src[i + 1]      ) & 0xff,
+                                                       (src[i + 1] >> 24) & 0xff )) << 4;
+                         d[i] = pixel;
+                    }
+               }
+               break;
+
           case DSPF_LUT8:
                if (palette) {
                     for (i = 0; i < len; i++) {
diff --git a/src/misc/util.c b/src/misc/util.c
index 2fbefed..9ad9670 100644
--- a/src/misc/util.c
+++ b/src/misc/util.c
@@ -464,6 +464,8 @@ dfb_pixelformat_for_depth( int depth )
      switch (depth) {
           case 2:
                return DSPF_LUT2;
+          case 4:
+               return DSPF_LUT4;
           case 8:
                return DSPF_LUT8;
           case 12:
-- 
1.7.4.4

