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 directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev