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