From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/tools/dfbinspector.c | 288 +++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100755 Source/DirectFB/tools/dfbinspector.c (limited to 'Source/DirectFB/tools/dfbinspector.c') diff --git a/Source/DirectFB/tools/dfbinspector.c b/Source/DirectFB/tools/dfbinspector.c new file mode 100755 index 0000000..52559aa --- /dev/null +++ b/Source/DirectFB/tools/dfbinspector.c @@ -0,0 +1,288 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include + +/**********************************************************************************************************************/ + +static const DirectFBPixelFormatNames(format_names); +static const DirectFBSurfaceBlittingFlagsNames(blittingflags_names); +static const DirectFBSurfaceDrawingFlagsNames(drawingflags_names); +static const DirectFBAccelerationMaskNames(accelerationmask_names); + +/**********************************************************************************************************************/ + +typedef enum { + NONE = 0x00000000, + CREATE_FILES = 0x00000001 +} Options; + +typedef struct { + IDirectFB *dfb; + IDirectFBFont *font; + + Options options; + const char *directory; + + struct { + FILE *formats; + } files; + + bool device_drawstring; +} Inspector; + +/**********************************************************************************************************************/ + +static DFBResult +Inspector_Init( Inspector *inspector, int argc, char *argv[] ) +{ + int i; + DFBResult ret; + DFBFontDescription desc; + + memset( inspector, 0, sizeof(Inspector) ); + + for (i=1; idirectory = argv[i]; + inspector->options |= CREATE_FILES; + } + } + + ret = DirectFBCreate( &inspector->dfb ); + if (ret) { + D_DERROR( ret, "Inspector/Init: DirectFBCreate() failed!\n" ); + return ret; + } + + desc.flags = DFDESC_HEIGHT; + desc.height = 24; + + ret = inspector->dfb->CreateFont( inspector->dfb, DATADIR"/decker.ttf", &desc, &inspector->font ); + if (ret) { + D_DERROR( ret, "Inspector/Init: Could not load font '%s'!\n", DATADIR"/decker.ttf" ); + return ret; + } + + return DFB_OK; +} + +static DFBResult +Inspector_Run( Inspector *inspector ) +{ + static const DFBSurfacePixelFormat formats[] = { + DSPF_LUT8, + DSPF_ALUT44, + DSPF_RGB332, + DSPF_RGB16, + DSPF_RGB24, + DSPF_RGB32, + DSPF_ARGB1555, + DSPF_ARGB2554, + DSPF_ARGB4444, + DSPF_ARGB, + DSPF_AiRGB, + DSPF_A1, + DSPF_A8, + DSPF_YUY2, + DSPF_UYVY, + DSPF_I420, + DSPF_YV12, + DSPF_NV12, + DSPF_NV21, + DSPF_NV16, + DSPF_AYUV + }; + + int i, j, n; + DFBResult ret; + DFBSurfaceDescription desc; + IDirectFBSurface *surfaces[D_ARRAY_SIZE(formats)]; + char buf[strlen( inspector->directory ? : "" ) + 23]; + + + if (inspector->options & CREATE_FILES) { + /* Create the directory. */ + if (mkdir( inspector->directory, 0755 ) < 0 && errno != EEXIST) { + D_PERROR( "Inspector/Init: Could not create directory '%s'!\n", inspector->directory ); + return DFB_INIT; + } + + /* Open file for writing supported format conversions (blitting). */ + snprintf( buf, sizeof(buf), "%s/blit.formats", inspector->directory ); + inspector->files.formats = fopen( buf, "w" ); + if (!inspector->files.formats) { + D_PERROR( "Inspector/Init: Could not open file '%s' for writing!\n", buf ); + return DFB_INIT; + } + } + + desc.flags = (DFBSurfaceDescriptionFlags)(DSDESC_WIDTH | + DSDESC_HEIGHT | + DSDESC_PIXELFORMAT); + desc.width = 64; + desc.height = 64; + + for (i=0; idfb->CreateSurface( inspector->dfb, &desc, &surfaces[i] ); + if (ret) { + D_DERROR( ret, "Inspector/Init: Could not create %s surface!\n", + format_names[DFB_PIXELFORMAT_INDEX(formats[i])].name ); + while (i--) + surfaces[i]->Release( surfaces[i] ); + return ret; + } + + surfaces[i]->SetFont( surfaces[i], inspector->font ); + + if (inspector->files.formats) + fprintf( inspector->files.formats, "%s%s", i ? "," : "", + format_names[DFB_PIXELFORMAT_INDEX(formats[i])].name ); + } + + if (inspector->files.formats) + fprintf( inspector->files.formats, "\n" ); + + printf("\n"); + + + + printf("source ->"); + + for (i=0; iGetAccelerationMask( surfaces[i], surfaces[j], &mask ); + + if (mask & DFXL_DRAWSTRING) + inspector->device_drawstring = true; + + printf( "%9s", (mask & DFXL_BLIT) ? "X" : "" ); + + if (inspector->files.formats) + fputc( (mask & DFXL_BLIT) ? '1' : '0', inspector->files.formats ); + } + + printf( " %s", format_names[DFB_PIXELFORMAT_INDEX(formats[i])].name ); + + printf("\n"); + + if (inspector->files.formats) + fprintf( inspector->files.formats, "\n" ); + } + + for (i=0; iRelease( surfaces[i] ); + + if (inspector->options & CREATE_FILES) { + FILE *f; + DFBGraphicsDeviceDescription desc; + + if (inspector->files.formats) + fclose( inspector->files.formats ); + + /* Query device and driver information. */ + inspector->dfb->GetDeviceDescription( inspector->dfb, &desc ); + + if (inspector->device_drawstring) + desc.acceleration_mask = (DFBAccelerationMask)(desc.acceleration_mask | DFXL_DRAWSTRING); + + /* Write device info to a file. */ + snprintf( buf, sizeof(buf), "%s/device.info", inspector->directory ); + f = fopen( buf, "w" ); + if (!f) { + D_PERROR( "Inspector/Init: Could not open file '%s' for writing!\n", buf ); + return DFB_FAILURE; + } + + fprintf( f, "name = %s\n", desc.name ); + fprintf( f, "vendor = %s\n", desc.vendor ); + + fprintf( f, "acceleration_mask = " ); + for (i=0, n=0; accelerationmask_names[i].mask; i++) { + if (desc.acceleration_mask & accelerationmask_names[i].mask) + fprintf( f, "%s%s", n++ ? "," : "", accelerationmask_names[i].name ); + } + fprintf( f, "\n" ); + + fprintf( f, "blitting_flags = " ); + for (i=0, n=0; blittingflags_names[i].flag; i++) { + if (desc.blitting_flags & blittingflags_names[i].flag) + fprintf( f, "%s%s", n++ ? "," : "", blittingflags_names[i].name ); + } + fprintf( f, "\n" ); + + fprintf( f, "drawing_flags = " ); + for (i=0, n=0; drawingflags_names[i].flag; i++) { + if (desc.drawing_flags & drawingflags_names[i].flag) + fprintf( f, "%s%s", n++ ? "," : "", drawingflags_names[i].name ); + } + fprintf( f, "\n" ); + + fclose( f ); + + + /* Write driver info to a file. */ + snprintf( buf, sizeof(buf), "%s/driver.info", inspector->directory ); + f = fopen( buf, "w" ); + if (!f) { + D_PERROR( "Inspector/Init: Could not open file '%s' for writing!\n", buf ); + return DFB_FAILURE; + } + + fprintf( f, "name = %s\n", desc.driver.name ); + fprintf( f, "vendor = %s\n", desc.driver.vendor ); + fprintf( f, "version = %d.%d\n", desc.driver.major, desc.driver.minor ); + + fclose( f ); + } + + return DFB_OK; +} + +/**********************************************************************************************************************/ + +int +main( int argc, char *argv[] ) +{ + DFBResult ret; + Inspector inspector; + + ret = DirectFBInit( &argc, &argv ); + if (ret) { + D_DERROR( ret, "Inspector/Init: DirectFBInit() failed!\n" ); + return ret; + } + + ret = Inspector_Init( &inspector, argc, argv ); + if (ret) + return ret; + + return Inspector_Run( &inspector ); +} + -- cgit