Marco Cavallini [KOAN] wrote:
> 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
Gratias ago!
You're almost there outside of the software rendering code :)
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
=======> Correct.
+ /* 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" } \
};
=======> File is generated automatically :)
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
=======> Correct, but shouldn't be separate.
+ 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
=======> Shouldn't this be different from RGB24?
Anyhow, I think we can do a direct_memcpy() here :)
+ 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) {
Wait, looking at the RGB24 case, should this be endianness dependent?
case DSPF_RGB24:
for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) {
#ifdef WORDS_BIGENDIAN
buf_p[n3+0] = data8[n3+0];
buf_p[n3+1] = data8[n3+1];
buf_p[n3+2] = data8[n3+2];
#else
buf_p[n3+0] = data8[n3+2];
buf_p[n3+1] = data8[n3+1];
buf_p[n3+2] = data8[n3+0];
#endif
}
break;
RGB24 is weird. Does anybody know which is the real standard byte order and
endianness dependency?
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;
+
=======> RGB24/BGR24 depending on architecture or endianness?
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 );
=======> Same comment as for dfb_surface_buffer_dump().
+ 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);
=======> dito
+ 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";
=======> We should make the function use an array and pixel format indices, but
that's a different story :)
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 },
=======> Most common mistake, this needs to stay sorted!
{ "RGB32", DSPF_RGB32 },
{ "RGB332", DSPF_RGB332 },
{ "RGB444", DSPF_RGB444 },
{ "RGB555", DSPF_RGB555 },
{ "UYVY", DSPF_UYVY },
{ "YUY2", DSPF_YUY2 },
- { "YV12", DSPF_YV12 },
+ { "YV12", DSPF_YV12 }
};
=======> One more perfectionist :-)
#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") ;
+
+
=======> Looks like you had problems due to the unsorted array :)
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;
+
=======> If image loading works, this is fine.
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)
=======> What does fbset -i tell you?
+ 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
=======> Looks good.
+ 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;
=======> Same as for RGB24?
+ }
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;
=======> dito
+ }
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;
=======> Any packed 24 bit expert out there?
+
case DSPF_RGB16:
pixel = *(u16*)(data + 2 * wx +
pitch * wy);
=======> src/gfx/generic/generic.c :-)
--
Best regards,
Denis Oliver Kropp
.------------------------------------------.
| DirectFB - Hardware accelerated graphics |
| http://www.directfb.org/ |
"------------------------------------------"
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev