From aa3fcb4bedfb225ae350dfbe3d8054dd9b219c70 Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 10 May 2016 12:47:31 -0400 Subject: [PATCH] v2_03_90_src Former-commit-id: 6f0f833ad11c763cb5756435f4c5f0cc639185c6 --- Include/dxwnd.h | 6 ++++ build/dxwnd.dll | 4 +-- build/dxwnd.exe | 4 +-- build/readme-relnotes.txt | 7 ++++ dll/cpulimit.cpp | 2 +- dll/ddraw.cpp | 71 ++++++++++++++++++++++++-------------- dll/dxhook.cpp | 5 +-- dll/dxwcore.cpp | 24 ++++++++++++- dll/dxwcore.hpp | 2 ++ dll/dxwnd.aps | Bin 58176 -> 58196 bytes dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 104448 -> 216576 bytes dll/gdi32.cpp | 33 ++---------------- dll/hd3d7.cpp | 33 +++++++++++------- dll/opengl.cpp | 68 ++++++++++++++++++++++++++++++++++-- dll/syslibs.h | 1 - dll/user32.cpp | 11 +++++- host/TabDirectX.cpp | 2 +- host/TabDirectX2.cpp | 3 ++ host/TabSysLibs.cpp | 1 + host/TabWindow.cpp | 6 ++-- host/TargetDlg.cpp | 6 ++++ host/TargetDlg.h | 6 ++++ host/dxwndhost.aps | Bin 247580 -> 248168 bytes host/dxwndhost.rc | Bin 130514 -> 131758 bytes host/dxwndhost.vs2008.suo | Bin 46592 -> 46592 bytes host/dxwndhostView.cpp | 26 ++++++++++++++ host/host.aps | Bin 47504 -> 47500 bytes host/resource | Bin 47834 -> 48110 bytes 29 files changed, 238 insertions(+), 85 deletions(-) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 16ff0e9..1383106 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -237,6 +237,10 @@ #define ENUM16BITMODES 0x00080000 // Enumerates 16 bit video modes when using DirectDraw8/9::EnumAdapterModes on a Win10 OS #define SHAREDKEYBOARD 0x00100000 // Forces DirectInput cooperative level to NONEXCLUSIVE mode for the keyboard #define HOOKNOUPDATE 0x00200000 // Updates the original addresses when changed +#define HOOKGLUT32 0x00400000 // Hook glut32.dll opengl extension library +#define INITIALRES 0x00800000 // Set initial screen resolution accorting to sizw x sizh fields +#define MAXIMUMRES 0x01000000 // Set maximum screen resolution accorting to sizw x sizh fields +#define LOCKCOLORDEPTH 0x02000000 // lock ddraw color depth to current desktop value (used in SetDisplayMode) // eighth flags DWORD dxw.dwFlags8: @@ -288,6 +292,8 @@ typedef struct TARGETMAP short posy; short sizx; short sizy; + short resw; + short resh; short MaxFPS; short InitTS; short FakeVersionId; diff --git a/build/dxwnd.dll b/build/dxwnd.dll index e37f5b1..8b4497f 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9070435639bcf64aebc632f848af969aa24800cb40864ae90d5ce56a1d43b373 -size 681472 +oid sha256:2a2587c509901aafe87b3f75f29a007e231a916c99f1bf90a210e44fbb532a0a +size 683520 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 767685f..780921d 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:14ddc8f6eaa1eac7dc356e8824fb118e014fe5b5e8828432e2ffa0ac58f1f3c4 -size 660992 +oid sha256:90ce56d32db76f27a8364a6325927ff6ac7035303dd47f913baf2d430c49f6a7 +size 661504 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index f5f400e..aa3897d 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1273,3 +1273,10 @@ fix: fixed the logic for centering the main window for desktop with non-zero off fix: improved logic for window placement in CreateWindowEx call fix: added wrapper for winmm/GetJoyPos() virtual joystick referenced in "Jane's FA18" +v2.03.90 +add: added flags/fields to define initial/maximum screen resolution +add: "Lock color depth" ddraw flag. Fixes "Ahlgrens Bilspelet" color problems +add: preliminary opengl/glut32 hook +fix: ZBUFFER capabilities - allow "Galapagos" to run in hw accelerated mode +fix: separated D3D FindDevice hookers for D3D version 1/2/3 +fix: some unused code cleanup diff --git a/dll/cpulimit.cpp b/dll/cpulimit.cpp index 28cf249..6722c9a 100644 --- a/dll/cpulimit.cpp +++ b/dll/cpulimit.cpp @@ -21,7 +21,7 @@ DWORD WINAPI CpuSlow(LPVOID lpThreadParameter) Sleep(100); while(TRUE) SlowCpuSpeed(dwOwnerPID, dwOwnerThread, iSlowDownRatio); return TRUE; -} +} DWORD WINAPI CpuLimit(LPVOID lpThreadParameter) { diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 081a8ab..1c97f9c 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2124,6 +2124,12 @@ HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, if((int)dwwidth < 0) dwwidth = dxw.GetScreenWidth(); if((int)dwheight < 0) dwheight = dxw.GetScreenHeight(); + // v2.03.90: add LOCKCOLORDEPTH, easiest way to manage "Ahlgrens bisplet"! + if(dxw.dwFlags7 & LOCKCOLORDEPTH){ + OutTraceDW("SetDisplayMode: LOCKCOLORDEPTH bpp=%d->%d\n", dwbpp, dxw.ActualPixelFormat.dwRGBBitCount); + dwbpp = dxw.ActualPixelFormat.dwRGBBitCount; + } + dxw.SetScreenSize(dwwidth, dwheight); GetHookInfo()->Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Width=(short)dxw.GetScreenWidth(); @@ -2198,9 +2204,9 @@ HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, if(res) OutTraceE("SetDisplayMode: error=%x(%s)\n", res, ExplainDDError(res)); SetVSyncDelays(dxversion, lpdd); + // set a default palette ??? - if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) - mySetPalette(0, 256, DefaultSystemPalette); + if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) mySetPalette(0, 256, DefaultSystemPalette); if(dxw.bAutoScale) dxw.AutoScale(); @@ -4621,6 +4627,7 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA // Texture Handling on Unlock TextureHandling(lpdds, dxversion); } + return res; } @@ -4837,10 +4844,12 @@ HRESULT WINAPI extFlipToGDISurface4(LPDIRECTDRAW lpdd) HRESULT WINAPI extFlipToGDISurface7(LPDIRECTDRAW lpdd) { return extFlipToGDISurface(pFlipToGDISurface7, lpdd); } -HRESULT WINAPI extGetGDISurface(GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) +HRESULT WINAPI extGetGDISurface(int dxversion, GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { int res; + OutTraceDDRAW("GetGDISurface(%d): lpdd=%x\n", dxversion, lpdd); + // v2.02.31: // in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one. if(dxw.dwFlags1 & EMULATESURFACE){ @@ -4861,15 +4870,15 @@ HRESULT WINAPI extGetGDISurface(GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW } HRESULT WINAPI extGetGDISurface1(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ return extGetGDISurface(pGetGDISurface1, lpdd, w); } +{ return extGetGDISurface(1, pGetGDISurface1, lpdd, w); } HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ return extGetGDISurface(pGetGDISurface2, lpdd, w); } +{ return extGetGDISurface(2, pGetGDISurface2, lpdd, w); } HRESULT WINAPI extGetGDISurface3(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ return extGetGDISurface(pGetGDISurface3, lpdd, w); } +{ return extGetGDISurface(3, pGetGDISurface3, lpdd, w); } HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ return extGetGDISurface(pGetGDISurface4, lpdd, w); } +{ return extGetGDISurface(4, pGetGDISurface4, lpdd, w); } HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ return extGetGDISurface(pGetGDISurface7, lpdd, w); } +{ return extGetGDISurface(7, pGetGDISurface7, lpdd, w); } // debug function to dump all video modes queried by the DirectDrav::EnumDisplayModes method @@ -4907,20 +4916,30 @@ typedef struct { static BOOL CheckResolutionLimit(LPDDSURFACEDESC lpDDSurfaceDesc) { - #define HUGE 100000 - DWORD maxw, maxh; - maxw=HUGE; maxh=HUGE; - switch(dxw.MaxScreenRes){ - case DXW_LIMIT_320x200: maxw=320; maxh=200; break; - case DXW_LIMIT_640x480: maxw=640; maxh=480; break; - case DXW_LIMIT_800x600: maxw=800; maxh=600; break; - case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; - case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break; + if(dxw.dwFlags4 & LIMITSCREENRES) { + #define HUGE 100000 + DWORD maxw, maxh; + maxw=HUGE; maxh=HUGE; + switch(dxw.MaxScreenRes){ + case DXW_LIMIT_320x200: maxw=320; maxh=200; break; + case DXW_LIMIT_640x480: maxw=640; maxh=480; break; + case DXW_LIMIT_800x600: maxw=800; maxh=600; break; + case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; + case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break; + } + if((lpDDSurfaceDesc->dwWidth > maxw) || (lpDDSurfaceDesc->dwHeight > maxh)){ + OutTraceDW("EnumDisplaySettings: hide device mode=(%d,%d)\n", maxw, maxh); + return TRUE; + } } - if((lpDDSurfaceDesc->dwWidth > maxw) || (lpDDSurfaceDesc->dwHeight > maxh)){ - OutTraceDW("EnumDisplaySettings: hide device mode=(%d,%d)\n", maxw, maxh); - return TRUE; + + if(dxw.dwFlags7 & MAXIMUMRES) { + if((lpDDSurfaceDesc->dwWidth > (DWORD)dxw.iMaxW) || (lpDDSurfaceDesc->dwHeight > (DWORD)dxw.iMaxH)){ + OutTraceDW("EnumDisplaySettings: hide device mode=(%d,%d)\n", dxw.iMaxW, dxw.iMaxH); + return TRUE; + } } + return FALSE; } @@ -4942,7 +4961,7 @@ HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l for (int ResIdx=0; SupportedRes[ResIdx].h; ResIdx++){ lpDDSurfaceDesc->dwHeight=SupportedRes[ResIdx].h; lpDDSurfaceDesc->dwWidth=SupportedRes[ResIdx].w; - if((dxw.dwFlags4 & LIMITSCREENRES) && CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; + if(CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; if (dxw.dwFlags1 & PREVENTMAXIMIZE){ // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || @@ -4973,7 +4992,7 @@ HRESULT WINAPI myEnumModesFilterNative(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l } } - if((dxw.dwFlags4 & LIMITSCREENRES) && CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; + if(CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; res=(*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); OutTraceDW("EnumDisplayModes(D): native size=(%d,%d) res=%x\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight, res); return res; @@ -5021,8 +5040,7 @@ HRESULT WINAPI extEnumDisplayModes(int dxversion, EnumDisplayModes1_Type pEnumDi for (ResIdx=0; SupportedRes[ResIdx].h; ResIdx++){ EmuDesc.dwHeight=SupportedRes[ResIdx].h; EmuDesc.dwWidth=SupportedRes[ResIdx].w; - if((dxw.dwFlags4 & LIMITSCREENRES) && - CheckResolutionLimit((LPDDSURFACEDESC)&EmuDesc)) break; + if(CheckResolutionLimit((LPDDSURFACEDESC)&EmuDesc)) break; EmuDesc.ddpfPixelFormat.dwSize=sizeof(DDPIXELFORMAT); EmuDesc.ddpfPixelFormat.dwFlags=DDPF_RGB; for (DepthIdx=0; SupportedDepths[DepthIdx]; DepthIdx++) { @@ -5419,7 +5437,7 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI caps->dwCaps |= DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE; // primary surfaces must be this way caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= DDSCAPS_LOCALVIDMEM; - } + } if (IsBack) { IsFixed=TRUE; @@ -5431,7 +5449,8 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI } // v2.03.82: fixed logic for ZBUFFER capabilities: "The Creed" may have two, in SYSTEMMEMORY or in VIDEOMEMORY ... - if(caps->dwCaps & DDSCAPS_ZBUFFER) { + // v2.03.90: "Galapagos" fix - if there's a DDSCAPS_SYSTEMMEMORY or DDSCAPS_VIDEOMEMORY spec, let it be. + if ((caps->dwCaps & DDSCAPS_ZBUFFER) && !(caps->dwCaps & (DDSCAPS_SYSTEMMEMORY|DDSCAPS_VIDEOMEMORY))) { DWORD dwCaps; dwCaps = dxwcdb.GetCaps(lpdds); // beware! the ZBUFFER surface could have never been registered! diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 5ab978e..6d591a2 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -134,8 +134,8 @@ static char *Flag7Names[32]={ "NOWINERRORS", "SUPPRESSOVERLAY", "INIT24BPP", "INIT32BPP", "FIXGLOBALUNLOCK", "SHOWHINTS", "SKIPDEVTYPEHID", "INJECTSUSPENDED", "SSUPPRESSDIERRORS", "HOOKNORUN", "FIXBINDTEXTURE", "ENUM16BITMODES", - "SHAREDKEYBOARD", "HOOKNOUPDATE", "", "", - "", "", "", "", + "SHAREDKEYBOARD", "HOOKNOUPDATE", "HOOKGLUT32", "INITIALRES", + "MAXIMUMRES", "LOCKCOLORDEPTH", "", "", "", "", "", "", }; @@ -1405,6 +1405,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) osinfo.dwMajorVersion, osinfo.dwMinorVersion, osinfo.dwPlatformId, osinfo.dwPlatformId, osinfo.szCSDVersion); } if (dxw.dwFlags4 & LIMITSCREENRES) OutTrace("HookInit: max resolution=%s\n", (dxw.MaxScreenRes<6)?Resolutions[dxw.MaxScreenRes]:"unknown"); + if (dxw.dwFlags7 & MAXIMUMRES) OutTrace("HookInit: max resolution=(%dx%d)\n", dxw.iMaxW, dxw.iMaxH); if (dxw.dwFlags7 & LIMITDDRAW) OutTrace("HookInit: max supported IDidrectDrawInterface=%d\n", dxw.MaxDdrawInterface); if (dxw.dwFlags7 & CPUSLOWDOWN) OutTrace("HookInit: CPU slowdown ratio 1:%d\n", dxw.SlowRatio); if (dxw.dwFlags7 & CPUMAXUSAGE) OutTrace("HookInit: CPU maxusage ratio 1:%d\n", dxw.SlowRatio); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 4cd3b0e..c2fec27 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -130,6 +130,8 @@ void dxwCore::InitTarget(TARGETMAP *target) iSizY = target->sizy; iPosX = target->posx; iPosY = target->posy; + iMaxW = target->resw; + iMaxH = target->resh; // Aspect Ratio from window size, or traditional 4:3 by default iRatioX = iSizX ? iSizX : 800; iRatioY = iSizY ? iSizY : 600; @@ -156,12 +158,19 @@ void dxwCore::InitTarget(TARGETMAP *target) bHintActive = (dwFlags7 & SHOWHINTS) ? TRUE : FALSE; MonitorId = target->monitorid; + + // if specified, set the custom initial resolution + if(dxw.dwFlags7 & INITIALRES) SetScreenSize(target->resw, target->resh); } void dxwCore::SetScreenSize(void) { - if(dxw.Windowize) + // if specified, use values registered in InitTarget + if(dxw.dwFlags7 & INITIALRES) return; + + if(dxw.Windowize){ SetScreenSize(800, 600); // set to default screen resolution + } else{ int sizx, sizy; sizx = GetSystemMetrics(SM_CXSCREEN); @@ -200,6 +209,14 @@ void dxwCore::SetScreenSize(int x, int y) dwScreenHeight= p->Height = (short)maxh; } } + if(dxw.dwFlags7 & MAXIMUMRES){ + if(((long)p->Width > dxw.iMaxW) || ((long)p->Height > dxw.iMaxH)){ + OutTraceDW("DXWND: limit device size=(%d,%d)\n", dxw.iMaxW, dxw.iMaxH); + // v2.03.90 setting new virtual desktop size + dwScreenWidth = p->Width = (short)dxw.iMaxW; + dwScreenHeight= p->Height = (short)dxw.iMaxH; + } + } } void dxwCore::DumpDesktopStatus() @@ -1497,6 +1514,11 @@ BOOL dxwCore::CheckScreenResolution(unsigned int w, unsigned int h) } if((w > maxw) || (h > maxh)) return FALSE; } + + if(dxw.dwFlags7 & MAXIMUMRES){ + if(((long)w > dxw.iMaxW) || ((long)h > dxw.iMaxH)) return FALSE; + } + return TRUE; } diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 11c71b9..753e64e 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -177,6 +177,8 @@ public: // simple data variables long iPosY; long iSizX; long iSizY; + long iMaxW; + long iMaxH; int iRatioX; int iRatioY; char *CustomOpenGLLib; diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index 8d4793cd0ef12f0d13e51a43128019a62a7f6163..73667a31cd45104a6492172da92f45d081e78fa6 100644 GIT binary patch delta 271 zcmX?bjQPqj<_QXnIujL@wOt-EFr-+;xKxDarNopO#TyvMTN=bCrIsYdq~zr2m6sdE zq*RpWrRWtUZ_H1K$)cO9lgmc!nf~RE83UM1~lK6owoi)MF?ILZi**ca@nK z_fL+!-^!0>*5r5h^)bXWA7F~5U=f>-MeNoCV`Vfu;O=FxVNhZC{~v@W>pxUw)Y%;R Xa4{p$2R|Pvv+iePU}%}F_*fnQ7%pLj delta 235 zcmca|jQPMZ<_QXnniCb3wGAFJFr-+;xKxDarNopO#TyvMTUf@Yq$ZW7$E4)s#H3V| z=cVWsB{MKEY|Kx+!K$)!3kFMuc!m^)RE8vmQigPf7$7@`A!oDgU1cU_28Okh z6Ysb3Ae%G!>wSGx0pkZ~0)^-T>(K??J}^c#L;s;DBg16phpLR4n=>CSW(2y9_pvhT NT1EzjhRLRn. #include "TlHelp32.h" -#define VERSION "2.03.89" +#define VERSION "2.03.90" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 9970e5a8f6dcd2419582939d38f633fe38eae712..fbd79d1513d1d69ff3192c9a7b4991b66a99269b 100644 GIT binary patch literal 216576 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 C;a2(p diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index d8b764c..3537bca 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -984,35 +984,6 @@ HDC WINAPI extGDICreateCompatibleDC(HDC hdc) return RetHdc; } -/*----------------------------------------*/ -HBITMAP VirtualPic; - -static HDC FillVirtualDC(HDC hdc) -{ - HDC VirtualHDC; - HBITMAP VirtualPic; - - if(!(VirtualHDC=CreateCompatibleDC(hdc))) - OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - - if(!(VirtualPic=CreateCompatibleBitmap(hdc, dxw.GetScreenWidth(), dxw.GetScreenHeight()))) - OutTraceE("dxwSDC::GetPrimaryDC: CreateCompatibleBitmap ERROR err=%d at=%d\n", GetLastError(), __LINE__); - - if(!SelectObject(VirtualHDC, VirtualPic)) - OutTraceE("dxwSDC::GetPrimaryDC: SelectObject ERROR err=%d at=%d\n", GetLastError(), __LINE__); - - if(!(*pGDIBitBlt)(VirtualHDC, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), hdc, 0, 0, SRCCOPY)) - OutTraceE("dxwSDC::GetPrimaryDC: StretchBlt ERROR err=%d at=%d\n", GetLastError(), __LINE__); - - return VirtualHDC; -} - -static void FlushVirtualDC(HDC VirtualHDC) -{ - DeleteObject(VirtualHDC); - DeleteObject(VirtualPic); -} - /*-------------------------------------------*/ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) @@ -1038,12 +1009,12 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH if(hdcDest == NULL){ // happens in Reah, hdc is NULL despite the fact that BeginPaint returns a valid DC. Too bad, we recover here ... hdcDest = (*pGDIGetDC)(dxw.GethWnd()); - OutTraceB("GDI.StretchBlt: DEBUG hdc dest=NULL->%x\n", hdcDest); + OutTraceB("GDI.BitBlt: DEBUG hdc dest=NULL->%x\n", hdcDest); IsDCLeakageDest = TRUE; } if(hdcSrc == NULL){ hdcSrc = (*pGDIGetDC)(dxw.GethWnd()); - OutTraceB("GDI.StretchBlt: DEBUG hdc src=NULL->%x\n", hdcSrc); + OutTraceB("GDI.BitBlt: DEBUG hdc src=NULL->%x\n", hdcSrc); IsDCLeakageSrc = TRUE; } diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 1dad169..2bf5107 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -64,7 +64,7 @@ CreateMaterial3_Type pCreateMaterial3 = NULL; CreateViewport1_Type pCreateViewport1 = NULL; CreateViewport2_Type pCreateViewport2 = NULL; CreateViewport3_Type pCreateViewport3 = NULL; -FindDevice_Type pFindDevice = NULL; +FindDevice_Type pFindDevice1, pFindDevice2, pFindDevice3; CreateDevice2_Type pCreateDevice2 = NULL; CreateDevice3_Type pCreateDevice3 = NULL; CreateDevice7_Type pCreateDevice7 = NULL; @@ -196,7 +196,9 @@ HRESULT WINAPI extCreateMaterial3(void *, LPDIRECT3DMATERIAL3 *, IUnknown *); HRESULT WINAPI extCreateViewport1(void *, LPDIRECT3DVIEWPORT *, IUnknown *); HRESULT WINAPI extCreateViewport2(void *, LPDIRECT3DVIEWPORT2 *, IUnknown *); HRESULT WINAPI extCreateViewport3(void *, LPDIRECT3DVIEWPORT3 *, IUnknown *); -HRESULT WINAPI extFindDevice(void *, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); +HRESULT WINAPI extFindDevice1(void *, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); +HRESULT WINAPI extFindDevice2(void *, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); +HRESULT WINAPI extFindDevice3(void *, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); HRESULT WINAPI extCreateDevice2(void *, REFCLSID, LPDIRECTDRAWSURFACE, LPDIRECT3DDEVICE2 *); HRESULT WINAPI extCreateDevice3(void *, REFCLSID, LPDIRECTDRAWSURFACE4, LPDIRECT3DDEVICE3 *, LPUNKNOWN); HRESULT WINAPI extCreateDevice7(void *, REFCLSID, LPDIRECTDRAWSURFACE7, LPDIRECT3DDEVICE7 *); @@ -447,7 +449,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateMaterial1, (void **)&pCreateMaterial1, "CreateMaterial(1)"); #endif SetHook((void *)(**(DWORD **)lplpdd + 28), extCreateViewport1, (void **)&pCreateViewport1, "CreateViewport(1)"); - SetHook((void *)(**(DWORD **)lplpdd + 32), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)lplpdd + 32), extFindDevice1, (void **)&pFindDevice1, "FindDevice(1)"); break; case 2: SetHook((void *)(**(DWORD **)lplpdd + 0), extQueryInterfaceD32, (void **)&pQueryInterfaceD32, "QueryInterface(D3S2)"); @@ -457,7 +459,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) SetHook((void *)(**(DWORD **)lplpdd + 20), extCreateMaterial2, (void **)&pCreateMaterial2, "CreateMaterial(2)"); #endif SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateViewport2, (void **)&pCreateViewport2, "CreateViewport(2)"); - SetHook((void *)(**(DWORD **)lplpdd + 28), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extFindDevice2, (void **)&pFindDevice2, "FindDevice(2)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extCreateDevice2, (void **)&pCreateDevice2, "CreateDevice(D3D2)"); break; case 3: @@ -468,7 +470,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) SetHook((void *)(**(DWORD **)lplpdd + 20), extCreateMaterial3, (void **)&pCreateMaterial3, "CreateMaterial(3)"); #endif SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateViewport3, (void **)&pCreateViewport3, "CreateViewport(3)"); - SetHook((void *)(**(DWORD **)lplpdd + 28), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extFindDevice3, (void **)&pFindDevice3, "FindDevice(3)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extCreateDevice3, (void **)&pCreateDevice3, "CreateDevice(D3D3)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extEnumZBufferFormats3, (void **)&pEnumZBufferFormats3, "EnumZBufferFormats(D3D3)"); break; @@ -697,7 +699,7 @@ HRESULT WINAPI extQueryInterfaceD3(int d3dversion, QueryInterfaceD3_Type pQueryI SetHook((void *)(**(DWORD **)ppvObj + 24), extCreateMaterial1, (void **)&pCreateMaterial1, "CreateMaterial(1)"); #endif SetHook((void *)(**(DWORD **)ppvObj + 28), extCreateViewport1, (void **)&pCreateViewport1, "CreateViewport(1)"); - SetHook((void *)(**(DWORD **)ppvObj + 32), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)ppvObj + 32), extFindDevice1, (void **)&pFindDevice1, "FindDevice(1)"); break; case 2: SetHook((void *)(**(DWORD **)ppvObj + 12), extEnumDevices2, (void **)&pEnumDevices2, "EnumDevices(2)"); @@ -706,16 +708,16 @@ HRESULT WINAPI extQueryInterfaceD3(int d3dversion, QueryInterfaceD3_Type pQueryI SetHook((void *)(**(DWORD **)ppvObj + 20), extCreateMaterial2, (void **)&pCreateMaterial2, "CreateMaterial(2)"); #endif SetHook((void *)(**(DWORD **)ppvObj + 24), extCreateViewport2, (void **)&pCreateViewport2, "CreateViewport(2)"); - SetHook((void *)(**(DWORD **)ppvObj + 28), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)ppvObj + 28), extFindDevice2, (void **)&pFindDevice2, "FindDevice(2)"); break; case 3: - SetHook((void *)(**(DWORD **)ppvObj + 12), extEnumDevices3, (void **)&pEnumDevices3, "EnumDevices"); + SetHook((void *)(**(DWORD **)ppvObj + 12), extEnumDevices3, (void **)&pEnumDevices3, "EnumDevices(3)"); SetHook((void *)(**(DWORD **)ppvObj + 16), extCreateLight3, (void **)&pCreateLight3, "CreateLight(3)"); #ifdef TRACEMATERIAL SetHook((void *)(**(DWORD **)ppvObj + 20), extCreateMaterial3, (void **)&pCreateMaterial3, "CreateMaterial(3)"); #endif SetHook((void *)(**(DWORD **)ppvObj + 24), extCreateViewport3, (void **)&pCreateViewport3, "CreateViewport(3)"); - SetHook((void *)(**(DWORD **)ppvObj + 28), extFindDevice, (void **)&pFindDevice, "FindDevice"); + SetHook((void *)(**(DWORD **)ppvObj + 28), extFindDevice3, (void **)&pFindDevice3, "FindDevice(3)"); break; case 7: SetHook((void *)(**(DWORD **)ppvObj + 12), extEnumDevices7, (void **)&pEnumDevices7, "EnumDevices(7)"); @@ -986,12 +988,12 @@ HRESULT WINAPI extCreateViewport3(void *lpd3d, LPDIRECT3DVIEWPORT3 *lpViewport, return res; } -HRESULT WINAPI extFindDevice(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEVICERESULT p2) +static HRESULT WINAPI extFindDevice(int d3dversion, FindDevice_Type pFindDevice, void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEVICERESULT p2) { HRESULT res; - OutTraceD3D("FindDevice: d3d=%x devsearch=%x (size=%d flags=%x caps=%x primcaps=%x colormodel=%x hw=%x guid=%x) p2=%x\n", - lpd3d, p1, p1->dwSize, p1->dwFlags, p1->dwCaps, p1->dpcPrimCaps, p1->dcmColorModel, p1->bHardware, p1->guid, p2); + OutTraceD3D("FindDevice(%d): d3d=%x devsearch=%x (size=%d flags=%x caps=%x primcaps=%x colormodel=%x hw=%x guid=%x) p2=%x\n", + d3dversion, lpd3d, p1, p1->dwSize, p1->dwFlags, p1->dwCaps, p1->dpcPrimCaps, p1->dcmColorModel, p1->bHardware, p1->guid, p2); res=(*pFindDevice)(lpd3d, p1, p2); if(res) OutTraceE("FindDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else { @@ -1002,6 +1004,13 @@ HRESULT WINAPI extFindDevice(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEV return res; } +HRESULT WINAPI extFindDevice1(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEVICERESULT p2) +{ return extFindDevice(1, pFindDevice1, lpd3d, p1, p2); } +HRESULT WINAPI extFindDevice2(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEVICERESULT p2) +{ return extFindDevice(2, pFindDevice2, lpd3d, p1, p2); } +HRESULT WINAPI extFindDevice3(void *lpd3d, LPD3DFINDDEVICESEARCH p1, LPD3DFINDDEVICERESULT p2) +{ return extFindDevice(3, pFindDevice3, lpd3d, p1, p2); } + HRESULT WINAPI extSetViewport(int dxversion, SetViewport_Type pSetViewport, void *lpvp, LPD3DVIEWPORT vpd) { HRESULT res; diff --git a/dll/opengl.cpp b/dll/opengl.cpp index a7f7524..2754098 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -20,6 +20,19 @@ #define COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #endif +typedef void (WINAPI *glutFullScreen_Type)(void); +glutFullScreen_Type pglutFullScreen; +void WINAPI extglutFullScreen(void); +typedef void (WINAPI *glutInitWindowSize_Type)(int, int); +glutInitWindowSize_Type pglutInitWindowSize; +void extglutInitWindowSize(int, int); +typedef void (WINAPI *glutInitWindowPosition_Type)(int, int); +glutInitWindowPosition_Type pglutInitWindowPosition; +void extglutInitWindowPosition(int, int); +typedef void (WINAPI *glutSetWindow_Type)(HWND); +glutSetWindow_Type pglutSetWindow; +void WINAPI extglutSetWindow(HWND); + //void WINAPI extglDrawPixels(GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); //typedef void (WINAPI *glDrawPixels_Type)(GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); //glDrawPixels_Type pglDrawPixels = NULL; @@ -45,11 +58,20 @@ static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; +static HookEntryEx_Type GlutHooks[]={ + {HOOK_IAT_CANDIDATE, 0, "glutFullScreen", NULL, (FARPROC *)&pglutFullScreen, (FARPROC)extglutFullScreen}, + {HOOK_IAT_CANDIDATE, 0, "glutInitWindowSize", NULL, (FARPROC *)&pglutInitWindowSize, (FARPROC)extglutInitWindowSize}, + {HOOK_IAT_CANDIDATE, 0, "glutInitWindowPosition", NULL, (FARPROC *)&pglutInitWindowPosition, (FARPROC)extglutInitWindowPosition}, + {HOOK_IAT_CANDIDATE, 0, "glutSetWindow", NULL, (FARPROC *)&pglutSetWindow, (FARPROC)extglutSetWindow}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator +}; + FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; if(!(dxw.dwFlags2 & HOOKOPENGL)) return NULL; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; + if (dxw.dwFlags7 & HOOKGLUT32) if(addr=RemapLibraryEx(proc, hModule, GlutHooks)) return addr; // NULL -> keep the original call address return NULL; } @@ -115,6 +137,8 @@ void HookOpenGL(HMODULE module, char *customlib) else HookLibraryEx(module, Hooks, customlib); + if(dxw.dwFlags7 & HOOKGLUT32) HookLibraryEx(module, GlutHooks, "glut32.dll"); + return; } @@ -130,7 +154,6 @@ void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height RECT client; POINT p={0,0}; HWND hwnd; - //if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return; hwnd=dxw.GethWnd(); (*pGetClientRect)(hwnd, &client); OutTraceDW("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height); @@ -570,4 +593,45 @@ void WINAPI extglPixelStorei(GLenum pname, GLint param) (*pglPixelStorei)(pname, param); if ((glerr=extglGetError())!= GL_NO_ERROR) OutTrace("GLERR %d ad %d\n", glerr, __LINE__); return; -} \ No newline at end of file +} + +void WINAPI extglutFullScreen(void) +{ + if(!dxw.Windowize) return (*pglutFullScreen)(); + OutTrace("glutFullScreen BYPASS\n"); + dxw.SetFullScreen(TRUE); +} + +void extglutInitWindowSize(int width, int height) +{ + int dummy1, dummy2; + if(dxw.Windowize){ + dummy1=0; + dummy2=0; + OutTrace("glutInitWindowSize: width=%d height=%d\n", width, height); + dxw.MapWindow(&dummy1, &dummy2, &width, &height); + OutTrace("glutInitWindowSize: FIXED width=%d height=%d\n", width, height); + } + (*pglutInitWindowSize)(width, height); +} + +void extglutInitWindowPosition(int x, int y) +{ + int dummy1, dummy2; + if(dxw.Windowize){ + dummy1=0; + dummy2=0; + OutTrace("glutInitWindowPosition: x=%d y=%d\n", x, y); + dxw.MapWindow(&x, &y, &dummy1, &dummy2); + OutTrace("glutInitWindowPosition: FIXED x=%d y=%d\n", x, y); + } + (*pglutInitWindowPosition)(x, y); +} + +void WINAPI extglutSetWindow(HWND win) +{ + OutTrace("glutSetWindow: win=%x\n", win); + if(dxw.Windowize && dxw.IsRealDesktop(win)) win=dxw.GethWnd(); + (*pglutSetWindow)(win); +} + diff --git a/dll/syslibs.h b/dll/syslibs.h index bf82c4b..7b76c55 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -503,7 +503,6 @@ extern BOOL WINAPI extImmGetOpenStatus(HIMC); // GDI32.dll: extern BOOL WINAPI extGDIBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); extern HDC WINAPI extGDICreateCompatibleDC(HDC); -extern HDC WINAPI extEMUCreateCompatibleDC(HDC); extern HDC WINAPI extGDICreateDCA(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); extern HDC WINAPI extGDICreateDCW(LPWSTR, LPWSTR, LPWSTR, CONST DEVMODE *); extern HFONT WINAPI extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); diff --git a/dll/user32.cpp b/dll/user32.cpp index f2fb7af..0b786c3 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1166,6 +1166,7 @@ BOOL WINAPI extScreenToClient(HWND hwnd, LPPOINT lppoint) else { res=(*pScreenToClient)(hwnd, lppoint); } + OutTraceB("ScreenToClient: returned point=(%d,%d)\n", lppoint->x, lppoint->y); return res; } @@ -1564,7 +1565,8 @@ static HWND WINAPI CreateWindowCommon( } nWidth=dxw.GetScreenWidth(); nHeight=dxw.GetScreenHeight(); - OutTraceDW("%s: fixed client pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + OutTraceDW("%s: fixed client pos=(%d,%d) size=(%d,%d) valid=%x\n", + ApiName, x, y, nWidth, nHeight, isValidHandle); dxw.SetFullScreen(TRUE); } @@ -2095,6 +2097,13 @@ LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMO lpDevMode->dmPelsHeight = maxh; } } + if(dxw.dwFlags7 & MAXIMUMRES){ + if((lpDevMode->dmPelsWidth > (DWORD)dxw.iMaxW) || (lpDevMode->dmPelsHeight > (DWORD)dxw.iMaxH)){ + OutTraceDW("EnumDisplaySettings: limit device size=(%d,%d)\n", dxw.iMaxW, dxw.iMaxH); + lpDevMode->dmPelsWidth = dxw.iMaxW; + lpDevMode->dmPelsHeight = dxw.iMaxH; + } + } OutTraceDW("EnumDisplaySettings: color=%dBPP size=(%dx%d) refresh=%dHz\n", lpDevMode->dmBitsPerPel, lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmDisplayFrequency); diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index f090e32..bb1bbb2 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -38,7 +38,6 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SUPPRESSRELEASE, cTarget->m_SuppressRelease); DDX_Check(pDX, IDC_VIDEOTOSYSTEMMEM, cTarget->m_VideoToSystemMem); DDX_Check(pDX, IDC_SUPPRESSDXERRORS, cTarget->m_SuppressDXErrors); - DDX_Check(pDX, IDC_BACKBUFATTACH, cTarget->m_BackBufAttach); DDX_Check(pDX, IDC_NOPALETTEUPDATE, cTarget->m_NoPaletteUpdate); DDX_Check(pDX, IDC_NOPIXELFORMAT, cTarget->m_NoPixelFormat); DDX_Check(pDX, IDC_NOALPHACHANNEL, cTarget->m_NoAlphaChannel); @@ -46,6 +45,7 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FLIPEMULATION, cTarget->m_FlipEmulation); DDX_Check(pDX, IDC_SETCOMPATIBILITY, cTarget->m_SetCompatibility); DDX_Check(pDX, IDC_AEROBOOST, cTarget->m_AEROBoost); + DDX_Check(pDX, IDC_LOCKCOLORDEPTH, cTarget->m_LockColorDepth); } BEGIN_MESSAGE_MAP(CTabDirectX, CDialog) diff --git a/host/TabDirectX2.cpp b/host/TabDirectX2.cpp index 77569b1..be38ea3 100644 --- a/host/TabDirectX2.cpp +++ b/host/TabDirectX2.cpp @@ -40,7 +40,10 @@ void CTabDirectX2::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_DEINTERLACE, cTarget->m_Deinterlace); DDX_Check(pDX, IDC_LIMITDDRAW, cTarget->m_LimitDdraw); DDX_Check(pDX, IDC_SUPPRESSOVERLAY, cTarget->m_SuppressOverlay); + DDX_Check(pDX, IDC_BLACKWHITE, cTarget->m_BlackWhite); + DDX_Check(pDX, IDC_USERGB565, cTarget->m_UseRGB565); DDX_CBIndex(pDX, IDC_DDWAWLIMITCOMBO, cTarget->m_MaxDdrawInterface); + DDX_Check(pDX, IDC_BACKBUFATTACH, cTarget->m_BackBufAttach); } BEGIN_MESSAGE_MAP(CTabDirectX2, CDialog) diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index bb5838a..43ad25c 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -41,6 +41,7 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FORCEHOOKOPENGL, cTarget->m_ForceHookOpenGL); DDX_Check(pDX, IDC_FIXPIXELZOOM, cTarget->m_FixPixelZoom); DDX_Check(pDX, IDC_FIXBINDTEXTURE, cTarget->m_FixBindTexture); + DDX_Check(pDX, IDC_HOOKGLUT32, cTarget->m_HookGlut32); DDX_Text(pDX, IDC_OPENGLLIB, cTarget->m_OpenGLLib); // Glide diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index e70ff80..997d962 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -52,8 +52,6 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Radio(pDX, IDC_COLORCURRENT, cTarget->m_InitColorDepth); DDX_Check(pDX, IDC_DISABLEGAMMARAMP, cTarget->m_DisableGammaRamp); DDX_Check(pDX, IDC_FORCE16BPP, cTarget->m_Force16BPP); - DDX_Check(pDX, IDC_BLACKWHITE, cTarget->m_BlackWhite); - DDX_Check(pDX, IDC_USERGB565, cTarget->m_UseRGB565); DDX_Check(pDX, IDC_LOCKSYSCOLORS, cTarget->m_LockSysColors); DDX_Check(pDX, IDC_LOCKRESERVEDPALETTE, cTarget->m_LockReservedPalette); @@ -61,6 +59,10 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_LIMITSCREENRES, cTarget->m_LimitScreenRes); DDX_LBIndex(pDX, IDC_LISTRES, cTarget->m_MaxScreenRes); DDX_Radio(pDX, IDC_SUPPORTSVGA, cTarget->m_ResTypes); + DDX_Check(pDX, IDC_INITIALRES, cTarget->m_InitialRes); + DDX_Check(pDX, IDC_MAXIMUMRES, cTarget->m_MaximumRes); + DDX_Text(pDX, IDC_INITW, cTarget->m_InitResW); + DDX_Text(pDX, IDC_INITH, cTarget->m_InitResH); } static char *Resolutions[]={ diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 272fc34..27c1885 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -137,6 +137,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SlowDown = FALSE; m_BlitFromBackBuffer = FALSE; m_NoFlipEmulation = FALSE; + m_LockColorDepth = FALSE; m_SuppressClipping = FALSE; m_ForceClipper = FALSE; m_DisableGammaRamp = FALSE; @@ -212,6 +213,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ForceHookOpenGL = FALSE; m_FixPixelZoom = FALSE; m_FixBindTexture = FALSE; + m_HookGlut32 = FALSE; m_FakeVersion = FALSE; m_FullRectBlt = FALSE; m_CenterToWin = FALSE; @@ -234,10 +236,14 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoTextures = FALSE; m_BlackWhite = FALSE; m_AssertDialog = FALSE; + m_InitialRes = FALSE; + m_MaximumRes = FALSE; m_PosX = 50; m_PosY = 50; m_SizX = 800; m_SizY = 600; + m_InitResW = 800; + m_InitResH = 600; m_MaxFPS = 0; m_InitTS = 8; m_SwapEffect = 0; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index d73412e..a910055 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -100,6 +100,7 @@ public: BOOL m_SlowDown; BOOL m_BlitFromBackBuffer; BOOL m_NoFlipEmulation; + BOOL m_LockColorDepth; BOOL m_SuppressClipping; BOOL m_ForceClipper; BOOL m_DisableGammaRamp; @@ -175,6 +176,7 @@ public: BOOL m_ForceHookOpenGL; BOOL m_FixPixelZoom; BOOL m_FixBindTexture; + BOOL m_HookGlut32; BOOL m_FakeVersion; BOOL m_FullRectBlt; BOOL m_CenterToWin; @@ -251,10 +253,14 @@ public: BOOL m_Enum16bitModes; BOOL m_Force16BPP; BOOL m_LimitScreenRes; + BOOL m_InitialRes; + BOOL m_MaximumRes; int m_PosX; int m_PosY; int m_SizX; int m_SizY; + int m_InitResW; + int m_InitResH; int m_MaxFPS; int m_InitTS; int m_FakeVersionId; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index ee98c71a349ac3fd928d3766f32b11968f390838..0d1045075881e523c802b46d09090fb0783b4ce6 100644 GIT binary patch delta 9554 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 O7yV}`b!uL?ivNEDcz(?Q delta 9125 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 i@dKhgm-w|A-B{01LNrS9Tib-ZYs&h%e!L-JJs diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 902ac6e726f49911a31c87b683dbf32ebf785380..e15791b058b46f76cea17b155db4f010b4acce5f 100644 GIT binary patch delta 639 zcmZ`%U1*YF6h6n#%+&VdrmHk3ZbA$h{!XO^E{JKHwu?D;m#&LlY^*I7cu}xLYt160 zGkPJq*vN~B2ucNX<5 zSU{8bc=>un@PLaFQ!cvjAt%_uO^$25;`D|I>m(!PwBQ3fHJ4A2eQSdn%0?J{;$ndX)QFpvnhagE8a>Rio!Cj{ouuFfAHCo1r8he%THg*( z(~4HieSV^#?qV043vtSHRYPNyR{CCP*dKxjgkYFw9}H6arx=yWO2G?GI=ggqPZ$!A zq|=qQIyTHPqZ}EAD1;>}YZCbCQ%i@a^z2CcU#b|_=;YB;*X#vvy?4{hkd?a6D9HTU zL_Y`q;e++L2mJrVn^`=FW=vA`ltJeN54S?HgL}rSPfF^W?GSH#eQIs={q~5DrJb&DB%Fs??y{3LM^LBkhe5vMu=GHV@tDv9K9;be zf#NSM`J4%#k5RFvrMVg2&EuAmP3}V*r9a*x`-F<==TXn%D(s@^&D+eZK?Utj$OQ-g oxz%t>{dT@w$x!jG67BpFT39WH4f*>iJa&%VOJRmx{edTc0nC-rSO5S3 delta 288 zcmV+*0pI?vg$UC72e2Fhm%;%8q_e^TGK815jsc{TK#B&Fe3TZGzGEtv5D@_cv-pO* z43p|g9<#8Nj7|YJlTlkSlfZ2Rlfaq`lYZl<12O0SdEl2LV zlOW^-lOE;p1d~eV9Ft&MB9q>e3X_iIkOeUSFaR{OA?7Io z0Wp)og&mV#bt0Eg836>7jORiNGypgNEC4Y8GypW0eIfxhvk>S61CyBSK$BGKdXsMS z29wn5!~-}0G?UTmJ(7kJv+C@;29w&v9+!@!0SdGJ_P8YjHvl%5xf}sq12_OUw;3G) m-vX1sRV26QAOXr^0Wp(LTQj%jg8}FWw|0*KN^+ON0RrqwuylI> diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 0b47af63e760495aad07c3e89dfbb030b8cd5900..476c487edf92eca23ff7fc7692a6f122f30e6f64 100644 GIT binary patch delta 8303 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 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index fcd5451..d09f631 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -384,6 +384,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SlowDown) t->flags |= SLOWDOWN; if(dlg->m_BlitFromBackBuffer) t->flags |= BLITFROMBACKBUFFER; if(dlg->m_NoFlipEmulation) t->flags4 |= NOFLIPEMULATION; + if(dlg->m_LockColorDepth) t->flags7 |= LOCKCOLORDEPTH; if(dlg->m_SuppressClipping) t->flags |= SUPPRESSCLIPPING; if(dlg->m_ForceClipper) t->flags3 |= FORCECLIPPER; if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP; @@ -457,6 +458,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL; if(dlg->m_FixPixelZoom) t->flags6 |= FIXPIXELZOOM; if(dlg->m_FixBindTexture) t->flags7 |= FIXBINDTEXTURE; + if(dlg->m_HookGlut32) t->flags7 |= HOOKGLUT32; if(dlg->m_WireFrame) t->flags2 |= WIREFRAME; if(dlg->m_NoTextures) t->flags4 |= NOTEXTURES; if(dlg->m_BlackWhite) t->flags3 |= BLACKWHITE; @@ -479,6 +481,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_NoWinErrors) t->flags7 |= NOWINERRORS; if(dlg->m_AnalyticMode) t->flags3 |= ANALYTICMODE; if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS; + if(dlg->m_InitialRes) t->flags7 |= INITIALRES; + if(dlg->m_MaximumRes) t->flags7 |= MAXIMUMRES; t->posx = dlg->m_PosX; t->posy = dlg->m_PosY; t->sizx = dlg->m_SizX; @@ -488,6 +492,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) t->FakeVersionId = dlg->m_FakeVersionId; t->MaxScreenRes = dlg->m_MaxScreenRes; t->SwapEffect = dlg->m_SwapEffect; + t->resw = dlg->m_InitResW; + t->resh = dlg->m_InitResH; strcpy_s(t->module, sizeof(t->module), dlg->m_Module); strcpy_s(t->OpenGLLib, sizeof(t->OpenGLLib), dlg->m_OpenGLLib); } @@ -662,6 +668,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; dlg->m_NoFlipEmulation = t->flags4 & NOFLIPEMULATION ? 1 : 0; + dlg->m_LockColorDepth = t->flags7 & LOCKCOLORDEPTH ? 1 : 0; dlg->m_SuppressClipping = t->flags & SUPPRESSCLIPPING ? 1 : 0; dlg->m_ForceClipper = t->flags3 & FORCECLIPPER ? 1 : 0; dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0; @@ -733,6 +740,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0; dlg->m_FixPixelZoom = t->flags6 & FIXPIXELZOOM ? 1 : 0; dlg->m_FixBindTexture = t->flags7 & FIXBINDTEXTURE ? 1 : 0; + dlg->m_HookGlut32 = t->flags7 & HOOKGLUT32 ? 1 : 0; dlg->m_WireFrame = t->flags2 & WIREFRAME ? 1 : 0; dlg->m_NoTextures = t->flags4 & NOTEXTURES ? 1 : 0; dlg->m_BlackWhite = t->flags3 & BLACKWHITE ? 1 : 0; @@ -755,6 +763,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoWinErrors = t->flags7 & NOWINERRORS ? 1 : 0; dlg->m_AnalyticMode = t->flags3 & ANALYTICMODE ? 1 : 0; dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0; + dlg->m_InitialRes = t->flags7 & INITIALRES ? 1 : 0; + dlg->m_MaximumRes = t->flags7 & MAXIMUMRES ? 1 : 0; dlg->m_PosX = t->posx; dlg->m_PosY = t->posy; dlg->m_SizX = t->sizx; @@ -763,6 +773,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_InitTS = t->InitTS+8; dlg->m_FakeVersionId = t->FakeVersionId; dlg->m_MaxScreenRes = t->MaxScreenRes; + dlg->m_InitResW = t->resw; + dlg->m_InitResH = t->resh; dlg->m_SwapEffect = t->SwapEffect; } @@ -897,6 +909,14 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, sprintf_s(key, sizeof(key), "slowratio%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->SlowRatio); WritePrivateProfileString("target", key, val, InitPath); + // ------- + sprintf_s(key, sizeof(key), "initresw%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->resw); + WritePrivateProfileString("target", key, val, InitPath); + // ------- + sprintf_s(key, sizeof(key), "initresh%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->resh); + WritePrivateProfileString("target", key, val, InitPath); free(EscBuf); EscBuf = NULL; @@ -1085,6 +1105,12 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c // ------- sprintf_s(key, sizeof(key), "slowratio%i", i); TargetMap->SlowRatio = GetPrivateProfileInt("target", key, 1, InitPath); + // ------- + sprintf_s(key, sizeof(key), "initresw%i", i); + TargetMap->resw = GetPrivateProfileInt("target", key, 0, InitPath); + // ------- + sprintf_s(key, sizeof(key), "initresh%i", i); + TargetMap->resh = GetPrivateProfileInt("target", key, 0, InitPath); if (!gbDebug){ // clear debug flags diff --git a/host/host.aps b/host/host.aps index 3e288d4d4b96f3af0cec61f674d351fba4c834e6..167b1dd1056c1cfb43efd6d8562878aa51f2f42c 100644 GIT binary patch delta 663 zcmXBQJ!n%=7zW^T4!zP#rGyenxR#v62I93b{V_uo2MeWmL0#<-h(8e$D7Ci5w&38< z!3#xF-c`h*LobvxY15y86o(F85OL_>R2*CaDndJSD!%Di9xmVeednIGAVx>>k2RCxM){z<;{Vs1XWurOjiW}nsPmZ~y?Kh?Bc zTU{Eoa#DzY@HVv?SI8>Ix+;W-!Qa#}kAT(?GF-MWZ8;a+Utrg??1M`=S<@=liFl`D zH8}YeKFge>9}zM;Yjl^Gr-aga3OHQ0^zJ}#}nYiRW=g>NYnj>2bo3IY9$kl|?>$7vJZgT2$f zzDvKu+tI3H0DrHWa1uVtD+uUMgbbruoZm2E3HEM#WtZ}SceP3lqkGtdi||?AKtKgT zhPfQ#Iqu0-?!eyDvI3Wu;L)!r(;4{m69W1eAuXY`$8*QfJ?2m5QwP~O+_2Yi}9aA8QN(4sNe&GuWm&3<`?2Xq-PoBBVYR@OxT delta 1049 zcmXxiPe>F|90%~3aVFiJNjKMB)^XiG?ds~b?yjq-g!l(SEJM9@S<*_u!d%HE5;}M& zkdRWpojQ3?kceGH$<;%6NQe;X&_SeQL3Qbn2a(Wz^Ii{@$9uo|eZIe8-p>6|=IIxZ z;|sx1;zLf7MlPqXJi0M4l75&PN;VC(whrAM&E86nWu~(6vAYx5DZYJhN0Qbv(>Xbg zpSg&FgDgW#VjD!*$gmQj1Zx?oxUkh&uS} zv2t81=Xvc;_?#?n#wmOm%Ug1ZvxDVj-6GG%@(OOea`U_c4|Y5}?@cA1S6UxNvsVi5 zq&&C1N*pUF&MkX!Qe|Q(uhFiPqO1Tz`i3=3At*^e+jhB<4mg|C*g$y&j@jJ=Nt z=H~1;g2M=B*Xt3l=WM24Fdt)IqJnujE4hSUQO?pabi_EDj|moF>|29i0nR*eoHTGY zoaSAt6eArq_u&~8s6?<>}N?S9`W^-{%mAjyA z`Q?|W+43vnE$DBdtEcj3j8Zv^r?l>3h1L=5SuLID?=%++s#4btd$)-|L6yU(DfpGu z9z5$IO@#`KQsHYK-u2Ocfpx4D{M5Hc>mC?2Z(R0@)Oi-hvdJwO6x4{Z~OlN DJ+y!A diff --git a/host/resource b/host/resource index 9c2d5661dcd213181f715c1ad19bf99fb3a3207d..18cb27781fe376f9158bdb9a1ebd79e6f924ae42 100644 GIT binary patch delta 805 zcmXYvT}V@57{|}t@wkp-%@q-rhj%N9Ovl)!3_BbuLR01kq7gOs;lAgPirCkMEb5{n zE&WT#NJ*(K#ab5c=!ymRW9`8%u9xfL25Ft=+}r@BqNlObBWPS$u$qh3epZWB zj{z&!dWjwg9tBs1rJDU~sC&|aU9Es~9v()oRIU2>GIt351`C+af)Tor_erQ9R`8j) z>JgD2cEaVCuu0wwvEuQV^;%K#Gko{T=nhzL(btZb0fu>>4DSfT(ph2J--fp&FZ*R2 z2{OF)E4USuUdU_Ic%J<`^PM%YK1@ioLSJ|aU2Gi(zJ#I~S} zJ)&|#heFVafe1s1yd`3HNQM|?NH|0+hn$E-C3wRk^kFB~RIPx;D&AVyj$DkX`z&I| zma0v-8)wp)XIRtG*kfbpz|=ByJlX-1xm-)Wjf-Z%2x84LcU1U${zQI)0V zPb=^fpQU)Lq+NKIr3f+#j^->F%eaagx!J?&l-~Oy))O|c2_AzlDwCzrcC~)fAt5)~ zu5q9)X~veS78=d4C)>3St`)EJ$J8E^`}OUEmAaheR;Eckb3;?{=2PW9=1XQ6jtd96 jxE^kZR^>n2v^-3wD*0~CS*GupG_5dCH56lyZl3uMIFcuD delta 725 zcmYk0Pe_w-7{{Hyy}rDOn0W9YKYk2_u(8$}W2_%9A%-R*CL)Tj?{vC?5*LMxxK2e$<+;4#PsHOB~xb1r5gSy_jhjpX)_Pi_SYJ#TA_&({u{^Ss%x<<}m zPig4Y8O|nT6ebn4=|jjzWE@Y0uzi(Fs2CE2;d8QDf71xz&sAS>P2lZ|E}S>WxUWn9 zb!wY_RCVrL?T-X8HdS+hBC$$rHaPa~$=)IGp8#}Kq$-MvlLXwJMa9<2kihVSvPu?JUN$wy#?7R*DV?EY(LT;+H*G)l$l)0EY7!~ MvLlyPHlN=53)fmGR{#J2