Windows2003-3790/windows/advcore/gdiplus/test/driverhack/cfunctest.cpp
2020-09-30 16:53:55 +02:00

555 lines
15 KiB
C++

/******************************Module*Header*******************************\
* Module Name: CFuncTest.cpp
*
* This file contains the code to support the functionality test harness
* for GDI+. This includes menu options and calling the appropriate
* functions for execution.
*
* Created: 05-May-2000 - Jeff Vezina [t-jfvez]
*
* Copyright (c) 2000 Microsoft Corporation
*
\**************************************************************************/
#undef UNICODE
#undef _UNICODE
#include "CFuncTest.h"
#include "Resource.h"
#include "CHDC.h"
#include "windows.h"
void EnableGDIPlusDriverHacks(BOOL);
extern LPFNGDIPLUS glpfnDisplayPaletteWindowNotify;
extern HWND g_hWndMain;
extern CFuncTest g_FuncTest; // Initialized in Main.cpp
extern HBRUSH g_hbrBackground; // Initialized in Main.cpp
extern CHDC g_HDC; // Initialized in Main.cpp
extern int g_nResult; // Initialized in Main.cpp
extern int gnPaths;
CFuncTest::CFuncTest()
{
m_hWndDlg=NULL;
m_hWndMain=NULL;
m_bUsePageDelay=true; // Default use page delay or page pause
m_bEraseBkgd=true; // Default erace background
m_bAppendTest=false; // Default append test
m_bDriverHacks=false; // Default enable printer driver hacks
m_nPageDelay=1000; // Default page delay
m_nPageRow=0;
m_nPageCol=0;
}
CFuncTest::~CFuncTest()
{
EndDialog(m_hWndDlg,0);
m_hWndDlg=NULL;
m_hWndMain=NULL;
}
BOOL CFuncTest::Init(HWND hWndParent)
// Initializes functest
{
HWND hWnd;
char szDelay[10];
char szNumPaths[10];
m_hWndMain=hWndParent;
// Create options dialog box
m_hWndDlg=CreateDialogA(GetModuleHandleA(NULL),MAKEINTRESOURCEA(IDD_FUNCTEST),hWndParent,&DlgProc);
if (m_hWndDlg==NULL)
return false;
/*
// Set default options in dialog box using defaults in constructor
if (m_bUsePageDelay)
{
hWnd=GetDlgItem(m_hWndDlg,IDC_PAGEDELAY);
SendMessageA(hWnd,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
}
else
{
hWnd=GetDlgItem(m_hWndDlg,IDC_PAGEPAUSE);
SendMessageA(hWnd,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
}
hWnd=GetDlgItem(m_hWndDlg,IDC_DELAY);
SendMessageA(hWnd,WM_SETTEXT,0,(LPARAM)_itoa(m_nPageDelay,szDelay,10));
*/
hWnd=GetDlgItem(m_hWndDlg,IDC_NUMPATHS);
SendMessageA(hWnd,WM_SETTEXT,0,(LPARAM)_itoa(gnPaths,szNumPaths,10));
if (m_bEraseBkgd)
{
hWnd=GetDlgItem(m_hWndDlg,IDC_ERASEBKGD);
SendMessageA(hWnd,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
}
if (m_bDriverHacks)
{
hWnd=GetDlgItem(m_hWndDlg,IDC_DRIVERHACKS);
SendMessageA(hWnd,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumEnablePrnOpts);
}
/*
if (m_bAppendTest)
{
hWnd=GetDlgItem(m_hWndDlg,IDC_APPENDTEST);
SendMessageA(hWnd,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumDisablePrnOpts);
}
*/
return true;
}
void CFuncTest::RunSamples()
// Toggle options dialog box
{
if (m_hWndDlg!=NULL)
{
if (!IsWindowVisible(m_hWndDlg))
ShowWindow(m_hWndDlg,SW_SHOW);
else
ShowWindow(m_hWndDlg,SW_HIDE);
}
}
BOOL CFuncTest::AddPrimitive(CPrimitive *pPrimitive)
// Adds a primitive to the primitive test list in options dialog box
{
HWND hWnd;
LRESULT iItem;
hWnd=GetDlgItem(m_hWndDlg,IDC_PRIMITIVES);
SendMessageA(hWnd,LB_SETSEL,(WPARAM)false,0); // Reset selection
iItem=SendMessageA(hWnd,LB_ADDSTRING,0,(LPARAM)pPrimitive->m_szName);
if (iItem<0)
return false;
SendMessageA(hWnd,LB_SETSEL,(WPARAM)true,0); // Pick top element as selection
// Data is a pointer to the primitive base class
SendMessageA(hWnd,LB_SETITEMDATA,(WPARAM)iItem,(LPARAM)pPrimitive);
return true;
}
BOOL CFuncTest::AddOutput(COutput *pOutput)
// Adds an output to the output list in options dialog box
{
HWND hWnd;
LRESULT iItem;
hWnd=GetDlgItem(m_hWndDlg,IDC_OUTPUTS);
SendMessageA(hWnd,LB_SETSEL,(WPARAM)false,0); // Reset selection
iItem=SendMessageA(hWnd,LB_ADDSTRING,0,(LPARAM)pOutput->m_szName);
if (iItem<0)
return false;
SendMessageA(hWnd,LB_SETSEL,(WPARAM)true,0); // Pick top element as selection
// Data is a pointer to the output base class
SendMessageA(hWnd,LB_SETITEMDATA,(WPARAM)iItem,(LPARAM)pOutput);
return true;
}
BOOL CFuncTest::AddSetting(CSetting *pSetting)
// Adds a setting to the settings list in options dialog box
{
HWND hWnd;
LRESULT iItem;
hWnd=GetDlgItem(m_hWndDlg,IDC_SETTINGS);
iItem=SendMessageA(hWnd,LB_ADDSTRING,0,(LPARAM)pSetting->m_szName);
if (iItem<0)
return false;
// Data is a pointer to the setting base class
SendMessageA(hWnd,LB_SETITEMDATA,(WPARAM)iItem,(LPARAM)pSetting);
return true;
}
RECT CFuncTest::GetTestRect(int nCol,int nRow)
{
RECT Rect;
GetClientRect(g_hWndMain, &Rect);
return Rect;
}
void CFuncTest::RunTest(COutput *pOutput,CPrimitive *pPrimitive)
// Runs one test using the given output, primitive, and settings that have m_bUseSetting=true
{
char szBuffer[256];
MSG Msg;
Graphics *g=NULL;
CSetting *pSetting;
RECT Rect;
HDC hDC;
HWND hWnd;
int iItem;
LRESULT cItemMax;
int nX;
int nY;
BOOL bFirstSetting=true;
__try
{
sprintf(szBuffer,"%s on %s",pPrimitive->m_szName,pOutput->m_szName);
Rect=GetTestRect(m_nPageCol,m_nPageRow); // Get test area
// Clear test area
if (m_bEraseBkgd)
{
hDC=GetDC(m_hWndMain);
FillRect(hDC,&Rect,g_hbrBackground);
ReleaseDC(m_hWndMain,hDC);
}
if (m_bDriverHacks)
{
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumEnablePrnOpts);
}
else
{
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumDisablePrnOpts);
}
// Initialize output and get graphics pointer
// Let pOutput modify the nX,nY in case we are drawing to a dib, we do not
// want to be translating.
nX=Rect.left;
nY=Rect.top;
g=pOutput->PreDraw(nX,nY);
if (g==NULL)
return;
// Move test to test area
g->TranslateTransform((float)nX,(float)nY);
// Set each setting in the list box
hWnd=GetDlgItem(m_hWndDlg,IDC_SETTINGS);
cItemMax=SendMessageA(hWnd,LB_GETCOUNT,0,0);
for (iItem=0;iItem<cItemMax;iItem++) {
pSetting=(CSetting*)SendMessageA(hWnd,LB_GETITEMDATA,(WPARAM)iItem,0);
pSetting->Set(g);
if (pSetting->m_bUseSetting)
{
if (bFirstSetting)
{
strcat(szBuffer," (");
bFirstSetting=false;
}
else
{
strcat(szBuffer,", ");
}
strcat(szBuffer,pSetting->m_szName);
}
}
if (!bFirstSetting)
strcat(szBuffer,")");
// We do have some primitives (CachedBitmap) which don't respect the
// world transform so we need some way to access the offset to the
// test rectangle.
pPrimitive->SetOffset(nX, nY);
// Draw primitive test
pPrimitive->Draw(g);
// Destroy graphics pointer
delete g;
// Finish off the output
pOutput->PostDraw(Rect);
// Write description of test
hDC=GetDC(m_hWndMain);
SetBkMode(hDC,TRANSPARENT);
DrawTextA(hDC,szBuffer,-1,&Rect,DT_CENTER|DT_WORDBREAK);
ReleaseDC(m_hWndMain,hDC);
// Determine page col/row where next test will be drawn
GetClientRect(m_hWndMain,&Rect);
m_nPageCol++;
if (m_nPageCol*TESTAREAWIDTH+TESTAREAWIDTH>Rect.right)
{
m_nPageCol=0;
m_nPageRow++;
if (m_nPageRow*TESTAREAHEIGHT+TESTAREAHEIGHT>Rect.bottom)
// If graphics page is full, wait or pause
{
m_nPageRow=0;
if (m_bUsePageDelay)
Sleep(m_nPageDelay); // Wait
else
{ // Pause for next input message
// Clear old input messages
while (GetInputState())
PeekMessageA(&Msg,NULL,0,0,PM_REMOVE);
// Wait for new input message
while (!GetInputState())
Sleep(100);
}
}
}
}__except(EXCEPTION_ACCESS_VIOLATION,1){
printf("%s caused AV\n",szBuffer);
g_nResult=1; // Return 1 if there was an AV
}
}
void CFuncTest::InitRun()
// Initialise test run, grabs all info from the options dialog box
{
HWND hWnd;
char szDelay[10];
char szNumPaths[10];
RECT Rect;
HDC hDC;
// Hide options dialog
// ShowWindow(m_hWndDlg,SW_HIDE);
// Grab options
/*
hWnd=GetDlgItem(m_hWndDlg,IDC_PAGEDELAY);
if (SendMessageA(hWnd,BM_GETCHECK,0,0)==BST_CHECKED)
m_bUsePageDelay=true;
else
*/
m_bUsePageDelay=false;
hWnd=GetDlgItem(m_hWndDlg,IDC_NUMPATHS);
SendMessageA(hWnd,WM_GETTEXT,(WPARAM)10,(LPARAM)szNumPaths);
gnPaths=atoi(szNumPaths);
/*
hWnd=GetDlgItem(m_hWndDlg,IDC_DELAY);
SendMessageA(hWnd,WM_GETTEXT,(WPARAM)10,(LPARAM)szDelay);
m_nPageDelay=atoi(szDelay);
*/
hWnd=GetDlgItem(m_hWndDlg,IDC_ERASEBKGD);
if (SendMessageA(hWnd,BM_GETCHECK,0,0)==BST_CHECKED)
m_bEraseBkgd=true;
else
m_bEraseBkgd=false;
hWnd=GetDlgItem(m_hWndDlg,IDC_DRIVERHACKS);
if (SendMessageA(hWnd,BM_GETCHECK,0,0)==BST_CHECKED)
{
m_bDriverHacks=true;
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumEnablePrnOpts);
}
else
{
m_bDriverHacks=false;
glpfnDisplayPaletteWindowNotify(WindowNotifyEnumDisablePrnOpts);
}
/*
hWnd=GetDlgItem(m_hWndDlg,IDC_APPENDTEST);
if (SendMessageA(hWnd,BM_GETCHECK,0,0)==BST_CHECKED)
m_bAppendTest=true;
else
*/
m_bAppendTest=false;
// Erase entire main window
if (!m_bAppendTest && m_bEraseBkgd)
{
GetClientRect(m_hWndMain,&Rect);
hDC=GetDC(m_hWndMain);
FillRect(hDC,&Rect,g_hbrBackground);
ReleaseDC(m_hWndMain,hDC);
}
if (!m_bAppendTest)
{
// Reset page row/col
m_nPageRow=0;
m_nPageCol=0;
}
}
void CFuncTest::EndRun()
{
int nX;
int nY;
RECT rTestArea;
RECT rWindow;
HDC hDC;
hDC=GetDC(m_hWndMain);
GetClientRect(m_hWndMain,&rWindow);
// Draw lines on bottom right corner of last test
// Figure out what was the last m_nPageCol and m_nPageRow
nX=m_nPageCol-1;
nY=m_nPageRow;
if (nX<0) {
nX=(rWindow.right/(int)TESTAREAWIDTH)-1;
nY--;
if (nY<0) {
nY=(rWindow.bottom/(int)TESTAREAHEIGHT)-1;
}
}
// Get the x,y coordinates
nX=nX*(int)TESTAREAWIDTH;
nY=nY*(int)TESTAREAHEIGHT;
// Draw both lines
/*
Rectangle(hDC,nX+(int)TESTAREAWIDTH-3,nY,nX+(int)TESTAREAWIDTH,nY+(int)TESTAREAHEIGHT);
Rectangle(hDC,nX,nY+(int)TESTAREAHEIGHT-3,nX+(int)TESTAREAWIDTH,nY+(int)TESTAREAWIDTH);
*/
// Clear the rest of the test areas on page
if (m_bEraseBkgd)
{
nX=m_nPageCol;
nY=m_nPageRow;
while ((nX>0) || (nY>0))
{
rTestArea=GetTestRect(nX,nY);
FillRect(hDC,&rTestArea,g_hbrBackground);
nX++;
if (nX*TESTAREAWIDTH+TESTAREAWIDTH>rWindow.right)
{
nX=0;
nY++;
if (nY*TESTAREAHEIGHT+TESTAREAHEIGHT>rWindow.bottom)
// If graphics page is full
{
nY=0;
}
}
}
}
ReleaseDC(m_hWndMain,hDC);
}
void CFuncTest::Run()
// Runs all selected tests
{
COutput *pOutput;
CPrimitive *pPrimitive;
CSetting *pSetting;
HWND hWnd;
HWND hWndOutput;
int iOutput;
LRESULT cOutputMax;
int iItem;
LRESULT cItemMax;
InitRun(); // Init test run
// Do the selected output loop
hWndOutput=GetDlgItem(m_hWndDlg,IDC_OUTPUTS);
cOutputMax=SendMessageA(hWndOutput,LB_GETCOUNT,0,0);
for (iOutput=0;iOutput<cOutputMax;iOutput++) {
pOutput=(COutput*)SendMessageA(hWndOutput,LB_GETITEMDATA,(WPARAM)iOutput,0);
if (SendMessageA(hWndOutput,LB_GETSEL,(WPARAM)iOutput,0)<=0)
continue;
// Set each setting according to what is selected in the list box
hWnd=GetDlgItem(m_hWndDlg,IDC_SETTINGS);
cItemMax=SendMessageA(hWnd,LB_GETCOUNT,0,0);
for (iItem=0;iItem<cItemMax;iItem++) {
pSetting=(CSetting*)SendMessageA(hWnd,LB_GETITEMDATA,(WPARAM)iItem,0);
if (SendMessageA(hWnd,LB_GETSEL,(WPARAM)iItem,0)>0)
pSetting->m_bUseSetting=true;
else
pSetting->m_bUseSetting=false;
}
// Draw each primitive selected in the list box
hWnd=GetDlgItem(m_hWndDlg,IDC_PRIMITIVES);
cItemMax=SendMessageA(hWnd,LB_GETCOUNT,0,0);
for (iItem=0;iItem<cItemMax;iItem++) {
pPrimitive=(CPrimitive*)SendMessageA(hWnd,LB_GETITEMDATA,(WPARAM)iItem,0);
if (SendMessageA(hWnd,LB_GETSEL,(WPARAM)iItem,0)>0)
RunTest(pOutput,pPrimitive);
}
}
EndRun();
}
void CFuncTest::ClearAllSettings()
// Clear all settings to m_bUseSetting=false
{
CSetting *pSetting;
HWND hWnd;
LRESULT cItemMax;
int iItem;
// Set all settings off
hWnd=GetDlgItem(m_hWndDlg,IDC_SETTINGS);
cItemMax=SendMessageA(hWnd,LB_GETCOUNT,0,0);
for (iItem=0;iItem<cItemMax;iItem++) {
pSetting=(CSetting*)SendMessageA(hWnd,LB_GETITEMDATA,(WPARAM)iItem,0);
pSetting->m_bUseSetting=false;
}
}
INT_PTR CALLBACK CFuncTest::DlgProc(HWND hWndDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
// Options dialog proc
{
switch (Msg)
{
case WM_INITDIALOG:
return true;
case WM_COMMAND:
if (HIWORD(wParam)==BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_RUN:
g_FuncTest.Run();
return true;
case IDC_CLOSE:
EndDialog(hWndDlg,0);
return true;
}
}
else if (HIWORD(wParam)==LBN_DBLCLK)
{
switch (LOWORD(wParam))
{
case IDC_PRIMITIVES:
g_FuncTest.Run();
return true;
}
}
break;
case WM_CLOSE:
ShowWindow(hWndDlg,SW_HIDE);
return true;
}
return false;
}
#define UNICODE
#define _UNICODE