Attached my temporary DirectFB-1.1.1 patch for BGR24 color support for
board based on AT91SAM9263 cpu
Work is in progress and and I'm still facing to some errors so any
comment or help would be greatly appreciated.
TIA
Cordiali Saluti / Kindest Regards / mit freundlichen Grüssen
--
Marco Cavallini | KOAN sas | Bergamo - Italia
embedded and real-time software engineering
Phone:+39-035-255.235 - Fax:+39-178-22.39.748
http://www.KoanSoftware.com
Meet us @ Embedded World 2008 - Nurenberg
February 26-28, 2008 Hall 11 - 224
diff -urNp DirectFB-1.1.1-orig/include/directfb.h DirectFB-1.1.1-bgr24/include/directfb.h
--- DirectFB-1.1.1-orig/include/directfb.h 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/include/directfb.h 2008-02-08 14:40:51.000000000 +0100
@@ -1121,12 +1121,17 @@ typedef enum {
DSPF_RGB444 = DFB_SURFACE_PIXELFORMAT( 26, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
/* 16 bit RGB (2 byte, nothing @15, red [EMAIL PROTECTED], green [EMAIL PROTECTED], blue [EMAIL PROTECTED]) */
- DSPF_RGB555 = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 )
+ DSPF_RGB555 = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
+
+ // TODO : verify
+ /* 24 bit BGR (3 byte, blue [EMAIL PROTECTED], green [EMAIL PROTECTED], red [EMAIL PROTECTED]) */
+ DSPF_BGR24 = DFB_SURFACE_PIXELFORMAT( 28, 24, 0, 0, 0, 3, 0, 0, 0, 0, 0 )
+
} DFBSurfacePixelFormat;
/* Number of pixelformats defined */
-#define DFB_NUM_PIXELFORMATS 28
+#define DFB_NUM_PIXELFORMATS 29 // was 28
/* These macros extract information about the pixel format. */
#define DFB_PIXELFORMAT_INDEX(fmt) (((fmt) & 0x0000007F) )
diff -urNp DirectFB-1.1.1-orig/include/directfb_strings.h DirectFB-1.1.1-bgr24/include/directfb_strings.h
--- DirectFB-1.1.1-orig/include/directfb_strings.h 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/include/directfb_strings.h 2008-02-08 11:35:30.000000000 +0100
@@ -33,6 +33,7 @@
{ DSPF_LUT2, "LUT2" }, \
{ DSPF_RGB444, "RGB444" }, \
{ DSPF_RGB555, "RGB555" }, \
+ { DSPF_BGR24, "BGR24" }, \
{ DSPF_UNKNOWN, "UNKNOWN" } \
};
diff -urNp DirectFB-1.1.1-orig/src/core/surface_buffer.c DirectFB-1.1.1-bgr24/src/core/surface_buffer.c
--- DirectFB-1.1.1-orig/src/core/surface_buffer.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/core/surface_buffer.c 2008-02-08 11:35:30.000000000 +0100
@@ -628,6 +628,11 @@ dfb_surface_buffer_dump( CoreSurfaceBuff
rgb = true;
break;
+ // TODO : verify
+ case DSPF_BGR24:
+ rgb = true;
+ break;
+
default:
D_ERROR( "DirectFB/core/surfaces: surface dump for format "
"'%s' is not implemented!\n",
@@ -875,6 +880,12 @@ dfb_surface_buffer_dump( CoreSurfaceBuff
buf_p[n3+2] = data8[n3+0];
#endif
}
+ case DSPF_BGR24: // TODO : verify
+ for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
+ buf_p[n3+0] = data8[n3+2];
+ buf_p[n3+1] = data8[n3+1];
+ buf_p[n3+2] = data8[n3+0];
+ }
break;
case DSPF_RGB32:
for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
diff -urNp DirectFB-1.1.1-orig/src/gfx/convert.c DirectFB-1.1.1-bgr24/src/gfx/convert.c
--- DirectFB-1.1.1-orig/src/gfx/convert.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/gfx/convert.c 2008-02-08 11:35:30.000000000 +0100
@@ -65,6 +65,9 @@ dfb_pixelformat_for_depth( int depth )
return DSPF_RGB18;
case 24:
return DSPF_RGB24;
+
+// TODO add DSPF_BGR24;
+
case 32:
return DSPF_RGB32;
}
@@ -106,6 +109,9 @@ dfb_color_to_pixel( DFBSurfacePixelForma
case DSPF_ARGB6666:
pixel = PIXEL_RGB18( r, g, b );
break;
+ case DSPF_BGR24: // TODO : complete this
+ pixel = PIXEL_RGB32( r, g, b );
+ break;
case DSPF_RGB24:
case DSPF_RGB32:
case DSPF_ARGB:
@@ -188,6 +194,12 @@ dfb_pixel_to_color( DFBSurfacePixelForma
ret_color->b = (pixel & 0x0000ff);
break;
+ case DSPF_BGR24: // TODO : complete this
+ ret_color->r = (pixel & 0xff0000) >> 16;
+ ret_color->g = (pixel & 0x00ff00) >> 8;
+ ret_color->b = (pixel & 0x0000ff);
+ break;
+
case DSPF_AiRGB:
ret_color->a = (pixel >> 24) ^ 0xff;
ret_color->r = (pixel & 0xff0000) >> 16;
@@ -224,6 +236,9 @@ dfb_pixelformat_name( DFBSurfacePixelFor
case DSPF_RGB24:
return "RGB24";
+ case DSPF_BGR24:
+ return "BGR24";
+
case DSPF_RGB32:
return "RGB32";
diff -urNp DirectFB-1.1.1-orig/src/idirectfb.c DirectFB-1.1.1-bgr24/src/idirectfb.c
--- DirectFB-1.1.1-orig/src/idirectfb.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/idirectfb.c 2008-02-08 11:35:30.000000000 +0100
@@ -493,6 +493,7 @@ IDirectFB_CreateSurface( IDirectFB
case DSPF_RGB16:
case DSPF_RGB18:
case DSPF_RGB24:
+ case DSPF_BGR24:
case DSPF_RGB32:
case DSPF_RGB332:
case DSPF_UYVY:
diff -urNp DirectFB-1.1.1-orig/src/misc/conf.c DirectFB-1.1.1-bgr24/src/misc/conf.c
--- DirectFB-1.1.1-orig/src/misc/conf.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/misc/conf.c 2008-02-09 18:02:30.000000000 +0100
@@ -200,13 +200,14 @@ static const FormatString format_strings
{ "RGB16", DSPF_RGB16 },
{ "RGB18", DSPF_RGB18 },
{ "RGB24", DSPF_RGB24 },
+ { "BGR24", DSPF_BGR24 },
{ "RGB32", DSPF_RGB32 },
{ "RGB332", DSPF_RGB332 },
{ "RGB444", DSPF_RGB444 },
{ "RGB555", DSPF_RGB555 },
{ "UYVY", DSPF_UYVY },
{ "YUY2", DSPF_YUY2 },
- { "YV12", DSPF_YV12 },
+ { "YV12", DSPF_YV12 }
};
#define NUM_FORMAT_STRINGS D_ARRAY_SIZE(format_strings)
@@ -247,6 +248,10 @@ dfb_config_parse_pixelformat( const char
format_string = bsearch( format, format_strings,
NUM_FORMAT_STRINGS, sizeof(FormatString),
format_string_compare );
+
+printf("Parsing |%s| = %d\n", format, format_string ? "OK" : "Fail") ;
+
+
if (!format_string)
return DSPF_UNKNOWN;
diff -urNp DirectFB-1.1.1-orig/src/misc/gfx_util.c DirectFB-1.1.1-bgr24/src/misc/gfx_util.c
--- DirectFB-1.1.1-orig/src/misc/gfx_util.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/src/misc/gfx_util.c 2008-02-08 11:35:30.000000000 +0100
@@ -190,6 +190,14 @@ static void write_argb_span (u32 *src, u
}
break;
+ case DSPF_BGR24: // TODO: verify
+ for (i = 0; i < len; i++) {
+ *d++ = src[i];
+ *d++ = src[i] >> 8;
+ *d++ = src[i] >> 16;
+ }
+ break;
+
case DSPF_RGB32:
case DSPF_ARGB:
direct_memcpy( d, src, len*4 );
diff -urNp DirectFB-1.1.1-orig/systems/fbdev/fbdev.c DirectFB-1.1.1-bgr24/systems/fbdev/fbdev.c
--- DirectFB-1.1.1-orig/systems/fbdev/fbdev.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/systems/fbdev/fbdev.c 2008-02-09 11:49:32.000000000 +0100
@@ -1505,9 +1505,11 @@ static DFBSurfacePixelFormat dfb_fbdev_g
break;
case 24:
- if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 0, 16, 8, 0 ))
+ if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 0, 16, 8, 0 ))
return DSPF_RGB24;
-
+ if (dfb_fbdev_compatible_format( var, 0, 8, 8, 8, 8, 16, 0, 0 )) // BGR24 (MCK)
+ printf("(MCK) modified DSPF_RGB24 / DSPF_BGR24\n") ;
+ return DSPF_BGR24;
break;
case 32:
@@ -1749,6 +1751,16 @@ dfb_fbdev_set_mode( CoreSurface
case DSPF_RGB332:
break;
+ case DSPF_BGR24:
+ // TODO : verify colors here
+ var.red.length = 8;
+ var.green.length = 8;
+ var.blue.length = 8;
+ var.red.offset = 0;
+ var.green.offset = 8;
+ var.blue.offset = 16;
+ break;
+
case DSPF_ARGB1666:
var.transp.length = 1;
var.red.length = 6;
@@ -2078,6 +2090,7 @@ static DFBResult dfb_fbdev_set_gamma_ram
blue_size = 32;
break;
case DSPF_RGB24:
+ case DSPF_BGR24:
case DSPF_RGB32:
case DSPF_ARGB:
red_size = 256;
diff -urNp DirectFB-1.1.1-orig/tools/directfb-csource.c DirectFB-1.1.1-bgr24/tools/directfb-csource.c
--- DirectFB-1.1.1-orig/tools/directfb-csource.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/tools/directfb-csource.c 2008-02-08 14:49:03.000000000 +0100
@@ -63,7 +63,8 @@ static struct {
{ DSPF_RGB16, "RGB16" },
{ DSPF_RGB332, "RGB332" },
{ DSPF_A8, "A8" },
- { DSPF_LUT8, "LUT8" }
+ { DSPF_LUT8, "LUT8" },
+ { DSPF_BGR24, "BGR24" }
};
static int n_pixelformats = D_ARRAY_SIZE( pixelformats );
@@ -362,6 +363,10 @@ static DFBResult load_image (const char
png_set_strip_alpha (png_ptr);
src_format = DSPF_RGB24;
}
+ else if (dest_format == DSPF_BGR24) { // TODO : verify and complete
+ png_set_strip_alpha (png_ptr);
+ src_format = DSPF_BGR24;
+ }
break;
}
diff -urNp DirectFB-1.1.1-orig/tools/mkdfiff.c DirectFB-1.1.1-bgr24/tools/mkdfiff.c
--- DirectFB-1.1.1-orig/tools/mkdfiff.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/tools/mkdfiff.c 2008-02-08 11:35:30.000000000 +0100
@@ -156,6 +156,10 @@ load_image (const char *filen
png_set_strip_alpha (png_ptr);
src_format = DSPF_RGB24;
}
+ else if (dest_format == DSPF_BGR24) { // TODO : verify and complete
+ png_set_strip_alpha (png_ptr);
+ src_format = DSPF_BGR24;
+ }
break;
}
diff -urNp DirectFB-1.1.1-orig/wm/default/default.c DirectFB-1.1.1-bgr24/wm/default/default.c
--- DirectFB-1.1.1-orig/wm/default/default.c 2008-01-18 21:29:37.000000000 +0100
+++ DirectFB-1.1.1-bgr24/wm/default/default.c 2008-02-08 11:35:30.000000000 +0100
@@ -494,6 +494,11 @@ window_at_pointer( CoreWindowStack *stac
#endif
break;
+ case DSPF_BGR24: // TODO: complete
+ p = (data + 3 * wx + pitch * wy);
+ pixel = (p[2] << 16) | (p[1] << 8) | p[0];
+ break;
+
case DSPF_RGB16:
pixel = *(u16*)(data + 2 * wx +
pitch * wy);
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev