From: Ilyes Gouta <ilyes.go...@st.com>

---
 src/core/surface.c        |   21 +++++++++++++++++++++
 src/core/surface_buffer.c |   21 +++++++++++++++++++++
 src/misc/gfx_util.c       |   19 +++++++++++++++++++
 src/misc/util.c           |    2 ++
 4 files changed, 63 insertions(+)

diff --git a/src/core/surface.c b/src/core/surface.c
index 50434a2..8b52779 100644
--- a/src/core/surface.c
+++ b/src/core/surface.c
@@ -1321,6 +1321,7 @@ dfb_surface_dump_buffer2( CoreSurface           *surface,
 
      /* Check pixel format. */
      switch (lock.buffer->format) {
+          case DSPF_LUT4:
           case DSPF_LUT8:
                palette = surface->palette;
 
@@ -1500,6 +1501,18 @@ dfb_surface_dump_buffer2( CoreSurface           *surface,
                          buf_p[n3+2] = palette->entries[src8[n]].b;
                     }
                }
+               else if (lock.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( lock.buffer->format, src8, 
lock.pitch, surface->config.size.h,
                                           buf_p, surface->config.size.w * 3, 
surface->config.size.w, 1 );
@@ -1518,6 +1531,14 @@ dfb_surface_dump_buffer2( CoreSurface           *surface,
                     for (n=0; n<surface->config.size.w; n++)
                          buf_g[n] = palette->entries[src8[n]].a;
                }
+               else if (lock.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( lock.buffer->format, src8, lock.pitch, 
surface->config.size.h,
                                        buf_g, surface->config.size.w, 
surface->config.size.w, 1 );
diff --git a/src/core/surface_buffer.c b/src/core/surface_buffer.c
index f1979d6..b118e79 100644
--- a/src/core/surface_buffer.c
+++ b/src/core/surface_buffer.c
@@ -701,6 +701,7 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer,
 
      /* Check pixel format. */
      switch (buffer->format) {
+          case DSPF_LUT4:
           case DSPF_LUT8:
                palette = surface->palette;
 
@@ -886,6 +887,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 );
@@ -905,6 +918,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 2e76018..916247d 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.9.5

_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to