1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_22_src

Former-commit-id: 96d72e2886d6e4e1bb8957d27c127aab6064cde4
This commit is contained in:
gho tik 2015-05-23 12:40:49 -04:00 committed by Refael ACkermann
parent d3dab9deb9
commit f386bd1d35
32 changed files with 607 additions and 876 deletions

View File

@ -310,11 +310,6 @@ LRESULT CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM);
#define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG) #define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG)
#define STEP OutTrace("STEP at %s:%d\n", __FILE__, __LINE__) #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 { typedef enum {
DXW_SET_COORDINATES = 0, DXW_SET_COORDINATES = 0,
DXW_DESKTOP_CENTER, DXW_DESKTOP_CENTER,

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:95762cfc50b158119d3bcb3d7a613dd13ae5abc3555c4c8153d9560bdafad4e6 oid sha256:685801c38436f785e2d29010e560c7eb98e07adb83ae0bf0593f089a2d2ed043
size 577536 size 572928

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c1bb172dc721bb8db528e064c3bc6acb78a0107c298e11368d28b36bb636dae6 oid sha256:ea58d479ffbb81c24c0282a35b7e8203848d66799bf047ad7d662e4fc53d0470
size 539648 size 539648

View File

@ -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

31
build/exports/Outwars.dxw Normal file
View File

@ -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

5
build/exports/dxwnd.ini Normal file
View File

@ -0,0 +1,5 @@
[window]
posx=1477
posy=150
sizx=320
sizy=749

View File

@ -805,4 +805,11 @@ fix: fully revised ddraw surface handling in d3d1-7 versions. Now "Might & Magic
v2.03.21: v2.03.21:
fix: full re-design of ddraw "special" surface management (primary & backbuffer): greater compatibility for emulation mode 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 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

View File

@ -204,6 +204,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect)
case D3DFMT_X1R5G5B5: case D3DFMT_X1R5G5B5:
case D3DFMT_A1R5G5B5: case D3DFMT_A1R5G5B5:
case D3DFMT_A8: case D3DFMT_A8:
case D3DFMT_L8:
hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height); hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height);
break; break;
case D3DFMT_DXT1: case D3DFMT_DXT1:
@ -274,6 +275,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect)
case D3DFMT_DXT4: case D3DFMT_DXT4:
case D3DFMT_DXT5: case D3DFMT_DXT5:
case D3DFMT_A8: case D3DFMT_A8:
case D3DFMT_L8:
pbi.bV4BitCount = 32; pbi.bV4BitCount = 32;
pbi.bV4RedMask = 0x00FF0000; pbi.bV4RedMask = 0x00FF0000;
pbi.bV4GreenMask = 0x0000FF00; pbi.bV4GreenMask = 0x0000FF00;
@ -343,6 +345,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect)
} }
break; break;
case D3DFMT_A8: case D3DFMT_A8:
case D3DFMT_L8:
{ {
// Copy the array of color indices into the .BMP file. // Copy the array of color indices into the .BMP file.
BYTE *p = (BYTE *)LockedRect.pBits; BYTE *p = (BYTE *)LockedRect.pBits;

View File

@ -34,7 +34,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
//extern PrimaryBlt_Type pPrimaryBlt; //extern PrimaryBlt_Type pPrimaryBlt;
//CkArg arg; //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 // make a working copy of srcrect if not NULL
if (lpsrcrect){ 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. // In "The Sims" there is no quality loss, but some scrolling artifact.
if(lpsrcrect && FromScreen){ if(lpsrcrect && FromScreen){
LPDIRECTDRAWSURFACE lpDDSBack; LPDIRECTDRAWSURFACE lpDDSBack;
lpDDSBack = dxw.GetBackBufferSurface(); lpDDSBack = dxwss.GetBackBufferSurface();
if(lpDDSBack && (dxw.dwFlags1 & BLITFROMBACKBUFFER)){ if(lpDDSBack && (dxw.dwFlags1 & BLITFROMBACKBUFFER)){
lpddssrc=lpDDSBack; lpddssrc=lpDDSBack;
srcrect=dxw.GetScreenRect(); srcrect=dxw.GetScreenRect();
@ -154,7 +154,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
if (isFlipping){ if (isFlipping){
// handle the flipping chain ... // handle the flipping chain ...
//lpddssrc=lpDDSBack; //lpddssrc=lpDDSBack;
lpddssrc = dxw.GetBackBufferSurface(); lpddssrc = dxwss.GetBackBufferSurface();
OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc); 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); ToPrim=dxwss.IsAPrimarySurface(lpdds);
FromPrim=dxw.IsAPrimarySurface(lpddssrc); FromPrim=dxwss.IsAPrimarySurface(lpddssrc);
ToScreen=ToPrim && !(dxw.dwFlags1 & EMULATESURFACE); ToScreen=ToPrim && !(dxw.dwFlags1 & EMULATESURFACE);
FromScreen=FromPrim && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 FromScreen=FromPrim && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77

View File

@ -260,9 +260,6 @@ LPDIRECTDRAWPALETTE lpDDP=NULL;
// v2.02.37: globals to store requested main surface capabilities // v2.02.37: globals to store requested main surface capabilities
DDSURFACEDESC2 DDSD_Prim; DDSURFACEDESC2 DDSD_Prim;
DDSURFACEDESC2 DDSD_Back;
DDSURFACEDESC2 DDSD_ZBuffer;
DWORD DDZBufferCaps; DWORD DDZBufferCaps;
DWORD PaletteEntries[256]; DWORD PaletteEntries[256];
DWORD *Palette16BPP = NULL; DWORD *Palette16BPP = NULL;
@ -1786,10 +1783,10 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp)
unsigned int dwLocalDDVersion; unsigned int dwLocalDDVersion;
unsigned int dwLocalTexVersion; unsigned int dwLocalTexVersion;
IsPrim=dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds);
IsBack=dxw.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds);
OutTraceDDRAW("QueryInterface(S): lpdds=%x%s REFIID=%x(%s)\n", 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; 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!! // 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); res = (*pQueryInterfaceS)(lpdds, riid, obp);
@ -1879,12 +1876,12 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp)
dxw.dwDDVersion=dwLocalDDVersion; dxw.dwDDVersion=dwLocalDDVersion;
if(IsPrim){ if(IsPrim){
OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); 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); HookDDSurfacePrim((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion);
} }
else{ else{
if(IsBack) dxw.MarkBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); if(IsBack) dxwss.PushBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion);
else dxw.MarkRegularSurface((LPDIRECTDRAWSURFACE)*obp); else dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp);
// v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition?
HookDDSurfaceGeneric((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); 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); OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim);
if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__);
InitDSScreenParameters(lpDDSEmu_Prim); 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! // 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. // better avoid it or hook just useful methods.
//if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); //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); OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back);
if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); 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); if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion);
} }
bFlippedDC = TRUE; bFlippedDC = TRUE;
return DD_OK; return DD_OK;
} }
@ -2334,7 +2331,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
if(dxw.dwFlags1 & EMULATEBUFFER){ if(dxw.dwFlags1 & EMULATEBUFFER){
lpDDSEmu_Prim = *lplpdds; lpDDSEmu_Prim = *lplpdds;
dxw.MarkRegularSurface(lpDDSEmu_Prim); dxwss.PopSurface(lpDDSEmu_Prim);
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
// warning: can't create zero sized backbuffer surface !!!! // 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_Back) while(lpDDSEmu_Back->Release());
if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release());
if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!!
lpDDSBack = dxw.GetBackBufferSurface(); lpDDSBack = dxwss.GetBackBufferSurface();
if (lpDDSBack) { if (lpDDSBack) {
while(lpDDSBack->Release()); while(lpDDSBack->Release());
dxw.MarkRegularSurface(lpDDSBack); dxwss.PopSurface(lpDDSBack);
lpDDSBack = NULL; lpDDSBack = NULL;
} }
} }
@ -2630,14 +2627,14 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL);
if(res) return res; if(res) return res;
lpDDSPrim = *lplpdds; lpDDSPrim = *lplpdds;
dxw.MarkPrimarySurface(lpDDSPrim, dxversion); dxwss.PushPrimarySurface(lpDDSPrim, dxversion);
RegisterPixelFormat(lpDDSPrim); RegisterPixelFormat(lpDDSPrim);
if (BBCount){ if (BBCount){
// build emulated backbuffer surface // build emulated backbuffer surface
res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL);
if(res) return res; if(res) return res;
dxw.MarkBackBufferSurface(lpDDSBack, dxversion); dxwss.PushBackBufferSurface(lpDDSBack, dxversion);
// V2.1.85/V2.2.34: tricky !!!! // V2.1.85/V2.2.34: tricky !!!!
// When a real backbuffer is created, it has a reference to its frontbuffer. // 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); 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; return res;
} }
@ -2686,7 +2683,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu);
if(!res) { if(!res) {
dxw.MarkRegularSurface(*lplpdds); dxwss.PopSurface(*lplpdds);
if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) {
lpDDZBuffer=*lplpdds; lpDDZBuffer=*lplpdds;
DDZBufferCaps = lpddsd->ddsCaps.dwCaps; DDZBufferCaps = lpddsd->ddsCaps.dwCaps;
@ -2727,8 +2724,8 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
BOOL IsPrim; BOOL IsPrim;
BOOL IsBack; BOOL IsBack;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n",
dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); 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 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 // 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. // backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface.
LPDIRECTDRAWSURFACE lpddsback = dxw.GetBackBufferSurface(); LPDIRECTDRAWSURFACE lpddsback = dxwss.GetBackBufferSurface();
if (lpddsback) { if (lpddsback) {
*lplpddas = lpddsback; *lplpddas = lpddsback;
OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas);
@ -3137,7 +3134,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc,
LPDIRECTDRAWSURFACE lpddsTmp; LPDIRECTDRAWSURFACE lpddsTmp;
LPDIRECTDRAWSURFACE lpDDSBack; LPDIRECTDRAWSURFACE lpDDSBack;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n",
lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); 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); if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0);
lpDDSBack = dxw.GetBackBufferSurface(); lpDDSBack = dxwss.GetBackBufferSurface();
if(dxw.dwFlags4 & NOFLIPEMULATION){ if(dxw.dwFlags4 & NOFLIPEMULATION){
HRESULT res2; HRESULT res2;
@ -3260,7 +3257,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc,
HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx)
{ {
if ((dxw.dwFlags2 & FULLRECTBLT) && dxw.IsAPrimarySurface(lpdds)){ if ((dxw.dwFlags2 & FULLRECTBLT) && dxwss.IsAPrimarySurface(lpdds)){
lpsrcrect=NULL; lpsrcrect=NULL;
lpdestrect=NULL; lpdestrect=NULL;
} }
@ -3281,8 +3278,8 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy,
HRESULT ret; HRESULT ret;
BOOL ToPrim, FromPrim; BOOL ToPrim, FromPrim;
ToPrim=dxw.IsAPrimarySurface(lpdds); ToPrim=dxwss.IsAPrimarySurface(lpdds);
FromPrim=dxw.IsAPrimarySurface(lpddssrc); FromPrim=dxwss.IsAPrimarySurface(lpddssrc);
CleanRect(&lpsrcrect,__LINE__); CleanRect(&lpsrcrect,__LINE__);
@ -3381,8 +3378,8 @@ HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lpl
HRESULT res; HRESULT res;
BOOL isPrim, isBack; BOOL isPrim, isBack;
isPrim=dxw.IsAPrimarySurface(lpdds); isPrim=dxwss.IsAPrimarySurface(lpdds);
isBack=dxw.IsABackBufferSurface(lpdds); isBack=dxwss.IsABackBufferSurface(lpdds);
OutTraceDDRAW("GetPalette: lpdds=%x%s%s\n", lpdds, isPrim?"(PRIM)":"", isBack?"(BACK)":""); OutTraceDDRAW("GetPalette: lpdds=%x%s%s\n", lpdds, isPrim?"(PRIM)":"", isBack?"(BACK)":"");
res=(*pGetPalette)(lpdds, lplpddp); res=(*pGetPalette)(lpdds, lplpddp);
@ -3407,7 +3404,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd
BOOL isPrim; BOOL isPrim;
HRESULT res; HRESULT res;
isPrim=dxw.IsAPrimarySurface(lpdds); isPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp);
res=(*pSetPalette)(lpdds, 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 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", ... // 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){ if (lpDDSBack){
OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack); OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack);
res=(*pSetPalette)(lpDDSBack, lpddp); res=(*pSetPalette)(lpDDSBack, lpddp);
@ -3477,7 +3474,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd
{ {
HRESULT res; HRESULT res;
BOOL isPrim; BOOL isPrim;
isPrim=dxw.IsAPrimarySurface(lpdds); isPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc);
// v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous // 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(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){
if ((isPrim && lpDDSEmu_Prim) || if ((isPrim && lpDDSEmu_Prim) ||
(dxw.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ (dxwss.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){
OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds);
res=0; res=0;
} }
@ -3509,7 +3506,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC
CleanRect(&lprect, __LINE__); CleanRect(&lprect, __LINE__);
if(IsTraceDDRAW){ if(IsTraceDDRAW){
BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds);
char sRect[81]; char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)"); 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); // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim);
if(IsTraceDDRAW){ if(IsTraceDDRAW){
BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds);
char sRect[81]; char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)"); else strcpy(sRect, "(NULL)");
@ -3622,8 +3619,8 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC
BOOL IsBack; BOOL IsBack;
RECT rect; RECT rect;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
if(IsTraceDDRAW){ if(IsTraceDDRAW){
char sRect[81]; char sRect[81];
@ -3682,7 +3679,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR
BOOL IsPrim; BOOL IsPrim;
LPDIRECTDRAWSURFACE lpDDSPrim; LPDIRECTDRAWSURFACE lpDDSPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__);
@ -3742,7 +3739,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC)
HRESULT res; HRESULT res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":"");
res=(*pGetDC)(lpdds, pHDC); res=(*pGetDC)(lpdds, pHDC);
@ -3778,7 +3775,7 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc)
HRESULT res; HRESULT res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc);
res=(*pReleaseDC)(lpdds, hdc); res=(*pReleaseDC)(lpdds, hdc);
if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); 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: // v2.02.31:
// in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one. // in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one.
if(dxw.dwFlags1 & EMULATESURFACE){ if(dxw.dwFlags1 & EMULATESURFACE){
*w=dxw.GetPrimarySurface(); *w=dxwss.GetPrimarySurface();
OutTraceDW("GetGDISurface: EMULATED lpdd=%x w=%x\n", lpdd, *w); OutTraceDW("GetGDISurface: EMULATED lpdd=%x w=%x\n", lpdd, *w);
return DD_OK; return DD_OK;
} }
@ -4067,7 +4064,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p)
DWORD res; DWORD res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); OutTraceDDRAW("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":"");
res=(*pGetPixelFormat)(lpdds, p); res=(*pGetPixelFormat)(lpdds, p);
if(res){ if(res){
@ -4112,17 +4109,17 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds)
BOOL IsPrim; BOOL IsPrim;
BOOL IsBack; BOOL IsBack;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
res = (*pReleaseS)(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 if (res==0) { // common precondition
// erase surface from primary or backbuffer list // 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, // 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. // 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 // when releasing primary surface, erase clipping region
if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor();
@ -4137,10 +4134,6 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds)
OutTraceDW("Release(S): Clearing lpDDSEmu_Back pointer\n"); OutTraceDW("Release(S): Clearing lpDDSEmu_Back pointer\n");
lpDDSEmu_Back=NULL; 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; HRESULT res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
if(IsTraceDDRAW){ if(IsTraceDDRAW){
char sInfo[81]; char sInfo[81];
if (lpDDColorKey) sprintf(sInfo, "(L:%x,H:%x)",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); 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; HRESULT res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n",
lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags));
res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); res=(*pGetColorKey)(lpdds, flags, lpDDColorKey);
@ -4188,7 +4181,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte
HRESULT res; HRESULT res;
BOOL IsPrim; BOOL IsPrim;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n",
lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback);
@ -4203,7 +4196,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte
res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback);
if (res) if (res)
OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); 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); ddsd.dwSize=Set_dwSize_From_Surface(lpDDSBack);
res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
if(res){ if(res){
@ -4235,8 +4228,8 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF
// just remember this for further handling in the Flip operation. // 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! // But beware: this holds to BACKBUFFER surfaces only, and NOT for attached ZBUFFERS or similar!
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
OutTraceDDRAW("AddAttachedSurface: lpdds=%x%s lpddsadd=%x%s\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), lpddsadd, (lpddsadd==lpDDZBuffer)?"(ZBUF)":""); 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... //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) || if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE) ||
(res==DDERR_NOEXCLUSIVEMODE)) (res==DDERR_NOEXCLUSIVEMODE))
OutTraceDW("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); OutTraceDW("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n");
dxw.MarkBackBufferSurface(lpddsadd, 1); dxwss.PushBackBufferSurface(lpddsadd, 1);
if (pAddRefS) (*pAddRefS)(lpdds); if (pAddRefS) (*pAddRefS)(lpdds);
res=DD_OK; 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); OutTraceDDRAW("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel);
res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel); res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel);
if(res) OutTraceE("DeleteAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); 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); OutTraceDW("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel);
res = DD_OK; res = DD_OK;
} }
@ -4301,8 +4294,8 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA
{ {
HRESULT res; HRESULT res;
BOOL IsPrim, IsBack, IsFixed; BOOL IsPrim, IsBack, IsFixed;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
IsFixed=FALSE; IsFixed=FALSE;
char *sLabel; char *sLabel;
@ -4384,7 +4377,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd)
if(dxw.dwFlags4 & FIXREFCOUNTER){ if(dxw.dwFlags4 & FIXREFCOUNTER){
// v2.02.41: fix the ref counter to sumulate the unwindowed original situation // v2.02.41: fix the ref counter to sumulate the unwindowed original situation
--VirtualRef; // why ???? --VirtualRef; // why ????
if(dxw.GetBackBufferSurface()) --VirtualRef; if(dxwss.GetBackBufferSurface()) --VirtualRef;
if(dxw.dwFlags1 & EMULATESURFACE){ if(dxw.dwFlags1 & EMULATESURFACE){
if(lpDDSEmu_Prim) --VirtualRef; if(lpDDSEmu_Prim) --VirtualRef;
if(lpDDSEmu_Back) --VirtualRef; if(lpDDSEmu_Back) --VirtualRef;
@ -4494,8 +4487,8 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR
{ {
HRESULT res; HRESULT res;
BOOL IsPrim, IsBack, IsFixed; BOOL IsPrim, IsBack, IsFixed;
IsPrim=dxw.IsAPrimarySurface(lpdds); IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxw.IsABackBufferSurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds);
IsFixed=FALSE; IsFixed=FALSE;
if (!pGetSurfaceDesc) { if (!pGetSurfaceDesc) {
@ -4699,7 +4692,7 @@ HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG
HRESULT ret; HRESULT ret;
OutTraceDDRAW("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); 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); ret=(*pDDGetGammaRamp)(lpdds, dwFlags, lpgr);
if(ret) { if(ret) {

View File

@ -39,10 +39,10 @@ void DDrawScreenShot()
} }
if(dxw.dwFlags5 & GDIMODE){ if(dxw.dwFlags5 & GDIMODE){
s = dxw.GetBackBufferSurface(); s = dxwss.GetBackBufferSurface();
} }
else{ else{
s = dxw.GetPrimarySurface(); s = dxwss.GetPrimarySurface();
} }
if(!s) return; if(!s) return;

View File

@ -42,6 +42,7 @@ unsigned int HashSurface(BYTE *buf, int pitch, int width, int height)
int pixelsize; int pixelsize;
DWORD hash = 0; DWORD hash = 0;
// integer divide, intentionally throwing reminder away // integer divide, intentionally throwing reminder away
if (width == 0) return 0; // avoid DivBy0 error
pixelsize = pitch / width; pixelsize = pitch / width;
for(int y = 0; y < height; y++){ for(int y = 0; y < height; y++){
BYTE *p = buf + (y * pitch); 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__); OutTraceE("TextureHigh: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return; 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", OutTrace("TextureHigh: lpdds=%x BitCount=%d size=(%dx%d)\n",
s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight);
w = ddsd.dwWidth; w = ddsd.dwWidth;
@ -204,7 +205,7 @@ static void TextureDump(LPDIRECTDRAWSURFACE s)
return; 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", OutTrace("TextureDump: lpdds=%x BitCount=%d size=(%dx%d)\n",
s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight);
w = ddsd.dwWidth; w = ddsd.dwWidth;
@ -281,16 +282,8 @@ static void TextureDump(LPDIRECTDRAWSURFACE s)
// Copy the RGBQUAD array into the file. // Copy the RGBQUAD array into the file.
if(pbi.bV4ClrUsed){ 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]; extern DWORD PaletteEntries[256];
fwrite((LPVOID)PaletteEntries, pbi.bV4ClrUsed * sizeof (RGBQUAD), 1, hf); 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. // 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__); OutTraceE("TextureHack: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return; 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", OutTrace("TextureHack: lpdds=%x BitCount=%d size=(%dx%d)\n",
s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight);
w = ddsd.dwWidth; w = ddsd.dwWidth;

View File

@ -25,6 +25,8 @@
#define SKIPIMEWINDOW TRUE #define SKIPIMEWINDOW TRUE
dxwCore dxw; dxwCore dxw;
dxwSStack dxwss;
dxwWStack dxwws;
typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long);
typedef int (*Preparedisasm_Type)(void); typedef int (*Preparedisasm_Type)(void);
@ -594,18 +596,26 @@ void HookWindowProc(HWND hwnd)
{ {
WNDPROC pWindowProc; WNDPROC pWindowProc;
pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
// don't hook twice ....
if ((pWindowProc == extWindowProc) || if ((pWindowProc == extWindowProc) ||
(pWindowProc == extChildWindowProc) || (pWindowProc == extChildWindowProc) ||
(pWindowProc == extDialogWindowProc)){ (pWindowProc == extDialogWindowProc)){
// hooked already !!! // hooked already !!!
OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK already in place\n", hwnd); OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK already in place\n", hwnd);
return;
} }
else {// don't hook twice ....
long lres; // v2.03.22: don't remap WindowProc in case of special address 0xFFFFnnnn.
WinDBPutProc(hwnd, pWindowProc); // This makes "The Hulk demo" work avoiding WindowProc recursion and stack overflow
lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); if (((DWORD)pWindowProc & 0xFFFF0000) == 0xFFFF0000){
OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); 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) void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height)
@ -670,8 +680,8 @@ LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA
t=tn; t=tn;
} }
pWindowProc=WinDBGetProc(hwnd); pWindowProc=dxwws.GetProc(hwnd);
if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n"; char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n";
OutTraceDW(sMsg); OutTraceDW(sMsg);
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); 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 // 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 .... // should never get here ....
OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd); OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd);
return DefWindowProc(hwnd, message, wparam, lparam); 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(); 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", //OutTraceB("WindowProc: pWindowProc=%x extWindowProc=%x message=%x(%s) wparam=%x lparam=%x\n",
// (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam); // (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam);
if(pWindowProc) { if(pWindowProc) {
LRESULT ret; LRESULT ret;
// v2.02.36: use CallWindowProc that handles WinProc handles // 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 // save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling
if(message==WM_NCHITTEST) LastCursorPos=ret; if(message==WM_NCHITTEST) LastCursorPos=ret;
// v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages // v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages

View File

@ -8,12 +8,6 @@
#include "resource.h" #include "resource.h"
#include "d3d9.h" #include "d3d9.h"
#if 1
#define OutTraceSDB OutTrace
#else
#define OutTraceSDB if(0) OutTrace
#endif
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
// Internal function pointers // Internal function pointers
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
@ -36,7 +30,6 @@ static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER, int);
dxwCore::dxwCore() dxwCore::dxwCore()
{ {
// initialization stuff .... // initialization stuff ....
extern void WinDBInit();
FullScreen=FALSE; FullScreen=FALSE;
SethWnd(NULL); SethWnd(NULL);
SetScreenSize(); SetScreenSize();
@ -46,12 +39,9 @@ dxwCore::dxwCore()
bActive = TRUE; bActive = TRUE;
bDInputAbs = 0; bDInputAbs = 0;
TimeShift = 0; TimeShift = 0;
lpDDSPrimary = NULL;
memset(SurfaceDB, 0, sizeof(SurfaceDB));
ResetEmulatedDC(); ResetEmulatedDC();
MustShowOverlay=FALSE; MustShowOverlay=FALSE;
TimerEvent.dwTimerType = TIMER_TYPE_NONE; TimerEvent.dwTimerType = TIMER_TYPE_NONE;
WinDBInit();
// initialization of default vsync emulation array // initialization of default vsync emulation array
iRefreshDelays[0]=16; iRefreshDelays[0]=16;
iRefreshDelays[1]=17; 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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY) && SurfaceDB[i].uRef) iPCount++;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER) && SurfaceDB[i].uRef) iBCount++;
}
if(iPCount > 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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break;
OutTrace("--- SURFACELIST DUMP: i=%d lpssd=%x%s ref=%d vers=%d\n", i,
SurfaceDB[i].lpdds, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion);
}
}
#endif
char *dxwCore::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps)
{
int i;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==ps) return sRole(SurfaceDB[i].uRole);
if (SurfaceDB[i].lpdds==0) break;
}
// this should NEVER happen, but ...
extern LPDIRECTDRAWSURFACE lpDDSEmu_Back, lpDDSEmu_Prim;
if(lpDDSEmu_Back && (ps==lpDDSEmu_Back)) return "(emu.BACK)";
if(lpDDSEmu_Prim && (ps==lpDDSEmu_Prim)) return "(emu.PRIM)";
// ... just in case!
return "";
}
void dxwCore::ClearSurfaceList()
{
#ifdef DXW_SURFACE_STACK_TRACING
OutTrace(">>> SURFACELIST CLEAR ALL\n");
#endif
for (int i=0;i<DDSQLEN;i++) {
SurfaceDB[i].lpdds = NULL;
SurfaceDB[i].uRef = FALSE;
SurfaceDB[i].uRole = 0;
SurfaceDB[i].uVersion = 0;
}
}
void dxwCore::UnrefSurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// look for entry
for (i=0;i<DDSQLEN;i++)
if ((SurfaceDB[i].lpdds==ps) || SurfaceDB[i].lpdds==0) break;
// if found, delete it by left-copying each entry until end of array
if (SurfaceDB[i].lpdds == ps) {
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> 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;i<DDSQLEN;i++) {
e=&SurfaceDB[i];
if ((e->lpdds==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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return;
if (SurfaceDB[i].lpdds==ps) break;
}
// if found, delete it by left-copying each entry until end of array
if (SurfaceDB[i].lpdds==ps){
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> 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<DDSQLEN; i++){
SurfaceDB[i]=SurfaceDB[i+1];
if (SurfaceDB[i].lpdds==0) break;
}
SurfaceDB[DDSQLEN].lpdds=0;
SurfaceDB[DDSQLEN].uRole=0;
SurfaceDB[DDSQLEN].uRef=0;
SurfaceDB[DDSQLEN].uVersion=0;
}
#ifdef DXW_SURFACE_STACK_TRACING
DumpSurfaceList(&SurfaceDB[0]);
#endif
}
// Note: since MS itself declares that the object refcount is not reliable and should
// be used for debugging only, it's not safe to rely on refcount==0 when releasing a
// surface to terminate its classification as primary. As an alternate and more reliable
// way, we use UnmarkPrimarySurface each time you create a new not primary surface,
// eliminating the risk that a surface previously classified as primary and then closed
// had the same surface handle than this new one that is not primary at all.
BOOL dxwCore::IsAPrimarySurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// treat NULL surface ptr as a non primary
if(!ps) return FALSE;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return FALSE;
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY);
}
return FALSE;
}
BOOL dxwCore::IsABackBufferSurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// treat NULL surface ptr as a non primary
if(!ps) return FALSE;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return FALSE;
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER);
}
return FALSE;
}
LPDIRECTDRAWSURFACE dxwCore::GetSurfaceByRole(USHORT role)
{
// Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and
// whith a not null reference counter. In case of multiple choices, it has to
// return the most recent reference!!!
// tested with "101 the Airborne Invasion of Normandy" and "Armored Fist 3"
int i;
LPDIRECTDRAWSURFACE ret = NULL;
#ifdef DXW_SURFACE_STACK_TRACING
if (IsAssertEnabled) CheckSurfaceList(SurfaceDB);
#endif
for (i=0;i<DDSQLEN;i++) {
if ((SurfaceDB[i].uRole == role) && (SurfaceDB[i].uRef)) ret = SurfaceDB[i].lpdds;
if (SurfaceDB[i].lpdds==NULL) break;
}
return ret;
}
LPDIRECTDRAWSURFACE dxwCore::GetPrimarySurface(void)
{
return GetSurfaceByRole(SURFACE_ROLE_PRIMARY);
}
LPDIRECTDRAWSURFACE dxwCore::GetBackBufferSurface(void)
{
return GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER);
}
void dxwCore::SetPrimarySurface(void)
{
if (!lpDDSPrimary) lpDDSPrimary=GetPrimarySurface();
}
void dxwCore::ResetPrimarySurface(void)
{
lpDDSPrimary=NULL;
}
void dxwCore::InitWindowPos(int x, int y, int w, int h) void dxwCore::InitWindowPos(int x, int y, int w, int h)
{ {
iPosX = x; iPosX = x;
@ -1118,7 +880,7 @@ void dxwCore::ScreenRefresh(void)
t = tn; t = tn;
// if not too early, refresh primary surface .... // if not too early, refresh primary surface ....
lpDDSPrim=dxw.GetPrimarySurface(); lpDDSPrim=dxwss.GetPrimarySurface();
if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL); if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL);
// v2.02.44 - used for what? Commenting out seems to fix the palette update glitches // v2.02.44 - used for what? Commenting out seems to fix the palette update glitches
@ -1793,7 +1555,7 @@ HDC dxwCore::AcquireEmulatedDC(LPDIRECTDRAWSURFACE lpdds)
typedef HRESULT (WINAPI *GetDC_Type) (LPDIRECTDRAWSURFACE, HDC FAR *); typedef HRESULT (WINAPI *GetDC_Type) (LPDIRECTDRAWSURFACE, HDC FAR *);
extern GetDC_Type pGetDC; extern GetDC_Type pGetDC;
if((*pGetDC)(lpdds, &ddc)) if((*pGetDC)(lpdds, &ddc))
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
return AcquireEmulatedDC(ddc); return AcquireEmulatedDC(ddc);
} }

View File

@ -91,18 +91,6 @@ public: // methods
BOOL HandleFPS(void); BOOL HandleFPS(void);
BOOL ishWndFPS(HWND); BOOL ishWndFPS(HWND);
DWORD GetTickCount(void); DWORD GetTickCount(void);
char *ExplainSurfaceRole(LPDIRECTDRAWSURFACE);
void ClearSurfaceList();
void MarkPrimarySurface(LPDIRECTDRAWSURFACE, int);
BOOL IsAPrimarySurface(LPDIRECTDRAWSURFACE);
void UnrefSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE GetPrimarySurface(void);
void MarkBackBufferSurface(LPDIRECTDRAWSURFACE, int);
BOOL IsABackBufferSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE GetBackBufferSurface(void);
void MarkRegularSurface(LPDIRECTDRAWSURFACE);
void SetPrimarySurface(void);
void ResetPrimarySurface(void);
void GetSystemTime(LPSYSTEMTIME); void GetSystemTime(LPSYSTEMTIME);
void GetSystemTimeAsFileTime(LPFILETIME); void GetSystemTimeAsFileTime(LPFILETIME);
DWORD StretchTime(DWORD); DWORD StretchTime(DWORD);
@ -164,7 +152,6 @@ public: // simple data variables
DWORD SwapEffect; DWORD SwapEffect;
char *gsModules; char *gsModules;
int TimeShift; int TimeShift;
LPDIRECTDRAWSURFACE lpDDSPrimary;
short iPosX; short iPosX;
short iPosY; short iPosY;
short iSizX; short iSizX;
@ -187,16 +174,10 @@ protected:
DWORD dwScreenHeight; DWORD dwScreenHeight;
BOOL FullScreen; BOOL FullScreen;
HWND hWnd, hWndFPS; HWND hWnd, hWndFPS;
SurfaceDB_Type SurfaceDB[DDSQLEN+1];
//DWORD PrimSurfaces[DDSQLEN+1];
//DWORD BackSurfaces[DDSQLEN+1];
HBITMAP VirtualPic; HBITMAP VirtualPic;
RECT VirtualPicRect; RECT VirtualPicRect;
private: private:
void MarkSurfaceByRole(LPDIRECTDRAWSURFACE, USHORT, USHORT);
LPDIRECTDRAWSURFACE GetSurfaceByRole(USHORT);
void SetSurfaceEntry(LPDIRECTDRAWSURFACE, USHORT, USHORT);
BOOL MustShowOverlay; BOOL MustShowOverlay;
void ShowFPS(HDC, int, int); void ShowFPS(HDC, int, int);
void ShowTimeStretching(HDC, int, int); void ShowTimeStretching(HDC, int, int);
@ -207,7 +188,64 @@ private:
int iRefreshDelayCount; int iRefreshDelayCount;
}; };
class dxwSStack
{
public:
dxwSStack();
virtual ~dxwSStack();
public:
char *ExplainSurfaceRole(LPDIRECTDRAWSURFACE);
void ClearSurfaceList();
void PushPrimarySurface(LPDIRECTDRAWSURFACE, int);
BOOL IsAPrimarySurface(LPDIRECTDRAWSURFACE);
void UnrefSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE GetPrimarySurface(void);
void PushBackBufferSurface(LPDIRECTDRAWSURFACE, int);
BOOL IsABackBufferSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE GetBackBufferSurface(void);
void PopSurface(LPDIRECTDRAWSURFACE);
protected:
SurfaceDB_Type SurfaceDB[DDSQLEN+1];
LPDIRECTDRAWSURFACE lpDDSPrimary;
LPDIRECTDRAWSURFACE lpDDSBackBuffer;
private:
void PushSurface(LPDIRECTDRAWSURFACE, USHORT, USHORT);
LPDIRECTDRAWSURFACE GetSurfaceByRole(USHORT);
void SetSurfaceEntry(LPDIRECTDRAWSURFACE, USHORT, USHORT);
};
typedef struct {
HWND hwnd;
WNDPROC wndproc;
int w;
int h;
} wndstack_entry;
class dxwWStack
{
public:
dxwWStack();
virtual ~dxwWStack();
public:
void Put(HWND, WNDPROC, int, int);
void PutProc(HWND, WNDPROC);
void PutSize(HWND, int, int);
BOOL GetSize(HWND, int *, int *);
WNDPROC GetProc(HWND);
private:
wndstack_entry *WhndStack;
int WhndTOS;
int WhndSize;
};
extern dxwCore dxw; extern dxwCore dxw;
extern dxwSStack dxwss;
extern dxwWStack dxwws;
typedef enum { typedef enum {
SYSLIBIDX_KERNEL32 = 0, SYSLIBIDX_KERNEL32 = 0,

Binary file not shown.

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h" #include "TlHelp32.h"
#define VERSION "2.03.21" #define VERSION "2.03.22"
#define DDTHREADLOCK 1 #define DDTHREADLOCK 1
//#define LOCKTHREADS //#define LOCKTHREADS

Binary file not shown.

View File

@ -361,6 +361,14 @@
RelativePath=".\dxwnd.rc" RelativePath=".\dxwnd.rc"
> >
</File> </File>
<File
RelativePath=".\dxwsstack.cpp"
>
</File>
<File
RelativePath=".\dxwwstack.cpp"
>
</File>
<File <File
RelativePath=".\gdi32.cpp" RelativePath=".\gdi32.cpp"
> >
@ -461,10 +469,6 @@
RelativePath=".\wintrust.cpp" RelativePath=".\wintrust.cpp"
> >
</File> </File>
<File
RelativePath=".\wndproc.cpp"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"

242
dll/dxwsstack.cpp Normal file
View File

@ -0,0 +1,242 @@
/* ------------------------------------------------------------------ */
// DirectDraw Surface Stack implementation
/* ------------------------------------------------------------------ */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY) && SurfaceDB[i].uRef) iPCount++;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER) && SurfaceDB[i].uRef) iBCount++;
}
if(iPCount > 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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break;
OutTrace("--- SURFACELIST DUMP: i=%d lpssd=%x%s ref=%d vers=%d\n", i,
SurfaceDB[i].lpdds, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion);
}
}
#endif
char *dxwSStack::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps)
{
int i;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==ps) return sRole(SurfaceDB[i].uRole);
if (SurfaceDB[i].lpdds==0) break;
}
// this should NEVER happen, but ...
extern LPDIRECTDRAWSURFACE lpDDSEmu_Back, lpDDSEmu_Prim;
if(lpDDSEmu_Back && (ps==lpDDSEmu_Back)) return "(emu.BACK)";
if(lpDDSEmu_Prim && (ps==lpDDSEmu_Prim)) return "(emu.PRIM)";
// ... just in case!
return "";
}
void dxwSStack::ClearSurfaceList()
{
#ifdef DXW_SURFACE_STACK_TRACING
OutTrace(">>> SURFACELIST CLEAR ALL\n");
#endif
for (int i=0;i<DDSQLEN;i++) {
SurfaceDB[i].lpdds = NULL;
SurfaceDB[i].uRef = FALSE;
SurfaceDB[i].uRole = 0;
SurfaceDB[i].uVersion = 0;
}
lpDDSPrimary = NULL;
lpDDSBackBuffer = NULL;
}
void dxwSStack::UnrefSurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// look for entry
for (i=0;i<DDSQLEN;i++)
if ((SurfaceDB[i].lpdds==ps) || SurfaceDB[i].lpdds==0) break;
// if found, delete it by left-copying each entry until end of array
if (SurfaceDB[i].lpdds == ps) {
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> 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;i<DDSQLEN;i++) {
e=&SurfaceDB[i];
if ((e->lpdds==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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return;
if (SurfaceDB[i].lpdds==ps) break;
}
// if found, delete it by left-copying each entry until end of array
if (SurfaceDB[i].lpdds==ps){
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> 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<DDSQLEN; i++){
SurfaceDB[i]=SurfaceDB[i+1];
if (SurfaceDB[i].lpdds==0) break;
}
SurfaceDB[DDSQLEN].lpdds=0;
SurfaceDB[DDSQLEN].uRole=0;
SurfaceDB[DDSQLEN].uRef=0;
SurfaceDB[DDSQLEN].uVersion=0;
if (ps == lpDDSPrimary) lpDDSPrimary = GetSurfaceByRole(SURFACE_ROLE_PRIMARY);
if (ps == lpDDSBackBuffer) lpDDSBackBuffer = GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER);
}
#ifdef DXW_SURFACE_STACK_TRACING
DumpSurfaceList(&SurfaceDB[0]);
#endif
}
// Note: since MS itself declares that the object refcount is not reliable and should
// be used for debugging only, it's not safe to rely on refcount==0 when releasing a
// surface to terminate its classification as primary. As an alternate and more reliable
// way, we use UnmarkPrimarySurface each time you create a new not primary surface,
// eliminating the risk that a surface previously classified as primary and then closed
// had the same surface handle than this new one that is not primary at all.
BOOL dxwSStack::IsAPrimarySurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// treat NULL surface ptr as a non primary
if(!ps) return FALSE;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return FALSE;
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY);
}
return FALSE;
}
BOOL dxwSStack::IsABackBufferSurface(LPDIRECTDRAWSURFACE ps)
{
int i;
// treat NULL surface ptr as a non primary
if(!ps) return FALSE;
for (i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return FALSE;
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER);
}
return FALSE;
}
LPDIRECTDRAWSURFACE dxwSStack::GetSurfaceByRole(USHORT role)
{
// Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and
// whith a not null reference counter. In case of multiple choices, it has to
// return the most recent reference!!!
// tested with "101 the Airborne Invasion of Normandy" and "Armored Fist 3"
int i;
LPDIRECTDRAWSURFACE ret = NULL;
#ifdef DXW_SURFACE_STACK_TRACING
if (IsAssertEnabled) CheckSurfaceList(SurfaceDB);
#endif
for (i=0;i<DDSQLEN;i++) {
if ((SurfaceDB[i].uRole == role) && (SurfaceDB[i].uRef)) ret = SurfaceDB[i].lpdds;
if (SurfaceDB[i].lpdds==NULL) break;
}
return ret;
}
LPDIRECTDRAWSURFACE dxwSStack::GetPrimarySurface(void)
{
//return GetSurfaceByRole(SURFACE_ROLE_PRIMARY);
return lpDDSPrimary;
}
LPDIRECTDRAWSURFACE dxwSStack::GetBackBufferSurface(void)
{
//return GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER);
return lpDDSBackBuffer;
}

