From f386bd1d35f84d9f05abcb63c314318da223d693 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 23 May 2015 12:40:49 -0400 Subject: [PATCH] v2_03_22_src Former-commit-id: 96d72e2886d6e4e1bb8957d27c127aab6064cde4 --- Include/dxwnd.h | 5 - build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/exports/Gorky 17.dxw | 31 +++ build/exports/Outwars.dxw | 31 +++ build/exports/dxwnd.ini | 5 + build/readme-relnotes.txt | 9 +- dll/d3dtexture.cpp | 3 + dll/ddblit.cpp | 10 +- dll/ddraw.cpp | 123 +++++----- dll/ddshot.cpp | 4 +- dll/ddtexture.cpp | 15 +- dll/dxhook.cpp | 34 ++- dll/dxwcore.cpp | 242 +------------------ dll/dxwcore.hpp | 76 ++++-- dll/dxwnd.aps | Bin 37664 -> 37668 bytes dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 210944 -> 267776 bytes dll/dxwnd.vs2008.vcproj | 12 +- dll/dxwsstack.cpp | 242 +++++++++++++++++++ dll/{wndproc.cpp => dxwwstack.cpp} | 48 ++-- dll/gdi32.cpp | 362 +++++------------------------ dll/hd3d7.cpp | 8 +- dll/hd3d8.cpp | 1 + dll/hd3d9.cpp | 3 +- dll/syslibs.h | 18 +- dll/user32.cpp | 189 +++------------ host/dxwndhost.aps | Bin 156844 -> 157012 bytes host/dxwndhost.rc | Bin 99420 -> 99716 bytes host/dxwndhost.vs2008.suo | Bin 208384 -> 208896 bytes host/dxwndhostView.cpp | 4 +- host/resource | Bin 34588 -> 34772 bytes 32 files changed, 607 insertions(+), 876 deletions(-) create mode 100644 build/exports/Gorky 17.dxw create mode 100644 build/exports/Outwars.dxw create mode 100644 build/exports/dxwnd.ini create mode 100644 dll/dxwsstack.cpp rename dll/{wndproc.cpp => dxwwstack.cpp} (82%) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 325445f..e6c7e8b 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -310,11 +310,6 @@ LRESULT CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG) #define STEP OutTrace("STEP at %s:%d\n", __FILE__, __LINE__) -extern BOOL WinDBGetSize(HWND, int *, int *); -extern WNDPROC WinDBGetProc(HWND); -extern void WinDBPutProc(HWND, WNDPROC); -extern void WinDBPutSize(HWND, int, int); - typedef enum { DXW_SET_COORDINATES = 0, DXW_DESKTOP_CENTER, diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 4954745..b0d49e7 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95762cfc50b158119d3bcb3d7a613dd13ae5abc3555c4c8153d9560bdafad4e6 -size 577536 +oid sha256:685801c38436f785e2d29010e560c7eb98e07adb83ae0bf0593f089a2d2ed043 +size 572928 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 85bc625..e98f13e 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c1bb172dc721bb8db528e064c3bc6acb78a0107c298e11368d28b36bb636dae6 +oid sha256:ea58d479ffbb81c24c0282a35b7e8203848d66799bf047ad7d662e4fc53d0470 size 539648 diff --git a/build/exports/Gorky 17.dxw b/build/exports/Gorky 17.dxw new file mode 100644 index 0000000..7e24281 --- /dev/null +++ b/build/exports/Gorky 17.dxw @@ -0,0 +1,31 @@ +[target] +title0=Gorky 17 +path0=D:\Games\Gorky 17\gorky17.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Outwars.dxw b/build/exports/Outwars.dxw new file mode 100644 index 0000000..67e2099 --- /dev/null +++ b/build/exports/Outwars.dxw @@ -0,0 +1,31 @@ +[target] +title0=Outwars +path0=D:\Games\OUTWARS\outwars.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088678 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini new file mode 100644 index 0000000..cfac93f --- /dev/null +++ b/build/exports/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=1477 +posy=150 +sizx=320 +sizy=749 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index ea3413c..8d8e939 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -805,4 +805,11 @@ fix: fully revised ddraw surface handling in d3d1-7 versions. Now "Might & Magic v2.03.21: fix: full re-design of ddraw "special" surface management (primary & backbuffer): greater compatibility for emulation mode -fix: GDI edit window positioning for "Imperialism" city name selection \ No newline at end of file +fix: GDI edit window positioning for "Imperialism" city name selection + +v2.03.22: +more code reorganization and cleanup +eliminated GDI over directdraw emulation (MAPGDITOPRIMARY flag) +add: support for texture D3DFMT_L8 dump ("Turok") +fix: eliminate a possible divide by zero error +fix: avoid intercepting WindowProc routines when set to special values 0xFFFFxxxx - makes "The Hulk" demo working diff --git a/dll/d3dtexture.cpp b/dll/d3dtexture.cpp index 1186cc8..69ee912 100644 --- a/dll/d3dtexture.cpp +++ b/dll/d3dtexture.cpp @@ -204,6 +204,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) case D3DFMT_X1R5G5B5: case D3DFMT_A1R5G5B5: case D3DFMT_A8: + case D3DFMT_L8: hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height); break; case D3DFMT_DXT1: @@ -274,6 +275,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) case D3DFMT_DXT4: case D3DFMT_DXT5: case D3DFMT_A8: + case D3DFMT_L8: pbi.bV4BitCount = 32; pbi.bV4RedMask = 0x00FF0000; pbi.bV4GreenMask = 0x0000FF00; @@ -343,6 +345,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) } break; case D3DFMT_A8: + case D3DFMT_L8: { // Copy the array of color indices into the .BMP file. BYTE *p = (BYTE *)LockedRect.pBits; diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 1b1c146..88ff3ff 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -34,7 +34,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest //extern PrimaryBlt_Type pPrimaryBlt; //CkArg arg; - FromScreen=dxw.IsAPrimarySurface(lpddssrc) && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 + FromScreen=dxwss.IsAPrimarySurface(lpddssrc) && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 // make a working copy of srcrect if not NULL if (lpsrcrect){ @@ -48,7 +48,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // In "The Sims" there is no quality loss, but some scrolling artifact. if(lpsrcrect && FromScreen){ LPDIRECTDRAWSURFACE lpDDSBack; - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if(lpDDSBack && (dxw.dwFlags1 & BLITFROMBACKBUFFER)){ lpddssrc=lpDDSBack; srcrect=dxw.GetScreenRect(); @@ -154,7 +154,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest if (isFlipping){ // handle the flipping chain ... //lpddssrc=lpDDSBack; - lpddssrc = dxw.GetBackBufferSurface(); + lpddssrc = dxwss.GetBackBufferSurface(); OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc); } } @@ -324,8 +324,8 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, } } - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); + ToPrim=dxwss.IsAPrimarySurface(lpdds); + FromPrim=dxwss.IsAPrimarySurface(lpddssrc); ToScreen=ToPrim && !(dxw.dwFlags1 & EMULATESURFACE); FromScreen=FromPrim && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index b5193b1..458a048 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -260,9 +260,6 @@ LPDIRECTDRAWPALETTE lpDDP=NULL; // v2.02.37: globals to store requested main surface capabilities DDSURFACEDESC2 DDSD_Prim; -DDSURFACEDESC2 DDSD_Back; -DDSURFACEDESC2 DDSD_ZBuffer; - DWORD DDZBufferCaps; DWORD PaletteEntries[256]; DWORD *Palette16BPP = NULL; @@ -1786,10 +1783,10 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) unsigned int dwLocalDDVersion; unsigned int dwLocalTexVersion; - IsPrim=dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); - IsBack=dxw.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); + IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); + IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); OutTraceDDRAW("QueryInterface(S): lpdds=%x%s REFIID=%x(%s)\n", - lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); + lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); IsGammaRamp=FALSE; @@ -1849,7 +1846,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) } // fix the target for gamma ramp creation: if it is a primary surface, use the real one!! - if(dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds) && IsGammaRamp) lpdds = lpDDSEmu_Prim; + if(dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds) && IsGammaRamp) lpdds = lpDDSEmu_Prim; res = (*pQueryInterfaceS)(lpdds, riid, obp); @@ -1879,12 +1876,12 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) dxw.dwDDVersion=dwLocalDDVersion; if(IsPrim){ OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); - dxw.MarkPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); + dxwss.PushPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); HookDDSurfacePrim((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); } else{ - if(IsBack) dxw.MarkBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); - else dxw.MarkRegularSurface((LPDIRECTDRAWSURFACE)*obp); + if(IsBack) dxwss.PushBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); + else dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? HookDDSurfaceGeneric((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); } @@ -2260,7 +2257,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); InitDSScreenParameters(lpDDSEmu_Prim); - dxw.MarkRegularSurface(lpDDSEmu_Prim); + dxwss.PopSurface(lpDDSEmu_Prim); // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! // better avoid it or hook just useful methods. //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); @@ -2288,12 +2285,12 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); - dxw.MarkRegularSurface(lpDDSEmu_Back); + dxwss.PopSurface(lpDDSEmu_Back); if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); } bFlippedDC = TRUE; - + return DD_OK; } @@ -2334,7 +2331,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(dxw.dwFlags1 & EMULATEBUFFER){ lpDDSEmu_Prim = *lplpdds; - dxw.MarkRegularSurface(lpDDSEmu_Prim); + dxwss.PopSurface(lpDDSEmu_Prim); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; // warning: can't create zero sized backbuffer surface !!!! @@ -2598,10 +2595,10 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if (lpDDSBack) { while(lpDDSBack->Release()); - dxw.MarkRegularSurface(lpDDSBack); + dxwss.PopSurface(lpDDSBack); lpDDSBack = NULL; } } @@ -2630,14 +2627,14 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); if(res) return res; lpDDSPrim = *lplpdds; - dxw.MarkPrimarySurface(lpDDSPrim, dxversion); + dxwss.PushPrimarySurface(lpDDSPrim, dxversion); RegisterPixelFormat(lpDDSPrim); if (BBCount){ // build emulated backbuffer surface res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); if(res) return res; - dxw.MarkBackBufferSurface(lpDDSBack, dxversion); + dxwss.PushBackBufferSurface(lpDDSBack, dxversion); // V2.1.85/V2.2.34: tricky !!!! // When a real backbuffer is created, it has a reference to its frontbuffer. @@ -2678,7 +2675,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate } res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - if(res == DD_OK) dxw.MarkBackBufferSurface(*lplpdds, dxversion); + if(res == DD_OK) dxwss.PushBackBufferSurface(*lplpdds, dxversion); return res; } @@ -2686,7 +2683,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); if(!res) { - dxw.MarkRegularSurface(*lplpdds); + dxwss.PopSurface(*lplpdds); if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { lpDDZBuffer=*lplpdds; DDZBufferCaps = lpddsd->ddsCaps.dwCaps; @@ -2727,8 +2724,8 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet BOOL IsPrim; BOOL IsBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); @@ -2754,7 +2751,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth // in "Tomb Raider III" GOG release, the primary surface is queryed and has no attached // backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface. - LPDIRECTDRAWSURFACE lpddsback = dxw.GetBackBufferSurface(); + LPDIRECTDRAWSURFACE lpddsback = dxwss.GetBackBufferSurface(); if (lpddsback) { *lplpddas = lpddsback; OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); @@ -3137,7 +3134,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE lpddsTmp; LPDIRECTDRAWSURFACE lpDDSBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); @@ -3178,7 +3175,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if(dxw.dwFlags4 & NOFLIPEMULATION){ HRESULT res2; @@ -3260,7 +3257,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) { - if ((dxw.dwFlags2 & FULLRECTBLT) && dxw.IsAPrimarySurface(lpdds)){ + if ((dxw.dwFlags2 & FULLRECTBLT) && dxwss.IsAPrimarySurface(lpdds)){ lpsrcrect=NULL; lpdestrect=NULL; } @@ -3281,8 +3278,8 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, HRESULT ret; BOOL ToPrim, FromPrim; - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); + ToPrim=dxwss.IsAPrimarySurface(lpdds); + FromPrim=dxwss.IsAPrimarySurface(lpddssrc); CleanRect(&lpsrcrect,__LINE__); @@ -3381,8 +3378,8 @@ HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lpl HRESULT res; BOOL isPrim, isBack; - isPrim=dxw.IsAPrimarySurface(lpdds); - isBack=dxw.IsABackBufferSurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); + isBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("GetPalette: lpdds=%x%s%s\n", lpdds, isPrim?"(PRIM)":"", isBack?"(BACK)":""); res=(*pGetPalette)(lpdds, lplpddp); @@ -3407,7 +3404,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd BOOL isPrim; HRESULT res; - isPrim=dxw.IsAPrimarySurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); res=(*pSetPalette)(lpdds, lpddp); @@ -3427,7 +3424,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd mySetPalette(0, 256, lpentries); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode } // Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ... - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if (lpDDSBack){ OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack); res=(*pSetPalette)(lpDDSBack, lpddp); @@ -3477,7 +3474,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd { HRESULT res; BOOL isPrim; - isPrim=dxw.IsAPrimarySurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); // v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous @@ -3487,7 +3484,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ if ((isPrim && lpDDSEmu_Prim) || - (dxw.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ + (dxwss.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); res=0; } @@ -3509,7 +3506,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC CleanRect(&lprect, __LINE__); if(IsTraceDDRAW){ - BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds); char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); @@ -3550,7 +3547,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim); if(IsTraceDDRAW){ - BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds); char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); @@ -3622,8 +3619,8 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC BOOL IsBack; RECT rect; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); if(IsTraceDDRAW){ char sRect[81]; @@ -3682,7 +3679,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR BOOL IsPrim; LPDIRECTDRAWSURFACE lpDDSPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); @@ -3742,7 +3739,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); res=(*pGetDC)(lpdds, pHDC); @@ -3778,7 +3775,7 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); res=(*pReleaseDC)(lpdds, hdc); if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); @@ -3811,7 +3808,7 @@ HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) // v2.02.31: // in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one. if(dxw.dwFlags1 & EMULATESURFACE){ - *w=dxw.GetPrimarySurface(); + *w=dxwss.GetPrimarySurface(); OutTraceDW("GetGDISurface: EMULATED lpdd=%x w=%x\n", lpdd, *w); return DD_OK; } @@ -4067,7 +4064,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) DWORD res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); res=(*pGetPixelFormat)(lpdds, p); if(res){ @@ -4112,17 +4109,17 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) BOOL IsPrim; BOOL IsBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); res = (*pReleaseS)(lpdds); - OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxw.ExplainSurfaceRole(lpdds), res); + OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxwss.ExplainSurfaceRole(lpdds), res); if (res==0) { // common precondition // erase surface from primary or backbuffer list // v2-03-20: d3d 1-7 play a dirty trick: it Release the surface passed as argument until refcount == 0, // but then rebuilds it with the original attributes! So, better not forget them. - if(IsPrim || IsBack) dxw.UnrefSurface(lpdds); + if(IsPrim || IsBack) dxwss.UnrefSurface(lpdds); // when releasing primary surface, erase clipping region if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); @@ -4137,10 +4134,6 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) OutTraceDW("Release(S): Clearing lpDDSEmu_Back pointer\n"); lpDDSEmu_Back=NULL; } - if(lpdds==dxw.lpDDSPrimary) { - OutTraceDW("Release(S): Clearing lpDDSPrimary pointer\n"); - dxw.ResetPrimarySurface(); - } } } @@ -4152,7 +4145,7 @@ HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK { HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); if(IsTraceDDRAW){ char sInfo[81]; if (lpDDColorKey) sprintf(sInfo, "(L:%x,H:%x)",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); @@ -4171,7 +4164,7 @@ HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK { HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); @@ -4188,7 +4181,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); @@ -4203,7 +4196,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); if (res) OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(lpDDSBack = dxw.GetBackBufferSurface()){ + if(lpDDSBack = dxwss.GetBackBufferSurface()){ ddsd.dwSize=Set_dwSize_From_Surface(lpDDSBack); res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); if(res){ @@ -4235,8 +4228,8 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF // just remember this for further handling in the Flip operation. // But beware: this holds to BACKBUFFER surfaces only, and NOT for attached ZBUFFERS or similar! - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("AddAttachedSurface: lpdds=%x%s lpddsadd=%x%s\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), lpddsadd, (lpddsadd==lpDDZBuffer)?"(ZBUF)":""); //if(!lpddsadd) return DDERR_CANNOTATTACHSURFACE; // to avoid a crash... @@ -4256,7 +4249,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE) || (res==DDERR_NOEXCLUSIVEMODE)) OutTraceDW("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); - dxw.MarkBackBufferSurface(lpddsadd, 1); + dxwss.PushBackBufferSurface(lpddsadd, 1); if (pAddRefS) (*pAddRefS)(lpdds); res=DD_OK; } @@ -4282,7 +4275,7 @@ HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflag OutTraceDDRAW("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel); if(res) OutTraceE("DeleteAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); - if (res && dxw.IsABackBufferSurface(lpddsdel)){ + if (res && dxwss.IsABackBufferSurface(lpddsdel)){ OutTraceDW("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); res = DD_OK; } @@ -4301,8 +4294,8 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA { HRESULT res; BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); IsFixed=FALSE; char *sLabel; @@ -4384,7 +4377,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) if(dxw.dwFlags4 & FIXREFCOUNTER){ // v2.02.41: fix the ref counter to sumulate the unwindowed original situation --VirtualRef; // why ???? - if(dxw.GetBackBufferSurface()) --VirtualRef; + if(dxwss.GetBackBufferSurface()) --VirtualRef; if(dxw.dwFlags1 & EMULATESURFACE){ if(lpDDSEmu_Prim) --VirtualRef; if(lpDDSEmu_Back) --VirtualRef; @@ -4494,8 +4487,8 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR { HRESULT res; BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); IsFixed=FALSE; if (!pGetSurfaceDesc) { @@ -4699,7 +4692,7 @@ HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG HRESULT ret; OutTraceDDRAW("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); - if(dxw.IsAPrimarySurface(lpdds)) lpdds=lpDDSEmu_Prim; + if(dxwss.IsAPrimarySurface(lpdds)) lpdds=lpDDSEmu_Prim; ret=(*pDDGetGammaRamp)(lpdds, dwFlags, lpgr); if(ret) { diff --git a/dll/ddshot.cpp b/dll/ddshot.cpp index e3c0e49..855aba5 100644 --- a/dll/ddshot.cpp +++ b/dll/ddshot.cpp @@ -39,10 +39,10 @@ void DDrawScreenShot() } if(dxw.dwFlags5 & GDIMODE){ - s = dxw.GetBackBufferSurface(); + s = dxwss.GetBackBufferSurface(); } else{ - s = dxw.GetPrimarySurface(); + s = dxwss.GetPrimarySurface(); } if(!s) return; diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index b1bfc13..351886c 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -42,6 +42,7 @@ unsigned int HashSurface(BYTE *buf, int pitch, int width, int height) int pixelsize; DWORD hash = 0; // integer divide, intentionally throwing reminder away + if (width == 0) return 0; // avoid DivBy0 error pixelsize = pitch / width; for(int y = 0; y < height; y++){ BYTE *p = buf + (y * pitch); @@ -114,7 +115,7 @@ void TextureHighlight(LPDIRECTDRAWSURFACE s) OutTraceE("TextureHigh: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) { + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) { OutTrace("TextureHigh: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; @@ -204,7 +205,7 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) while (TRUE) { + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) while (TRUE) { OutTrace("TextureDump: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; @@ -281,16 +282,8 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) // Copy the RGBQUAD array into the file. if(pbi.bV4ClrUsed){ - //DWORD PaletteEntries[256]; - //LPDIRECTDRAWSURFACE lpDDS=NULL; - //LPDIRECTDRAWPALETTE lpDDP=NULL; - //lpDDS=dxw.GetPrimarySurface(); - //if(lpDDS) lpDDS->GetPalette(&lpDDP); - //if(lpDDP) lpDDP->GetEntries(0, 0, 256, (LPPALETTEENTRY)PaletteEntries); - //for(int i=0; i<256; i++) PaletteEntries[i]=0xff0000; extern DWORD PaletteEntries[256]; fwrite((LPVOID)PaletteEntries, pbi.bV4ClrUsed * sizeof (RGBQUAD), 1, hf); - //fwrite((LPBYTE)PaletteEntries, pbi.bV4ClrUsed * sizeof (RGBQUAD), 1, hf); } // Copy the array of color indices into the .BMP file. @@ -318,7 +311,7 @@ static void TextureHack(LPDIRECTDRAWSURFACE s) OutTraceE("TextureHack: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) while (TRUE) { // fake loop to ensure final Unlock + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) while (TRUE) { // fake loop to ensure final Unlock OutTrace("TextureHack: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 904865e..84dac54 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -25,6 +25,8 @@ #define SKIPIMEWINDOW TRUE dxwCore dxw; +dxwSStack dxwss; +dxwWStack dxwws; typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); typedef int (*Preparedisasm_Type)(void); @@ -594,18 +596,26 @@ void HookWindowProc(HWND hwnd) { WNDPROC pWindowProc; pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); + // don't hook twice .... if ((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || (pWindowProc == extDialogWindowProc)){ // hooked already !!! OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK already in place\n", hwnd); + return; } - else {// don't hook twice .... - long lres; - WinDBPutProc(hwnd, pWindowProc); - lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); - OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); + + // v2.03.22: don't remap WindowProc in case of special address 0xFFFFnnnn. + // This makes "The Hulk demo" work avoiding WindowProc recursion and stack overflow + if (((DWORD)pWindowProc & 0xFFFF0000) == 0xFFFF0000){ + OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK %x not updated\n", hwnd, pWindowProc); + return; } + + long lres; + dxwws.PutProc(hwnd, pWindowProc); + lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); + OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); } void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) @@ -670,8 +680,8 @@ LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA t=tn; } - pWindowProc=WinDBGetProc(hwnd); - if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); + pWindowProc=dxwws.GetProc(hwnd); + if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n"; OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); @@ -726,10 +736,10 @@ LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPAR } } - pWindowProc=WinDBGetProc(hwnd); + pWindowProc=dxwws.GetProc(hwnd); // v2.02.82: use CallWindowProc that handles WinProc handles - if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); + if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); // should never get here .... OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd); return DefWindowProc(hwnd, message, wparam, lparam); @@ -1116,15 +1126,15 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } if (dxw.dwFlags1 & AUTOREFRESH) dxw.ScreenRefresh(); - pWindowProc=WinDBGetProc(hwnd); + pWindowProc=dxwws.GetProc(hwnd); //OutTraceB("WindowProc: pWindowProc=%x extWindowProc=%x message=%x(%s) wparam=%x lparam=%x\n", // (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam); if(pWindowProc) { LRESULT ret; // v2.02.36: use CallWindowProc that handles WinProc handles - ret=(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); - + ret=(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); + // save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling if(message==WM_NCHITTEST) LastCursorPos=ret; // v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 9d22e18..f4469db 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -8,12 +8,6 @@ #include "resource.h" #include "d3d9.h" -#if 1 -#define OutTraceSDB OutTrace -#else -#define OutTraceSDB if(0) OutTrace -#endif - /* ------------------------------------------------------------------ */ // Internal function pointers /* ------------------------------------------------------------------ */ @@ -36,7 +30,6 @@ static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER, int); dxwCore::dxwCore() { // initialization stuff .... - extern void WinDBInit(); FullScreen=FALSE; SethWnd(NULL); SetScreenSize(); @@ -46,12 +39,9 @@ dxwCore::dxwCore() bActive = TRUE; bDInputAbs = 0; TimeShift = 0; - lpDDSPrimary = NULL; - memset(SurfaceDB, 0, sizeof(SurfaceDB)); ResetEmulatedDC(); MustShowOverlay=FALSE; TimerEvent.dwTimerType = TIMER_TYPE_NONE; - WinDBInit(); // initialization of default vsync emulation array iRefreshDelays[0]=16; iRefreshDelays[1]=17; @@ -228,234 +218,6 @@ void dxwCore::DumpDesktopStatus() ); } - - -/* ------------------------------------------------------------------ */ -// Primary surfaces auxiliary functions -/* ------------------------------------------------------------------ */ - -//#define DXW_SURFACE_STACK_TRACING - -static char *sRole(USHORT role) -{ - char *s; - switch (role){ - case 0: s="(NULL)"; break; // should never happen ... - case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; - case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; - default: s="??"; break; // should never happen ... - } - return s; -} - -#ifdef DXW_SURFACE_STACK_TRACING -static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) -{ - char sMsg[81]; - int iPCount = 0; - int iBCount = 0; - for (int i=0;i 1) { - sprintf(sMsg, "Primary count = %d", iPCount); - MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - } - if(iBCount > 1) { - sprintf(sMsg, "Backbuffer count = %d", iPCount); - MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - } -} - -static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) -{ - for (int i=0;i>> SURFACELIST CLEAR ALL\n"); -#endif - for (int i=0;i>> SURFACELIST UNREF: lpdds=%x%s ref=%x vers=%d\n", ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); -#endif - SurfaceDB[i].uRef = FALSE; - } -#ifdef DXW_SURFACE_STACK_TRACING - DumpSurfaceList(SurfaceDB); -#endif -} - -void dxwCore::MarkSurfaceByRole(LPDIRECTDRAWSURFACE ps, USHORT role, USHORT version) -{ - int i; - SurfaceDB_Type *e; -#ifdef DXW_SURFACE_STACK_TRACING - OutTraceSDB(">>> SURFACELIST MARK: lpdds=%x%s vers=%d\n", ps, sRole(role), version); -#endif - for (i=0;ilpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list - } - if(i == DDSQLEN) { - MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - return; - } - e->lpdds=ps; - e->uRole = role; - e->uRef = TRUE; - e->uVersion = version; -#ifdef DXW_SURFACE_STACK_TRACING - DumpSurfaceList(SurfaceDB); -#endif -} - -void dxwCore::MarkPrimarySurface(LPDIRECTDRAWSURFACE ps, int version) -{ - MarkSurfaceByRole(ps, SURFACE_ROLE_PRIMARY, (USHORT)version); -} - -void dxwCore::MarkBackBufferSurface(LPDIRECTDRAWSURFACE ps, int version) -{ - MarkSurfaceByRole(ps, SURFACE_ROLE_BACKBUFFER, (USHORT)version); -} - -void dxwCore::MarkRegularSurface(LPDIRECTDRAWSURFACE ps) -{ - int i; - // look for entry - for (i=0;i>> SURFACELIST CLEAR: i=%d lpdds=%x%s ref=%x vers=%d\n", - i, ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); -#endif - for (; iJt@})i+FJU`Vlwaj6K;ONl8niZ?KhH?WK^E=rC`$;pXHsVL7& z(JM-3*qFVwkMY=K#eQ#Y0|rZmc!pwzB8KG6mHm?$nHd-wCi6~gmBXgboI!=*|9=pk byk(*aqx$BX6PX!-2Hl;c%-ArQak4T1eB3ee diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 6d67180..64cb186 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.21" +#define VERSION "2.03.22" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 7606983dfde7c02497e45d8bde8c99ca2dbfb76e..bd368767c0dbfa70a895a76bfaae518f187a5163 100644 GIT binary patch delta 36119 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 delta 2198 zcmZuyZ){W76~E`+XJe8V$MuYHL*~7>b{eH=NJ7ZcjRptODtKuK|GPARZA{8a#v+$h z2r=}C_8~2lCcccbb!bab>!OTRrH|!xQngu-RT-aGeqe&;;>q)Y!&9jaNNFvfr+cexnjq^QHKi%ckoHzCE_;HdEw|2a5b zrH$EaHY=}-1XRchE8yUtW`%Ps&TR?8QA&ahIQDsaQ zs~n>Tg%?MvVLc8!$D6SKJK#1CKL(wUviS|a>l(=8K`-8}fy+``UWP6W+}KtN*N=NR z)+~lmv!Mw#g4BH!?YmZt$;Y93eu8ahz4WdiR@@QaHY4re0!)na0BRG$haK(U!Mm%V z5mP}3$f=M|c6nV!q;iX2wGQ+b%J?G^dAe<=@ggaICb>-VG08tjte{V5{gmW$lFtgh zE3~SFpWO4*ApFJvXBJfJy#KolwfzVTCw#{HtM+i19gZzFq8;1pcs3;(lr0f~;Dr zij-KadjbCEWvDho2a@pA)A+=oI>xsy-O1-grb5h87 zyet)~gdTa|(}#_4Y_Jr{^07-O_J(n++a4fw{}Xa=a+N)o=lq=8m`+Z9 z)Alg!eZ63hb~znq$+ob`6K?l!4>ccm^VIYZ)j*z@)=njw;fPXhl+XB7@Ho!Vkv<~9nuXv~qI4j$eIdNBq`Y1u;XMX8bz8I*?PJ^6w^$GBVrf5cjJJRv z&%Y%)%)2|q49GW~#JXN0T;_TDJ2oSNsLhB5oYKXJOnCE@l-ivHMQS(_hHA54gIXak z-3iF3TgAF+aLY_ZQMwAaZ3iWp!Z!?2kI^P@;MD-3bvOt~sr^ionU`GVk3+DJ%eBrr z>&9+O?i7AA5`i(w_GP-^O8}R2J*!}O0$k}ju*>5cJZ3lnyXI2u8Eb}&4X?FBAjb>I z|JrhNGdS}kIsYUiF;EE+vuHUq!MqhL#$IIGu_7%NAZ-S*;ecqucMl4Wc`gi1^YFdr zxX(P&3w?lxZwV)kZ00W0KL}g+SO@6fiV?6@N1dc~)B<_v8R)m;?I&T^cbBmruzu?1 zU95$bup)w*_-V28It4NsD8IL*Iq@r-9pH0QtNGPmTSF{&X@@MG&)KYwEn!<(gN(%& zrDA?u!Ifp0iE_mZZ-9)mknAfEp@DIq&JkV(Ui0GXPz$oI)PtTbej;De37T7(5KW`* zHQb-x0UBoB65V)l4X?$FA%aqW%?T^8J_I3}Fdp-F-CPx^V!!D>1lLM173I}(&u1Rf zv4x+3v11T+;*PY~YPEw5FI4eXS}eoXrCe`W%AQ~i^jk^Nn$vznN3*29VM(I}0<(>X z90=xvAl%3u8V`)|R;eG=Ozk90Ey6QnT+i`tq>1=QWwPVQeQJK^72&{36HtShd7vY& z68hLV(1Xig$l=IX8Cyri_#sPD5weh(`*iQXGX?r|kM? z9Y)h)zS(*cR(cex{x~RjT~0GU5WMYiJY(_}U=qIeDE5xR>xS;u0h=4Z4f|!x`~7qy zFPBNT*PPnQe_^p#L+zJD=-#-O5Ol(6GrNWp<>TX=dXDO4x_Y@iPxGPYc|YC=fQsrk zA4TO4{6iVNlK;M#PdAGrfWbSWR=#slgT;92z6eRx?Zmn!q2Wsh#ag7#P5|}o1fjl_ zyD{;uI4M0LYT&ix@0lh*PoEMS^B*00nTl866OE{!;Z%n>Kf&RTxiMup2mz8cT|jW6XHz&Ao7 z@{@68+0jbz)$lRHQ@knwv!`MRX_W`km7>Hv-zT)WiSgBN^S-S&3XbC%G^474xBjxx lch@SqHHGuVUrFt2b+Ag(R?s^Nt2JyNnh~w}>8Loh{{kwzr + + + + @@ -461,10 +469,6 @@ RelativePath=".\wintrust.cpp" > - - +#include "dxwnd.h" +#include "dxwcore.hpp" + +//#define DXW_SURFACE_STACK_TRACING + +dxwSStack::dxwSStack() +{ + lpDDSPrimary = NULL; + lpDDSBackBuffer = NULL; + memset(SurfaceDB, 0, sizeof(SurfaceDB)); +} + +dxwSStack::~dxwSStack() +{ +} + +static char *sRole(USHORT role) +{ + char *s; + switch (role){ + case 0: s="(NULL)"; break; // should never happen ... + case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; + case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; + default: s="??"; break; // should never happen ... + } + return s; +} + +#ifdef DXW_SURFACE_STACK_TRACING +static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) +{ + char sMsg[81]; + int iPCount = 0; + int iBCount = 0; + for (int i=0;i 1) { + sprintf(sMsg, "Primary count = %d", iPCount); + MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + } + if(iBCount > 1) { + sprintf(sMsg, "Backbuffer count = %d", iPCount); + MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + } +} + +static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) +{ + for (int i=0;i>> SURFACELIST CLEAR ALL\n"); +#endif + for (int i=0;i>> SURFACELIST UNREF: lpdds=%x%s ref=%x vers=%d\n", ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); +#endif + SurfaceDB[i].uRef = FALSE; + if(ps == lpDDSPrimary) lpDDSPrimary = GetSurfaceByRole(SURFACE_ROLE_PRIMARY); + if(ps == lpDDSBackBuffer) lpDDSBackBuffer = GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER); + } +#ifdef DXW_SURFACE_STACK_TRACING + DumpSurfaceList(SurfaceDB); +#endif +} + +void dxwSStack::PushSurface(LPDIRECTDRAWSURFACE ps, USHORT role, USHORT version) +{ + int i; + SurfaceDB_Type *e; +#ifdef DXW_SURFACE_STACK_TRACING + OutTraceSDB(">>> SURFACELIST MARK: lpdds=%x%s vers=%d\n", ps, sRole(role), version); +#endif + for (i=0;ilpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list + } + if(i == DDSQLEN) { + MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + return; + } + e->lpdds=ps; + e->uRole = role; + e->uRef = TRUE; + e->uVersion = version; +#ifdef DXW_SURFACE_STACK_TRACING + DumpSurfaceList(SurfaceDB); +#endif +} + +void dxwSStack::PushPrimarySurface(LPDIRECTDRAWSURFACE ps, int version) +{ + PushSurface(ps, SURFACE_ROLE_PRIMARY, (USHORT)version); + lpDDSPrimary = ps; +} + +void dxwSStack::PushBackBufferSurface(LPDIRECTDRAWSURFACE ps, int version) +{ + PushSurface(ps, SURFACE_ROLE_BACKBUFFER, (USHORT)version); + lpDDSBackBuffer = ps; +} + +void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps) +{ + int i; + // look for entry + for (i=0;i>> SURFACELIST CLEAR: i=%d lpdds=%x%s ref=%x vers=%d\n", + i, ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); +#endif + for (; i #include -#include -#include #include "dxwnd.h" #include "dxwcore.hpp" -#include "dxhook.h" -#include "syslibs.h" -#include "dxhelper.h" - -typedef struct { - HWND hwnd; - WNDPROC wndproc; - int w; - int h; -} wndstack_entry; +//#define DXW_WINPROC_STACK_TRACING #define MAXWNDHSTACK 256 -wndstack_entry *WhndStack; -static int WhndTOS = 0; -static int WhndSize = 0; - -void WinDBInit() +dxwWStack::dxwWStack() { + WhndTOS = 0; WhndSize = MAXWNDHSTACK; WhndStack = (wndstack_entry *)malloc(WhndSize * sizeof(wndstack_entry)); } -void WinDBPut(HWND hwnd, WNDPROC wndproc, int w, int h) +dxwWStack::~dxwWStack() +{ +} + +void dxwWStack::Put(HWND hwnd, WNDPROC wndproc, int w, int h) { int StackIdx; @@ -66,7 +57,7 @@ void WinDBPut(HWND hwnd, WNDPROC wndproc, int w, int h) WhndTOS++; } -void WinDBPutProc(HWND hwnd, WNDPROC wndproc) +void dxwWStack::PutProc(HWND hwnd, WNDPROC wndproc) { int StackIdx; @@ -94,7 +85,7 @@ void WinDBPutProc(HWND hwnd, WNDPROC wndproc) WhndTOS++; } -void WinDBPutSize(HWND hwnd, int w, int h) +void dxwWStack::PutSize(HWND hwnd, int w, int h) { int StackIdx; @@ -119,7 +110,7 @@ void WinDBPutSize(HWND hwnd, int w, int h) WhndTOS++; } -BOOL WinDBGetSize(HWND hwnd, int *w, int *h) +BOOL dxwWStack::GetSize(HWND hwnd, int *w, int *h) { int StackIdx; for(StackIdx=0; StackIdxm_DCEmulationMode = 0; - if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; - if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; - if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; -*/ - typedef BOOL (WINAPI *ExtTextOutW_Type)(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); typedef BOOL (WINAPI *ExtTextOutA_Type)(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *); BOOL WINAPI extExtTextOutW(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); @@ -155,19 +148,6 @@ static HookEntry_Type EmulateHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type DDHooks[]={ - {HOOK_IAT_CANDIDATE, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extDDCreateCompatibleDC}, - {HOOK_IAT_CANDIDATE, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extDDDeleteDC}, - {HOOK_IAT_CANDIDATE, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extDDCreateDC}, - {HOOK_IAT_CANDIDATE, "BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt}, - {HOOK_IAT_CANDIDATE, "StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt}, - {HOOK_IAT_CANDIDATE, "GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox}, - - // {HOOK_IAT_CANDIDATE, "PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ... - // {HOOK_IAT_CANDIDATE, "MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extDDMaskBlt}, // missing one ... - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type TextHooks[]={ {HOOK_IAT_CANDIDATE, "CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont}, {HOOK_IAT_CANDIDATE, "CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect}, @@ -206,7 +186,7 @@ void HookGDI32Init() { HookLibInit(Hooks); HookLibInit(RemapHooks); - HookLibInit(DDHooks); + HookLibInit(ScaledHooks); HookLibInit(EmulateHooks); HookLibInit(TextHooks); HookLibInit(GammaHooks); @@ -220,7 +200,6 @@ void HookGDI32(HMODULE module) if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(module, RemapHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(module, ScaledHooks, libname); if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(module, EmulateHooks, libname); - if (dxw.dwFlags1 & MAPGDITOPRIMARY) HookLibrary(module, DDHooks, libname); if (dxw.dwFlags1 & FIXTEXTOUT) HookLibrary(module, TextHooks, libname); if (dxw.dwFlags2 & DISABLEGAMMARAMP) HookLibrary(module, GammaHooks, libname); // v2.02.33 - for "Stratego" compatibility option @@ -237,7 +216,6 @@ FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule) if (dxw.dwFlags1 & CLIENTREMAPPING) if(addr=RemapLibrary(proc, hModule, RemapHooks)) return addr; if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) if (addr=RemapLibrary(proc, hModule, DDHooks)) return addr; if (dxw.dwFlags1 & FIXTEXTOUT) if(addr=RemapLibrary(proc, hModule, TextHooks)) return addr; if (dxw.dwFlags2 & DISABLEGAMMARAMP) if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr; // v2.02.33 - for "Stratego" compatibility option @@ -495,61 +473,6 @@ BOOL WINAPI extGDIRestoreDC(HDC hdc, int nSavedDC) // maps the GDI palette to the buffered DirectDraw one. This fixes the screen // output for "Dementia" (a.k.a. "Armed & Delirious"). -HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) -{ - HPALETTE ret; - - OutTraceDW("GDI.CreatePalette: plpal=%x version=%x NumEntries=%d\n", plpal, plpal->palVersion, plpal->palNumEntries); - if(IsDebug) dxw.DumpPalette(plpal->palNumEntries, (LPPALETTEENTRY)plpal->palPalEntry); - ret=(*pGDICreatePalette)(plpal); - OutTraceDW("GDI.CreatePalette: hPalette=%x\n", ret); - return ret; -} - -HPALETTE hDesktopPalette=NULL; - -HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) -{ - HPALETTE ret; - - if(hdc==dxw.RealHDC) hdc= dxw.VirtualHDC; - - ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); - OutTraceDW("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); - if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - OutTraceDW("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); - hDesktopPalette=hpal; - } - return ret; -} - -BOOL WINAPI extAnimatePalette(HPALETTE hpal, UINT iStartIndex, UINT cEntries, const PALETTEENTRY *ppe) -{ - // Invoked by "Pharaoh's Ascent 1.4" - STOPPER("AnimatePalette"); - return TRUE; -} - -UINT WINAPI extRealizePalette(HDC hdc) -{ - UINT ret; - extern void mySetPalette(int, int, LPPALETTEENTRY); - - OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); - if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - PALETTEENTRY PalEntries[256]; - UINT nEntries; - nEntries=(*pGetPaletteEntries)(hDesktopPalette, 0, 256, PalEntries); - mySetPalette(0, nEntries, PalEntries); - if(IsDebug) dxw.DumpPalette(nEntries, PalEntries); - ret=DD_OK; - } - else - ret=(*pGDIRealizePalette)(hdc); - OutTraceDW("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); - return ret; -} - // In emulated mode (when color depyth is 8BPP ?) it may happen that the game // expects to get the requested system palette entries, while the 32BPP screen // returns 0. "Mission Force Cyberstorm" is one of these. Returning the same @@ -622,6 +545,61 @@ static PALETTEENTRY dp[256]={ // default palette, captured on my PC with video m {0x00,0x00,0xff,0x00},{0xff,0x00,0xff,0x00},{0x00,0xff,0xff,0x00},{0xff,0xff,0xff,0x00} }; +HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) +{ + HPALETTE ret; + + OutTraceDW("GDI.CreatePalette: plpal=%x version=%x NumEntries=%d\n", plpal, plpal->palVersion, plpal->palNumEntries); + if(IsDebug) dxw.DumpPalette(plpal->palNumEntries, (LPPALETTEENTRY)plpal->palPalEntry); + ret=(*pGDICreatePalette)(plpal); + OutTraceDW("GDI.CreatePalette: hPalette=%x\n", ret); + return ret; +} + +HPALETTE hDesktopPalette=NULL; + +HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) +{ + HPALETTE ret; + + if(hdc==dxw.RealHDC) hdc= dxw.VirtualHDC; + + ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); + OutTraceDW("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); + if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ + OutTraceDW("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); + hDesktopPalette=hpal; + } + return ret; +} + +BOOL WINAPI extAnimatePalette(HPALETTE hpal, UINT iStartIndex, UINT cEntries, const PALETTEENTRY *ppe) +{ + // Invoked by "Pharaoh's Ascent 1.4" + STOPPER("AnimatePalette"); + return TRUE; +} + +UINT WINAPI extRealizePalette(HDC hdc) +{ + UINT ret; + extern void mySetPalette(int, int, LPPALETTEENTRY); + + OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); + if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ + PALETTEENTRY PalEntries[256]; + UINT nEntries; + nEntries=(*pGetPaletteEntries)(hDesktopPalette, 0, 256, PalEntries); + mySetPalette(0, nEntries, PalEntries); + if(IsDebug && nEntries) dxw.DumpPalette(nEntries, PalEntries); + ret=nEntries; + } + else + ret=(*pGDIRealizePalette)(hdc); + OutTraceDW("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); + return ret; +} + UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, LPPALETTEENTRY lppe) { int ret; @@ -639,234 +617,6 @@ UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, return ret; } -/* -------------------------------------------------------------------- */ -// directdraw supported GDI calls -/* -------------------------------------------------------------------- */ - -// PrimHDC: DC handle of the selected DirectDraw primary surface. NULL when invalid. -extern HDC PrimHDC; - -HDC WINAPI extDDCreateCompatibleDC(HDC hdc) -{ - HDC RetHdc; - extern GetDC_Type pGetDC; - - OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); - - if(dxw.IsDesktop(WindowFromDC(hdc)) && dxw.IsFullScreen()) { - dxw.SetPrimarySurface(); - if(!PrimHDC && dxw.lpDDSPrimary){ - HRESULT res; - STOPPER("null PrimHDC"); - res=(*pGetDC)(dxw.lpDDSPrimary, &PrimHDC); - if(res) OutTraceE("GDI.CreateCompatibleDC ERROR: GetDC lpdds=%x err=%d(%s) at %d\n", dxw.lpDDSPrimary, res, ExplainDDError(res), __LINE__); - } - OutTraceDW("GDI.CreateCompatibleDC: duplicating primary surface HDC lpDDSPrimary=%x SrcHdc=%x\n", dxw.lpDDSPrimary, PrimHDC); - RetHdc=(*pGDICreateCompatibleDC)(PrimHDC); - } - else - RetHdc=(*pGDICreateCompatibleDC)(hdc); - - if(RetHdc) - OutTraceDW("GDI.CreateCompatibleDC: returning HDC=%x\n", RetHdc); - else - OutTraceE("GDI.CreateCompatibleDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); - - return RetHdc; -} - -BOOL WINAPI extDDDeleteDC(HDC hdc) -{ - BOOL res; - - OutTraceDW("GDI.DeleteDC: hdc=%x\n", hdc); - - res=(*pGDIDeleteDC)(hdc); - if(!res) OutTraceE("GDI.DeleteDC: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; -} - -static HDC WINAPI winDDGetDC(HWND hwnd, char *api) -{ - HDC hdc; - HRESULT res; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("%s: hwnd=%x\n", api, hwnd); - - dxw.ResetPrimarySurface(); - dxw.SetPrimarySurface(); - if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - - if(dxw.lpDDSPrimary){ - if (PrimHDC){ - OutTraceDW("%s: reusing primary hdc\n", api); - (*pUnlockMethod(dxw.lpDDSPrimary))(dxw.lpDDSPrimary, NULL); - hdc=PrimHDC; - } - else{ - OutTraceDW("%s: get hdc from PRIMARY surface lpdds=%x\n", api, dxw.lpDDSPrimary); - res=extGetDC(dxw.lpDDSPrimary,&hdc); - if(res) { - OutTraceE("%s: GetDC(%x) ERROR %x(%s) at %d\n", api, dxw.lpDDSPrimary, res, ExplainDDError(res), __LINE__); - if(res==DDERR_DCALREADYCREATED){ - // try recovery.... - (*pReleaseDC)(dxw.lpDDSPrimary,NULL); - res=extGetDC(dxw.lpDDSPrimary,&hdc); - } - if(res)return 0; - } - PrimHDC=hdc; - } - } - else { - hdc=(*pGDIGetDC)(hwnd ? hwnd : dxw.GethWnd()); - OutTraceDW("%s: returning window DC handle hwnd=%x hdc=%x\n", api, hwnd, hdc); - PrimHDC=NULL; - } - - if(hdc) - OutTraceDW("%s: hwnd=%x hdc=%x\n", api, hwnd, hdc); - else - OutTraceE("%s: ERROR err=%d at %d\n", api, GetLastError, __LINE__); - return(hdc); -} - -HDC WINAPI extDDCreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMODE *InitData) -{ - HDC RetHDC; - OutTraceDW("GDI.CreateDC: Driver=%s Device=%s Output=%s InitData=%x\n", - Driver?Driver:"(NULL)", Device?Device:"(NULL)", Output?Output:"(NULL)", InitData); - - if (!Driver || !strncmp(Driver,"DISPLAY",7)) { - //HDC PrimHDC; - LPDIRECTDRAWSURFACE lpdds; - OutTraceDW("GDI.CreateDC: returning primary surface DC\n"); - lpdds=dxw.GetPrimarySurface(); - (*pGetDC)(lpdds, &PrimHDC); - RetHDC=(*pGDICreateCompatibleDC)(PrimHDC); - (*pReleaseDC)(lpdds, PrimHDC); - } - else{ - RetHDC=(*pGDICreateDC)(Driver, Device, Output, InitData); - } - if(RetHDC) - OutTraceDW("GDI.CreateDC: returning HDC=%x\n", RetHDC); - else - OutTraceE("GDI.CreateDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return RetHDC; -} - -HDC WINAPI extDDGetDC(HWND hwnd) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetDC"); - return ret; -} - -HDC WINAPI extDDGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetDCEx"); - return ret; -} - -HDC WINAPI extDDGetWindowDC(HWND hwnd) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetWindowDC"); - return ret; -} - -int WINAPI extDDReleaseDC(HWND hwnd, HDC hDC) -{ - int res; - extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC); - - OutTraceDW("GDI.ReleaseDC(DD): hwnd=%x hdc=%x\n", hwnd, hDC); - res=0; - if ((hDC == PrimHDC) || (hwnd==0)){ - dxw.SetPrimarySurface(); - OutTraceDW("GDI.ReleaseDC(DD): refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimary); - if(!dxw.lpDDSPrimary) return 0; - extReleaseDC(dxw.lpDDSPrimary, hDC); - PrimHDC=NULL; - res=1; // 1 = OK - } - else { - res=(*pGDIReleaseDC)(hwnd, hDC); - if (!res) OutTraceE("GDI.ReleaseDC: ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - return(res); -} - -BOOL WINAPI extDDBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) -{ - BOOL ret; - HRESULT res; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.BitBlt(PRIMARY): HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d dwRop=%x(%s)\n", - hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop, ExplainROP(dwRop)); - - ret=TRUE; // OK - - if(dxw.IsDesktop(WindowFromDC(hdcDest))) { - OutTrace("hdcDest=%x PrimHDC=%x\n", hdcDest, PrimHDC); - hdcDest=PrimHDC; - if(hdcDest==0) { - dxw.ResetPrimarySurface(); - dxw.SetPrimarySurface(); - extGetDC(dxw.lpDDSPrimary, &PrimHDC); - hdcDest=PrimHDC; - } - res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); - if(!res) OutTraceE("GDI.BitBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - dxw.ScreenRefresh(); - return ret; - } - - // proxy ... - res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); - if(!res) OutTraceE("GDI.BitBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} - -BOOL WINAPI extDDStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, - HDC hdcSrc, int nXSrc, int nYSrc, int nWSrc, int nHSrc, DWORD dwRop) -{ - BOOL ret; - RECT ClientRect; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.StretchBlt: HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d nWSrc=%x nHSrc=%x dwRop=%x\n", - hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); - - //if(dxw.IsDesktop(WindowFromDC(hdcDest))) { - // hdcDest=PrimHDC; - // if(hdcDest==0) { - // dxw.ResetPrimarySurface(); - // dxw.SetPrimarySurface(); - // extGetDC(dxw.lpDDSPrimary, &PrimHDC); - // hdcDest=PrimHDC; - // } - //} - - if(hdcDest != hdcSrc){ - (*pGetClientRect)(dxw.GethWnd(),&ClientRect); - ret=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); - if(!ret) { - OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return ret; - } - } - //dxw.SetPrimarySurface(); - //OutTraceDW("GDI.StretchBlt: refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimary); - //sBlt("GDI.StretchBlt", dxw.lpDDSPrimary, NULL, dxw.lpDDSPrimary, NULL, 0, NULL, 0); - //res=(*pUnlockMethod(dxw.lpDDSPrimary))(dxw.lpDDSPrimary, NULL); - return ret; -} - HDC WINAPI extGDICreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMODE *InitData) { HDC WinHDC, RetHDC; diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 2b81865..b5c67a2 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -504,7 +504,7 @@ HRESULT WINAPI extDirect3DCreateDevice(GUID FAR *lpGUID, LPDIRECT3D lpd3ddevice, HRESULT res; OutTraceD3D("Direct3DCreateDevice: guid=%x d3ddevice=%x dds=%x%s UnkOuter=%x\n", - lpGUID, lpd3ddevice, surf, dxw.ExplainSurfaceRole(surf), pUnkOuter); + lpGUID, lpd3ddevice, surf, dxwss.ExplainSurfaceRole(surf), pUnkOuter); res=(*pDirect3DCreateDevice)(lpGUID, lpd3ddevice, surf, lplpd3ddevice, pUnkOuter); if(res) OutTraceE("Direct3DCreateDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice); @@ -879,7 +879,7 @@ HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE HRESULT res; OutTraceD3D("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice2)(lpd3d, Guid, lpdds, lplpd3dd); if(res) { OutTraceE("CreateDevice(D3D2) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -903,7 +903,7 @@ HRESULT WINAPI extCreateDevice3(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE4 HRESULT res; OutTraceD3D("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice3)(lpd3d, Guid, lpdds, lplpd3dd, unk); if(res) { OutTraceE("CreateDevice(D3D3) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -931,7 +931,7 @@ HRESULT WINAPI extCreateDevice7(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE7 HRESULT res; OutTraceD3D("CreateDevice(D3D7): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice7)(lpd3d, Guid, lpdds, lplpd3dd); if(res) { OutTraceE("CreateDevice(D3D7) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); diff --git a/dll/hd3d8.cpp b/dll/hd3d8.cpp index 9ec1a06..43de20c 100644 --- a/dll/hd3d8.cpp +++ b/dll/hd3d8.cpp @@ -27,6 +27,7 @@ void D3D8TextureHandling(void *arg, int Level) IDirect3DSurface8 *pSurfaceLevel; D3DSURFACE_DESC Desc; D3DLOCKED_RECT LockedRect; + //OutTrace("D3D8TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level); if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; diff --git a/dll/hd3d9.cpp b/dll/hd3d9.cpp index d239070..12ca359 100644 --- a/dll/hd3d9.cpp +++ b/dll/hd3d9.cpp @@ -27,15 +27,16 @@ void D3D9TextureHandling(void *arg, int Level) IDirect3DSurface9 *pSurfaceLevel; D3DSURFACE_DESC Desc; D3DLOCKED_RECT LockedRect; + //OutTrace("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level); if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; } + pSurfaceLevel->Release(); if(res=lpd3dtex->GetLevelDesc(Level, &Desc)){ OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; } - pSurfaceLevel->Release(); switch(Desc.Type){ case D3DRTYPE_SURFACE: case D3DRTYPE_TEXTURE: diff --git a/dll/syslibs.h b/dll/syslibs.h index 75ec488..1dfd764 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -355,7 +355,8 @@ DXWEXTERN CoUninitialize_Type pCoUninitialize DXWINITIALIZED; // user32.dll: DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; -DXWEXTERN CallWindowProc_Type pCallWindowProc DXWINITIALIZED; +DXWEXTERN CallWindowProc_Type pCallWindowProcA DXWINITIALIZED; +DXWEXTERN CallWindowProc_Type pCallWindowProcW DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsA_Type pChangeDisplaySettingsA DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsExA_Type pChangeDisplaySettingsExA DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsW_Type pChangeDisplaySettingsW DXWINITIALIZED; @@ -466,15 +467,12 @@ extern BOOL WINAPI extImmGetOpenStatus(HIMC); 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 extDDCreateCompatibleDC(HDC); extern HDC WINAPI extGDICreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); -extern HDC WINAPI extDDCreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); extern HFONT WINAPI extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*); extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *); extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); extern BOOL WINAPI extGDIDeleteDC(HDC); -extern BOOL WINAPI extDDDeleteDC(HDC); extern int WINAPI extGetClipBox(HDC, LPRECT); extern int WINAPI extGetRgnBox(HRGN, LPRECT); extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA); @@ -483,7 +481,6 @@ extern BOOL WINAPI extGetDeviceGammaRamp(HDC, LPVOID); extern UINT WINAPI extGetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); extern BOOL WINAPI extGDIPatBlt(HDC, int, int, int, int, DWORD); extern BOOL WINAPI extPolyline(HDC, const POINT *, int); -extern BOOL WINAPI extDDBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); extern UINT WINAPI extRealizePalette(HDC); extern BOOL WINAPI extRectangle(HDC, int, int, int, int); extern BOOL WINAPI extGDIRestoreDC(HDC, int); @@ -493,7 +490,6 @@ extern HPALETTE WINAPI extSelectPalette(HDC, HPALETTE, BOOL); extern BOOL WINAPI extSetDeviceGammaRamp(HDC, LPVOID); extern BOOL WINAPI extGDIStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); extern int WINAPI extStretchDIBits(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD); -extern BOOL WINAPI extDDStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); extern BOOL WINAPI extTextOutA(HDC, int, int, LPCTSTR, int); extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD); extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD); @@ -571,8 +567,8 @@ extern void STDAPICALLTYPE extCoUninitialize(void); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); -extern HDC WINAPI extDDBeginPaint(HWND, LPPAINTSTRUCT); -extern LRESULT WINAPI extCallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extCallWindowProcA(WNDPROC, HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extCallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM); extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD); extern LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID); extern LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *, DWORD); @@ -588,7 +584,6 @@ extern LRESULT WINAPI extDefWindowProcW(HWND, UINT, WPARAM, LPARAM); extern int WINAPI extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT); extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); -extern BOOL WINAPI extDDEndPaint(HWND, const PAINTSTRUCT *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH); extern int WINAPI extFrameRect(HDC, const RECT *, HBRUSH); @@ -597,7 +592,6 @@ extern BOOL WINAPI extGetClipCursor(LPRECT); extern BOOL WINAPI extGetCursorPos(LPPOINT); extern HDC WINAPI extGDIGetDC(HWND); extern HDC WINAPI extEMUGetDC(HWND); -extern HDC WINAPI extDDGetDC(HWND); extern HWND WINAPI extGetDesktopWindow(void); extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO); extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO); @@ -605,12 +599,10 @@ extern int WINAPI extGetSystemMetrics(int); extern HWND WINAPI extGetTopWindow(HWND); extern int WINAPI extGetUpdateRgn(HWND, HRGN, BOOL); extern HDC WINAPI extGDIGetWindowDC(HWND); -extern HDC WINAPI extDDGetWindowDC(HWND); extern LONG WINAPI extGetWindowLongA(HWND, int); extern LONG WINAPI extGetWindowLongW(HWND, int); extern BOOL WINAPI extGetWindowRect(HWND, LPRECT); extern BOOL WINAPI extInvalidateRect(HWND, RECT *, BOOL); -//extern BOOL WINAPI extDDInvalidateRect(HWND, RECT *, BOOL); extern int WINAPI extMapWindowPoints(HWND, HWND, LPPOINT, UINT); extern BOOL WINAPI extMoveWindow(HWND, int, int, int, int, BOOL); extern BOOL WINAPI extPeekMessage(LPMSG, HWND, UINT, UINT, UINT); @@ -618,7 +610,6 @@ extern BOOL WINAPI extRedrawWindow(HWND, const RECT *, HRGN, UINT); extern ATOM WINAPI extRegisterClassExA(WNDCLASSEXA *); extern ATOM WINAPI extRegisterClassA(WNDCLASSA *); extern int WINAPI extGDIReleaseDC(HWND, HDC); -extern int WINAPI extDDReleaseDC(HWND, HDC); extern BOOL WINAPI extScreenToClient(HWND, LPPOINT); extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extSendMessageW(HWND, UINT, WPARAM, LPARAM); @@ -635,7 +626,6 @@ extern BOOL WINAPI extDestroyWindow(HWND); extern BOOL WINAPI extCloseWindow(HWND); extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *); extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD); -extern HDC WINAPI extDDGetDCEx(HWND, HRGN, DWORD); extern BOOL WINAPI extUpdateWindow(HWND); extern BOOL WINAPI extGetWindowPlacement(HWND, WINDOWPLACEMENT *); extern BOOL WINAPI extSetWindowPlacement(HWND, WINDOWPLACEMENT *); diff --git a/dll/user32.cpp b/dll/user32.cpp index f045db9..108e228 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -17,7 +17,6 @@ BOOL IsChangeDisplaySettingsHotPatched = FALSE; #define GDIMODE_STRETCHED 0 #define GDIMODE_EMULATED 1 -#define GDIMODE_DIRECTDRAW 2 int GDIEmulationMode = 0; //typedef BOOL (WINAPI *ValidateRect_Type)(HWND, const RECT *); @@ -154,18 +153,6 @@ static HookEntry_Type ScaledHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type DDHooks[]={ - {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint}, - //{HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, - {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint}, - {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx}, - {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC}, - {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type RemapHooks[]={ {HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient}, {HOOK_IAT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen}, @@ -198,7 +185,8 @@ static HookEntry_Type WinHooks[]={ {HOOK_HOT_CANDIDATE, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow}, {HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos}, {HOOK_HOT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos}, - {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProc, (FARPROC)extCallWindowProc}, + {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProcA, (FARPROC)extCallWindowProcA}, + {HOOK_HOT_CANDIDATE, "CallWindowProcW", (FARPROC)CallWindowProcW, (FARPROC *)&pCallWindowProcW, (FARPROC)extCallWindowProcW}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -221,8 +209,7 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) if (addr=RemapLibrary(proc, hModule, DDHooks)) return addr; - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC) && !(dxw.dwFlags1 & MAPGDITOPRIMARY)) + if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr; if (dxw.dwFlags1 & MODIFYMOUSE) if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr; @@ -245,14 +232,12 @@ void HookUser32(HMODULE hModule) GDIEmulationMode = GDIMODE_STRETCHED; // default if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) GDIEmulationMode = GDIMODE_DIRECTDRAW; HookLibrary(hModule, Hooks, libname); - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC) && !(dxw.dwFlags1 & MAPGDITOPRIMARY)) + if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) HookLibrary(hModule, NoGDIHooks, libname); if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, libname); - if (dxw.dwFlags1 & MAPGDITOPRIMARY) HookLibrary(hModule, DDHooks, libname); if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname); if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname); @@ -268,7 +253,8 @@ void HookUser32(HMODULE hModule) void HookUser32Init() { HookLibInit(Hooks); - HookLibInit(DDHooks); + HookLibInit(ScaledHooks); + HookLibInit(EmulateHooks); HookLibInit(RemapHooks); HookLibInit(MouseHooks); HookLibInit(WinHooks); @@ -631,7 +617,7 @@ LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, H if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){ WNDPROC wp; - wp=WinDBGetProc(hwnd); + wp=dxwws.GetProc(hwnd); OutTraceDW("%s: remapping WindowProc res=%x -> %x\n", ApiName, res, (LONG)wp); if(wp) res=(LONG)wp; // if not found, don't alter the value. } @@ -709,8 +695,8 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon if((OldProc==extWindowProc) || (OldProc==extChildWindowProc)|| (OldProc==extDialogWindowProc)) - OldProc=WinDBGetProc(hwnd); - WinDBPutProc(hwnd, (WNDPROC)dwNewLong); + OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); res=(LONG)OldProc; SetLastError(0); lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc); @@ -1089,7 +1075,7 @@ BOOL WINAPI extGetClientRect(HWND hwnd, LPRECT lpRect) if (dxw.IsFullScreen()){ int w, h; if(FIXCHILDSIZE){ - if(WinDBGetSize(hwnd, &w, &h)){ + if(dxwws.GetSize(hwnd, &w, &h)){ lpRect->top=lpRect->left=0; lpRect->right=w; lpRect->bottom=h; @@ -1275,7 +1261,7 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) { // child window inherit the father's windproc, so if it's redirected to // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve - // the correct value (WinDBGetProc) before saving it (WinDBPutProc). + // the correct value (dxwws.GetProc) before saving it (dxwws.PutProc). long res; WNDPROC pWindowProc; @@ -1286,13 +1272,13 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) HWND Father; WNDPROC pFatherProc; Father=GetParent(hwnd); - pFatherProc=WinDBGetProc(Father); + pFatherProc=dxwws.GetProc(Father); OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName, (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"), Father, pFatherProc); pWindowProc = pFatherProc; } - WinDBPutProc(hwnd, pWindowProc); + dxwws.PutProc(hwnd, pWindowProc); if(dwStyle & WS_CHILD){ OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc); res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); @@ -1502,7 +1488,7 @@ static HWND WINAPI extCreateWindowCommon( HookChildWndProc(hwnd, dwStyle, ApiName); if ((FIXCHILDSIZE) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) - WinDBPutSize(hwnd, iOrigW, iOrigH); + dxwws.PutSize(hwnd, iOrigW, iOrigH); // "Hoyle Casino Empire" needs to be in a maximized state to continue after the intro movie. // Sending a SW_MAXIMIZE message intercepted by the PREVENTMAXIMIZE handling fixes the problem. @@ -1606,16 +1592,30 @@ HWND WINAPI extCreateWindowExA( return extCreateWindowCommon("CreateWindowExA", FALSE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); } -LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +LRESULT WINAPI extCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! HRESULT res; res = -1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProc", hwnd, Msg, wParam, &lParam); + if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcA", hwnd, Msg, wParam, &lParam); if (res==(HRESULT)-1) - return (*pCallWindowProc)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); + return (*pCallWindowProcA)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); + else + return res; +} + +LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + // v2.02.30: fix (Imperialism II): apply to main window only !!! + HRESULT res; + + res = -1; + if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcW", hwnd, Msg, wParam, &lParam); + + if (res==(HRESULT)-1) + return (*pCallWindowProcW)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); else return res; } @@ -1910,16 +1910,9 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) if(bFlippedDC) { extern HDC hFlippedDC; LPDIRECTDRAWSURFACE lpDDSPrim; - lpDDSPrim = dxw.GetPrimarySurface(); -#if 0 - // v2.03.20: beware, from this release the output from dxw.GetPrimarySurface() could be a - // zero reference counter released surface that could be used to feed a QueryInterface method, - // but would crash if used otherwise. - __try {(*pGetDC)(lpDDSPrim, &hFlippedDC);} __except(EXCEPTION_EXECUTE_HANDLER){hFlippedDC=NULL;}; -#else + lpDDSPrim = dxwss.GetPrimarySurface(); if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC); -#endif - OutTraceDW("%s: remapping flipped GDI hdc=%x\n", ApiName, hFlippedDC); + OutTraceDW("%s: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", ApiName, lpDDSPrim, hFlippedDC); if(hFlippedDC) return hFlippedDC; } #endif @@ -1932,8 +1925,6 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) ret=dxw.AcquireEmulatedDC(lochwnd); dxw.VirtualHDC=ret; break; - case GDIMODE_DIRECTDRAW: - break; } if(ret){ @@ -1996,7 +1987,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) if(bFlippedDC && (hDC == hFlippedDC)) { HRESULT ret; OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC); - ret=(*pReleaseDC)(dxw.GetPrimarySurface(), hDC); + ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC); if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__); else dxw.ScreenRefresh(); return (ret == DD_OK); @@ -2013,8 +2004,6 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) res=dxw.ReleaseEmulatedDC(hwnd); res=(*pGDIReleaseDC)(hwnd, windc); break; - case GDIMODE_DIRECTDRAW: - break; } if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); @@ -2047,15 +2036,6 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) lpPaint->hdc=EmuHDC; hdc = EmuHDC; break; - case GDIMODE_DIRECTDRAW: - (*pGDIReleaseDC)(hwnd, lpPaint->hdc); - (*pGetDC)(dxw.lpDDSPrimary,&PrimHDC); - lpPaint->hdc=PrimHDC; - // resize the paint area to virtual screen size (see CivIII clipped panels...) - lpPaint->rcPaint=dxw.GetScreenRect(); - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, PrimHDC); - hdc = PrimHDC; - break; } OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n", @@ -2063,53 +2043,6 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) return hdc; } -HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) -{ - HDC hdc; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.BeginPaint: hwnd=%x%s lpPaint=%x FullScreen=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, dxw.IsFullScreen()); - - if(dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd(); - - hdc=(*pBeginPaint)(hwnd, lpPaint); - - // if not in fullscreen mode, that's all! - if(!dxw.IsFullScreen()) return hdc; - - // on MAPGDITOPRIMARY, return the PrimHDC handle instead of the window DC - // if a primary surface has not been created yet, do it - if(!pGetDC || !dxw.lpDDSPrimary){ - extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); - HRESULT res; - LPDIRECTDRAW lpDD; - LPDIRECTDRAWSURFACE lpDDS; - DDSURFACEDESC ddsd; - res=extDirectDrawCreate(0, &lpDD, NULL); - //res=extDirectDrawCreate((GUID *)&IID_IDirectDraw, &lpDD, NULL); - lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); - //lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_NORMAL); - memset((void *)&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.dwWidth = dxw.GetScreenWidth(); - res=lpDD->CreateSurface(&ddsd, &lpDDS, NULL); - dxw.lpDDSPrimary = lpDDS; - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): dd=%x ddsPrim=%x\n", lpDD, lpDDS); - } - - extGetDC(dxw.lpDDSPrimary,&PrimHDC); - lpPaint->hdc=PrimHDC; - // resize the paint area to virtual screen size (see CivIII clipped panels...) - lpPaint->rcPaint=dxw.GetScreenRect(); - - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, PrimHDC); - return PrimHDC; -} - BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) { BOOL ret; @@ -2133,8 +2066,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) case GDIMODE_EMULATED: ret=dxw.ReleaseEmulatedDC(hwnd); break; - case GDIMODE_DIRECTDRAW: - break; } if(ret) @@ -2145,54 +2076,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) return ret; } -BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) -{ - BOOL ret; - extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc); - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - extern HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx); - - OutTraceDW("GDI.EndPaint(DD): hwnd=%x%s lpPaint=%x lpPaint.hdc=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, lpPaint->hdc); - - // v2.02.53 ... - //if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ - if(dxw.IsFullScreen()){ - RECT Rect; - LPRECT lpRect; - ret=(*pEndPaint)(hwnd, lpPaint); - dxw.lpDDSPrimary->Unlock(NULL); - //dxw.ScreenRefresh(); - if(dxw.IsDesktop(hwnd)) - lpRect=NULL; - else{ -#if 1 - POINT p={0,0}; - lpRect=&Rect; - (*pGetClientRect)(hwnd, lpRect); - p=dxw.ClientOffset(hwnd); - lpRect->left += p.x; - lpRect->right += p.x; - lpRect->top += p.y; - lpRect->bottom += p.y; - //dxw.AddCoordinates(lpRect, p); - dxw.UnmapClient(lpRect); -#else - lpRect=&Rect; - Rect = dxw.MapClientRect(lpRect); -#endif - } - extBlt(dxw.lpDDSPrimary, lpRect, dxw.lpDDSPrimary, NULL, 0, NULL); - return TRUE; - } - - // proxy part ... - ret=(*pEndPaint)(hwnd, lpPaint); - OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); - if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} - HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { HWND RetHWND; @@ -2204,7 +2087,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT // v2.02.73: redirect lpDialogFunc only when it is nor NULL if(lpDialogFunc) { - WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); + dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -2226,7 +2109,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally" if(lpDialogFunc) { - WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); + dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index c6fff39b5c7d2db9888cc1d3423fb787c57cf89a..85265e4e1766c8eb635e85e57e0f03c8a4f4b462 100644 GIT binary patch delta 3390 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 GbOHc&Rv%LU delta 28 kcmZqaX1mkDwxQ+Q<`v(MF;9LFpftUpl96TejNflM0o7g(>Hq)$ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 8d76bf37c5b248b8835a45da789be3e82dc85b54..5652e3843a96e7d7a544409b400f465e32b1c7cc 100644 GIT binary patch delta 2836 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 delta 3753 zcmd5#flb#p69>;lJ2xAUBPec^dlMti~v4&8l%{UoK)mUqUGEN&) z5>H|}#$rZUbC03uoYs-3O9a1e&+EhpVy*K1n1E~bg$io0M5FOJ))&xzFlH0@m) zeV?G(<@YiZ|2Et^qU3Js=R~FV%k3mf58qArlCgK<#NgD|;Ba_T;%y%NFop`jEOuHP z`ZZdXoJS294;t#C-K=7xuu%>>UXA2jW5OH2T86hBh89YdQp2 zF2N!!LErwp41>2IDZC+A55o6qneeCE!}k3*^jLq1*@dwoDO~sNMi9Y+sn|3REST#6 z>*z~|Zt`Wy&Dvj;y4p0&AA5?&tFS_*DYDnCnaOb2H~u5q?5gPk4#2flx`PB2*Ki8=>=B&8(?{7^~iH zy1z}hj^AT&4mxlehbQ0}xroDg8`j2Cma((6SOzfil;K@H@-o z;kTd^u=6`$6OO73S=0cn3qOOt6{xDMzq0=u*?hnsUG z%YhDMvLu7kHglm`<;LQ~=B*nWsik%wBK41~XwG-)MGjsru} zAHXUvv_dXm$O~liQ?O3>AE#ALLIj{&Olg{lj-zDp_|wpj9Rd}ISg1f7h; zGY6m}g0;eusNGCd1xUkqikIaMl=?%z4a9|C6`6w zM0?{(j9JD8vCB)Ae4z|nm{r17qD%3;@&ZuK=-v;rSz?2 zZA5r3q)jk=@r&#@6Gb5#_7;OhnX*l}DjL@rkD!c;%| zOYLdH6U% zwTXwxAoWiX9-APiM@Q3H6CSc-u{4L3o>> zUK>`W_C09TaX)4IKK2@D_)#$|!_X}-$me5uGsE6LLqb4OV)NR0Phb+KT^P?@`Vpe| ztqHp|o)??Mo0b{(PK*+qk1iS?~ity$(nXFHtH|!a;%0UU$E)eflags2 |= GDISTRETCHED; break; case 2: t->flags3 |= GDIEMULATEDC; break; - case 3: t->flags |= MAPGDITOPRIMARY; break; + //case 3: t->flags |= MAPGDITOPRIMARY; break; } switch(dlg->m_ResTypes){ @@ -428,7 +428,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DCEmulationMode = 0; if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; - if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; + //if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; dlg->m_ResTypes = 0; if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0; diff --git a/host/resource b/host/resource index 81ac5e80c0946cc08ada8a40563baecbbc778544..758d0259e4bf926322732c9f9beed6d96d9ab236 100644 GIT binary patch delta 91 zcmbQ!$8@EiX~VP#*-(aH23H0bAa-L2XYge31G4>rtN?}}2LH*4meP|iFtSXZ)h03d t0uRULX%QPZCx75$nLH^`jL~RvV1(*st)wEA$suN9ljpUHOg`2Y1^~7J9O?i7 delta 31 ncmcc8&orlxX~VRL&7UGRaBlvW6s9t{B0_BPhBlGOb?spQ^k5FR