From 7e800960ff64d2cb1f8a21407bbff9d6322ba89f Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 22 Dec 2009 22:11:14 +0000 Subject: [PATCH] win32: add directdraw software-forcer (config > display method), to fix some systems with broken directdraw as well as block the bilinear filtering in winxp --- desmume/src/windows/main.cpp | 44 ++++++++++++++++++++++++------- desmume/src/windows/resource.h | 5 +++- desmume/src/windows/resources.rc | Bin 891458 -> 891018 bytes desmume/src/windows/winutil.cpp | 7 +++++ desmume/src/windows/winutil.h | 3 +++ 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 3134c8558..9a2383f8d 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -667,10 +667,14 @@ void ToDSScreenRelativeCoords(s32& x, s32& y, int whichScreen) // END Rotation definitions //-----window style handling---- +const u32 DISPMETHOD_DDRAW_HW = 1; +const u32 DISPMETHOD_DDRAW_SW = 2; + const u32 DWS_NORMAL = 0; const u32 DWS_ALWAYSONTOP = 1; const u32 DWS_LOCKDOWN = 2; const u32 DWS_FULLSCREEN = 4; +const u32 DWS_DDRAW_SW = 8; static u32 currWindowStyle = DWS_NORMAL; static void SetStyle(u32 dws) @@ -810,6 +814,7 @@ int CreateDDrawBuffers() ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + if(GetStyle()&DWS_DDRAW_SW) ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = video.rotatedwidth(); ddsd.dwHeight = video.rotatedheight(); @@ -907,7 +912,7 @@ void UpdateWndRects(HWND hwnd) POINT ptClient; RECT rc; - bool maximized = IsZoomed(hwnd); + bool maximized = IsZoomed(hwnd)!=FALSE; int wndWidth, wndHeight; int defHeight = video.height; @@ -2291,13 +2296,6 @@ class WinDriver : public BaseDriver } }; -std::string GetPrivateProfileStdString(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpDefault) -{ - static char buf[65536]; - GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, buf, 65536, IniName); - return buf; -} - static void RefreshMicSettings() { Mic_DeInit_Physical(); @@ -2385,6 +2383,10 @@ int _main() u32 style = DWS_NORMAL; if(GetPrivateProfileBool("Video","Window Always On Top", false, IniName)) style |= DWS_ALWAYSONTOP; if(GetPrivateProfileBool("Video","Window Lockdown", false, IniName)) style |= DWS_LOCKDOWN; + + int dispMethod = GetPrivateProfileInt("Video","Display Method", DISPMETHOD_DDRAW_HW, IniName); + if(dispMethod == DISPMETHOD_DDRAW_SW) + style |= DWS_DDRAW_SW; windowSize = GetPrivateProfileInt("Video","Window Size", 0, IniName); video.rotation = GetPrivateProfileInt("Video","Window Rotate", 0, IniName); @@ -2993,6 +2995,7 @@ void SetRotate(HWND hwnd, int rot, bool user) ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + if(GetStyle()&DWS_DDRAW_SW) ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = video.rotatedwidth(); ddsd.dwHeight = video.rotatedheight(); @@ -3645,7 +3648,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM //emulation menu MainWindow->checkMenu(IDM_PAUSE, ((paused))); - MainWindow->checkMenu(IDM_EJECTCARD, nds.cardEjected); + MainWindow->checkMenu(IDM_EJECTCARD, nds.cardEjected != FALSE); // LCDs layout MainWindow->checkMenu(ID_LCDS_VERTICAL, ((video.layout==0))); @@ -3737,7 +3740,10 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM MainWindow->checkMenu(IDC_STATEREWINDING, staterewindingenabled == 1 ); - MainWindow->checkMenu(IDC_BACKGROUNDPAUSE, lostFocusPause); + MainWindow->checkMenu(ID_DISPLAYMETHOD_DIRECTDRAWHW, (GetStyle()&DWS_DDRAW_SW)==0); + MainWindow->checkMenu(ID_DISPLAYMETHOD_DIRECTDRAWSW, (GetStyle()&DWS_DDRAW_SW)!=0); + + MainWindow->checkMenu(IDM_EJECTCARD, nds.cardEjected != FALSE); //Save type const int savelist[] = {IDC_SAVETYPE1,IDC_SAVETYPE2,IDC_SAVETYPE3,IDC_SAVETYPE4,IDC_SAVETYPE5,IDC_SAVETYPE6,IDC_SAVETYPE7,IDC_SAVETYPE8}; @@ -4993,6 +4999,24 @@ DOKEYDOWN: case IDC_SAVETYPE7: backup_setManualBackupType(6); return 0; case IDC_SAVETYPE8: backup_setManualBackupType(7); return 0; + case ID_DISPLAYMETHOD_DIRECTDRAWHW: + { + Lock lock (win_backbuffer_sync); + SetStyle(GetStyle()&~DWS_DDRAW_SW); + WritePrivateProfileInt("Video","Display Method", DISPMETHOD_DDRAW_HW, IniName); + backbuffer_invalidate = true; + } + break; + + case ID_DISPLAYMETHOD_DIRECTDRAWSW: + { + Lock lock (win_backbuffer_sync); + SetStyle(GetStyle()|DWS_DDRAW_SW); + WritePrivateProfileInt("Video","Display Method", DISPMETHOD_DDRAW_SW, IniName); + backbuffer_invalidate = true; + } + break; + case IDM_EJECTCARD: NDS_ToggleCardEject(); return 0; diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index c3ddae773..611caf41f 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -710,6 +710,9 @@ #define IDC_SAVETYPE8 40067 #define IDM_EJECTCARD 40068 #define IDM_SHOWTOOLBAR 40069 +#define ID_CONFIG_DISPLAYMETHOD 40070 +#define ID_DISPLAYMETHOD_DIRECTDRAWHW 40071 +#define ID_DISPLAYMETHOD_DIRECTDRAWSW 40072 #define IDC_LABEL_UP 50000 #define IDC_LABEL_RIGHT 50001 #define IDC_LABEL_LEFT 50002 @@ -805,7 +808,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 118 -#define _APS_NEXT_COMMAND_VALUE 40070 +#define _APS_NEXT_COMMAND_VALUE 40073 #define _APS_NEXT_CONTROL_VALUE 1022 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 6a3e6d13f701f874334163dd838bba8ffffa8b03..47403fc5ca39875fb2ca8f509b23d6fde7926670 100644 GIT binary patch delta 2614 zcmds&e@s(X6vywoeXo7J^cAcHT87;NqXPm`U;(or0cB7bVih*#k_DK|xIYHfU}Vd- zuwOzL6C&EP_{W&U0FtSYxE^O1sb+J=F-C|ZWHAdmmu!nsmMq!+aBLU)-t$KUlkGqL zXmjp4_ndo^&-Z@cg)_PB!?{D{qI)%Yh3q2ruE&6mAQ85i=6+HVvm)jC{|Zf-&rT>fK>QxqO)C zA3+}mjrlxLn8l21)MT?#r8|(<3!(iq1_nPAilM8J6+oIw8O}OsheuH1_iJJ*OdO#y zewst?)M**y8Lw4er1a1b<%?s3^l_LtPQ_3!HCy1yAtkY2Jwb(q2x=X2Hhg@7%Fr}O z*F|!?Dq?t$w$n!-f|2VMdv~+woDWhKht=(ulKW$tBmv($O+R`SY>iQ2{9%=8dn{~h zjT*&Ya!lSgF>csI6TtD4?7+0o%}xRH$4qVc5stw5#^WtnWIC^VAOnXS4DMz8@ePt2@rP6bzrP*$K zIL&L{i=W|zXQa?0+LIu(RkFjGSlKxrxgI`k{vl(FUpm?ok;L?@RN#t8V$y2%oi@ZU zP_8jtM$i1D4X$nyM^W`zHkNW|b)A-PpM@@uBnLN8I~-Ug#YAo4-q=KTlSWbxNvgCB zX1=kAv3q%TC(jp?y`+xp=iccf)$sO{G&QT3TWBTmlX6l-c91RPX;Q_DTlv-+{@YBp z^UNlmE9OxVH(Vd=`GCelS3OHyYjQ*c3UD3L54~{UG71TM4 z?q|4b&T^k&O>x7zLV=4l4B;_$6$9h!fB-GBTnm9iiU;q=vML*vl?~n_%5ktcO z-(FN4STfBn1(AP<*1P6u9KLLLO)~}m4J!-YWC=JiVyzO;^@Ukhp=(q!I6 z%YFFnIUnEo4nKb19rz^p)pRfwqHyCP@oEto)NFDBvdg?yi!&7i|HxhmTvsIa_Non6 zZPLy8if~bL(b1x3#Cy2thU-x=S)$Sy*={Hq({ICarS*Qn=kb=f!Dtw|Sih zo%|m2oc0QCk@I?`RnGg>RylQZszse6^Hygox!0;r-CnCYZ>>ufbw(+%=*PLDPO1=Y z;=@|%p)s7UAbWOb*MIjy{2Woy)#0(Z+0NRlS-XSff#f1@rKNs?a*;ZB(Uh_vV-)=rQCl0)jb0#4(-FDnw(Pmv3! zz~56miv!!`j&0!YWHUJ2AP3HlUrou?K#$W>jDBvblR0YqNZV>=_uxAG)rsRU4(1U}!scMe= z2Q}0JkuUGJI=Ddb_MsN*DTUMnlw!D+PMfzN@bo}vKW&BRUOs2qg5cDHVv9u!0#*-p zKWf#&*+zP>43>UXtE5NZU|4C;!pEAmcv%2?+BwHa8};=Yj9y!&3CRd!-_pAY{v%8O zJXs(Z1i^hULfNoRF$#)1W!-X+eL@N7T*lwEb6kB=Nz0IKQ#uQ*ei~=h5_;Q}6R|w2 z2iBA(cb?Ut!`3=gz%&^$yOb>*ijlA>ba;3>_MM_H1z~NDryy2Onsj`!mCi0aF=+2P z2GI%b$C01x(Gml!@4nz}2lTAlea5%+y4~=j4}}@y56-OIVjIgdog3YFwTk_{Piu*HL+KS7IbY}SL44Ff@%s>K zcJvG9qQBGe#`qSy7XI86>`tmEM)`{S4zcBU{Aqs1nBeJ4{NuZ9D4=cScl77mh^9{A z^P{8W{5sJki!Rs@J<`#fM6wri?2F=W`^Ky_Bl5QZjb%HDC&&nT-l(g Xp{$)k@;&G6e?_6GSMc #include +#include + extern char IniName[MAX_PATH]; void GetINIPath(); void PreventScreensaver(); void DesEnableMenuItem(HMENU hMenu, UINT uIDEnableItem, bool enable); +std::string GetPrivateProfileStdString(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpDefault); inline bool operator==(const RECT& lhs, const RECT& rhs) {