View File

@ -1,37 +1,28 @@
#define _WIN32_WINNT 0x0600 /* ------------------------------------------------------------------ */
#define WIN32_LEAN_AND_MEAN // DirectDraw Surface Stack implementation
/* ------------------------------------------------------------------ */
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h> #include <stdio.h>
#include <malloc.h>
#include <ddraw.h>
#include "dxwnd.h" #include "dxwnd.h"
#include "dxwcore.hpp" #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 #define MAXWNDHSTACK 256
wndstack_entry *WhndStack; dxwWStack::dxwWStack()
static int WhndTOS = 0;
static int WhndSize = 0;
void WinDBInit()
{ {
WhndTOS = 0;
WhndSize = MAXWNDHSTACK; WhndSize = MAXWNDHSTACK;
WhndStack = (wndstack_entry *)malloc(WhndSize * sizeof(wndstack_entry)); 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; int StackIdx;
@ -66,7 +57,7 @@ void WinDBPut(HWND hwnd, WNDPROC wndproc, int w, int h)
WhndTOS++; WhndTOS++;
} }
void WinDBPutProc(HWND hwnd, WNDPROC wndproc) void dxwWStack::PutProc(HWND hwnd, WNDPROC wndproc)
{ {
int StackIdx; int StackIdx;
@ -94,7 +85,7 @@ void WinDBPutProc(HWND hwnd, WNDPROC wndproc)
WhndTOS++; WhndTOS++;
} }
void WinDBPutSize(HWND hwnd, int w, int h) void dxwWStack::PutSize(HWND hwnd, int w, int h)
{ {
int StackIdx; int StackIdx;
@ -119,7 +110,7 @@ void WinDBPutSize(HWND hwnd, int w, int h)
WhndTOS++; WhndTOS++;
} }
BOOL WinDBGetSize(HWND hwnd, int *w, int *h) BOOL dxwWStack::GetSize(HWND hwnd, int *w, int *h)
{ {
int StackIdx; int StackIdx;
for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) if (WhndStack[StackIdx].hwnd==hwnd) { for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) if (WhndStack[StackIdx].hwnd==hwnd) {
@ -133,15 +124,16 @@ BOOL WinDBGetSize(HWND hwnd, int *w, int *h)
return FALSE; return FALSE;
} }
WNDPROC WinDBGetProc(HWND hwnd) WNDPROC dxwWStack::GetProc(HWND hwnd)
{ {
int StackIdx; int StackIdx;
//if(dxw.dwFlags6 & USEDEFWINDOWPROC) return pDefWindowProcA;
//OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x TOS=%d\n", hwnd, WhndTOS); //OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x TOS=%d\n", hwnd, WhndTOS);
for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) { for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) {
if (WhndStack[StackIdx].hwnd==hwnd) { if (WhndStack[StackIdx].hwnd==hwnd) {
//OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x, wndproc=%x\n", hwnd, WhndStack[StackIdx].wndproc); //OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x, wndproc=%x\n", hwnd, WhndStack[StackIdx].wndproc);
return WhndStack[StackIdx].wndproc; // either a good value, or NULL return WhndStack[StackIdx].wndproc; // either a good value, or NULL
} }
} }
//OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x, wndproc=NULL\n", hwnd); //OutTraceDW("DEBUG: WNDPROC STACK pop hwnd=%x, wndproc=NULL\n", hwnd);
return NULL; return NULL;

