#include #include #include #include #include #include /* * Structures */ typedef struct { char *Name; DWORD Value; } DWFLAGS; /* * Prototypes */ VOID PrintPixelFormat( HDC Dc, int PixelFormatId ); void PrintRangeOfPixelFormat( HDC Dc, int Start, int End ); char * dwFlags2String( DWORD dwFlags, char *Buf ); static char *iLayerType2String( BYTE iLayerType, char *Buf ); void PrintUsage( void ); void PrintHelp( void ); /* * defines */ #define EXIT_OK EXIT_SUCCESS #define EXIT_ERROR EXIT_FAILURE #define EXIT_USAGE 15 #define EXIT_HELP 14 /* * globals */ char *ProgramName; /* Pointer to the name of the program */ int CountOnly = 0; /* Count only flag */ /* * main */ int main( int argc, char **argv ) { HDC Dc; int AvailableIds; int ExitCode = EXIT_OK; ProgramName = *argv; for (argc--, argv++ ; argc && '-' == **argv ; argc--, argv++ ) { switch ( *(++(*argv)) ) { case 'c': case 'C': CountOnly = !CountOnly; break; case 'h': case 'H': case '?': PrintHelp(); exit(EXIT_HELP); break; default: PrintUsage(); exit(EXIT_USAGE); break; } } /* * Get a DC for the display */ Dc = GetDC(NULL); /* * Get the total number of pixel formats */ AvailableIds = DescribePixelFormat( Dc, 0, 0, NULL ); /* * If only a count was requested, we are done */ if (CountOnly) { printf("%d\n", AvailableIds); exit(AvailableIds); } /* * If there are more arguments, print only the Ids requested */ if ( argc ) { for ( ; argc ; argc--, argv++ ) { int StartId, EndId, Scanned; Scanned = sscanf(*argv, "%i-%i", &StartId, &EndId ); if ( 1 == Scanned ) { PrintPixelFormat( Dc, StartId ); } else if ( 2 == Scanned ) { PrintRangeOfPixelFormat( Dc, StartId, EndId ); } else { fprintf(stderr, "%s: Error: expected a number, found: '%s'\n", ProgramName, *argv ); } } } else { /* * Print them all */ PrintRangeOfPixelFormat( Dc, 1, AvailableIds ); } /* * Don't need the DC anymore */ ReleaseDC( NULL, Dc ); return(ExitCode); } VOID PrintPixelFormat( HDC Dc, int PixelFormatId ) { char Buf[256]; PIXELFORMATDESCRIPTOR Pfd; if ( DescribePixelFormat( Dc, PixelFormatId, sizeof(Pfd), &Pfd ) ) { printf("PixelFormat: %d\n", PixelFormatId ); printf("nSize %d\n", Pfd.nSize ); printf("nVersion %d\n", Pfd.nVersion ); printf("dwFlags 0x%08lX (%s)\n", Pfd.dwFlags, dwFlags2String( Pfd.dwFlags, Buf )); printf("iPixelType %d, (%s)\n", Pfd.iPixelType, (PFD_TYPE_RGBA == Pfd.iPixelType) ? "TYPE_RGBA" : "TYPE_COLORINDEX"); printf("cColorBits %d\n", Pfd.cColorBits ); printf("cRedBits %d\n", Pfd.cRedBits ); printf("cRedShift %d\n", Pfd.cRedShift ); printf("cGreenBits %d\n", Pfd.cGreenBits ); printf("cGreenShift %d\n", Pfd.cGreenShift ); printf("cBlueBits %d\n", Pfd.cBlueBits ); printf("cBlueShift %d\n", Pfd.cBlueShift ); printf("cAlphaBits %d\n", Pfd.cAlphaBits ); printf("cAlphaShift %d\n", Pfd.cAlphaShift ); printf("cAccumBits %d\n", Pfd.cAccumBits ); printf("cAccumRedBits %d\n", Pfd.cAccumRedBits ); printf("cAccumGreenBits %d\n", Pfd.cAccumGreenBits ); printf("cAccumBlueBits %d\n", Pfd.cAccumBlueBits ); printf("cAccumAlphaBits %d\n", Pfd.cAccumAlphaBits ); printf("cDepthBits %d\n", Pfd.cDepthBits ); printf("cStencilBits %d\n", Pfd.cStencilBits ); printf("cAuxBuffers %d\n", Pfd.cAuxBuffers ); printf("iLayerType %d, (%s)\n", Pfd.iLayerType, iLayerType2String( Pfd.iLayerType, Buf ) ); printf("bReserved %d\n", Pfd.bReserved ); printf("dwLayerMask %d\n", Pfd.dwLayerMask ); printf("dwVisibleMask %d\n", Pfd.dwVisibleMask ); printf("dwDamageMask %d\n", Pfd.dwDamageMask ); printf("\n"); } else { printf("Could not get pixel format id: %d\n", PixelFormatId ); } } void PrintRangeOfPixelFormat( HDC Dc, int Start, int End ) { if ( End >= Start ) { for ( ; Start <= End; Start++ ) { PrintPixelFormat( Dc, Start ); } } else { for ( ; Start >= End; Start-- ) { PrintPixelFormat( Dc, Start ); } } } char * dwFlags2String( DWORD dwFlags, char *Buf ) { int i; static DWFLAGS dwFlagsData[] = { { "PFD_DOUBLEBUFFER" , PFD_DOUBLEBUFFER }, { "PFD_STEREO" , PFD_STEREO }, { "PFD_DRAW_TO_WINDOW" , PFD_DRAW_TO_WINDOW }, { "PFD_DRAW_TO_BITMAP" , PFD_DRAW_TO_BITMAP }, { "PFD_SUPPORT_GDI" , PFD_SUPPORT_GDI }, { "PFD_SUPPORT_OPENGL" , PFD_SUPPORT_OPENGL }, { "PFD_GENERIC_FORMAT" , PFD_GENERIC_FORMAT }, { "PFD_NEED_PALETTE" , PFD_NEED_PALETTE }, { "PFD_NEED_SYSTEM_PALETTE" , PFD_NEED_SYSTEM_PALETTE }, { "PFD_GENERIC_ACCELERATED" , PFD_GENERIC_ACCELERATED }, { NULL , 0 } }; *Buf = '\0'; for ( i = 0; NULL != dwFlagsData[i].Name ; i++ ) { if ( dwFlags & dwFlagsData[i].Value ) { strcat( Buf, dwFlagsData[i].Name ); strcat( Buf, " "); } } return( Buf ); } /********************************************************************/ static char * iLayerType2String( BYTE iLayerType, char *Buf ) { switch ( iLayerType ) { case PFD_MAIN_PLANE: strcpy( Buf, "PFD_MAIN_PLANE"); break; case PFD_OVERLAY_PLANE: strcpy( Buf, "PFD_OVERLAY_PLANE"); break; case PFD_UNDERLAY_PLANE: strcpy( Buf, "PFD_UNDERLAY_PLANE"); break; default: strcpy( Buf, "UNKNOWN"); break; } return( Buf ); } void PrintUsage( void ) { printf("usage: %s -ch? [PfdId[-RangePfd]...]\n", ProgramName ); } void PrintHelp( void ) { PrintUsage(); printf("\n"); printf(" -?|h Print this information.\n"); printf(" -c Count the number of available pixel formats. (exit code is count)\n"); printf("\n"); printf("PfdId is the pixel format id requested\n"); printf("A range of pixel formats is specified with StarId-EndId\n"); printf("\n"); printf("The following prints Ids 5 to 7: %s 5-7\n", ProgramName); }