339 lines
9.1 KiB
C
339 lines
9.1 KiB
C
|
#include <windows.h>
|
||
|
#include <drawdib.h>
|
||
|
#include <mmsystem.h>
|
||
|
#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);
|
||
|
}
|