View File

@ -23,13 +23,6 @@ static void Stopper(char *s, int line)
#define STOPPER(s) #define STOPPER(s)
#endif #endif
/*
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;
*/
typedef BOOL (WINAPI *ExtTextOutW_Type)(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); 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 *); 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 *); 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 {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[]={ static HookEntry_Type TextHooks[]={
{HOOK_IAT_CANDIDATE, "CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont}, {HOOK_IAT_CANDIDATE, "CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont},
{HOOK_IAT_CANDIDATE, "CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect}, {HOOK_IAT_CANDIDATE, "CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect},
@ -206,7 +186,7 @@ void HookGDI32Init()
{ {
HookLibInit(Hooks); HookLibInit(Hooks);
HookLibInit(RemapHooks); HookLibInit(RemapHooks);
HookLibInit(DDHooks); HookLibInit(ScaledHooks);
HookLibInit(EmulateHooks); HookLibInit(EmulateHooks);
HookLibInit(TextHooks); HookLibInit(TextHooks);
HookLibInit(GammaHooks); HookLibInit(GammaHooks);
@ -220,7 +200,6 @@ void HookGDI32(HMODULE module)
if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(module, RemapHooks, libname); if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(module, RemapHooks, libname);
if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(module, ScaledHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(module, ScaledHooks, libname);
if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(module, EmulateHooks, 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.dwFlags1 & FIXTEXTOUT) HookLibrary(module, TextHooks, libname);
if (dxw.dwFlags2 & DISABLEGAMMARAMP) HookLibrary(module, GammaHooks, libname); if (dxw.dwFlags2 & DISABLEGAMMARAMP) HookLibrary(module, GammaHooks, libname);
// v2.02.33 - for "Stratego" compatibility option // 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.dwFlags1 & CLIENTREMAPPING) if(addr=RemapLibrary(proc, hModule, RemapHooks)) return addr;
if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) 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.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.dwFlags1 & FIXTEXTOUT) if(addr=RemapLibrary(proc, hModule, TextHooks)) return addr;
if (dxw.dwFlags2 & DISABLEGAMMARAMP) if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr; if (dxw.dwFlags2 & DISABLEGAMMARAMP) if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr;
// v2.02.33 - for "Stratego" compatibility option // 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 // maps the GDI palette to the buffered DirectDraw one. This fixes the screen
// output for "Dementia" (a.k.a. "Armed & Delirious"). // 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 // 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 // expects to get the requested system palette entries, while the 32BPP screen
// returns 0. "Mission Force Cyberstorm" is one of these. Returning the same // 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} {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) UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, LPPALETTEENTRY lppe)
{ {
int ret; int ret;
@ -639,234 +617,6 @@ UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries,
return ret; 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 WINAPI extGDICreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMODE *InitData)
{ {
HDC WinHDC, RetHDC; HDC WinHDC, RetHDC;

View File

@ -504,7 +504,7 @@ HRESULT WINAPI extDirect3DCreateDevice(GUID FAR *lpGUID, LPDIRECT3D lpd3ddevice,
HRESULT res; HRESULT res;
OutTraceD3D("Direct3DCreateDevice: guid=%x d3ddevice=%x dds=%x%s UnkOuter=%x\n", 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); res=(*pDirect3DCreateDevice)(lpGUID, lpd3ddevice, surf, lplpd3ddevice, pUnkOuter);
if(res) OutTraceE("Direct3DCreateDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res) OutTraceE("Direct3DCreateDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
else OutTraceD3D("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice); else OutTraceD3D("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice);
@ -879,7 +879,7 @@ HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE
HRESULT res; HRESULT res;
OutTraceD3D("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x%s\n", 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); res=(*pCreateDevice2)(lpd3d, Guid, lpdds, lplpd3dd);
if(res) { if(res) {
OutTraceE("CreateDevice(D3D2) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); 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; HRESULT res;
OutTraceD3D("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x%s\n", 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); res=(*pCreateDevice3)(lpd3d, Guid, lpdds, lplpd3dd, unk);
if(res) { if(res) {
OutTraceE("CreateDevice(D3D3) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); 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; HRESULT res;
OutTraceD3D("CreateDevice(D3D7): d3d=%x GUID=%x(%s) lpdds=%x%s\n", 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); res=(*pCreateDevice7)(lpd3d, Guid, lpdds, lplpd3dd);
if(res) { if(res) {
OutTraceE("CreateDevice(D3D7) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("CreateDevice(D3D7) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);

View File

@ -27,6 +27,7 @@ void D3D8TextureHandling(void *arg, int Level)
IDirect3DSurface8 *pSurfaceLevel; IDirect3DSurface8 *pSurfaceLevel;
D3DSURFACE_DESC Desc; D3DSURFACE_DESC Desc;
D3DLOCKED_RECT LockedRect; D3DLOCKED_RECT LockedRect;
//OutTrace("D3D8TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){
OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res));
return; return;

View File

@ -27,15 +27,16 @@ void D3D9TextureHandling(void *arg, int Level)
IDirect3DSurface9 *pSurfaceLevel; IDirect3DSurface9 *pSurfaceLevel;
D3DSURFACE_DESC Desc; D3DSURFACE_DESC Desc;
D3DLOCKED_RECT LockedRect; D3DLOCKED_RECT LockedRect;
//OutTrace("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){
OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res));
return; return;
} }
pSurfaceLevel->Release();
if(res=lpd3dtex->GetLevelDesc(Level, &Desc)){ if(res=lpd3dtex->GetLevelDesc(Level, &Desc)){
OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res)); OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res));
return; return;
} }
pSurfaceLevel->Release();
switch(Desc.Type){ switch(Desc.Type){
case D3DRTYPE_SURFACE: case D3DRTYPE_SURFACE:
case D3DRTYPE_TEXTURE: case D3DRTYPE_TEXTURE:

View File

@ -355,7 +355,8 @@ DXWEXTERN CoUninitialize_Type pCoUninitialize DXWINITIALIZED;
// user32.dll: // user32.dll:
DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; 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 ChangeDisplaySettingsA_Type pChangeDisplaySettingsA DXWINITIALIZED;
DXWEXTERN ChangeDisplaySettingsExA_Type pChangeDisplaySettingsExA DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsExA_Type pChangeDisplaySettingsExA DXWINITIALIZED;
DXWEXTERN ChangeDisplaySettingsW_Type pChangeDisplaySettingsW 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 BOOL WINAPI extGDIBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD);
extern HDC WINAPI extGDICreateCompatibleDC(HDC); extern HDC WINAPI extGDICreateCompatibleDC(HDC);
extern HDC WINAPI extEMUCreateCompatibleDC(HDC); extern HDC WINAPI extEMUCreateCompatibleDC(HDC);
extern HDC WINAPI extDDCreateCompatibleDC(HDC);
extern HDC WINAPI extGDICreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); 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 extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*); extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*);
extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *); extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *);
extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT);
extern BOOL WINAPI extGDIDeleteDC(HDC); extern BOOL WINAPI extGDIDeleteDC(HDC);
extern BOOL WINAPI extDDDeleteDC(HDC);
extern int WINAPI extGetClipBox(HDC, LPRECT); extern int WINAPI extGetClipBox(HDC, LPRECT);
extern int WINAPI extGetRgnBox(HRGN, LPRECT); extern int WINAPI extGetRgnBox(HRGN, LPRECT);
extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA); 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 UINT WINAPI extGetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY);
extern BOOL WINAPI extGDIPatBlt(HDC, int, int, int, int, DWORD); extern BOOL WINAPI extGDIPatBlt(HDC, int, int, int, int, DWORD);
extern BOOL WINAPI extPolyline(HDC, const POINT *, int); 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 UINT WINAPI extRealizePalette(HDC);
extern BOOL WINAPI extRectangle(HDC, int, int, int, int); extern BOOL WINAPI extRectangle(HDC, int, int, int, int);
extern BOOL WINAPI extGDIRestoreDC(HDC, 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 extSetDeviceGammaRamp(HDC, LPVOID);
extern BOOL WINAPI extGDIStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); 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 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 extTextOutA(HDC, int, int, LPCTSTR, int);
extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD); extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD);
extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD); extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD);
@ -571,8 +567,8 @@ extern void STDAPICALLTYPE extCoUninitialize(void);
// user32.dll: // user32.dll:
extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT);
extern HDC WINAPI extDDBeginPaint(HWND, LPPAINTSTRUCT); extern LRESULT WINAPI extCallWindowProcA(WNDPROC, HWND, UINT, WPARAM, LPARAM);
extern LRESULT WINAPI extCallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extCallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM);
extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD); extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD);
extern LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID); extern LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID);
extern LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *, DWORD); 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 extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT);
extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *);
extern BOOL WINAPI extDDEndPaint(HWND, const PAINTSTRUCT *);
extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *);
extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH); extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH);
extern int WINAPI extFrameRect(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 BOOL WINAPI extGetCursorPos(LPPOINT);
extern HDC WINAPI extGDIGetDC(HWND); extern HDC WINAPI extGDIGetDC(HWND);
extern HDC WINAPI extEMUGetDC(HWND); extern HDC WINAPI extEMUGetDC(HWND);
extern HDC WINAPI extDDGetDC(HWND);
extern HWND WINAPI extGetDesktopWindow(void); extern HWND WINAPI extGetDesktopWindow(void);
extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO); extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO);
extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO); extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO);
@ -605,12 +599,10 @@ extern int WINAPI extGetSystemMetrics(int);
extern HWND WINAPI extGetTopWindow(HWND); extern HWND WINAPI extGetTopWindow(HWND);
extern int WINAPI extGetUpdateRgn(HWND, HRGN, BOOL); extern int WINAPI extGetUpdateRgn(HWND, HRGN, BOOL);
extern HDC WINAPI extGDIGetWindowDC(HWND); extern HDC WINAPI extGDIGetWindowDC(HWND);
extern HDC WINAPI extDDGetWindowDC(HWND);
extern LONG WINAPI extGetWindowLongA(HWND, int); extern LONG WINAPI extGetWindowLongA(HWND, int);
extern LONG WINAPI extGetWindowLongW(HWND, int); extern LONG WINAPI extGetWindowLongW(HWND, int);
extern BOOL WINAPI extGetWindowRect(HWND, LPRECT); extern BOOL WINAPI extGetWindowRect(HWND, LPRECT);
extern BOOL WINAPI extInvalidateRect(HWND, RECT *, BOOL); extern BOOL WINAPI extInvalidateRect(HWND, RECT *, BOOL);
//extern BOOL WINAPI extDDInvalidateRect(HWND, RECT *, BOOL);
extern int WINAPI extMapWindowPoints(HWND, HWND, LPPOINT, UINT); extern int WINAPI extMapWindowPoints(HWND, HWND, LPPOINT, UINT);
extern BOOL WINAPI extMoveWindow(HWND, int, int, int, int, BOOL); extern BOOL WINAPI extMoveWindow(HWND, int, int, int, int, BOOL);
extern BOOL WINAPI extPeekMessage(LPMSG, HWND, UINT, UINT, UINT); 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 extRegisterClassExA(WNDCLASSEXA *);
extern ATOM WINAPI extRegisterClassA(WNDCLASSA *); extern ATOM WINAPI extRegisterClassA(WNDCLASSA *);
extern int WINAPI extGDIReleaseDC(HWND, HDC); extern int WINAPI extGDIReleaseDC(HWND, HDC);
extern int WINAPI extDDReleaseDC(HWND, HDC);
extern BOOL WINAPI extScreenToClient(HWND, LPPOINT); extern BOOL WINAPI extScreenToClient(HWND, LPPOINT);
extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM);
extern LRESULT WINAPI extSendMessageW(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 extCloseWindow(HWND);
extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *); extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *);
extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD); extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD);
extern HDC WINAPI extDDGetDCEx(HWND, HRGN, DWORD);
extern BOOL WINAPI extUpdateWindow(HWND); extern BOOL WINAPI extUpdateWindow(HWND);
extern BOOL WINAPI extGetWindowPlacement(HWND, WINDOWPLACEMENT *); extern BOOL WINAPI extGetWindowPlacement(HWND, WINDOWPLACEMENT *);
extern BOOL WINAPI extSetWindowPlacement(HWND, WINDOWPLACEMENT *); extern BOOL WINAPI extSetWindowPlacement(HWND, WINDOWPLACEMENT *);

