|
|
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <commdlg.h>
#include "prfl.h"
#include "skeltest.h"
#include "hugetest.h"
#include "primtest.h"
#include "resource.h"
#include "macros.h"
#include "square.h"
#include "large1.h"
#include "small1.h"
#include "teapot.h"
#include "large2.h"
#include "small2.h"
#include "tptlght.h"
#include "tpttxtr.h"
static LPCTSTR lpszAppName = "Profiler";
typedef PrimativeTest NewTestType;
HINSTANCE hInstance; HWND hWndMain;
#define MAXNUMBEROFTESTS 40
SkeletonTest *tests[MAXNUMBEROFTESTS]; static int iNumberOfTests = 0;
#define DisableWindow(x) EnableWindow(x,FALSE)
LRESULT CALLBACK mainWndProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK renameDlgProc(HWND, UINT, WPARAM, LPARAM);
// Entry point of all Windows programs
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wc; HACCEL hAccel; hInstance = hInst; // Register Window style
wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) mainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) COLOR_BTNSHADOW; wc.lpszMenuName = NULL; wc.lpszClassName = lpszAppName; wc.hIconSm = NULL; // Register the window class
if(RegisterClassEx(&wc) == 0) exit(-1); if (prfl_RegisterClass(hInstance) == FALSE) exit(-1);
bzero(tests,sizeof(tests)); tests[0] = new SkeletonTest; tests[1] = new HugeTest; tests[2] = new PrimativeTest; tests[3] = new TeapotTest; tests[4] = new LargeTriangle; tests[5] = new SmallTriangle; tests[6] = new SquareTest; tests[7] = new TeapotTextureTest; tests[8] = new TeapotLightTest; tests[9] = new LargeTriangle2; tests[10] = new SmallTriangle2; iNumberOfTests = 11;
hWndMain = CreateDialog(hInstance, lpszAppName, 0, NULL); // I'm not sure why, but my window isn't getting a WM_INITDIALOG
// message, so we'll just force it to get one.
// Perhaps because I'm using CreateDialog instead of DialogBox?
SendMessage(hWndMain, WM_INITDIALOG, 0, 0); hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1)); while(GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hWndMain, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; }
void EnableRunmode(HWND hDlg, BOOL f) { EnableWindow(GetDlgItem(hDlg,M_IDC_WHICHTEST), !f); // Test list
EnableWindow(GetDlgItem(hDlg,M_IDC_CONFIG), !f); // Config
EnableWindow(GetDlgItem(hDlg,M_IDC_NEW), !f); // New
EnableWindow(GetDlgItem(hDlg,M_IDC_DELETE), !f); // Delete
EnableWindow(GetDlgItem(hDlg,M_IDC_RENAME), !f); // Rename
EnableWindow(GetDlgItem(hDlg,M_IDC_RUN), !f); // Run
EnableWindow(GetDlgItem(hDlg,M_IDC_ABORT), f); // Abort
EnableWindow(GetDlgItem(hDlg,M_IDC_QUIT), !f); // Quit
if (iNumberOfTests == MAXNUMBEROFTESTS) { EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE); EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE); } if (iNumberOfTests == 1) EnableWindow(GetDlgItem(hDlg, M_IDC_DELETE), FALSE); }
int UpdateTestList(HWND hDlg, int iRadio) { int i; if (iRadio >= iNumberOfTests) iRadio = 0; CB_DlgResetContent(hDlg, M_IDC_WHICHTEST); CB_DlgSetRedraw(hDlg, M_IDC_WHICHTEST, FALSE); for (i = 0 ; i < iNumberOfTests ; i++) { CB_DlgAddString(hDlg, M_IDC_WHICHTEST, tests[i]->QueryName()); } CB_DlgSetRedraw(hDlg, M_IDC_WHICHTEST, TRUE); CB_DlgSetSelect(hDlg, M_IDC_WHICHTEST, iRadio); SetFocus(GetDlgItem(hDlg, M_IDC_RUN)); return iRadio; };
void main_test_end_callback() { PostMessage(hWndMain, WM_USER, 0, 0); }
// Window procedure, handles all messages for this window
LRESULT CALLBACK mainWndProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static char szFileName[_MAX_PATH]; static char szTitleName[_MAX_FNAME + _MAX_EXT]; static OPENFILENAME ofn; static int iRadio = 0; static char szFilter[] = "Test Files (*.TST)\0*.tst\0" \ "All Files (*.*)\0*.*\0\0" ; static char acBuffer[120]; void *pTmp; char *pc; HANDLE hFile; int iControl; int i;
switch (msg) { case WM_CREATE: ofn.lStructSize = sizeof (OPENFILENAME); ofn.hwndOwner = hDlg; ofn.hInstance = NULL; ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 0; ofn.lpstrFile = szFileName; ofn.nMaxFile = _MAX_PATH; ofn.lpstrFileTitle = szTitleName; ofn.nMaxFileTitle = _MAX_FNAME + _MAX_EXT; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = NULL; ofn.Flags = 0; // Set in Open and Close functions
ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = "tst"; ofn.lCustData = 0L; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; break;
case WM_INITDIALOG: iRadio = UpdateTestList(hDlg,iRadio); return 0; // WM_INITDIALOG
case WM_COMMAND: { iControl = LOWORD(wParam); switch (iControl) {
case M_IDC_WHICHTEST: iRadio = CB_DlgGetSelect(hDlg, M_IDC_WHICHTEST); break;
case M_IDC_CONFIG: // if (tests[iRadio])
if (-1 == tests[iRadio]->cnfgfunct(hDlg)) { MessageBeep(MB_OK); fprintf(stderr,"error calling cnfgfunct()\n"); MessageBox(hDlg,"An error occured.",NULL, MB_OK|MB_ICONERROR); } break;
case M_IDC_NEW: // New
if (iNumberOfTests == MAXNUMBEROFTESTS) { MessageBox(hDlg, "Sorry, you've already got too many tests.", NULL, MB_OK|MB_ICONERROR); break; } tests[iNumberOfTests] = new NewTestType; iNumberOfTests++; if (iNumberOfTests == MAXNUMBEROFTESTS) { EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE); EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE); } iRadio = UpdateTestList(hDlg,iRadio); break;
case M_IDC_DELETE: // Delete
if (iNumberOfTests == 1) break; delete(tests[iRadio]); iNumberOfTests--; tests[iRadio] = tests[iNumberOfTests]; if (iNumberOfTests == 1) EnableWindow(GetDlgItem(hDlg, M_IDC_DELETE), FALSE); iRadio = UpdateTestList(hDlg,iRadio); break;
case M_IDC_RENAME: // Rename
pc = (char*)DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_RENAME),hDlg, (DLGPROC)renameDlgProc, (LPARAM)tests[iRadio]->QueryName()); if (pc) { tests[iRadio]->Rename(pc); } iRadio = UpdateTestList(hDlg,iRadio); break;
case M_IDC_LOAD: // Load
if (iNumberOfTests == MAXNUMBEROFTESTS) { MessageBox(hDlg, "Sorry, you've already got too many tests.", NULL, MB_OK|MB_ICONERROR); break; } ofn.hwndOwner = hDlg; ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; if (GetOpenFileName (&ofn)) { fprintf(stderr, "file to open: %s\n", szFileName); } else { fprintf(stderr, "load canceled\n"); break; } pTmp = prfl_AutoLoad(szFileName, &i); if (i) { MessageBox(hDlg, (char*)pTmp, NULL, MB_OK | MB_ICONERROR); break; } tests[iNumberOfTests] = (SkeletonTest*) pTmp; iRadio = iNumberOfTests; iNumberOfTests++; if (iNumberOfTests == MAXNUMBEROFTESTS) { EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE); EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE); } iRadio = UpdateTestList(hDlg,iRadio); break;
case M_IDC_SAVE: // Save
ofn.hwndOwner = hDlg; ofn.Flags = OFN_HIDEREADONLY; if (GetSaveFileName (&ofn)) { fprintf(stderr,"file to save: %s\n",szFileName); } else { fprintf(stderr,"save canceled\n"); break; } hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile == INVALID_HANDLE_VALUE) { fprintf(stderr,"Error opening file: %d\n",GetLastError()); break; } i = tests[iRadio]->Save(hFile); if (i < 0) { sprintf(acBuffer,"Error number %d while reading file",i); MessageBox(hDlg,acBuffer,NULL,MB_OK|MB_ICONERROR); } if (!CloseHandle(hFile)) fprintf(stderr,"Error closing file: %d\n",GetLastError()); break;
case M_IDC_RUN: // Run
EnableRunmode(hDlg,TRUE); if (!prfl_StartTest(tests[iRadio], tests[iRadio]->QueryName(), main_test_end_callback)) { fprintf(stderr,"%cError: StartTest == FALSE\n",7); } break;
case M_IDC_ABORT: prfl_StopTest(); KillTimer(hDlg,101); EnableRunmode(hDlg,FALSE); break;
case M_IDC_QUIT: // Quit
DestroyWindow(hDlg); break;
default: // This is an error!
MessageBeep(0); return DefWindowProc(hDlg,msg,wParam,lParam); } } return 0; // WM_COMMAND
case WM_TIMER: KillTimer(hDlg,101); case WM_USER: if (prfl_TestRunning()) { SetTimer(hDlg, 101, 1, NULL); } else { char acStr[200]; double dNumCalls, dDuration, dResult; dNumCalls = prfl_GetCount(); dDuration = prfl_GetDuration(); dResult = prfl_GetResult(); sprintf(acStr, "Test:\t%s\r" "duration (ms):\t%.10g\r" "frames drawn: \t%.10g\r" "FPS: \t%.10g\r" "%-12s: \t%.10g\r" "%cPS: \t%.10g", tests[iRadio]->QueryName(), dDuration, dNumCalls, dNumCalls*1000/dDuration, tests[iRadio]->td.acTestStatName, dResult, *tests[iRadio]->td.acTestStatName,dResult*1000/dDuration); MessageBox(hDlg,acStr,"Test Results",MB_ICONINFORMATION|MB_OK); EnableRunmode(hDlg,FALSE); } return 0; // WM_TIMER
case WM_DESTROY: PostQuitMessage(0); return 0; // WM_DESTROY
} return DefWindowProc(hDlg,msg,wParam,lParam); }
BOOL CALLBACK renameDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static char acBuffer[120]; switch (msg) { case WM_INITDIALOG: SetDlgItemText(hDlg, M_IDC_NEWNAME, (char*) lParam); return TRUE;
case WM_COMMAND: { int i = LOWORD(wParam); switch (i) { case IDOK: GetDlgItemText(hDlg,M_IDC_NEWNAME,acBuffer,sizeof(acBuffer)); EndDialog(hDlg, (int) acBuffer); break;
case IDCANCEL: EndDialog(hDlg, 0); break; } } return 0; // WM_COMMAND
}
return 0; }
|