diff options
Diffstat (limited to 'win32/plugins/dfxvideo/winsrc/cfg.c')
| -rw-r--r-- | win32/plugins/dfxvideo/winsrc/cfg.c | 1294 |
1 files changed, 1294 insertions, 0 deletions
diff --git a/win32/plugins/dfxvideo/winsrc/cfg.c b/win32/plugins/dfxvideo/winsrc/cfg.c new file mode 100644 index 00000000..d311aa72 --- /dev/null +++ b/win32/plugins/dfxvideo/winsrc/cfg.c @@ -0,0 +1,1294 @@ +/*************************************************************************** + cfg.c - description + ------------------- + begin : Sun Oct 28 2001 + copyright : (C) 2001 by Pete Bernert + email : BlackDove@addcom.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. See also the license.txt file for * + * additional informations. * + * * + ***************************************************************************/ + +#define _IN_CFG + +#include "externals.h" +#include "cfg.h" +#include "gpu.h" +#include "record.h"
+
+///////////////////////////////////////////////////////////////////////////// +// globals + +char szKeyDefaults[11]={VK_DELETE,VK_INSERT,VK_HOME,VK_END,VK_PRIOR,VK_NEXT,VK_MULTIPLY,VK_SUBTRACT,VK_ADD,VK_F12,0x00}; +char szDevName[128]; + +//////////////////////////////////////////////////////////////////////// +// prototypes + +BOOL OnInitCfgDialog(HWND hW); +void OnCfgOK(HWND hW); +BOOL OnInitSoftDialog(HWND hW); +void OnSoftOK(HWND hW); +void OnCfgCancel(HWND hW); +void OnCfgDef1(HWND hW); +void OnCfgDef2(HWND hW); +void OnBugFixes(HWND hW); + +void OnRecording(HWND hW); + +void SelectDev(HWND hW); +BOOL bTestModes(void); +void OnKeyConfig(HWND hW); +void GetSettings(HWND hW); +void OnClipboard(HWND hW); +void DoDevEnum(HWND hW); +char * pGetConfigInfos(int iCfg); + +//////////////////////////////////////////////////////////////////////// +// funcs + +BOOL CALLBACK SoftDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + return OnInitSoftDialog(hW); + + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_DISPMODE1: + { + CheckDlgButton(hW,IDC_DISPMODE2,FALSE); + return TRUE; + } + case IDC_DISPMODE2: + { + CheckDlgButton(hW,IDC_DISPMODE1,FALSE); + return TRUE; + } + case IDC_DEF1: OnCfgDef1(hW); return TRUE; + case IDC_DEF2: OnCfgDef2(hW); return TRUE; + case IDC_SELFIX: OnBugFixes(hW); return TRUE; + case IDC_KEYCONFIG: OnKeyConfig(hW); return TRUE; + case IDC_SELDEV: SelectDev(hW); return TRUE; + case IDCANCEL: OnCfgCancel(hW); return TRUE; + case IDOK: OnSoftOK(hW); return TRUE; + case IDC_CLIPBOARD: OnClipboard(hW); return TRUE; + + case IDC_RECORDING: OnRecording(hW); return TRUE; + } + } + } + return FALSE; +} + +//////////////////////////////////////////////////////////////////////// +// init dlg +//////////////////////////////////////////////////////////////////////// + +void ComboBoxAddRes(HWND hWC,char * cs) +{ + int i=ComboBox_FindString(hWC,-1,cs); + if(i!=CB_ERR) return; + ComboBox_AddString(hWC,cs); +} + +BOOL OnInitSoftDialog(HWND hW) +{ + HWND hWC;char cs[256];int i;DEVMODE dv; + + ReadConfig(); // read registry stuff + + if(szDevName[0]) + SetDlgItemText(hW,IDC_DEVICETXT,szDevName); + + hWC=GetDlgItem(hW,IDC_RESOLUTION); + + memset(&dv,0,sizeof(DEVMODE)); + dv.dmSize=sizeof(DEVMODE); + i=0; + + while(EnumDisplaySettings(NULL,i,&dv)) + { + wsprintf(cs,"%4d x %4d - default",dv.dmPelsWidth,dv.dmPelsHeight); + ComboBoxAddRes(hWC,cs); + if(dv.dmDisplayFrequency > 40 && dv.dmDisplayFrequency < 200 ) + { + wsprintf(cs,"%4d x %4d , %4d Hz",dv.dmPelsWidth,dv.dmPelsHeight,dv.dmDisplayFrequency); + ComboBoxAddRes(hWC,cs); + } + i++; + } + + ComboBoxAddRes(hWC," 320 x 200 - default"); + ComboBoxAddRes(hWC," 320 x 240 - default"); + ComboBoxAddRes(hWC," 400 x 300 - default"); + ComboBoxAddRes(hWC," 512 x 384 - default"); + ComboBoxAddRes(hWC," 640 x 480 - default"); + ComboBoxAddRes(hWC," 800 x 600 - default"); + ComboBoxAddRes(hWC,"1024 x 768 - default"); + ComboBoxAddRes(hWC,"1152 x 864 - default"); + ComboBoxAddRes(hWC,"1280 x 1024 - default"); + ComboBoxAddRes(hWC,"1600 x 1200 - default"); + + if(iRefreshRate) + wsprintf(cs,"%4d x %4d , %4d Hz",iResX,iResY,iRefreshRate); + else wsprintf(cs,"%4d x %4d - default",iResX,iResY); + + i=ComboBox_FindString(hWC,-1,cs); + if(i==CB_ERR) i=0; + ComboBox_SetCurSel(hWC,i); + + hWC=GetDlgItem(hW,IDC_COLDEPTH); + ComboBox_AddString(hWC,"16 Bit"); + ComboBox_AddString(hWC,"32 Bit"); + wsprintf(cs,"%d Bit",iColDepth); // resolution + i=ComboBox_FindString(hWC,-1,cs); + if(i==CB_ERR) i=0; + ComboBox_SetCurSel(hWC,i); + + hWC=GetDlgItem(hW,IDC_SCANLINES); + ComboBox_AddString(hWC,"Scanlines disabled"); + ComboBox_AddString(hWC,"Scanlines enabled (standard)"); + ComboBox_AddString(hWC,"Scanlines enabled (double blitting - nVidia fix)"); + ComboBox_SetCurSel(hWC,iUseScanLines); + + SetDlgItemInt(hW,IDC_WINX,LOWORD(iWinSize),FALSE); // window size + SetDlgItemInt(hW,IDC_WINY,HIWORD(iWinSize),FALSE); + + if(UseFrameLimit) CheckDlgButton(hW,IDC_USELIMIT,TRUE); + if(UseFrameSkip) CheckDlgButton(hW,IDC_USESKIPPING,TRUE); + if(iWindowMode) CheckRadioButton(hW,IDC_DISPMODE1,IDC_DISPMODE2,IDC_DISPMODE2); + else CheckRadioButton(hW,IDC_DISPMODE1,IDC_DISPMODE2,IDC_DISPMODE1); + if(iSysMemory) CheckDlgButton(hW,IDC_SYSMEMORY,TRUE); + if(iStopSaver) CheckDlgButton(hW,IDC_STOPSAVER,TRUE); + if(iUseFixes) CheckDlgButton(hW,IDC_GAMEFIX,TRUE); + if(iShowFPS) CheckDlgButton(hW,IDC_SHOWFPS,TRUE); + if(bVsync) CheckDlgButton(hW,IDC_VSYNC,TRUE); + if(bTransparent) CheckDlgButton(hW,IDC_TRANSPARENT,TRUE); + if(iDebugMode) CheckDlgButton(hW,IDC_DEBUGMODE,TRUE); + + hWC=GetDlgItem(hW,IDC_NOSTRETCH); // streching + ComboBox_AddString(hWC,"Stretch to full window size"); + ComboBox_AddString(hWC,"1:1 (faster with some cards)"); + ComboBox_AddString(hWC,"Scale to window size, keep aspect ratio"); + ComboBox_AddString(hWC,"2xSaI stretching (needs a fast cpu)"); + ComboBox_AddString(hWC,"2xSaI unstretched (needs a fast cpu)"); + ComboBox_AddString(hWC,"Super2xSaI stretching (needs a very fast cpu)"); + ComboBox_AddString(hWC,"Super2xSaI unstretched (needs a very fast cpu)"); + ComboBox_AddString(hWC,"SuperEagle stretching (needs a fast cpu)"); + ComboBox_AddString(hWC,"SuperEagle unstretched (needs a fast cpu)"); + ComboBox_AddString(hWC,"Scale2x stretching (needs a fast cpu)"); + ComboBox_AddString(hWC,"Scale2x unstretched (needs a fast cpu)"); + ComboBox_AddString(hWC,"HQ2X unstretched (needs a fast cpu)"); + ComboBox_AddString(hWC,"HQ2X streched (needs a fast cpu)"); + ComboBox_AddString(hWC,"Scale3x stretching (needs a fast cpu)"); + ComboBox_AddString(hWC,"Scale3x unstretched (needs a fast cpu)"); + ComboBox_AddString(hWC,"HQ3X unstretched (needs a fast cpu)"); + ComboBox_SetCurSel(hWC,iUseNoStretchBlt); + + hWC=GetDlgItem(hW,IDC_DITHER); // dithering + ComboBox_AddString(hWC,"No dithering (fastest)"); + ComboBox_AddString(hWC,"Game dependend dithering (slow)"); + ComboBox_AddString(hWC,"Always dither g-shaded polygons (slowest)"); + ComboBox_SetCurSel(hWC,iUseDither); + + if(iFrameLimit==2) // frame limit wrapper + CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE); + else CheckDlgButton(hW,IDC_FRAMEMANUELL,TRUE); + + sprintf(cs,"%.1f",fFrameRate); + SetDlgItemText(hW,IDC_FRAMELIM,cs); // set frame rate + + return TRUE; +} + +//////////////////////////////////////////////////////////////////////// +// on ok: take vals +//////////////////////////////////////////////////////////////////////// + +void GetSettings(HWND hW) +{ + HWND hWC;char cs[256];int i,j;char * p; + + hWC=GetDlgItem(hW,IDC_RESOLUTION); // get resolution + i=ComboBox_GetCurSel(hWC); + ComboBox_GetLBText(hWC,i,cs); + iResX=atol(cs); + p=strchr(cs,'x'); + iResY=atol(p+1); + p=strchr(cs,','); // added by syo + if(p) iRefreshRate=atol(p+1); // get refreshrate + else iRefreshRate=0; + + hWC=GetDlgItem(hW,IDC_COLDEPTH); // get color depth + i=ComboBox_GetCurSel(hWC); + ComboBox_GetLBText(hWC,i,cs); + iColDepth=atol(cs); + + hWC=GetDlgItem(hW,IDC_SCANLINES); // scanlines + iUseScanLines=ComboBox_GetCurSel(hWC); + + i=GetDlgItemInt(hW,IDC_WINX,NULL,FALSE); // get win size + if(i<50) i=50; if(i>20000) i=20000; + j=GetDlgItemInt(hW,IDC_WINY,NULL,FALSE); + if(j<50) j=50; if(j>20000) j=20000; + iWinSize=MAKELONG(i,j); + + if(IsDlgButtonChecked(hW,IDC_DISPMODE2)) // win mode + iWindowMode=1; else iWindowMode=0; + + if(IsDlgButtonChecked(hW,IDC_USELIMIT)) // fps limit + UseFrameLimit=1; else UseFrameLimit=0; + + if(IsDlgButtonChecked(hW,IDC_USESKIPPING)) // fps skip + UseFrameSkip=1; else UseFrameSkip=0; + + if(IsDlgButtonChecked(hW,IDC_GAMEFIX)) // game fix + iUseFixes=1; else iUseFixes=0; + + if(IsDlgButtonChecked(hW,IDC_SYSMEMORY)) // use system memory + iSysMemory=1; else iSysMemory=0; + + if(IsDlgButtonChecked(hW,IDC_STOPSAVER)) // stop screen saver + iStopSaver=1; else iStopSaver=0; + + if(IsDlgButtonChecked(hW,IDC_VSYNC)) // wait VSYNC + bVsync=bVsync_Key=TRUE; else bVsync=bVsync_Key=FALSE; + + if(IsDlgButtonChecked(hW,IDC_TRANSPARENT)) // transparent menu + bTransparent=TRUE; else bTransparent=FALSE; + + if(IsDlgButtonChecked(hW,IDC_SHOWFPS)) // show fps + iShowFPS=1; else iShowFPS=0; + + if(IsDlgButtonChecked(hW,IDC_DEBUGMODE)) // debug mode + iDebugMode=1; else iDebugMode=0; + + hWC=GetDlgItem(hW,IDC_NOSTRETCH); + iUseNoStretchBlt=ComboBox_GetCurSel(hWC); + + hWC=GetDlgItem(hW,IDC_DITHER); + iUseDither=ComboBox_GetCurSel(hWC); + + if(IsDlgButtonChecked(hW,IDC_FRAMEAUTO)) // frame rate + iFrameLimit=2; + else iFrameLimit=1; + + GetDlgItemText(hW,IDC_FRAMELIM,cs,255); + fFrameRate=(float)atof(cs); + if(fFrameRate<10.0f) fFrameRate=10.0f; + if(fFrameRate>200.0f) fFrameRate=200.0f; +} + +void OnSoftOK(HWND hW) +{ + GetSettings(hW); + + if(!iWindowMode && !bTestModes()) // check fullscreen sets + { + MessageBox(hW,"Resolution/color depth not supported!","Error",MB_ICONERROR|MB_OK); + return; + } + + WriteConfig(); // write registry + + EndDialog(hW,TRUE); +} + +//////////////////////////////////////////////////////////////////////// +// on clipboard button +//////////////////////////////////////////////////////////////////////// + +void OnClipboard(HWND hW) +{ + HWND hWE=GetDlgItem(hW,IDC_CLPEDIT); + char * pB; + GetSettings(hW); + pB=pGetConfigInfos(1); + + if(pB) + { + SetDlgItemText(hW,IDC_CLPEDIT,pB); + SendMessage(hWE,EM_SETSEL,0,-1); + SendMessage(hWE,WM_COPY,0,0); + free(pB); + MessageBox(hW,"Configuration info successfully copied to the clipboard\nJust use the PASTE function in another program to retrieve the data!","Copy Info",MB_ICONINFORMATION|MB_OK); + } +} + +//////////////////////////////////////////////////////////////////////// +// Cancel +//////////////////////////////////////////////////////////////////////// + +void OnCfgCancel(HWND hW) +{ + EndDialog(hW,FALSE); +} + +//////////////////////////////////////////////////////////////////////// +// Bug fixes +//////////////////////////////////////////////////////////////////////// + +BOOL CALLBACK BugFixesDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + int i; + + for(i=0;i<32;i++) + { + if(dwCfgFixes&(1<<i)) + CheckDlgButton(hW,IDC_FIX1+i,TRUE); + } + } + + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDCANCEL: EndDialog(hW,FALSE);return TRUE; + + case IDOK: + { + int i; + dwCfgFixes=0; + for(i=0;i<32;i++) + { + if(IsDlgButtonChecked(hW,IDC_FIX1+i)) + dwCfgFixes|=(1<<i); + } + EndDialog(hW,TRUE); + return TRUE; + } + } + } + } + return FALSE; +} + +void OnBugFixes(HWND hW) +{ + DialogBox(hInst,MAKEINTRESOURCE(IDD_FIXES), + hW,(DLGPROC)BugFixesDlgProc); +} + +//////////////////////////////////////////////////////////////////////// +// Recording options +//////////////////////////////////////////////////////////////////////// + +void RefreshCodec(HWND hW) +{ +char buffer[255]; +union { + char chFCC[5]; + DWORD dwFCC; + } fcc; +ICINFO icinfo; +memset(&icinfo,0,sizeof(icinfo)); +icinfo.dwSize = sizeof(icinfo); +strcpy(fcc.chFCC,"VIDC"); +RECORD_COMPRESSION1.hic = ICOpen(fcc.dwFCC,RECORD_COMPRESSION1.fccHandler,ICMODE_QUERY); +if(RECORD_COMPRESSION1.hic) + { + ICGetInfo(RECORD_COMPRESSION1.hic,&icinfo,sizeof(icinfo)); + ICClose(RECORD_COMPRESSION1.hic); + wsprintf(buffer,"16 bit Compression: %ws",icinfo.szDescription); + } +else + wsprintf(buffer,"16 bit Compression: Full Frames (Uncompressed)"); +SetDlgItemText(hW,IDC_COMPRESSION1,buffer); + +memset(&icinfo,0,sizeof(icinfo)); +icinfo.dwSize = sizeof(icinfo); +RECORD_COMPRESSION2.hic = ICOpen(fcc.dwFCC,RECORD_COMPRESSION2.fccHandler,ICMODE_QUERY); +if(RECORD_COMPRESSION2.hic) + { + ICGetInfo(RECORD_COMPRESSION2.hic,&icinfo,sizeof(icinfo)); + ICClose(RECORD_COMPRESSION2.hic); + wsprintf(buffer,"24 bit Compression: %ws",icinfo.szDescription); + } +else + wsprintf(buffer,"24 bit Compression: Full Frames (Uncompressed)"); +SetDlgItemText(hW,IDC_COMPRESSION2,buffer); +} + + +BOOL CALLBACK RecordingDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + HWND hWC; + CheckDlgButton(hW,IDC_REC_MODE1,RECORD_RECORDING_MODE==0); + CheckDlgButton(hW,IDC_REC_MODE2,RECORD_RECORDING_MODE==1); + hWC = GetDlgItem(hW,IDC_VIDEO_SIZE); + ComboBox_ResetContent(hWC); + ComboBox_AddString(hWC,"Full"); + ComboBox_AddString(hWC,"Half"); + ComboBox_AddString(hWC,"Quarter"); + ComboBox_SetCurSel(hWC,RECORD_VIDEO_SIZE); + + SetDlgItemInt(hW,IDC_REC_WIDTH,RECORD_RECORDING_WIDTH,FALSE); + SetDlgItemInt(hW,IDC_REC_HEIGHT,RECORD_RECORDING_HEIGHT,FALSE); + + hWC = GetDlgItem(hW,IDC_FRAME_RATE); + ComboBox_ResetContent(hWC); + ComboBox_AddString(hWC,"1"); + ComboBox_AddString(hWC,"2"); + ComboBox_AddString(hWC,"3"); + ComboBox_AddString(hWC,"4"); + ComboBox_AddString(hWC,"5"); + ComboBox_AddString(hWC,"6"); + ComboBox_AddString(hWC,"7"); + ComboBox_AddString(hWC,"8"); + ComboBox_SetCurSel(hWC,RECORD_FRAME_RATE_SCALE); + CheckDlgButton(hW,IDC_COMPRESSION1,RECORD_COMPRESSION_MODE==0); + CheckDlgButton(hW,IDC_COMPRESSION2,RECORD_COMPRESSION_MODE==1); + RefreshCodec(hW); + } + + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_RECCFG: + { + if(IsDlgButtonChecked(hW,IDC_COMPRESSION1)) + { + BITMAPINFOHEADER bitmap = {40,640,480,1,16,0,640*480*2,2048,2048,0,0}; + if(!ICCompressorChoose(hW,ICMF_CHOOSE_DATARATE|ICMF_CHOOSE_KEYFRAME,&bitmap,NULL,&RECORD_COMPRESSION1,"16 bit Compression")) return TRUE; + if(RECORD_COMPRESSION1.cbState>sizeof(RECORD_COMPRESSION_STATE1)) + { + memset(&RECORD_COMPRESSION1,0,sizeof(RECORD_COMPRESSION1)); + memset(&RECORD_COMPRESSION_STATE1,0,sizeof(RECORD_COMPRESSION_STATE1)); + RECORD_COMPRESSION1.cbSize = sizeof(RECORD_COMPRESSION1); + } + else + { + if(RECORD_COMPRESSION1.lpState!=RECORD_COMPRESSION_STATE1) + memcpy(RECORD_COMPRESSION_STATE1,RECORD_COMPRESSION1.lpState,RECORD_COMPRESSION1.cbState); + } + RECORD_COMPRESSION1.lpState = RECORD_COMPRESSION_STATE1; + } + else + { + BITMAPINFOHEADER bitmap = {40,640,480,1,24,0,640*480*3,2048,2048,0,0}; + if(!ICCompressorChoose(hW,ICMF_CHOOSE_DATARATE|ICMF_CHOOSE_KEYFRAME,&bitmap,NULL,&RECORD_COMPRESSION2,"24 bit Compression")) return TRUE; + if(RECORD_COMPRESSION2.cbState>sizeof(RECORD_COMPRESSION_STATE2)) + { + memset(&RECORD_COMPRESSION2,0,sizeof(RECORD_COMPRESSION2)); + memset(&RECORD_COMPRESSION_STATE2,0,sizeof(RECORD_COMPRESSION_STATE2)); + RECORD_COMPRESSION2.cbSize = sizeof(RECORD_COMPRESSION2); + } + else + { + if(RECORD_COMPRESSION2.lpState!=RECORD_COMPRESSION_STATE2) + memcpy(RECORD_COMPRESSION_STATE2,RECORD_COMPRESSION2.lpState,RECORD_COMPRESSION2.cbState); + } + RECORD_COMPRESSION2.lpState = RECORD_COMPRESSION_STATE2; + } + RefreshCodec(hW); + return TRUE; + } + case IDCANCEL: EndDialog(hW,FALSE);return TRUE; + + case IDOK: + { + HWND hWC; + if(IsDlgButtonChecked(hW,IDC_REC_MODE1)) RECORD_RECORDING_MODE = 0; + else RECORD_RECORDING_MODE = 1; + hWC = GetDlgItem(hW,IDC_VIDEO_SIZE); + RECORD_VIDEO_SIZE = ComboBox_GetCurSel(hWC); + RECORD_RECORDING_WIDTH = GetDlgItemInt(hW,IDC_REC_WIDTH,NULL,FALSE); + RECORD_RECORDING_HEIGHT = GetDlgItemInt(hW,IDC_REC_HEIGHT,NULL,FALSE); + hWC = GetDlgItem(hW,IDC_FRAME_RATE); + RECORD_FRAME_RATE_SCALE = ComboBox_GetCurSel(hWC); + if(IsDlgButtonChecked(hW,IDC_COMPRESSION1)) RECORD_COMPRESSION_MODE = 0; + else RECORD_COMPRESSION_MODE = 1; + EndDialog(hW,TRUE); + return TRUE; + } + } + } + } + return FALSE; +} + +void OnRecording(HWND hW) +{ + DialogBox(hInst,MAKEINTRESOURCE(IDD_RECORDING), + hW,(DLGPROC)RecordingDlgProc); + +} + + +//////////////////////////////////////////////////////////////////////// +// default 1: fast +//////////////////////////////////////////////////////////////////////// + +void OnCfgDef1(HWND hW) +{ + HWND hWC; + + hWC=GetDlgItem(hW,IDC_RESOLUTION); + ComboBox_SetCurSel(hWC,1); + hWC=GetDlgItem(hW,IDC_COLDEPTH); + ComboBox_SetCurSel(hWC,0); + hWC=GetDlgItem(hW,IDC_SCANLINES); + ComboBox_SetCurSel(hWC,0); + CheckDlgButton(hW,IDC_USELIMIT,FALSE); + CheckDlgButton(hW,IDC_USESKIPPING,TRUE); + CheckRadioButton(hW,IDC_DISPMODE1,IDC_DISPMODE2,IDC_DISPMODE1); + CheckDlgButton(hW,IDC_FRAMEAUTO,FALSE); + CheckDlgButton(hW,IDC_FRAMEMANUELL,TRUE); + CheckDlgButton(hW,IDC_SHOWFPS,FALSE); + hWC=GetDlgItem(hW,IDC_NOSTRETCH); + ComboBox_SetCurSel(hWC,1); + hWC=GetDlgItem(hW,IDC_DITHER); + ComboBox_SetCurSel(hWC,0); + SetDlgItemInt(hW,IDC_FRAMELIM,200,FALSE); + SetDlgItemInt(hW,IDC_WINX,320,FALSE); + SetDlgItemInt(hW,IDC_WINY,240,FALSE); + CheckDlgButton(hW,IDC_VSYNC,FALSE); + CheckDlgButton(hW,IDC_TRANSPARENT,TRUE); + CheckDlgButton(hW,IDC_DEBUGMODE,FALSE); +} + +//////////////////////////////////////////////////////////////////////// +// default 2: nice +//////////////////////////////////////////////////////////////////////// + +void OnCfgDef2(HWND hW) +{ + HWND hWC; + + hWC=GetDlgItem(hW,IDC_RESOLUTION); + ComboBox_SetCurSel(hWC,2); + hWC=GetDlgItem(hW,IDC_COLDEPTH); + ComboBox_SetCurSel(hWC,0); + hWC=GetDlgItem(hW,IDC_SCANLINES); + ComboBox_SetCurSel(hWC,0); + CheckDlgButton(hW,IDC_USELIMIT,TRUE); + CheckDlgButton(hW,IDC_USESKIPPING,FALSE); + CheckRadioButton(hW,IDC_DISPMODE1,IDC_DISPMODE2,IDC_DISPMODE1); + CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE); + CheckDlgButton(hW,IDC_FRAMEMANUELL,FALSE); + CheckDlgButton(hW,IDC_SHOWFPS,FALSE); + CheckDlgButton(hW,IDC_VSYNC,FALSE); + CheckDlgButton(hW,IDC_TRANSPARENT,TRUE); + CheckDlgButton(hW,IDC_DEBUGMODE,FALSE); + hWC=GetDlgItem(hW,IDC_NOSTRETCH); + ComboBox_SetCurSel(hWC,0); + hWC=GetDlgItem(hW,IDC_DITHER); + ComboBox_SetCurSel(hWC,2); + + SetDlgItemInt(hW,IDC_FRAMELIM,200,FALSE); + SetDlgItemInt(hW,IDC_WINX,640,FALSE); + SetDlgItemInt(hW,IDC_WINY,480,FALSE); +} + +//////////////////////////////////////////////////////////////////////// +// read registry +//////////////////////////////////////////////////////////////////////// + +void ReadConfig(void) +{ + HKEY myKey; + DWORD temp; + DWORD type; + DWORD size; + + // predefines + iResX=640;iResY=480; + iColDepth=16; + iWindowMode=0; + UseFrameLimit=1; + UseFrameSkip=0; + iFrameLimit=2; + fFrameRate=200.0f; + iWinSize=MAKELONG(640,480); + dwCfgFixes=0; + iUseFixes=0; + iUseGammaVal=2048; + iUseScanLines=0; + iUseNoStretchBlt=0; + iUseDither=0; + iShowFPS=0; + iSysMemory=0; + iStopSaver=1; + bVsync=FALSE; + bTransparent=FALSE; + iRefreshRate=0; + iDebugMode=0; + lstrcpy(szGPUKeys,szKeyDefaults); + + memset(szDevName,0,128); + memset(&guiDev,0,sizeof(GUID)); + + // standard Windows psx config (registry) + if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\DFXVideo",0,KEY_ALL_ACCESS,&myKey)==ERROR_SUCCESS) + { + size = 4; + if(RegQueryValueEx(myKey,"ResX",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iResX=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"ResY",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iResY=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"RefreshRate",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iRefreshRate=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"WinSize",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iWinSize=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"WindowMode",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iWindowMode=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"ColDepth",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iColDepth=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseFrameLimit",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + UseFrameLimit=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseFrameSkip",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + UseFrameSkip=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"FrameLimit",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iFrameLimit=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"CfgFixes",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + dwCfgFixes=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseFixes",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iUseFixes=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseScanLines",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iUseScanLines=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"ShowFPS",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iShowFPS=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseNoStrechBlt",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iUseNoStretchBlt=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseDither",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iUseDither=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"UseGamma",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iUseGammaVal=(int)temp; + if(!iFrameLimit) {UseFrameLimit=0;UseFrameSkip=0;iFrameLimit=2;} + + // try to get the float framerate... if none: take int framerate + fFrameRate=0.0f; + size = 4; + if(RegQueryValueEx(myKey,"FrameRateFloat",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + fFrameRate=*((float *)(&temp)); + if(fFrameRate==0.0f) + { + fFrameRate=200.0f; + size = 4; + if(RegQueryValueEx(myKey,"FrameRate",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + fFrameRate=(float)temp; + } + + size = 4; + if(RegQueryValueEx(myKey,"UseSysMemory",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iSysMemory=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"StopSaver",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iStopSaver=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"WaitVSYNC",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + bVsync=bVsync_Key=(BOOL)temp; + size = 4; + if(RegQueryValueEx(myKey,"Transparent",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + bTransparent=(BOOL)temp; + size = 4; + if(RegQueryValueEx(myKey,"DebugMode",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iDebugMode=(BOOL)temp; + size=11; + RegQueryValueEx(myKey,"GPUKeys",0,&type,(LPBYTE)&szGPUKeys,&size); + size=128; + RegQueryValueEx(myKey,"DeviceName",0,&type,(LPBYTE)szDevName,&size); + size=sizeof(GUID); + RegQueryValueEx(myKey,"GuiDev",0,&type,(LPBYTE)&guiDev,&size); + +// +// Recording options +// +#define GetDWORD(xa,xb) size=4;if(RegQueryValueEx(myKey,xa,0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) xb=(unsigned long)temp; +#define GetBINARY(xa,xb) size=sizeof(xb);RegQueryValueEx(myKey,xa,0,&type,(LPBYTE)&xb,&size); + + GetDWORD("RecordingMode", RECORD_RECORDING_MODE); + GetDWORD("RecordingVideoSize", RECORD_VIDEO_SIZE); + GetDWORD("RecordingWidth", RECORD_RECORDING_WIDTH); + GetDWORD("RecordingHeight", RECORD_RECORDING_HEIGHT); + GetDWORD("RecordingFrameRateScale", RECORD_FRAME_RATE_SCALE); + GetDWORD("RecordingCompressionMode", RECORD_COMPRESSION_MODE); + GetBINARY("RecordingCompression1", RECORD_COMPRESSION1); + GetBINARY("RecordingCompressionState1", RECORD_COMPRESSION_STATE1); + GetBINARY("RecordingCompression2", RECORD_COMPRESSION2); + GetBINARY("RecordingCompressionState2", RECORD_COMPRESSION_STATE2); + + if(RECORD_RECORDING_WIDTH>1024) RECORD_RECORDING_WIDTH = 1024; + if(RECORD_RECORDING_HEIGHT>768) RECORD_RECORDING_HEIGHT = 768; + if(RECORD_VIDEO_SIZE>2) RECORD_VIDEO_SIZE = 2; + if(RECORD_FRAME_RATE_SCALE>7) RECORD_FRAME_RATE_SCALE = 7; + if(RECORD_COMPRESSION1.cbSize != sizeof(RECORD_COMPRESSION1)) + { + memset(&RECORD_COMPRESSION1,0,sizeof(RECORD_COMPRESSION1)); + RECORD_COMPRESSION1.cbSize = sizeof(RECORD_COMPRESSION1); + } + RECORD_COMPRESSION1.lpState = RECORD_COMPRESSION_STATE1; + if(RECORD_COMPRESSION2.cbSize != sizeof(RECORD_COMPRESSION2)) + { + memset(&RECORD_COMPRESSION2,0,sizeof(RECORD_COMPRESSION2)); + RECORD_COMPRESSION2.cbSize = sizeof(RECORD_COMPRESSION2); + } + RECORD_COMPRESSION2.lpState = RECORD_COMPRESSION_STATE2; + +// +// end of recording options +// + + RegCloseKey(myKey); + } + + if(!iColDepth) iColDepth=32; + if(iUseFixes) dwActFixes=dwCfgFixes; + SetFixes(); + + if(iUseGammaVal<0 || iUseGammaVal>1536) iUseGammaVal=2048; +} + +//////////////////////////////////////////////////////////////////////// + +void ReadWinSizeConfig(void) +{ + HKEY myKey; + DWORD temp; + DWORD type; + DWORD size; + + iResX=640;iResY=480; + iWinSize=MAKELONG(320,240); + + if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\DFXVideo",0,KEY_ALL_ACCESS,&myKey)==ERROR_SUCCESS) + { + size = 4; + if(RegQueryValueEx(myKey,"ResX",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iResX=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"ResY",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iResY=(int)temp; + size = 4; + if(RegQueryValueEx(myKey,"WinSize",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS) + iWinSize=(int)temp; + + RegCloseKey(myKey); + } +} + +//////////////////////////////////////////////////////////////////////// +// write registry +//////////////////////////////////////////////////////////////////////// + +void WriteConfig(void) +{ + HKEY myKey; + DWORD myDisp; + DWORD temp; + + RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\DFXVideo",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&myKey,&myDisp); + temp=iResX; + RegSetValueEx(myKey,"ResX",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iResY; + RegSetValueEx(myKey,"ResY",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iRefreshRate; + RegSetValueEx(myKey,"RefreshRate",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iWinSize; + RegSetValueEx(myKey,"WinSize",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iWindowMode; + RegSetValueEx(myKey,"WindowMode",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iColDepth; + RegSetValueEx(myKey,"ColDepth",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=UseFrameLimit; + RegSetValueEx(myKey,"UseFrameLimit",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=UseFrameSkip; + RegSetValueEx(myKey,"UseFrameSkip",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=dwCfgFixes; + RegSetValueEx(myKey,"CfgFixes",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iUseFixes; + RegSetValueEx(myKey,"UseFixes",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iUseScanLines; + RegSetValueEx(myKey,"UseScanLines",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iShowFPS; + RegSetValueEx(myKey,"ShowFPS",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iUseNoStretchBlt; + RegSetValueEx(myKey,"UseNoStrechBlt",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iUseDither; + RegSetValueEx(myKey,"UseDither",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iFrameLimit; + RegSetValueEx(myKey,"FrameLimit",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iUseGammaVal; + RegSetValueEx(myKey,"UseGamma",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=(DWORD)fFrameRate; + RegSetValueEx(myKey,"FrameRate",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=*((DWORD *)&fFrameRate); + RegSetValueEx(myKey,"FrameRateFloat",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=bVsync; + RegSetValueEx(myKey,"WaitVSYNC",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=bTransparent; + RegSetValueEx(myKey,"Transparent",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iSysMemory; + RegSetValueEx(myKey,"UseSysMemory",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iStopSaver; + RegSetValueEx(myKey,"StopSaver",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + temp=iDebugMode; + RegSetValueEx(myKey,"DebugMode",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp)); + RegSetValueEx(myKey,"GPUKeys",0,REG_BINARY,(LPBYTE)szGPUKeys,11); + RegSetValueEx(myKey,"DeviceName",0,REG_BINARY,(LPBYTE)szDevName,128); + RegSetValueEx(myKey,"GuiDev",0,REG_BINARY,(LPBYTE)&guiDev,sizeof(GUID)); + +// +// Recording options +// +if(RECORD_COMPRESSION1.cbState>sizeof(RECORD_COMPRESSION_STATE1) || RECORD_COMPRESSION1.lpState!=RECORD_COMPRESSION_STATE1) + { + memset(&RECORD_COMPRESSION1,0,sizeof(RECORD_COMPRESSION1)); + memset(&RECORD_COMPRESSION_STATE1,0,sizeof(RECORD_COMPRESSION_STATE1)); + RECORD_COMPRESSION1.cbSize = sizeof(RECORD_COMPRESSION1); + RECORD_COMPRESSION1.lpState = RECORD_COMPRESSION_STATE1; + } +if(RECORD_COMPRESSION2.cbState>sizeof(RECORD_COMPRESSION_STATE2) || RECORD_COMPRESSION2.lpState!=RECORD_COMPRESSION_STATE2) + { + memset(&RECORD_COMPRESSION2,0,sizeof(RECORD_COMPRESSION2)); + memset(&RECORD_COMPRESSION_STATE2,0,sizeof(RECORD_COMPRESSION_STATE2)); + RECORD_COMPRESSION2.cbSize = sizeof(RECORD_COMPRESSION2); + RECORD_COMPRESSION2.lpState = RECORD_COMPRESSION_STATE2; + } + +#define SetDWORD(xa,xb) RegSetValueEx(myKey,xa,0,REG_DWORD,(LPBYTE)&xb,sizeof(xb)); +#define SetBINARY(xa,xb) RegSetValueEx(myKey,xa,0,REG_BINARY,(LPBYTE)&xb,sizeof(xb)); + +SetDWORD("RecordingMode", RECORD_RECORDING_MODE); +SetDWORD("RecordingVideoSize", RECORD_VIDEO_SIZE); +SetDWORD("RecordingWidth", RECORD_RECORDING_WIDTH); +SetDWORD("RecordingHeight", RECORD_RECORDING_HEIGHT); +SetDWORD("RecordingFrameRateScale", RECORD_FRAME_RATE_SCALE); +SetDWORD("RecordingCompressionMode", RECORD_COMPRESSION_MODE); +SetBINARY("RecordingCompression1", RECORD_COMPRESSION1); +SetBINARY("RecordingCompressionState1", RECORD_COMPRESSION_STATE1); +SetBINARY("RecordingCompression2", RECORD_COMPRESSION2); +SetBINARY("RecordingCompressionState2", RECORD_COMPRESSION_STATE2); +// +// +// + RegCloseKey(myKey); +} + +//////////////////////////////////////////////////////////////////////// + +HWND gHWND; + +static HRESULT WINAPI Enum3DDevicesCallback( GUID* pGUID, LPSTR strDesc, + LPSTR strName, LPD3DDEVICEDESC pHALDesc, + LPD3DDEVICEDESC pHELDesc, LPVOID pvContext ) +{ + BOOL IsHardware; + + // Check params + if( NULL==pGUID || NULL==pHALDesc || NULL==pHELDesc) + return D3DENUMRET_CANCEL; + + // Handle specific device GUIDs. NullDevice renders nothing + if( IsEqualGUID( pGUID, &IID_IDirect3DNullDevice ) ) + return D3DENUMRET_OK; + + IsHardware = ( 0 != pHALDesc->dwFlags ); + if(!IsHardware) return D3DENUMRET_OK; + + bDeviceOK=TRUE; + + return D3DENUMRET_OK; +} + +static BOOL WINAPI DirectDrawEnumCallbackEx( GUID FAR* pGUID, LPSTR strDesc, + LPSTR strName, VOID* pV, + HMONITOR hMonitor ) +{ + // Use the GUID to create the DirectDraw object, so that information + // can be extracted from it. + + LPDIRECTDRAW pDD; + LPDIRECTDRAW4 g_pDD; + LPDIRECT3D3 pD3D; + + if( FAILED( DirectDrawCreate( pGUID, &pDD, 0L ) ) ) + { + return D3DENUMRET_OK; + } + + // Query the DirectDraw driver for access to Direct3D. + if( FAILED(IDirectDraw_QueryInterface(pDD, &IID_IDirectDraw4, (VOID**)&g_pDD))) + { + IDirectDraw_Release(pDD); + return D3DENUMRET_OK; + } + IDirectDraw_Release(pDD); + + // Query the DirectDraw driver for access to Direct3D. + + if( FAILED( IDirectDraw4_QueryInterface(g_pDD,&IID_IDirect3D3, (VOID**)&pD3D))) + { + IDirectDraw4_Release(g_pDD); + return D3DENUMRET_OK; + } + + bDeviceOK=FALSE; + + // Now, enumerate all the 3D devices + IDirect3D3_EnumDevices(pD3D,Enum3DDevicesCallback,NULL); + + if(bDeviceOK) + { + HWND hWC=GetDlgItem(gHWND,IDC_DEVICE); + int i=ComboBox_AddString(hWC,strDesc); + GUID * g=(GUID *)malloc(sizeof(GUID)); + if(NULL != pGUID) *g=*pGUID; + else memset(g,0,sizeof(GUID)); + ComboBox_SetItemData(hWC,i,g); + } + + IDirect3D3_Release(pD3D); + IDirectDraw4_Release(g_pDD); + return DDENUMRET_OK; +} + +//----------------------------------------------------------------------------- + +static BOOL WINAPI DirectDrawEnumCallback( GUID FAR* pGUID, LPSTR strDesc, + LPSTR strName, VOID* pV) +{ + return DirectDrawEnumCallbackEx( pGUID, strDesc, strName, NULL, NULL ); +} + +//----------------------------------------------------------------------------- + +void DoDevEnum(HWND hW) +{ + LPDIRECTDRAWENUMERATEEX pDDrawEnumFn; + + HMODULE hDDrawDLL = GetModuleHandle("DDRAW.DLL"); + if(NULL == hDDrawDLL) return; + + gHWND=hW; + + pDDrawEnumFn = (LPDIRECTDRAWENUMERATEEX) + GetProcAddress( hDDrawDLL, "DirectDrawEnumerateExA" ); + + if(pDDrawEnumFn) + pDDrawEnumFn( DirectDrawEnumCallbackEx, NULL, + DDENUM_ATTACHEDSECONDARYDEVICES | + DDENUM_DETACHEDSECONDARYDEVICES | + DDENUM_NONDISPLAYDEVICES ); + else + DirectDrawEnumerate( DirectDrawEnumCallback, NULL ); +} + +//////////////////////////////////////////////////////////////////////// + +void FreeGui(HWND hW) +{ + int i,iCnt; + HWND hWC=GetDlgItem(hW,IDC_DEVICE); + iCnt=ComboBox_GetCount(hWC); + for(i=0;i<iCnt;i++) + { + free((GUID *)ComboBox_GetItemData(hWC,i)); + } +} + +//////////////////////////////////////////////////////////////////////// + +BOOL CALLBACK DeviceDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + HWND hWC;int i; + DoDevEnum(hW); + hWC=GetDlgItem(hW,IDC_DEVICE); + i=ComboBox_FindStringExact(hWC,-1,szDevName); + if(i==CB_ERR) i=0; + ComboBox_SetCurSel(hWC,i); + hWC=GetDlgItem(hW,IDC_GAMMA); + ScrollBar_SetRange(hWC,0,1024,FALSE); + if(iUseGammaVal==2048) ScrollBar_SetPos(hWC,512,FALSE); + else + { + ScrollBar_SetPos(hWC,iUseGammaVal,FALSE); + CheckDlgButton(hW,IDC_USEGAMMA,TRUE); + } + } + + case WM_HSCROLL: + { + HWND hWC=GetDlgItem(hW,IDC_GAMMA); + int pos=ScrollBar_GetPos(hWC); + switch(LOWORD(wParam)) + { + case SB_THUMBPOSITION: + pos=HIWORD(wParam);break; + case SB_LEFT: + pos=0;break; + case SB_RIGHT: + pos=1024;break; + case SB_LINELEFT: + pos-=16;break; + case SB_LINERIGHT: + pos+=16;break; + case SB_PAGELEFT: + pos-=128;break; + case SB_PAGERIGHT: + pos+=128;break; + + } + ScrollBar_SetPos(hWC,pos,TRUE); + return TRUE; + } + + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDCANCEL: FreeGui(hW); + EndDialog(hW,FALSE);return TRUE; + case IDOK: + { + HWND hWC=GetDlgItem(hW,IDC_DEVICE); + int i=ComboBox_GetCurSel(hWC); + if(i==CB_ERR) return TRUE; + guiDev=*((GUID *)ComboBox_GetItemData(hWC,i)); + ComboBox_GetLBText(hWC,i,szDevName); + FreeGui(hW); + + if(!IsDlgButtonChecked(hW,IDC_USEGAMMA)) + iUseGammaVal=2048; + else + iUseGammaVal=ScrollBar_GetPos(GetDlgItem(hW,IDC_GAMMA)); + + EndDialog(hW,TRUE); + return TRUE; + } + } + } + } + return FALSE; +} + +//////////////////////////////////////////////////////////////////////// + +void SelectDev(HWND hW) +{ + if(DialogBox(hInst,MAKEINTRESOURCE(IDD_DEVICE), + hW,(DLGPROC)DeviceDlgProc)==IDOK) + { + SetDlgItemText(hW,IDC_DEVICETXT,szDevName); + } +} + + +//////////////////////////////////////////////////////////////////////// + +static HRESULT WINAPI EnumDisplayModesCallback( DDSURFACEDESC2* pddsd, + VOID* pvContext ) +{ + if(NULL==pddsd) return DDENUMRET_CANCEL; + + if(pddsd->ddpfPixelFormat.dwRGBBitCount==(unsigned int)iColDepth && + pddsd->dwWidth==(unsigned int)iResX && + pddsd->dwHeight==(unsigned int)iResY) + { + bDeviceOK=TRUE; + return DDENUMRET_CANCEL; + } + + return DDENUMRET_OK; +} + +//////////////////////////////////////////////////////////////////////// + +BOOL bTestModes(void) +{ + LPDIRECTDRAW pDD; + LPDIRECTDRAW4 g_pDD; + + GUID FAR * guid=0; + int i;unsigned char * c=(unsigned char *)&guiDev; + for(i=0;i<sizeof(GUID);i++,c++) + {if(*c) {guid=&guiDev;break;}} + + bDeviceOK=FALSE; + + if( FAILED( DirectDrawCreate(guid, &pDD, 0L ) ) ) + return FALSE; + + if(FAILED(IDirectDraw_QueryInterface(pDD, &IID_IDirectDraw4, (VOID**)&g_pDD))) + { + IDirectDraw_Release(pDD); + return FALSE; + } + IDirectDraw_Release(pDD); + + IDirectDraw4_EnumDisplayModes(g_pDD,0,NULL,NULL,EnumDisplayModesCallback); + + IDirectDraw4_Release(g_pDD); + + return bDeviceOK; +} + +//////////////////////////////////////////////////////////////////////// +// define key dialog +//////////////////////////////////////////////////////////////////////// + +typedef struct KEYSETSTAG +{ + char szName[10]; + char cCode; +} +KEYSETS; + +KEYSETS tMKeys[]= +{ + {"SPACE", 0x20}, + {"PRIOR", 0x21}, + {"NEXT", 0x22}, + {"END", 0x23}, + {"HOME", 0x24}, + {"LEFT", 0x25}, + {"UP", 0x26}, + {"RIGHT", 0x27}, + {"DOWN", 0x28}, + {"SELECT", 0x29}, + {"PRINT", 0x2A}, + {"EXECUTE", 0x2B}, + {"SNAPSHOT", 0x2C}, + {"INSERT", 0x2D}, + {"DELETE", 0x2E}, + {"HELP", 0x2F}, + {"NUMPAD0", 0x60}, + {"NUMPAD1", 0x61}, + {"NUMPAD2", 0x62}, + {"NUMPAD3", 0x63}, + {"NUMPAD4", 0x64}, + {"NUMPAD5", 0x65}, + {"NUMPAD6", 0x66}, + {"NUMPAD7", 0x67}, + {"NUMPAD8", 0x68}, + {"NUMPAD9", 0x69}, + {"MULTIPLY", 0x6A}, + {"ADD", 0x6B}, + {"SEPARATOR", 0x6C}, + {"SUBTRACT", 0x6D}, + {"DECIMAL", 0x6E}, + {"DIVIDE", 0x6F}, + {"F9", VK_F9}, + {"F10", VK_F10}, + {"F11", VK_F11}, + {"F12", VK_F12}, + {"", 0x00} +}; + +void SetGPUKey(HWND hWC,char szKey) +{ + int i,iCnt=ComboBox_GetCount(hWC); + for(i=0;i<iCnt;i++) + { + if(ComboBox_GetItemData(hWC,i)==szKey) break; + } + if(i!=iCnt) ComboBox_SetCurSel(hWC,i); +} + +BOOL CALLBACK KeyDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + int i,j,k;char szB[2];HWND hWC; + for(i=IDC_KEY1;i<=IDC_KEY10;i++) + { + hWC=GetDlgItem(hW,i); + + for(j=0;tMKeys[j].cCode!=0;j++) + { + k=ComboBox_AddString(hWC,tMKeys[j].szName); + ComboBox_SetItemData(hWC,k,tMKeys[j].cCode); + } + for(j=0x30;j<=0x39;j++) + { + wsprintf(szB,"%c",j); + k=ComboBox_AddString(hWC,szB); + ComboBox_SetItemData(hWC,k,j); + } + for(j=0x41;j<=0x5a;j++) + { + wsprintf(szB,"%c",j); + k=ComboBox_AddString(hWC,szB); + ComboBox_SetItemData(hWC,k,j); + } + SetGPUKey(GetDlgItem(hW,i),szGPUKeys[i-IDC_KEY1]); + } + }return TRUE; + + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_DEFAULT: + { + int i; + for(i=IDC_KEY1;i<=IDC_KEY10;i++) + SetGPUKey(GetDlgItem(hW,i),szKeyDefaults[i-IDC_KEY1]); + }break; + + case IDCANCEL: EndDialog(hW,FALSE); return TRUE; + case IDOK: + { + HWND hWC;int i; + for(i=IDC_KEY1;i<=IDC_KEY10;i++) + { + hWC=GetDlgItem(hW,i); + szGPUKeys[i-IDC_KEY1]=(char)ComboBox_GetItemData(hWC,ComboBox_GetCurSel(hWC)); + if(szGPUKeys[i-IDC_KEY1]<0x20) szGPUKeys[i-IDC_KEY1]=0x20; + } + EndDialog(hW,TRUE); + return TRUE; + } + } + } + } + return FALSE; +} + +void OnKeyConfig(HWND hW) +{ + DialogBox(hInst,MAKEINTRESOURCE(IDD_KEYS), + hW,(DLGPROC)KeyDlgProc); +} + |
