windows-nt/Source/XPSP1/NT/multimedia/media/avi/drawdib.16/ddt/ddt.c
2020-09-26 16:20:57 +08:00

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);
}