From: Ilyes Gouta <[email protected]>
---
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
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev