/*************************************************************************** cfg.c - description ------------------- begin : Sun Mar 08 2009 copyright : (C) 1999-2009 by Pete Bernert web : www.pbernert.com ***************************************************************************/ /*************************************************************************** * * * 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 ///////////////////////////////////////////////////////////////////////////// // Windows config handling #include "stdafx.h" #include "resource.h" #include "externals.h" #include "cfg.h" #include char szKeyDefaults[7]={VK_DELETE,VK_INSERT,VK_HOME,VK_END,VK_PRIOR,VK_NEXT,0x00}; ///////////////////////////////////////////////////////////////////////////// // CCfgDlg dialog BOOL OnInitCfgDialog(HWND hW); void OnCfgOK(HWND hW); void OnCfgCancel(HWND hW); void OnCfgDef1(HWND hW); void OnCfgDef2(HWND hW); void OnBugFixes(HWND hW); void OnKeyConfig(HWND hW); void GetSettings(HWND hW); void OnClipboard(HWND hW); char * GetConfigInfos(HWND hWE); BOOL CALLBACK CfgDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: return OnInitCfgDialog(hW); case WM_COMMAND: { switch(LOWORD(wParam)) { 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 IDCANCEL: OnCfgCancel(hW); return TRUE; case IDOK: OnCfgOK(hW); return TRUE; case IDC_CLIPBOARD: OnClipboard(hW); return TRUE; } } } return FALSE; } ///////////////////////////////////////////////////////////////////////////// // CCfgDlg message handlers //////////////////////////////////////////////////////////////////////// // init dlg //////////////////////////////////////////////////////////////////////// void ComboBoxAddRes(HWND hWC,char * cs) // ADD COMBOBOX RESOURCES { int i=ComboBox_FindString(hWC,-1,cs); if(i!=CB_ERR) return; ComboBox_AddString(hWC,cs); } BOOL OnInitCfgDialog(HWND hW) // INIT CONFIG DIALOG { HWND hWC;char cs[256];int i;DEVMODE dv; ReadConfig(); // read registry stuff //----------------------------------------------------// fill combo with available resolutions hWC=GetDlgItem(hW,IDC_RESOLUTION); memset(&dv,0,sizeof(DEVMODE)); dv.dmSize=sizeof(DEVMODE); i=0; while(EnumDisplaySettings(NULL,i,&dv)) // add all resolutions from the driver { wsprintf(cs,"%4d x %4d",dv.dmPelsWidth,dv.dmPelsHeight); ComboBoxAddRes(hWC,cs); i++; } ComboBoxAddRes(hWC," 640 x 480"); // and also add some common ones ComboBoxAddRes(hWC," 800 x 600"); ComboBoxAddRes(hWC,"1024 x 768"); ComboBoxAddRes(hWC,"1152 x 864"); ComboBoxAddRes(hWC,"1280 x 1024"); ComboBoxAddRes(hWC,"1600 x 1200"); wsprintf(cs,"%4d x %4d",iResX,iResY); // search curr resolution in combo i=ComboBox_FindString(hWC,-1,cs); if(i==CB_ERR) i=0; ComboBox_SetCurSel(hWC,i); // and select this one //----------------------------------------------------// window size SetDlgItemInt(hW,IDC_WINX,LOWORD(iWinSize),FALSE); SetDlgItemInt(hW,IDC_WINY,HIWORD(iWinSize),FALSE); //----------------------------------------------------// color depth hWC=GetDlgItem(hW,IDC_COLORDEPTH); ComboBox_AddString(hWC,"16 Bit"); ComboBox_AddString(hWC,"32 Bit"); wsprintf(cs,"%d Bit",iColDepth); i=ComboBox_FindString(hWC,-1,cs); if(i==CB_ERR) i=0; ComboBox_SetCurSel(hWC,i); //----------------------------------------------------// vsync hWC=GetDlgItem(hW,IDC_VSYNC); ComboBox_AddString(hWC,"Driver"); ComboBox_AddString(hWC,"Off"); ComboBox_AddString(hWC,"On"); ComboBox_SetCurSel(hWC,iForceVSync+1); //----------------------------------------------------// vram size hWC=GetDlgItem(hW,IDC_VRAMSIZE); ComboBox_AddString(hWC,"0 (Autodetect)"); ComboBox_AddString(hWC,"2"); ComboBox_AddString(hWC,"4"); ComboBox_AddString(hWC,"8"); ComboBox_AddString(hWC,"16"); ComboBox_AddString(hWC,"32"); ComboBox_AddString(hWC,"64"); ComboBox_AddString(hWC,"128 (or more)"); if(!iVRamSize) ComboBox_SetCurSel(hWC,0); else {wsprintf(cs,"%d",iVRamSize);ComboBox_SetText(hWC,cs);} //----------------------------------------------------// texture quality hWC=GetDlgItem(hW,IDC_TEXQUALITY); ComboBox_AddString(hWC,"don't care - Use driver's default textures"); ComboBox_AddString(hWC,"R4 G4 B4 A4 - Fast, but less colorful"); ComboBox_AddString(hWC,"R5 G5 B5 A1 - Nice colors, bad transparency"); ComboBox_AddString(hWC,"R8 G8 B8 A8 - Best colors, more ram needed"); ComboBox_AddString(hWC,"B8 G8 R8 A8 - Slightly faster with some cards"); ComboBox_SetCurSel(hWC,iTexQuality); //----------------------------------------------------// all kind of on/off options if(bDrawDither) CheckDlgButton(hW,IDC_DRAWDITHER,TRUE); if(bUseLines) CheckDlgButton(hW,IDC_USELINES,TRUE); if(bUseFrameLimit) CheckDlgButton(hW,IDC_USELIMIT,TRUE); if(bUseFrameSkip) CheckDlgButton(hW,IDC_USESKIP,TRUE); if(bAdvancedBlend) CheckDlgButton(hW,IDC_ADVBLEND,TRUE); if(bOpaquePass) CheckDlgButton(hW,IDC_OPAQUE,TRUE); // if(bUseAntiAlias) CheckDlgButton(hW,IDC_USEANTIALIAS,TRUE); if(bWindowMode) CheckDlgButton(hW,IDC_DISPMODE2,TRUE); else CheckDlgButton(hW,IDC_DISPMODE1,TRUE); if(iUseMask) CheckDlgButton(hW,IDC_USEMASK,TRUE); if(bUseFastMdec) CheckDlgButton(hW,IDC_FASTMDEC,TRUE); if(bUse15bitMdec) CheckDlgButton(hW,IDC_FASTMDEC2,TRUE); if(bUseFixes) CheckDlgButton(hW,IDC_GAMEFIX,TRUE); if(bGteAccuracy) CheckDlgButton(hW,IDC_GTEACCURACY,TRUE); if(iUseExts) CheckDlgButton(hW,IDC_USEEXT, TRUE); if(iUseScanLines) CheckDlgButton(hW,IDC_USESCANLINES,TRUE); if(iShowFPS) CheckDlgButton(hW,IDC_SHOWFPS,TRUE); if(bKeepRatio) CheckDlgButton(hW,IDC_ARATIO,TRUE); if(bForceRatio43) CheckDlgButton(hW,IDC_ARATIO43,TRUE); if(iBlurBuffer) CheckDlgButton(hW,IDC_BLUR,TRUE); if(iNoScreenSaver) CheckDlgButton(hW,IDC_SSAVE,TRUE); //----------------------------------------------------// texture filter hWC=GetDlgItem(hW,IDC_FILTERTYPE); ComboBox_AddString(hWC,"0: None"); ComboBox_AddString(hWC,"1: Standard - Glitches will happen"); ComboBox_AddString(hWC,"2: Extended - Removes black borders"); ComboBox_AddString(hWC,"3: Standard w/o Sprites - unfiltered 2D"); ComboBox_AddString(hWC,"4: Extended w/o Sprites - unfiltered 2D"); ComboBox_AddString(hWC,"5: Standard + smoothed Sprites"); ComboBox_AddString(hWC,"6: Extended + smoothed Sprites"); ComboBox_SetCurSel(hWC,iFilterType); //----------------------------------------------------// hires texture mode hWC=GetDlgItem(hW,IDC_HIRESTEX); ComboBox_AddString(hWC,"0: None (standard)"); ComboBox_AddString(hWC,"1: 2xSaI (much vram needed)"); ComboBox_AddString(hWC,"2: Stretched (filtering needed)"); ComboBox_SetCurSel(hWC,iHiResTextures); //----------------------------------------------------// offscreen drawing hWC=GetDlgItem(hW,IDC_OFFSCREEN); ComboBox_AddString(hWC,"0: None - Fastest, most glitches"); ComboBox_AddString(hWC,"1: Minimum - Missing screens"); ComboBox_AddString(hWC,"2: Standard - OK for most games"); ComboBox_AddString(hWC,"3: Enhanced - Shows more stuff"); ComboBox_AddString(hWC,"4: Extended - Can cause garbage"); ComboBox_SetCurSel(hWC,iOffscreenDrawing); //----------------------------------------------------// texture quality hWC=GetDlgItem(hW,IDC_FRAMETEX); ComboBox_AddString(hWC,"0: Emulated vram - effects need FVP"); ComboBox_AddString(hWC,"1: Black - Fast but no special effects"); ComboBox_AddString(hWC,"2: Gfx card buffer - Can be slow"); ComboBox_AddString(hWC,"3: Gfx card buffer & software - slow"); ComboBox_SetCurSel(hWC,iFrameTexType); //----------------------------------------------------// framebuffer read mode hWC=GetDlgItem(hW,IDC_FRAMEREAD); ComboBox_AddString(hWC,"0: Emulated vram - OK for most games"); ComboBox_AddString(hWC,"1: Gfx card buffer reads"); ComboBox_AddString(hWC,"2: Gfx card buffer moves"); ComboBox_AddString(hWC,"3: Gfx card buffer reads & moves"); ComboBox_AddString(hWC,"4: Full software drawing (FVP)"); ComboBox_SetCurSel(hWC,iFrameReadType); //----------------------------------------------------// line hack mode hWC = GetDlgItem(hW, IDC_LINEHACK); ComboBox_AddString(hWC, "0: Disabled"); ComboBox_AddString(hWC, "1: Default (Doom, Hexen, Soul Blade)"); ComboBox_AddString(hWC, "2: Aggressive (Dark Forces, Duke Nukem)"); ComboBox_SetCurSel(hWC, iLineHackMode); //----------------------------------------------------// framerate stuff if(iFrameLimit==2) CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE); else CheckDlgButton(hW,IDC_FRAMEMANUELL,TRUE); sprintf(cs,"%.2f",fFrameRate); SetDlgItemText(hW,IDC_FRAMELIMIT,cs); SetDlgItemInt(hW,IDC_SCANBLEND,iScanBlend,TRUE); return TRUE; } //////////////////////////////////////////////////////////////////////// // on ok: take vals //////////////////////////////////////////////////////////////////////// void GetSettings(HWND hW) { HWND hWC;char cs[256];int i,j;char * p; hWC=GetDlgItem(hW,IDC_VRAMSIZE); // get vram size ComboBox_GetText(hWC,cs,255); iVRamSize=atoi(cs); if(iVRamSize<0) iVRamSize=0; if(iVRamSize>1024) iVRamSize=1024; hWC=GetDlgItem(hW,IDC_RESOLUTION); // get resolution i=ComboBox_GetCurSel(hWC); ComboBox_GetLBText(hWC,i,cs); iResX=atol(cs); p=strchr(cs,'x'); if(p) iResY=atol(p+1); else iResY=480; hWC=GetDlgItem(hW,IDC_COLORDEPTH); // get color depth i=ComboBox_GetCurSel(hWC); ComboBox_GetLBText(hWC,i,cs); iColDepth=atol(cs); hWC=GetDlgItem(hW,IDC_VSYNC); // get vsync iForceVSync=ComboBox_GetCurSel(hWC)-1; i=GetDlgItemInt(hW,IDC_WINX,NULL,FALSE); // get win size if(i<100) i=100; if(i>16384) i=16384; j=GetDlgItemInt(hW,IDC_WINY,NULL,FALSE); if(j<100) j=100; if(j>16384) j=16384; iWinSize=MAKELONG(i,j); hWC=GetDlgItem(hW,IDC_TEXQUALITY); // texture quality iTexQuality=ComboBox_GetCurSel(hWC); hWC=GetDlgItem(hW,IDC_FILTERTYPE); // all kind of options iFilterType=ComboBox_GetCurSel(hWC); if(IsDlgButtonChecked(hW,IDC_DRAWDITHER)) bDrawDither=TRUE; else bDrawDither=FALSE; if(IsDlgButtonChecked(hW,IDC_USELINES)) bUseLines=TRUE; else bUseLines=FALSE; if(IsDlgButtonChecked(hW,IDC_DISPMODE2)) bWindowMode=TRUE; else bWindowMode=FALSE; if(IsDlgButtonChecked(hW,IDC_ADVBLEND)) bAdvancedBlend=TRUE; else bAdvancedBlend=FALSE; iOffscreenDrawing=ComboBox_GetCurSel(GetDlgItem(hW,IDC_OFFSCREEN)); iFrameTexType=ComboBox_GetCurSel(GetDlgItem(hW,IDC_FRAMETEX)); iFrameReadType=ComboBox_GetCurSel(GetDlgItem(hW,IDC_FRAMEREAD)); iLineHackMode = ComboBox_GetCurSel(GetDlgItem(hW,IDC_LINEHACK)); if(IsDlgButtonChecked(hW,IDC_USELIMIT)) bUseFrameLimit=TRUE; else bUseFrameLimit=FALSE; if(IsDlgButtonChecked(hW,IDC_USESKIP)) bUseFrameSkip=TRUE; else bUseFrameSkip=FALSE; if(IsDlgButtonChecked(hW,IDC_OPAQUE)) bOpaquePass=TRUE; else bOpaquePass=FALSE; // if(IsDlgButtonChecked(hW,IDC_USEANTIALIAS)) // bUseAntiAlias=TRUE; else bUseAntiAlias=FALSE; if(IsDlgButtonChecked(hW,IDC_FASTMDEC)) bUseFastMdec=TRUE; else bUseFastMdec=FALSE; if(IsDlgButtonChecked(hW,IDC_FASTMDEC2)) bUse15bitMdec=TRUE; else bUse15bitMdec=FALSE; if(IsDlgButtonChecked(hW,IDC_GAMEFIX)) bUseFixes=TRUE; else bUseFixes=FALSE; if(IsDlgButtonChecked(hW,IDC_GTEACCURACY)) bGteAccuracy=TRUE; else bGteAccuracy=FALSE; if(IsDlgButtonChecked(hW, IDC_USEEXT)) iUseExts = TRUE; else iUseExts = FALSE; if(IsDlgButtonChecked(hW,IDC_USESCANLINES)) iUseScanLines=1; else iUseScanLines=0; if(IsDlgButtonChecked(hW,IDC_SHOWFPS)) iShowFPS=1; else iShowFPS=0; if(IsDlgButtonChecked(hW,IDC_ARATIO)) bKeepRatio=TRUE; else bKeepRatio=FALSE; if(IsDlgButtonChecked(hW,IDC_ARATIO43)) bForceRatio43=TRUE; else bForceRatio43=FALSE; if(IsDlgButtonChecked(hW,IDC_BLUR)) iBlurBuffer=1; else iBlurBuffer=0; if(IsDlgButtonChecked(hW,IDC_SSAVE)) iNoScreenSaver=1; else iNoScreenSaver=0; hWC=GetDlgItem(hW,IDC_HIRESTEX); iHiResTextures=ComboBox_GetCurSel(hWC); if(IsDlgButtonChecked(hW,IDC_USEMASK)) {iUseMask=1;iZBufferDepth=16;} else {iUseMask=0;iZBufferDepth=0; } iScanBlend=GetDlgItemInt(hW,IDC_SCANBLEND,NULL,TRUE); if(iScanBlend>255) iScanBlend=0; if(iScanBlend<-1) iScanBlend=-1; if(IsDlgButtonChecked(hW,IDC_FRAMEAUTO)) // frame rate settings iFrameLimit=2; else iFrameLimit=1; GetDlgItemText(hW,IDC_FRAMELIMIT,cs,255); fFrameRate=(float)atof(cs); if(fFrameRate<10.0f) fFrameRate=10.0f; if(fFrameRate>1000.0f) fFrameRate=1000.0f; } //////////////////////////////////////////////////////////////////////// // OK button //////////////////////////////////////////////////////////////////////// void OnCfgOK(HWND hW) { GetSettings(hW); // get dialog settings WriteConfig(); // write registry EndDialog(hW,TRUE); // close dialog } //////////////////////////////////////////////////////////////////////// // Clipboard button //////////////////////////////////////////////////////////////////////// void OnClipboard(HWND hW) { HWND hWE=GetDlgItem(hW,IDC_CLPEDIT); char * pB; GetSettings(hW); // get dialog setings pB=GetConfigInfos(hWE); // get text infos if(pB) // some text got? { SetDlgItemText(hW,IDC_CLPEDIT,pB); // -> set text in invisible edit SendMessage(hWE,EM_SETSEL,0,-1); // -> sel all in edit SendMessage(hWE,WM_COPY,0,0); // -> copy sel to clipboard free(pB); // -> free helper text buffer 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 button (just closes window) //////////////////////////////////////////////////////////////////////// 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: // init dialog: { int i; for(i=0;i<32;i++) // -> loop all 32 checkboxes { if(dwCfgFixes&(1< if fix is active: check box CheckDlgButton(hW,IDC_FIX1+i,TRUE); } } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDCANCEL: EndDialog(hW,FALSE);return TRUE; // cancel: close window case IDOK: // ok: take settings and close { int i; dwCfgFixes=0; for(i=0;i<32;i++) { if(IsDlgButtonChecked(hW,IDC_FIX1+i)) dwCfgFixes|=(1< set defaults for(i=IDC_KEY1;i<=IDC_KEY6;i++) SetGPUKey(GetDlgItem(hW,i),szKeyDefaults[i-IDC_KEY1]); }break; case IDCANCEL: // cancel: just close window EndDialog(hW,FALSE); return TRUE; case IDOK: // ok: take key bindings { HWND hWC;int i; for(i=IDC_KEY1;i<=IDC_KEY6;i++) { hWC=GetDlgItem(hW,i); szGPUKeys[i-IDC_KEY1]=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) // call key dialog { DialogBox(hInst,MAKEINTRESOURCE(IDD_KEYS), hW,(DLGPROC)KeyDlgProc); } ///////////////////////////////////////////////////////////////////////////// // AboutDlg dialog (Windows) BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: { switch(LOWORD(wParam)) { case IDOK: EndDialog(hW,TRUE);return TRUE; } } } return FALSE; }