View File

@ -17,7 +17,6 @@
BOOL IsChangeDisplaySettingsHotPatched = FALSE; BOOL IsChangeDisplaySettingsHotPatched = FALSE;
#define GDIMODE_STRETCHED 0 #define GDIMODE_STRETCHED 0
#define GDIMODE_EMULATED 1 #define GDIMODE_EMULATED 1
#define GDIMODE_DIRECTDRAW 2
int GDIEmulationMode = 0; int GDIEmulationMode = 0;
//typedef BOOL (WINAPI *ValidateRect_Type)(HWND, const RECT *); //typedef BOOL (WINAPI *ValidateRect_Type)(HWND, const RECT *);
@ -154,18 +153,6 @@ static HookEntry_Type ScaledHooks[]={
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator {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[]={ static HookEntry_Type RemapHooks[]={
{HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient}, {HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient},
{HOOK_IAT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen}, {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, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow},
{HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos}, {HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos},
{HOOK_HOT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos}, {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 {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.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr;
if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) 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))
if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC) && !(dxw.dwFlags1 & MAPGDITOPRIMARY))
if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr; if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr;
if (dxw.dwFlags1 & MODIFYMOUSE) if (addr=RemapLibrary(proc, hModule, MouseHooks)) 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 GDIEmulationMode = GDIMODE_STRETCHED; // default
if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED;
if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED;
if (dxw.dwFlags1 & MAPGDITOPRIMARY) GDIEmulationMode = GDIMODE_DIRECTDRAW;
HookLibrary(hModule, Hooks, libname); 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); HookLibrary(hModule, NoGDIHooks, libname);
if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname); if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname);
if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, 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 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname);
if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname); if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname);
@ -268,7 +253,8 @@ void HookUser32(HMODULE hModule)
void HookUser32Init() void HookUser32Init()
{ {
HookLibInit(Hooks); HookLibInit(Hooks);
HookLibInit(DDHooks); HookLibInit(ScaledHooks);
HookLibInit(EmulateHooks);
HookLibInit(RemapHooks); HookLibInit(RemapHooks);
HookLibInit(MouseHooks); HookLibInit(MouseHooks);
HookLibInit(WinHooks); HookLibInit(WinHooks);
@ -631,7 +617,7 @@ LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, H
if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){ if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){
WNDPROC wp; WNDPROC wp;
wp=WinDBGetProc(hwnd); wp=dxwws.GetProc(hwnd);
OutTraceDW("%s: remapping WindowProc res=%x -> %x\n", ApiName, res, (LONG)wp); 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. 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) || if((OldProc==extWindowProc) ||
(OldProc==extChildWindowProc)|| (OldProc==extChildWindowProc)||
(OldProc==extDialogWindowProc)) (OldProc==extDialogWindowProc))
OldProc=WinDBGetProc(hwnd); OldProc=dxwws.GetProc(hwnd);
WinDBPutProc(hwnd, (WNDPROC)dwNewLong); dxwws.PutProc(hwnd, (WNDPROC)dwNewLong);
res=(LONG)OldProc; res=(LONG)OldProc;
SetLastError(0); SetLastError(0);
lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc); lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc);
@ -1089,7 +1075,7 @@ BOOL WINAPI extGetClientRect(HWND hwnd, LPRECT lpRect)
if (dxw.IsFullScreen()){ if (dxw.IsFullScreen()){
int w, h; int w, h;
if(FIXCHILDSIZE){ if(FIXCHILDSIZE){
if(WinDBGetSize(hwnd, &w, &h)){ if(dxwws.GetSize(hwnd, &w, &h)){
lpRect->top=lpRect->left=0; lpRect->top=lpRect->left=0;
lpRect->right=w; lpRect->right=w;
lpRect->bottom=h; 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 // child window inherit the father's windproc, so if it's redirected to
// a hooker (either extWindowProc or extChildWindowProc) you have to retrieve // 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; long res;
WNDPROC pWindowProc; WNDPROC pWindowProc;
@ -1286,13 +1272,13 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName)
HWND Father; HWND Father;
WNDPROC pFatherProc; WNDPROC pFatherProc;
Father=GetParent(hwnd); Father=GetParent(hwnd);
pFatherProc=WinDBGetProc(Father); pFatherProc=dxwws.GetProc(Father);
OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName, OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName,
(pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"), (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"),
Father, pFatherProc); Father, pFatherProc);
pWindowProc = pFatherProc; pWindowProc = pFatherProc;
} }
WinDBPutProc(hwnd, pWindowProc); dxwws.PutProc(hwnd, pWindowProc);
if(dwStyle & WS_CHILD){ if(dwStyle & WS_CHILD){
OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc); OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc);
res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc);
@ -1502,7 +1488,7 @@ static HWND WINAPI extCreateWindowCommon(
HookChildWndProc(hwnd, dwStyle, ApiName); HookChildWndProc(hwnd, dwStyle, ApiName);
if ((FIXCHILDSIZE) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) 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. // "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. // 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); 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 !!! // v2.02.30: fix (Imperialism II): apply to main window only !!!
HRESULT res; HRESULT res;
res = -1; 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) 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 else
return res; return res;
} }
@ -1910,16 +1910,9 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName)
if(bFlippedDC) { if(bFlippedDC) {
extern HDC hFlippedDC; extern HDC hFlippedDC;
LPDIRECTDRAWSURFACE lpDDSPrim; LPDIRECTDRAWSURFACE lpDDSPrim;
lpDDSPrim = dxw.GetPrimarySurface(); lpDDSPrim = dxwss.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
if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC); if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC);
#endif OutTraceDW("%s: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", ApiName, lpDDSPrim, hFlippedDC);
OutTraceDW("%s: remapping flipped GDI hdc=%x\n", ApiName, hFlippedDC);
if(hFlippedDC) return hFlippedDC; if(hFlippedDC) return hFlippedDC;
} }
#endif #endif
@ -1932,8 +1925,6 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName)
ret=dxw.AcquireEmulatedDC(lochwnd); ret=dxw.AcquireEmulatedDC(lochwnd);
dxw.VirtualHDC=ret; dxw.VirtualHDC=ret;
break; break;
case GDIMODE_DIRECTDRAW:
break;
} }
if(ret){ if(ret){
@ -1996,7 +1987,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC)
if(bFlippedDC && (hDC == hFlippedDC)) { if(bFlippedDC && (hDC == hFlippedDC)) {
HRESULT ret; HRESULT ret;
OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC); 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__); if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__);
else dxw.ScreenRefresh(); else dxw.ScreenRefresh();
return (ret == DD_OK); return (ret == DD_OK);
@ -2013,8 +2004,6 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC)
res=dxw.ReleaseEmulatedDC(hwnd); res=dxw.ReleaseEmulatedDC(hwnd);
res=(*pGDIReleaseDC)(hwnd, windc); res=(*pGDIReleaseDC)(hwnd, windc);
break; break;
case GDIMODE_DIRECTDRAW:
break;
} }
if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); 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; lpPaint->hdc=EmuHDC;
hdc = EmuHDC; hdc = EmuHDC;
break; 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", OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n",
@ -2063,53 +2043,6 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint)
return hdc; 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 WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
{ {
BOOL ret; BOOL ret;
@ -2133,8 +2066,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
case GDIMODE_EMULATED: case GDIMODE_EMULATED:
ret=dxw.ReleaseEmulatedDC(hwnd); ret=dxw.ReleaseEmulatedDC(hwnd);
break; break;
case GDIMODE_DIRECTDRAW:
break;
} }
if(ret) if(ret)
@ -2145,54 +2076,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
return ret; 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 WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit)
{ {
HWND RetHWND; HWND RetHWND;
@ -2204,7 +2087,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT
// v2.02.73: redirect lpDialogFunc only when it is nor NULL // v2.02.73: redirect lpDialogFunc only when it is nor NULL
if(lpDialogFunc) { if(lpDialogFunc) {
WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); 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" // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally"
if(lpDialogFunc) { if(lpDialogFunc) {
WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -204,7 +204,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
case 0: break; case 0: break;
case 1: t->flags2 |= GDISTRETCHED; break; case 1: t->flags2 |= GDISTRETCHED; break;
case 2: t->flags3 |= GDIEMULATEDC; break; case 2: t->flags3 |= GDIEMULATEDC; break;
case 3: t->flags |= MAPGDITOPRIMARY; break; //case 3: t->flags |= MAPGDITOPRIMARY; break;
} }
switch(dlg->m_ResTypes){ switch(dlg->m_ResTypes){
@ -428,7 +428,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_DCEmulationMode = 0; dlg->m_DCEmulationMode = 0;
if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1;
if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; 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; dlg->m_ResTypes = 0;
if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0; if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0;

Binary file not shown.