Hi list, I wrote a patch to add the BGR555 pixel format but I still have blue and red swapped... I based my work on RGB555.
Could you tell me what is wrong, please? Should I modify something else? What about the *.dfiff format ? Regards, Guillaume
diff -purN ./DirectFB-1.1.1/include/directfb.h ./DirectFB-1.1.1_modifie/include/directfb.h --- ./DirectFB-1.1.1/include/directfb.h 2007-12-15 13:30:28.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/include/directfb.h 2008-04-08 14:49:52.000000000 +0200 @@ -1121,12 +1121,15 @@ 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 ), + + /* 16 bit BGR (2 byte, nothing @15, blue [EMAIL PROTECTED], green [EMAIL PROTECTED], red [EMAIL PROTECTED]) */ + DSPF_BGR555 = DFB_SURFACE_PIXELFORMAT( 28, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 ) } DFBSurfacePixelFormat; /* Number of pixelformats defined */ -#define DFB_NUM_PIXELFORMATS 28 +#define DFB_NUM_PIXELFORMATS 29 /* These macros extract information about the pixel format. */ #define DFB_PIXELFORMAT_INDEX(fmt) (((fmt) & 0x0000007F) ) diff -purN ./DirectFB-1.1.1/src/core/surface_buffer.c ./DirectFB-1.1.1_modifie/src/core/surface_buffer.c --- ./DirectFB-1.1.1/src/core/surface_buffer.c 2007-12-15 13:30:28.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/core/surface_buffer.c 2008-04-08 14:58:20.000000000 +0200 @@ -628,6 +628,9 @@ dfb_surface_buffer_dump( CoreSurfaceBuff rgb = true; break; + case DSPF_BGR555: + rgb = true; // TEST false; + default: D_ERROR( "DirectFB/core/surfaces: surface dump for format " "'%s' is not implemented!\n", @@ -810,6 +813,14 @@ dfb_surface_buffer_dump( CoreSurfaceBuff } break; + case DSPF_BGR555: // Test + for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) { + buf_p[n3+2] = (data16[n] & 0x7C00) >> 7; + buf_p[n3+1] = (data16[n] & 0x03E0) >> 2; + buf_p[n3+0] = (data16[n] & 0x001F) << 3; + } + break; + case DSPF_ARGB2554: for (n=0, n3=0; n<surface->config.size.w; n++, n3+=3) { buf_p[n3+0] = (data16[n] & 0x3E00) >> 6; diff -purN ./DirectFB-1.1.1/src/gfx/convert.c ./DirectFB-1.1.1_modifie/src/gfx/convert.c --- ./DirectFB-1.1.1/src/gfx/convert.c 2007-08-14 18:59:50.000000000 +0200 +++ ./DirectFB-1.1.1_modifie/src/gfx/convert.c 2008-04-08 13:50:09.000000000 +0200 @@ -89,6 +89,9 @@ dfb_color_to_pixel( DFBSurfacePixelForma case DSPF_RGB555: pixel = PIXEL_RGB555( r, g, b ); break; + case DSPF_BGR555: // Test + pixel = PIXEL_BGR555( r, g, b ); + break; case DSPF_ARGB2554: pixel = PIXEL_ARGB2554( 0, r, g, b ); break; @@ -158,6 +161,12 @@ dfb_pixel_to_color( DFBSurfacePixelForma ret_color->b = EXPAND_5to8( (pixel & 0x001f) ); break; + case DSPF_BGR555: // Test + ret_color->b = EXPAND_5to8( (pixel & 0x7c00) >> 10 ); + ret_color->g = EXPAND_5to8( (pixel & 0x03e0) >> 5 ); + ret_color->r = EXPAND_5to8( (pixel & 0x001f) ); + break; + case DSPF_ARGB2554: ret_color->a = EXPAND_2to8( pixel >> 14 ); ret_color->r = EXPAND_5to8( (pixel & 0x3e00) >> 9 ); @@ -215,6 +224,9 @@ dfb_pixelformat_name( DFBSurfacePixelFor case DSPF_RGB555: return "RGB555"; + case DSPF_BGR555: // Test + return "BGR555"; + case DSPF_RGB16: return "RGB16"; diff -purN ./DirectFB-1.1.1/src/gfx/convert.h ./DirectFB-1.1.1_modifie/src/gfx/convert.h --- ./DirectFB-1.1.1/src/gfx/convert.h 2007-12-15 13:30:28.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/gfx/convert.h 2008-04-08 15:24:14.000000000 +0200 @@ -50,6 +50,10 @@ (((g)&0xF8) << 2) | \ (((b)&0xF8) >> 3) ) +#define PIXEL_BGR555(r,g,b) ( (((b)&0xF8) << 7) | \ + (((g)&0xF8) << 2) | \ + (((r)&0xF8) >> 3) ) + #define PIXEL_ARGB2554(a,r,g,b)( (((a)&0xC0) << 8) | \ (((r)&0xF8) << 6) | \ (((g)&0xF8) << 1) | \ @@ -200,6 +204,10 @@ (((pixel) & 0x07C0) >> 1) | \ (((pixel) & 0x001F)) ) +#define RGB16_TO_BGR555(pixel) ( (((pixel) & 0xF800) >> 12) | \ + (((pixel) & 0x07C0) >> 1) | \ + (((pixel) & 0x001F) << 10 ) ) + #define RGB16_TO_RGB444(pixel) ( (((pixel) & 0xF000) >> 4) | \ (((pixel) & 0x0780) >> 3) | \ (((pixel) & 0x001F) >> 1) ) @@ -244,6 +252,10 @@ (((pixel) & 0x00F800) >> 6) | \ (((pixel) & 0x0000F8) >> 3) ) +#define RGB32_TO_BGR555(pixel) ( (((pixel) & 0xF80000) >> 19) | \ + (((pixel) & 0x00F800) >> 6) | \ + (((pixel) & 0x0000F8) << 7) ) + #define RGB32_TO_RGB444(pixel) ( (((pixel) & 0xF00000) >> 12) | \ (((pixel) & 0x00F000) >> 8) | \ (((pixel) & 0x0000F0) >> 4) ) @@ -270,6 +282,10 @@ #define ARGB_TO_RGB555(pixel) ( (((pixel) & 0x00F80000) >> 9) | \ (((pixel) & 0x0000F800) >> 6) | \ (((pixel) & 0x000000F8) >> 3) ) + +#define ARGB_TO_BGR555(pixel) ( (((pixel) & 0x00F80000) >> 19) | \ + (((pixel) & 0x0000F800) >> 6) | \ + (((pixel) & 0x000000F8) << 7) ) /* RGB <-> YCbCr conversion */ extern const u16 y_for_rgb[256]; @@ -478,6 +494,18 @@ dfb_convert_to_rgb16( DFBSurfacePixelFor } break; + case DSPF_BGR555: // Test + while (height--) { + src16 = src; + + for (x=0; x<width; x++) + dst[x] = ((src16[x] & 0x7c00) >> 10) | ((src16[x] & 0x03e0) << 1) | ((src16[x] & 0x001f) << 11 ); + + src += spitch; + dst += dp2; + } + break; + case DSPF_RGB32: case DSPF_ARGB: while (height--) { @@ -572,6 +600,20 @@ dfb_convert_to_rgb32( DFBSurfacePixelFor } break; + case DSPF_BGR555: // Test + while (height--) { + src16 = src; + + for (x=0; x<width; x++) + dst[x] = PIXEL_RGB32( ((src16[x] & 0x001f) << 3) | ((src16[x] & 0x001c) >> 2), + ((src16[x] & 0x03e0) >> 2) | ((src16[x] & 0x0380) >> 7), + ((src16[x] & 0x7c00) >> 7) | ((src16[x] & 0x7000) >> 12) ); + + src += spitch; + dst += dp4; + } + break; + case DSPF_RGB16: while (height--) { src16 = src; diff -purN ./DirectFB-1.1.1/src/gfx/generic/generic.c ./DirectFB-1.1.1_modifie/src/gfx/generic/generic.c --- ./DirectFB-1.1.1/src/gfx/generic/generic.c 2007-12-15 16:24:26.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/gfx/generic/generic.c 2008-04-08 14:19:19.000000000 +0200 @@ -93,7 +93,7 @@ static void gInit_64bit(); #define Bop_PFI_OP_Aop_PFI( op ) Bop_16_##op##_Aop #include "template_colorkey_16.h" -/* ARGB1555 / RGB555*/ +/* ARGB1555 / RGB555 / BGR555 */ #define RGB_MASK 0x7fff #define Cop_OP_Aop_PFI( op ) Cop_##op##_Aop_15 #define Bop_PFI_OP_Aop_PFI( op ) Bop_15_##op##_Aop @@ -171,6 +171,24 @@ static void gInit_64bit(); #define B_MASK 0x001f #include "template_acc_16.h" +/* BGR555 */ +#define EXPAND_Ato8( a ) 0xFF +#define EXPAND_Rto8( r ) EXPAND_5to8( r ) +#define EXPAND_Gto8( g ) EXPAND_5to8( g ) +#define EXPAND_Bto8( b ) EXPAND_5to8( b ) +#define PIXEL_OUT( a, r, g, b ) PIXEL_BGR555( r, g, b ) +#define Sop_PFI_OP_Dacc( op ) Sop_xbgr1555_##op##_Dacc +#define Sacc_OP_Aop_PFI( op ) Sacc_##op##_Aop_xbgr1555 +#define A_SHIFT 0 +#define B_SHIFT 10 +#define G_SHIFT 5 +#define R_SHIFT 0 +#define A_MASK 0 +#define B_MASK 0x7c00 +#define G_MASK 0x03e0 +#define R_MASK 0x001f +#include "template_acc_16.h" + /* ARGB2554 */ #define EXPAND_Ato8( a ) EXPAND_2to8( a ) #define EXPAND_Rto8( r ) EXPAND_5to8( r ) @@ -449,6 +467,7 @@ static GenefxFunc Cop_to_Aop_PFI[DFB_NUM NULL, /* DSPF_LUT2 */ Cop_to_Aop_16, /* DSPF_RGB444 */ Cop_to_Aop_16, /* DSPF_RGB555 */ + Cop_to_Aop_16, /* DSPF_BGR555 */ }; /********************************* Cop_toK_Aop_PFI ****************************/ @@ -587,6 +606,7 @@ static GenefxFunc Cop_toK_Aop_PFI[DFB_NU NULL, /* DSPF_LUT2 */ Cop_toK_Aop_12, /* DSPF_RGB444 */ Cop_toK_Aop_15, /* DSPF_RGB555 */ + Cop_toK_Aop_15, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_to_Aop_PFI *************************/ @@ -661,6 +681,7 @@ static GenefxFunc Bop_PFI_to_Aop_PFI[DFB NULL, /* DSPF_LUT2 */ Bop_16_to_Aop, /* DSPF_RGB444 */ Bop_16_to_Aop, /* DSPF_RGB555 */ + Bop_16_to_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_Kto_Aop_PFI ************************/ @@ -872,6 +893,7 @@ static GenefxFunc Bop_PFI_Kto_Aop_PFI[DF NULL, /* DSPF_LUT2 */ Bop_12_Kto_Aop, /* DSPF_RGB444 */ Bop_15_Kto_Aop, /* DSPF_RGB555 */ + Bop_15_Kto_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_toK_Aop_PFI ************************/ @@ -1009,6 +1031,7 @@ static GenefxFunc Bop_PFI_toK_Aop_PFI[DF NULL, /* DSPF_LUT2 */ Bop_12_toK_Aop, /* DSPF_RGB444 */ Bop_15_toK_Aop, /* DSPF_RGB555 */ + Bop_15_toK_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_KtoK_Aop_PFI ***********************/ @@ -1042,6 +1065,7 @@ static GenefxFunc Bop_PFI_KtoK_Aop_PFI[D NULL, /* DSPF_LUT2 */ Bop_12_KtoK_Aop, /* DSPF_RGB444 */ Bop_15_KtoK_Aop, /* DSPF_RGB555 */ + Bop_15_KtoK_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_Sto_Aop_PFI ************************/ @@ -1540,6 +1564,7 @@ static GenefxFunc Bop_PFI_SKto_Aop_PFI[D NULL, /* DSPF_LUT2 */ Bop_12_SKto_Aop, /* DSPF_RGB444 */ Bop_15_SKto_Aop, /* DSPF_RGB555 */ + Bop_15_SKto_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_StoK_Aop_PFI ***********************/ @@ -1573,6 +1598,7 @@ static GenefxFunc Bop_PFI_StoK_Aop_PFI[D NULL, /* DSPF_LUT2 */ Bop_12_StoK_Aop, /* DSPF_RGB444 */ Bop_15_StoK_Aop, /* DSPF_RGB555 */ + Bop_15_StoK_Aop, /* DSPF_BGR555 */ }; /********************************* Bop_PFI_SKtoK_Aop_PFI **********************/ @@ -1606,6 +1632,7 @@ static GenefxFunc Bop_PFI_SKtoK_Aop_PFI[ NULL, /* DSPF_LUT2 */ Bop_12_SKtoK_Aop, /* DSPF_RGB444 */ Bop_15_SKtoK_Aop, /* DSPF_RGB555 */ + Bop_15_SKtoK_Aop, /* DSPF_BGR555 */ }; /********************************* Sop_PFI_Sto_Dacc ***************************/ @@ -2000,6 +2027,7 @@ static GenefxFunc Sop_PFI_Sto_Dacc[DFB_N NULL, /* DSPF_LUT2 */ Sop_xrgb4444_Sto_Dacc, /* DSPF_RGB444 */ Sop_xrgb1555_Sto_Dacc, /* DSPF_RGB555 */ + Sop_xbgr1555_Sto_Dacc, /* DSPF_BGR555 */ }; /********************************* Sop_PFI_SKto_Dacc **************************/ @@ -2418,6 +2446,7 @@ static GenefxFunc Sop_PFI_SKto_Dacc[DFB_ NULL, /* DSPF_LUT2 */ Sop_xrgb4444_SKto_Dacc, /* DSPF_RGB444 */ Sop_xrgb1555_SKto_Dacc, /* DSPF_RGB555 */ + Sop_xbgr1555_SKto_Dacc, /* DSPF_BGR555 */ }; /********************************* Sop_PFI_to_Dacc ****************************/ @@ -2784,6 +2813,7 @@ static GenefxFunc Sop_PFI_to_Dacc[DFB_NU NULL, /* DSPF_LUT2 */ Sop_xrgb4444_to_Dacc, /* DSPF_RGB444 */ Sop_xrgb1555_to_Dacc, /* DSPF_RGB555 */ + Sop_xbgr1555_to_Dacc, /* DSPF_BGR555 */ }; /********************************* Sop_PFI_Kto_Dacc ***************************/ @@ -3179,6 +3209,7 @@ static GenefxFunc Sop_PFI_Kto_Dacc[DFB_N NULL, /* DSPF_LUT2 */ Sop_xrgb4444_Kto_Dacc, /* DSPF_RGB444 */ Sop_xrgb1555_Kto_Dacc, /* DSPF_RGB555 */ + Sop_xbgr1555_Kto_Dacc, /* DSPF_BGR555 */ }; /********************************* Sacc_to_Aop_PFI ****************************/ @@ -3689,6 +3720,7 @@ static GenefxFunc Sacc_to_Aop_PFI[DFB_NU NULL, /* DSPF_LUT2 */ Sacc_to_Aop_xrgb4444, /* DSPF_RGB444 */ Sacc_to_Aop_xrgb1555, /* DSPF_RGB555 */ + Sacc_to_Aop_xbgr1555, /* DSPF_BGR555 */ }; /********************************* Sacc_Sto_Aop_PFI ***************************/ @@ -4245,6 +4277,7 @@ static GenefxFunc Sacc_Sto_Aop_PFI[DFB_N NULL, /* DSPF_LUT2 */ Sacc_Sto_Aop_xrgb4444, /* DSPF_RGB444 */ Sacc_Sto_Aop_xrgb1555, /* DSPF_RGB555 */ + Sacc_Sto_Aop_xbgr1555, /* DSPF_BGR555 */ }; /********************************* Sacc_toK_Aop_PFI ***************************/ @@ -4584,6 +4617,7 @@ static GenefxFunc Sacc_toK_Aop_PFI[DFB_N NULL, /* DSPF_LUT2 */ Sacc_toK_Aop_xrgb4444, /* DSPF_RGB444 */ Sacc_toK_Aop_xrgb1555, /* DSPF_RGB555 */ + Sacc_toK_Aop_xbgr1555, /* DSPF_BGR555 */ }; /********************************* Sacc_StoK_Aop_PFI **************************/ @@ -4617,6 +4651,7 @@ static GenefxFunc Sacc_StoK_Aop_PFI[DFB_ NULL, /* DSPF_LUT2 */ Sacc_StoK_Aop_xrgb4444, /* DSPF_RGB444 */ Sacc_StoK_Aop_xrgb1555, /* DSPF_RGB555 */ + Sacc_StoK_Aop_xbgr1555, /* DSPF_BGR555 */ }; /************** Bop_a8_set_alphapixel_Aop_PFI *********************************/ @@ -5432,6 +5467,7 @@ static GenefxFunc Bop_a1_set_alphapixel_ NULL, /* DSPF_LUT2 */ NULL, /* DSPF_RGB444 */ NULL, /* DSPF_RGB555 */ + NULL, /* DSPF_BGR555 */ }; @@ -6164,6 +6200,7 @@ static GenefxFunc Bop_argb_blend_alphach NULL, /* DSPF_LUT2 */ NULL, /* DSPF_RGB444 */ NULL, /* DSPF_RGB555 */ + NULL, /* DSPF_BGR555 */ }; /* A8/A1 to YCbCr */ @@ -6773,6 +6810,9 @@ bool gAcquire( CardState *state, DFBAcce case DSPF_RGB555: gfxs->Cop = PIXEL_RGB555( color.r, color.g, color.b ); break; + case DSPF_BGR555: + gfxs->Cop = PIXEL_BGR555( color.r, color.g, color.b ); + break; default: D_ONCE("unsupported destination format"); return false; @@ -6798,6 +6838,7 @@ bool gAcquire( CardState *state, DFBAcce case DSPF_RGB332: case DSPF_RGB444: case DSPF_RGB555: + case DSPF_BGR555: if (dst_ycbcr && state->blittingflags & (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR)) @@ -8253,6 +8294,7 @@ static const StretchFunctionTable *stret NULL, /* DSPF_LUT2 */ NULL, /* DSPF_RGB444 */ NULL, /* DSPF_RGB555 */ + NULL, /* DSPF_BGR555 */ }; /**********************************************************************************************************************/ diff -purN ./DirectFB-1.1.1/src/idirectfb.c ./DirectFB-1.1.1_modifie/src/idirectfb.c --- ./DirectFB-1.1.1/src/idirectfb.c 2007-12-15 13:30:28.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/idirectfb.c 2008-04-08 13:41:12.000000000 +0200 @@ -503,6 +503,7 @@ IDirectFB_CreateSurface( IDirectFB case DSPF_NV16: case DSPF_RGB444: case DSPF_RGB555: + case DSPF_BGR555: break; default: diff -purN ./DirectFB-1.1.1/src/misc/conf.c ./DirectFB-1.1.1_modifie/src/misc/conf.c --- ./DirectFB-1.1.1/src/misc/conf.c 2007-12-15 14:19:08.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/misc/conf.c 2008-04-08 14:25:49.000000000 +0200 @@ -204,6 +204,7 @@ static const FormatString format_strings { "RGB332", DSPF_RGB332 }, { "RGB444", DSPF_RGB444 }, { "RGB555", DSPF_RGB555 }, + { "BGR555", DSPF_BGR555 }, { "UYVY", DSPF_UYVY }, { "YUY2", DSPF_YUY2 }, { "YV12", DSPF_YV12 }, diff -purN ./DirectFB-1.1.1/src/misc/gfx_util.c ./DirectFB-1.1.1_modifie/src/misc/gfx_util.c --- ./DirectFB-1.1.1/src/misc/gfx_util.c 2007-12-15 13:30:24.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/src/misc/gfx_util.c 2008-04-08 14:00:20.000000000 +0200 @@ -439,6 +439,11 @@ static void write_argb_span (u32 *src, u ((u16*)d)[i] = ARGB_TO_RGB555( src[i] ); break; + case DSPF_BGR555: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_BGR555( src[i] ); + break; + case DSPF_RGB444: for (i = 0; i < len; i++) ((u16*)d)[i] = ARGB_TO_RGB444( src[i] ); diff -purN ./DirectFB-1.1.1/systems/fbdev/fbdev.c ./DirectFB-1.1.1_modifie/systems/fbdev/fbdev.c --- ./DirectFB-1.1.1/systems/fbdev/fbdev.c 2008-04-07 09:44:07.000000000 +0200 +++ ./DirectFB-1.1.1_modifie/systems/fbdev/fbdev.c 2008-04-08 13:27:48.000000000 +0200 @@ -1476,7 +1476,7 @@ printf("(II) dfb_fbdev_get_pixelformat(. // Test if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 0, 5, 10 )){ printf("(II) dfb_fbdev_get_pixelformat(...) : Format BGR555\n"); - return DSPF_RGB555; + return DSPF_BGR555; } break; @@ -1502,7 +1502,7 @@ printf("(II) dfb_fbdev_get_pixelformat(. // Test if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 0, 5, 10 )){ printf("(II) dfb_fbdev_get_pixelformat(...) : Format BGR555\n"); - return DSPF_RGB555; + return DSPF_BGR555; } break; @@ -1708,6 +1708,15 @@ dfb_fbdev_set_mode( CoreSurface var.blue.offset = 0; break; + case DSPF_BGR555: + var.red.length = 5; + var.green.length = 5; + var.blue.length = 5; + var.red.offset = 0; + var.green.offset = 5; + var.blue.offset = 10; + break; + case DSPF_ARGB4444: var.transp.length = 4; var.red.length = 4; @@ -2080,6 +2089,7 @@ static DFBResult dfb_fbdev_set_gamma_ram switch (format) { case DSPF_ARGB1555: case DSPF_RGB555: + case DSPF_BGR555: red_size = 32; green_size = 32; blue_size = 32; diff -purN ./DirectFB-1.1.1/wm/default/default.c ./DirectFB-1.1.1_modifie/wm/default/default.c --- ./DirectFB-1.1.1/wm/default/default.c 2007-12-15 13:30:28.000000000 +0100 +++ ./DirectFB-1.1.1_modifie/wm/default/default.c 2008-04-08 13:51:46.000000000 +0200 @@ -508,6 +508,7 @@ window_at_pointer( CoreWindowStack *stac case DSPF_ARGB1555: case DSPF_RGB555: + case DSPF_BGR555: // Test pixel = *(u16*)(data + 2 * wx + pitch * wy) & 0x7fff;
_______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev