#include #include #include #include "ddt.h" static char szAppName[]="Display Test"; static HANDLE hInstApp; static int fhLog; static UINT (FAR *displayFPS)[3][2]; void LogMsg (LPSTR sz,...); void ErrMsg (LPSTR sz,...); DWORD VideoForWindowsVersion() { HINSTANCE h; DWORD (FAR PASCAL *Version)(void); DWORD ver=0; SetErrorMode(SEM_NOOPENFILEERRORBOX); h = LoadLibrary("MSVIDEO"); SetErrorMode(0); if (h <= HINSTANCE_ERROR) return ver; (FARPROC)Version = GetProcAddress(h, "VideoForWindowsVersion"); if (Version != NULL) ver = Version(); FreeLibrary(h); return ver; } #define BI_CRAM mmioFOURCC('C','R','A','M') #ifndef QUERYDIBSUPPORT #define QUERYDIBSUPPORT 3073 #define QDI_SETDIBITS 0x0001 #define QDI_GETDIBITS 0x0002 #define QDI_DIBTOSCREEN 0x0004 #define QDI_STRETCHDIB 0x0008 #endif DWORD QueryDibSupport(LPBITMAPINFOHEADER lpbi) { HDC hdc; DWORD dw = 0; hdc = GetDC(NULL); // // send the Escape to see if they support this DIB // if (!Escape(hdc, QUERYDIBSUPPORT, (int)lpbi->biSize, (LPVOID)lpbi, (LPVOID)&dw) > 0) dw = -1; ReleaseDC(NULL, hdc); return dw; } static void TestDisplay(void) { (LPVOID)displayFPS = (LPVOID)DrawDibProfileDisplay(NULL); #define SUCK(bpp,n) \ displayFPS[bpp/8][n][0]/10, displayFPS[bpp/8][n][0]%10, \ displayFPS[bpp/8][n][1]/10, displayFPS[bpp/8][n][1]%10, \ (LPSTR)(displayFPS[bpp/8][n][0] < displayFPS[bpp/8][n][1] ? "** POOR **" : "") #define SUCKS(bpp) \ SUCK(bpp,0), \ SUCK(bpp,1), \ SUCK(bpp,2) \ ErrMsg( " 8 Bit DIBs \tStretchDI \tSetDI+BitBlt\n" " Stretch x1 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch x2 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch xN \t%03d.%01d fps\t%03d.%01d fps %s\n\n" " 16 Bit DIBs\n" " Stetch x1 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch x2 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch xN \t%03d.%01d fps\t%03d.%01d fps %s\n\n" " 24 Bit DIBs\n" " Stetch x1 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch x2 \t%03d.%01d fps\t%03d.%01d fps %s\n" " Stretch xN \t%03d.%01d fps\t%03d.%01d fps %s", SUCKS(8), SUCKS(16), SUCKS(24) ); } void Sleep(UINT uSleep) { MSG msg; int id; id = SetTimer(NULL, 42, uSleep, NULL); while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message == WM_TIMER && msg.wParam == (WORD)id) break; TranslateMessage(&msg); DispatchMessage(&msg); } KillTimer(NULL, id); } #pragma optimize("", off) void GetNetName(char *pBuffer) { _asm { mov bx, pBuffer ; ds:bx -> pBuffer xor ax,ax ; zero the buffer mov [bx],ax mov [bx+2],ax mov [bx+4],ax mov [bx+8],ax mov [bx+10],ax mov [bx+12],ax mov [bx+14],ax mov dx, bx ; ds:dx -> pBuffer mov ax, 5E00h ; get machine name int 21h cmc sbb ax,ax } } #pragma optimize("", on) void NetName(char *achNetName) { int i; GetNetName(achNetName); for (i=15; i>=0 && (achNetName[i] == ' ' || achNetName[i] == 0); i--) achNetName[i] = 0; if (achNetName[0] == 0) lstrcpy(achNetName, "(Unknown)"); } void DisplayName(char *szDisplay) { char achDriver[128]; char achDriverName[128]; HDC hdc; GetPrivateProfileString("boot", "display.drv","",achDriver, sizeof(achDriver),"system.ini"); GetPrivateProfileString("boot.description","display.drv","",achDriverName, sizeof(achDriverName),"system.ini"); hdc = GetDC(NULL); wsprintf(szDisplay, "%dx%dx%d, %s, %s", GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL), (LPSTR)achDriver, (LPSTR)achDriverName); ReleaseDC(NULL, hdc); } BOOL WriteLog() { char ach[128]; OFSTRUCT of; int i; BITMAPINFOHEADER bi; DWORD f; DWORD VfW; WORD Win; // Open log file, keep trying for a while. GetModuleFileName(hInstApp, ach, sizeof(ach)); lstrcpy(ach+lstrlen(ach)-4,".log"); SetErrorMode(SEM_FAILCRITICALERRORS); for (i=0; i<100; i++) { fhLog = OpenFile(ach, &of, OF_READWRITE|OF_SHARE_DENY_WRITE); if (fhLog == -1) //!!! should we do this? fhLog = OpenFile(ach, &of, OF_READWRITE|OF_CREATE|OF_SHARE_DENY_WRITE); if (fhLog != -1) break; Sleep(2000); // sleep for a while } SetErrorMode(0); if (fhLog == -1) return FALSE; _llseek(fhLog, 0, SEEK_END); LogMsg("Display Test Results 1.0 *******************************************\r\n"); NetName(ach); LogMsg("User: \t%s\r\n",(LPSTR)ach); VfW = VideoForWindowsVersion(); Win = (WORD)GetVersion(); LogMsg("Windows:\t%d.%02d %s\r\n",LOBYTE(Win), HIBYTE(Win), (LPSTR)(GetSystemMetrics(SM_DEBUG) ? "(Debug)" : "")); LogMsg("VfW: \t%d.%02d.%02d.%02d\r\n",HIBYTE(HIWORD(VfW)),LOBYTE(HIWORD(VfW)),HIBYTE(VfW),LOBYTE(VfW)); DisplayName(ach); LogMsg("Display:\t%s\r\n",(LPSTR)ach); #define SDIB(f) \ (LPSTR)((f != -1) ? ((f & QDI_SETDIBITS ) ? "Yes" : "No") : "Not Supported" ) bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = 100; bi.biHeight = 100; bi.biPlanes = 1; bi.biBitCount = 0; bi.biCompression = 0; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; bi.biBitCount = 16; bi.biCompression = 0; f = QueryDibSupport(&bi); LogMsg("RGB555: \t%s\r\n",SDIB(f)); bi.biBitCount = 32; bi.biCompression = 0; f = QueryDibSupport(&bi); LogMsg("RGB32: \t%s\r\n",SDIB(f)); bi.biBitCount = 16; bi.biCompression = BI_CRAM; f = QueryDibSupport(&bi); LogMsg("Cram16: \t%s\r\n",SDIB(f)); bi.biBitCount = 8; bi.biCompression = BI_CRAM; f = QueryDibSupport(&bi); LogMsg("Cram8: \t%s\r\n",SDIB(f)); LogMsg("\r\n"); LogMsg( "\t8 Bit DIBs \tStretchDI\tSetDI+BitBlt\r\n" "\tStretch x1 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch x2 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch xN \t%03d.%01d \t%03d.%01d\t%s\r\n\r\n" "\t16 Bit DIBs\r\n" "\tStetch x1 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch x2 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch xN \t%03d.%01d \t%03d.%01d\t%s\r\n\r\n" "\t24 Bit DIBs\r\n" "\tStetch x1 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch x2 \t%03d.%01d \t%03d.%01d\t%s\r\n" "\tStretch xN \t%03d.%01d \t%03d.%01d\t%s\r\n\r\n", SUCKS(8), SUCKS(16), SUCKS(24) ); LogMsg("\r\n"); _lclose(fhLog); return TRUE; } /*----------------------------------------------------------------------------*\ | WinMain( hInst, hPrev, lpszCmdLine, cmdShow ) | | | | Description: | | The main procedure for the App. After initializing, it just goes | | into a message-processing loop until it gets a WM_QUIT message | | (meaning the app was closed). | | | | Arguments: | | hInst instance handle of this instance of the app | | hPrev instance handle of previous instance, NULL if first | | szCmdLine ->null-terminated command line | | cmdShow specifies how the window is initially displayed | | | | Returns: | | The exit code as specified in the WM_QUIT message. | | | \*----------------------------------------------------------------------------*/ int PASCAL WinMain(HANDLE hInst, HANDLE hPrev, LPSTR szCmdLine, WORD sw) { hInstApp = hInst; TestDisplay(); if (hPrev == NULL) WriteLog(); return 0; } void ErrMsg (LPSTR sz,...) { static char ach[2000]; wvsprintf (ach,sz,(LPSTR)(&sz+1)); /* Format the string */ MessageBox(NULL,ach,szAppName, #ifdef BIDI MB_RTL_READING | #endif MB_OK|MB_ICONEXCLAMATION|MB_TASKMODAL); } void LogMsg (LPSTR sz,...) { static char ach[2000]; int len; len = wvsprintf (ach,sz,(LPSTR)(&sz+1)); /* Format the string */ if (fhLog != -1) _lwrite(fhLog, ach, len); }