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

v2_02_32_src

Former-commit-id: fe45ae6a326109606378d67a657b9f0080001fd2
This commit is contained in:
gho tik 2013-08-30 12:38:14 -04:00 committed by Refael ACkermann
parent 6d56f83f1f
commit 3db9abb9ba
23 changed files with 775 additions and 230 deletions

View File

@ -93,6 +93,8 @@
#define CDROMDRIVETYPE 0x00000800 // Pretends that GetDriveType() always returns DRIVE_CDROM
#define NOWINDOWMOVE 0x00001000 // Do not try to update window position & size on D3D rendering
#define DISABLEHAL 0x00002000 // Disable HAL support (IID_IDirect3DHALDevice)
#define LOCKSYSCOLORS 0x00004000 // Lock Sys Colors changes by SetSysColors() call
#define EMULATEDC 0x00008000 // ........
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff5e1a04f90b69aaeac5520885d280a978746c9674a5085725d17d45593af92a
size 378368
oid sha256:47630d9ec2f6d6c9eb9b588acadace0fa49394596c03a977bb3d062a07a60074
size 385024

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a15a98b4e75ff8b03d04af4bf9b30445a6af7324468d3276316063fede54375a
oid sha256:f985fae11aaa4f10de4c9135577527784e1b153c6403a2f5b01666f0996b8a29
size 524288

View File

@ -27,10 +27,10 @@ path1=D:\Games\688\688I_HK.EXE
module1=
opengllib1=
ver1=0
coord1=1
flag1=-938999262
flagg1=135266304
flagh1=20
coord1=0
flag1=-937950686
flagg1=134217728
flagh1=32788
flagi1=0
tflag1=3
initx1=0
@ -98,7 +98,7 @@ opengllib4=
ver4=0
coord4=0
flag4=142606368
flagg4=135266304
flagg4=134217728
flagh4=8212
flagi4=0
tflag4=7
@ -304,7 +304,7 @@ module13=
opengllib13=
ver13=0
coord13=0
flag13=771891232
flag13=771891234
flagg13=201457664
flagh13=8212
flagi13=0
@ -672,9 +672,9 @@ module29=
opengllib29=
ver29=0
coord29=0
flag29=671621154
flagg29=135266304
flagh29=20
flag29=679485474
flagg29=134217728
flagh29=32788
flagi29=0
tflag29=3
initx29=0
@ -689,17 +689,17 @@ sizx29=1200
sizy29=900
maxfps29=0
initts29=0
title30=Imperialism II
path30=D:\Games\imperialism_2\imperialism II.exe
title30=Mechwarrior 3
path30=D:\Games\Mechwarrior 3 (full)\Mech3.exe
module30=
opengllib30=
ver30=0
coord30=1
coord30=0
flag30=671096866
flagg30=470810640
flagh30=52
flagg30=134217728
flagh30=20
flagi30=0
tflag30=3
tflag30=0
initx30=0
inity30=0
minx30=0
@ -712,13 +712,13 @@ sizx30=800
sizy30=600
maxfps30=0
initts30=0
title31=Mechwarrior 3
path31=D:\Games\Mechwarrior 3 (full)\Mech3.exe
title31=Raiden II
path31=D:\Games\raiden2\RAIDENII.EXE
module31=
opengllib31=
ver31=0
coord31=0
flag31=671096866
coord31=1
flag31=134217762
flagg31=134217728
flagh31=20
flagi31=0
@ -735,12 +735,12 @@ sizx31=800
sizy31=600
maxfps31=0
initts31=0
title32=Raiden II
path32=D:\Games\raiden2\RAIDENII.EXE
title32=Rapanui
path32=D:\Games\Rapanui\Rapanui.exe
module32=
opengllib32=
ver32=0
coord32=1
coord32=0
flag32=134217762
flagg32=134217728
flagh32=20
@ -758,42 +758,42 @@ sizx32=800
sizy32=600
maxfps32=0
initts32=0
title33=Rapanui
path33=D:\Games\Rapanui\Rapanui.exe
title33=Silent Hunter II (shell)
path33=D:\Games\Silent Hunter II\Shell\Shell.exe
module33=
opengllib33=
ver33=0
coord33=0
flag33=134217762
flagg33=134217728
flag33=402653221
flagg33=135266304
flagh33=20
flagi33=0
tflag33=0
tflag33=3
initx33=0
inity33=0
minx33=0
miny33=0
maxx33=0
maxy33=0
maxx33=800
maxy33=600
posx33=50
posy33=50
sizx33=800
sizy33=600
maxfps33=0
initts33=0
title34=Silent Hunter II (shell)
path34=D:\Games\Silent Hunter II\Shell\Shell.exe
title34=Silent Hunter II (sim)
path34=D:\Games\Silent Hunter II\Sim\Sim.exe
module34=
opengllib34=
ver34=0
coord34=0
flag34=402653221
flagg34=135266304
flag34=134217780
flagg34=134217728
flagh34=20
flagi34=0
tflag34=3
initx34=0
inity34=0
tflag34=0
initx34=400
inity34=300
minx34=0
miny34=0
maxx34=800
@ -804,40 +804,40 @@ sizx34=800
sizy34=600
maxfps34=0
initts34=0
title35=Silent Hunter II (sim)
path35=D:\Games\Silent Hunter II\Sim\Sim.exe
title35=The Sims
path35=D:\Games\sims\Sims.exe
module35=
opengllib35=
ver35=0
coord35=0
flag35=134217780
flag35=679616546
flagg35=134217728
flagh35=20
flagh35=84
flagi35=0
tflag35=0
initx35=400
inity35=300
tflag35=67
initx35=0
inity35=0
minx35=0
miny35=0
maxx35=800
maxy35=600
maxx35=0
maxy35=0
posx35=50
posy35=50
sizx35=800
sizy35=600
maxfps35=0
initts35=0
title36=The Sims
path36=D:\Games\sims\Sims.exe
title36=Tomb Raider - The Last Revelation
path36=D:\Games\Tomb Raider - The Last Revelation\tomb4.exe
module36=
opengllib36=
ver36=0
coord36=0
flag36=738336800
flag36=134217826
flagg36=134217728
flagh36=1044
flagh36=20
flagi36=0
tflag36=66
tflag36=3
initx36=0
inity36=0
minx36=0
@ -850,17 +850,17 @@ sizx36=800
sizy36=600
maxfps36=0
initts36=0
title37=Tomb Raider - The Last Revelation
path37=D:\Games\Tomb Raider - The Last Revelation\tomb4.exe
title37=TOMB2.EXE
path37=D:\Games\Tomb Raider 2\TOMB2.EXE
module37=
opengllib37=
ver37=0
coord37=0
flag37=134217826
flagg37=134217728
flagh37=20
flag37=134217760
flagg37=201326592
flagh37=2068
flagi37=0
tflag37=3
tflag37=0
initx37=0
inity37=0
minx37=0
@ -873,17 +873,17 @@ sizx37=800
sizy37=600
maxfps37=0
initts37=0
title38=TOMB2.EXE
path38=D:\Games\Tomb Raider 2\TOMB2.EXE
title38=wa.exe
path38=D:\Games\worms_arma\Worms_2_Armageddon\wa.exe
module38=
opengllib38=
ver38=0
coord38=0
flag38=134217760
flagg38=201326592
flagh38=2068
flag38=713031712
flagg38=142606336
flagh38=20
flagi38=0
tflag38=0
tflag38=3
initx38=0
inity38=0
minx38=0
@ -896,17 +896,17 @@ sizx38=800
sizy38=600
maxfps38=0
initts38=0
title39=wa.exe
path39=D:\Games\worms_arma\Worms_2_Armageddon\wa.exe
title39=Western Front
path39=D:\Games\Western Front\wf.exe
module39=
opengllib39=
ver39=0
coord39=0
flag39=713031712
flagg39=142606336
flagh39=20
flag39=679477282
flagg39=135266304
flagh39=16404
flagi39=0
tflag39=3
tflag39=0
initx39=0
inity39=0
minx39=0
@ -919,40 +919,40 @@ sizx39=800
sizy39=600
maxfps39=0
initts39=0
title40=Western Front
path40=D:\Games\Western Front\wf.exe
title40=G-Nome
path40=D:\Games\G-Nome\G-NOME.EXE
module40=
opengllib40=
ver40=0
coord40=0
flag40=679477282
flagg40=134217728
flagh40=20
flag40=-1433399262
flagg40=201326592
flagh40=33300
flagi40=0
tflag40=0
tflag40=3
initx40=0
inity40=0
minx40=0
miny40=0
maxx40=0
maxy40=0
posx40=50
posy40=50
posx40=250
posy40=250
sizx40=800
sizy40=600
maxfps40=0
initts40=0
title41=G-Nome
path41=D:\Games\G-Nome\G-NOME.EXE
title41=GeneRally
path41=D:\Games\generally105\GeneRally.exe
module41=
opengllib41=
ver41=0
ver41=7
coord41=0
flag41=713031714
flagg41=134217728
flag41=134234146
flagg41=135266305
flagh41=20
flagi41=0
tflag41=3
tflag41=0
initx41=0
inity41=0
minx41=0
@ -961,10 +961,125 @@ maxx41=0
maxy41=0
posx41=50
posy41=50
sizx41=0
sizy41=0
sizx41=800
sizy41=600
maxfps41=0
initts41=0
title42=Warlords 3
path42=D:\Games\Warlords3\Darklord.exe
module42=
opengllib42=
ver42=0
coord42=0
flag42=-2013249502
flagg42=135266304
flagh42=20
flagi42=0
tflag42=0
initx42=0
inity42=0
minx42=0
miny42=0
maxx42=0
maxy42=0
posx42=50
posy42=50
sizx42=800
sizy42=600
maxfps42=0
initts42=0
title43=Tachyon The Fringe
path43=D:\Games\TachyonTheFringe\space.exe
module43=
opengllib43=
ver43=0
coord43=0
flag43=151011364
flagg43=134217728
flagh43=20
flagi43=0
tflag43=3
initx43=0
inity43=0
minx43=0
miny43=0
maxx43=0
maxy43=0
posx43=50
posy43=50
sizx43=800
sizy43=600
maxfps43=0
initts43=0
title44=Tanktics
path44=D:\Games\Tanktics\tanktics.exe
module44=
opengllib44=
ver44=0
coord44=1
flag44=671088674
flagg44=134217728
flagh44=20
flagi44=0
tflag44=259
initx44=0
inity44=0
minx44=0
miny44=0
maxx44=0
maxy44=0
posx44=50
posy44=50
sizx44=800
sizy44=600
maxfps44=0
initts44=0
title45=Nightmare Ned
path45=D:\Games\Ned\NITENED.EXE
module45=
opengllib45=
ver45=0
coord45=0
flag45=134217762
flagg45=134217728
flagh45=20
flagi45=0
tflag45=3
initx45=0
inity45=0
minx45=0
miny45=0
maxx45=0
maxy45=0
posx45=50
posy45=50
sizx45=800
sizy45=600
maxfps45=0
initts45=0
title46=Imperialism II
path46=D:\Games\imperialism_2\imperialism II.exe
module46=
opengllib46=
ver46=0
coord46=0
flag46=142614562
flagg46=470810688
flagh46=20
flagi46=0
tflag46=67
initx46=0
inity46=0
minx46=0
miny46=0
maxx46=0
maxy46=0
posx46=50
posy46=50
sizx46=800
sizy46=600
maxfps46=0
initts46=0
[window]
posx=908
posy=205

View File

@ -212,4 +212,14 @@ fixed DeferWindowPos hook to make Imperialism II working
fixed SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN properties
fixed window class logging causing program crash
GUI:
added "GDI/Scale font parameters" & "DirectX/Disable HAL support" options
added "GDI/Scale font parameters" & "DirectX/Disable HAL support" options
v2.02.32
CORE:
added new GDI handling mode, "Emulated devce context". Currently tested successfully on "G-Nome" only.
fixed "Prevent maximize" windows handling avoiding to disable topmost style for child windows
fixed handling of DDSCAPS_3DDEVICE surfaces in emulated mode: "Nightmare Ned" is working ok, "The Sims" works better (still crashing..)
fixed banner handling in case of device context remmapped coordinates
fixed memory leakage in SetDIBitsToDevice hooker
GUI
added radiobutton group to set the preferred GDI emulation mode

View File

@ -763,23 +763,24 @@ int lpddHookedVersion(LPDIRECTDRAW lpdd)
/* ------------------------------------------------------------------ */
static void DumpPixFmt(LPDDSURFACEDESC2 lpdd)
static void DumpPixFmt(LPDDSURFACEDESC2 lpdds)
{
OutTraceD("PixFmt: Size=%x Flags=%x(%s) FourCC=%x RGBBitCount=%d RGBA BitMask=(%x,%x,%x,%x)\n",
lpdd->ddpfPixelFormat.dwSize,
lpdd->ddpfPixelFormat.dwFlags, ExplainPixelFormatFlags(lpdd->ddpfPixelFormat.dwFlags),
lpdd->ddpfPixelFormat.dwFourCC,
lpdd->ddpfPixelFormat.dwRGBBitCount,
lpdd->ddpfPixelFormat.dwRBitMask,
lpdd->ddpfPixelFormat.dwGBitMask,
lpdd->ddpfPixelFormat.dwBBitMask,
lpdd->ddpfPixelFormat.dwRGBAlphaBitMask);
lpdds->ddpfPixelFormat.dwSize,
lpdds->ddpfPixelFormat.dwFlags, ExplainPixelFormatFlags(lpdds->ddpfPixelFormat.dwFlags),
lpdds->ddpfPixelFormat.dwFourCC,
lpdds->ddpfPixelFormat.dwRGBBitCount,
lpdds->ddpfPixelFormat.dwRBitMask,
lpdds->ddpfPixelFormat.dwGBitMask,
lpdds->ddpfPixelFormat.dwBBitMask,
lpdds->ddpfPixelFormat.dwRGBAlphaBitMask);
}
static char *SetPixFmt(LPDDSURFACEDESC2 lpdd)
{
char *pfstr;
OutTraceD("SetPixFmt: BPP=%d Use565=%d\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.dwFlags1 & USERGB565 ? 1:0);
memset(&lpdd->ddpfPixelFormat,0,sizeof(DDPIXELFORMAT));
lpdd->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
lpdd->ddpfPixelFormat.dwRGBBitCount = dxw.ActualPixelFormat.dwRGBBitCount;
@ -1652,7 +1653,7 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd)
lpddsd->dwHeight = dxw.GetScreenHeight();
// v2.1.96: fake screen color depth
if(dxw.dwFlags2 & INIT8BPP|INIT16BPP){
if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix
if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat);
if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat);
OutTraceD("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount);
@ -1819,6 +1820,20 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd)
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
return SetPixFmt(lpddsd);
break;
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE:
// Nightmare Ned
OutTrace("FixSurfaceCaps: Nightmare Ned\n");
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
return SetPixFmt(lpddsd);
break;
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY:
// Nightmare Ned
OutTrace("FixSurfaceCaps: The Sims\n");
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
return SetPixFmt(lpddsd);
break;
default:
break;
}
@ -1999,7 +2014,9 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf
res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0);
if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){
OutTraceD("CreateSurface: ASSERT DDSEmu_Prim already exists\n");
res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim);
res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); // ok only if the oprevious surface has the good properties!!!
//while((*pReleaseS)(lpDDSEmu_Prim));
//res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0);
}
if(res){
OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);

View File

@ -57,11 +57,11 @@ static char *Flag3Names[32]={
"FORCEHOOKOPENGL", "MARKBLIT", "HOOKDLLS", "SUPPRESSD3DEXT",
"HOOKENABLED", "FIXD3DFRAME", "FORCE16BPP", "BLACKWHITE",
"SAVECAPS", "SINGLEPROCAFFINITY", "EMULATEREGISTRY", "CDROMDRIVETYPE",
"NOWINDOWMOVE", "Flag3:14", "Flag3:15", "Flag3:16",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"NOWINDOWMOVE", "DISABLEHAL", "LOCKSYSCOLORS", "EMULATEDC",
"Flags3:17", "Flags3:18", "Flags3:19", "Flags3:20",
"Flags3:21", "Flags3:22", "Flags3:23", "Flags3:24",
"Flags3:25", "Flags3:26", "Flags3:27", "Flags3:28",
"Flags3:29", "Flags3:30", "Flags3:31", "Flags3:32",
};
static char *Flag4Names[32]={
@ -937,10 +937,11 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
}
break;
case WM_WINDOWPOSCHANGING:
dxwFixWindowPos("WindowProc", hwnd, lparam);
break;
case WM_WINDOWPOSCHANGED:
LPWINDOWPOS wp;
wp = (LPWINDOWPOS)lparam;
dxwFixWindowPos("WindowProc", hwnd, lparam);
OutTraceD("WindowProc: WM_WINDOWPOSCHANGING fixed size=(%d,%d)\n", wp->cx, wp->cy);
break;
case WM_ENTERSIZEMOVE:
while((*pShowCursor)(1) < 0);
@ -1245,7 +1246,7 @@ void HookModule(HMODULE base, int dxversion)
HookOle32(base);
HookWinMM(base);
//if(dxw.dwFlags2 & SUPPRESSIME) HookImeLib(module);
if(dxw.dwFlags2 & HOOKGDI) HookGDI32(base);
HookGDI32(base);
if(dxw.dwFlags1 & HOOKDI) HookDirectInput(base, dxversion);
HookDirectDraw(base, dxversion);
HookDirect3D(base, dxversion);

View File

@ -27,6 +27,7 @@ dxwCore::dxwCore()
//IsWithinDDraw = FALSE;
IsGDIPalette = FALSE;
memset(PrimSurfaces, 0, sizeof(PrimSurfaces));
ResetEmulatedDC();
}
dxwCore::~dxwCore()
@ -421,6 +422,28 @@ void dxwCore::MapClient(int *nXDest, int *nYDest)
*nYDest= *nYDest * h / (int)dwScreenHeight;
}
void dxwCore::UnmapClient(LPPOINT lppoint)
{
RECT client;
int w, h;
(*pGetClientRect)(hWnd, &client);
w = client.right ? client.right : iSizX;
h = client.bottom ? client.bottom : iSizY;
lppoint->x = (lppoint->x * (int)dwScreenWidth) / w;
lppoint->y = (lppoint->y * (int)dwScreenHeight) / h;
}
void dxwCore::UnmapClient(int *nXDest, int *nYDest)
{
RECT client;
int w, h;
(*pGetClientRect)(hWnd, &client);
w = client.right ? client.right : iSizX;
h = client.bottom ? client.bottom : iSizY;
*nXDest= *nXDest * (int)dwScreenWidth / w;
*nYDest= *nYDest * (int)dwScreenHeight / h;
}
void dxwCore::MapWindow(LPRECT rect)
{
RECT client;
@ -837,10 +860,12 @@ void dxwCore::ShowBanner(HWND hwnd)
HDC hClientDC;
HBITMAP g_hbmBall;
RECT client;
RECT win;
POINT PrevViewPort;
hClientDC=GetDC(hwnd);
hClientDC=(*pGDIGetDC)(hwnd);
(*pGetClientRect)(hwnd, &client);
BitBlt(hClientDC, 0, 0, client.right, client.bottom, NULL, 0, 0, BLACKNESS);
(*pGDIBitBlt)(hClientDC, 0, 0, client.right, client.bottom, NULL, 0, 0, BLACKNESS);
if(JustOnce || (dwFlags2 & NOBANNER)) return;
JustOnce=TRUE;
@ -849,21 +874,29 @@ void dxwCore::ShowBanner(HWND hwnd)
HDC hdcMem = CreateCompatibleDC(hClientDC);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmBall);
GetObject(g_hbmBall, sizeof(bm), &bm);
(*pGetWindowRect)(hwnd, &win);
OutTraceD("ShowBanner: hdc=%x win=(%d,%d)-(%d,%d) banner size=(%dx%d)\n",
hwnd, win.left, win.top, win.right, win.bottom, bm.bmWidth, bm.bmHeight);
//if(!pSetViewportOrgEx) pSetViewportOrgEx=SetViewportOrgEx;
(*pSetViewportOrgEx)(hClientDC, 0, 0, &PrevViewPort);
for (int i=1; i<=16; i++){
int w, h;
w=(bm.bmWidth*i)/8;
h=(bm.bmHeight*i)/8;
StretchBlt(hClientDC, (client.right-w)/2, (client.bottom-h)/2, w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
(*pGDIStretchBlt)(hClientDC, (client.right-w)/2, (client.bottom-h)/2, w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
Sleep(40);
}
for (int i=16; i>=8; i--){
int w, h;
w=(bm.bmWidth*i)/8;
h=(bm.bmHeight*i)/8;
BitBlt(hClientDC, 0, 0, client.right, client.bottom, NULL, 0, 0, BLACKNESS);
StretchBlt(hClientDC, (client.right-w)/2, (client.bottom-h)/2, w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
(*pGDIBitBlt)(hClientDC, 0, 0, client.right, client.bottom, NULL, 0, 0, BLACKNESS);
(*pGDIStretchBlt)(hClientDC, (client.right-w)/2, (client.bottom-h)/2, w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
Sleep(40);
}
(*pSetViewportOrgEx)(hClientDC, PrevViewPort.x, PrevViewPort.y, NULL);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
Sleep(200);
@ -956,7 +989,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam)
if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value
lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_EXSTYLE);
}
if (dxw.dwFlags1 & PREVENTMAXIMIZE){ // disable maximize settings
if ((dxw.dwFlags1 & PREVENTMAXIMIZE) && (hwnd==hWnd)){ // disable maximize settings
if (lpSS->styleNew & WS_EX_TOPMOST){
OutTraceD("%s: prevent EXSTYLE topmost style\n", ApiName);
lpSS->styleNew &= ~WS_EX_TOPMOST;
@ -967,3 +1000,55 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam)
break;
}
}
HDC dxwCore::AcquireEmulatedDC(HWND hwnd)
{
HDC wdc;
if(!(wdc=(*pGDIGetDC)(hwnd)))
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!VirtualHDC){ // or resolution changed and you must rebuild a new one .... !!!!!
if(!(VirtualHDC=CreateCompatibleDC(wdc)))
OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!VirtualPic){
if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight())))
OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
if(!SelectObject(VirtualHDC, VirtualPic)){
if(!DeleteObject(VirtualPic))
OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight())))
OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!SelectObject(VirtualHDC, VirtualPic))
OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
}
return VirtualHDC;
}
BOOL dxwCore::ReleaseEmulatedDC(HWND hwnd)
{
BOOL ret;
HDC wdc;
RECT client;
(*pGetClientRect)(hwnd, &client);
if(!(wdc=(*pGDIGetDC)(hwnd)))
OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!(*pGDIStretchBlt)(wdc, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), SRCCOPY))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
(*pInvalidateRect)(hwnd, NULL, 0);
ret=TRUE;
return ret;
}
void dxwCore::ResetEmulatedDC()
{
VirtualHDC=NULL;
VirtualPic=NULL;
VirtualOffsetX=0;
VirtualOffsetY=0;
}
BOOL dxwCore::IsVirtual(HDC hdc)
{
return (hdc==VirtualHDC) && (dwFlags3 & EMULATEDC);
}

View File

@ -36,6 +36,8 @@ public: // methods
void MapClient(LPRECT);
void MapClient(int *, int *, int *, int *);
void MapClient(int *, int *);
void UnmapClient(LPPOINT);
void UnmapClient(int *, int *);
void MapWindow(LPPOINT);
void MapWindow(LPRECT);
void MapWindow(int *, int *, int *, int *);
@ -67,6 +69,11 @@ public: // methods
POINT ScreenToClient(POINT);
int GetDLLIndex(char *);
void FixStyle(char *, HWND, WPARAM, LPARAM);
HDC AcquireEmulatedDC(HWND);
BOOL ReleaseEmulatedDC(HWND);
BOOL IsVirtual(HDC);
void ResetEmulatedDC();
int VirtualOffsetX, VirtualOffsetY;
public: // simple data variables
DDPIXELFORMAT ActualPixelFormat;
@ -109,6 +116,8 @@ protected:
BOOL FullScreen;
HWND hWnd, hWndFPS;
DWORD PrimSurfaces[DDSQLEN+1];
HDC VirtualHDC;
HBITMAP VirtualPic;
};
extern dxwCore dxw;

View File

@ -24,7 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "dxwnd.h"
#include "dxwcore.hpp"
#define VERSION "2.02.31"
#define VERSION "2.02.32"
#define DDTHREADLOCK 1

Binary file not shown.

View File

@ -5,17 +5,43 @@
#include "dxhook.h"
#include "dxhelper.h"
/*
dlg->m_DCEmulationMode = 0;
if(t->flags2 & HOOKGDI) dlg->m_DCEmulationMode = 1;
if(t->flags3 & EMULATEDC) dlg->m_DCEmulationMode = 2;
if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3;
*/
static HookEntry_Type Hooks[]={
{"GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps},
{"TextOutA", (FARPROC)TextOutA, (FARPROC *)&pGDITextOutA, (FARPROC)extTextOutA},
{"ScaleWindowExtEx", (FARPROC)ScaleWindowExtEx, (FARPROC *)&pGDIScaleWindowExtEx, (FARPROC)extScaleWindowExtEx},
{"Rectangle", (FARPROC)Rectangle, (FARPROC *)&pGDIRectangle, (FARPROC)extRectangle},
{"SaveDC", (FARPROC)SaveDC, (FARPROC *)&pGDISaveDC, (FARPROC)extGDISaveDC},
{"RestoreDC", (FARPROC)RestoreDC, (FARPROC *)&pGDIRestoreDC, (FARPROC)extGDIRestoreDC},
{"CreatePalette", (FARPROC)CreatePalette, (FARPROC *)&pGDICreatePalette, (FARPROC)extGDICreatePalette},
{"SelectPalette", (FARPROC)SelectPalette, (FARPROC *)&pGDISelectPalette, (FARPROC)extSelectPalette},
{"RealizePalette", (FARPROC)RealizePalette, (FARPROC *)&pGDIRealizePalette, (FARPROC)extRealizePalette},
{"GetSystemPaletteEntries", (FARPROC)GetSystemPaletteEntries, (FARPROC *)&pGDIGetSystemPaletteEntries, (FARPROC)extGetSystemPaletteEntries},
{"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits},
//{"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice},
//{"CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap},
{0, NULL, 0, 0} // terminator
};
static HookEntry_Type RemapHooks[]={
{"SetViewportOrgEx", (FARPROC)SetViewportOrgEx, (FARPROC *)&pSetViewportOrgEx, (FARPROC)extSetViewportOrgEx}, // needed in ShowBanner
{"SetViewportExtEx", (FARPROC)NULL, (FARPROC *)&pSetViewportExtEx, (FARPROC)extSetViewportExtEx},
{"GetViewportOrgEx", (FARPROC)NULL, (FARPROC *)&pGetViewportOrgEx, (FARPROC)extGetViewportOrgEx},
{"GetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pGetWindowOrgEx, (FARPROC)extGetWindowOrgEx},
{"SetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pSetWindowOrgEx, (FARPROC)extSetWindowOrgEx},
{"GetCurrentPositionEx", (FARPROC)NULL, (FARPROC *)&pGetCurrentPositionEx, (FARPROC)extGetCurrentPositionEx},
{"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits}, // unuseful
{"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, // does the stretching
{0, NULL, 0, 0} // terminator
};
static HookEntry_Type ScaledHooks[]={
{"Rectangle", (FARPROC)Rectangle, (FARPROC *)&pGDIRectangle, (FARPROC)extRectangle},
{"TextOutA", (FARPROC)TextOutA, (FARPROC *)&pGDITextOutA, (FARPROC)extTextOutA},
{"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox},
{"Polyline", (FARPROC)NULL, (FARPROC *)&pPolyline, (FARPROC)extPolyline},
{"PolyBezierTo", (FARPROC)NULL, (FARPROC *)&pPolyBezierTo, (FARPROC)extPolyBezierTo},
@ -24,9 +50,6 @@ static HookEntry_Type Hooks[]={
{"MoveToEx", (FARPROC)NULL, (FARPROC *)&pMoveToEx, (FARPROC)extMoveToEx},
{"ArcTo", (FARPROC)NULL, (FARPROC *)&pArcTo, (FARPROC)extArcTo},
{"LineTo", (FARPROC)NULL, (FARPROC *)&pLineTo, (FARPROC)extLineTo},
{"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits},
{"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice},
//{"CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap},
{"SetPixel", (FARPROC)NULL, (FARPROC *)&pSetPixel, (FARPROC)extSetPixel},
{"Ellipse", (FARPROC)NULL, (FARPROC *)&pEllipse, (FARPROC)extEllipse},
{"Polygon", (FARPROC)NULL, (FARPROC *)&pPolygon, (FARPROC)extPolygon},
@ -38,7 +61,10 @@ static HookEntry_Type Hooks[]={
{"CreatePolygonRgn", (FARPROC)NULL, (FARPROC *)&pCreatePolygonRgn, (FARPROC)extCreatePolygonRgn},
{"DrawTextA", (FARPROC)NULL, (FARPROC *)&pDrawText, (FARPROC)extDrawText},
{"DrawTextExA", (FARPROC)NULL, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextEx},
{"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt},
{0, NULL, 0, 0} // terminator
};
static HookEntry_Type EmulateHooks[]={
{0, NULL, 0, 0} // terminator
};
@ -49,6 +75,7 @@ static HookEntry_Type DDHooks[]={
{"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt},
{"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt},
// {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ...
// {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt},
{0, NULL, 0, 0} // terminator
};
@ -59,12 +86,11 @@ static HookEntry_Type GDIHooks[]={
{"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extGDIBitBlt},
{"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extGDIStretchBlt},
{"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extGDIPatBlt},
{"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt},
{0, NULL, 0, 0} // terminator
};
static HookEntry_Type EmuHooks[]={
//{"SetTextColor", (FARPROC)SetTextColor, (FARPROC *)&pGDISetTextColor, (FARPROC)extSetTextColor},
//{"SetBkColor", (FARPROC)SetBkColor, (FARPROC *)&pGDISetBkColor, (FARPROC)extSetBkColor},
{"CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont},
{"CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect},
{0, NULL, 0, 0} // terminator
@ -81,39 +107,79 @@ extern HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFI
static char *libname = "gdi32.dll";
void HookGDI32(HMODULE module)
{
HookLibrary(module, Hooks, libname);
if(dxw.dwFlags1 & MAPGDITOPRIMARY)
HookLibrary(module, DDHooks, libname);
else
HookLibrary(module, GDIHooks, libname);
if ((dxw.dwFlags1 & EMULATESURFACE) && (dxw.dwFlags1 & HANDLEDC))
HookLibrary(module, EmuHooks, libname);
if(dxw.dwFlags2 & DISABLEGAMMARAMP)
HookLibrary(module, GammaHooks, libname);
}
void HookGDI32Init()
{
HookLibInit(Hooks);
HookLibInit(RemapHooks);
HookLibInit(DDHooks);
HookLibInit(EmuHooks);
HookLibInit(GammaHooks);
}
void HookGDI32(HMODULE module)
{
HookLibrary(module, Hooks, libname);
if(dxw.dwFlags1 & CLIENTREMAPPING)
HookLibrary(module, RemapHooks, libname);
if(dxw.dwFlags3 & EMULATEDC)
HookLibrary(module, EmulateHooks, libname);
HookLibrary(module, ScaledHooks, libname);
HookLibrary(module, GDIHooks, libname);
if(dxw.dwFlags2 & HOOKGDI){
HookLibrary(module, EmulateHooks, libname);
HookLibrary(module, ScaledHooks, libname);
HookLibrary(module, GDIHooks, libname);
}
if(dxw.dwFlags1 & MAPGDITOPRIMARY){
HookLibrary(module, EmulateHooks, libname);
HookLibrary(module, ScaledHooks, libname);
HookLibrary(module, DDHooks, libname);
}
if ((dxw.dwFlags1 & EMULATESURFACE) && (dxw.dwFlags1 & HANDLEDC))
HookLibrary(module, EmuHooks, libname);
if(dxw.dwFlags2 & DISABLEGAMMARAMP)
HookLibrary(module, GammaHooks, libname);
}
FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if (addr=RemapLibrary(proc, hModule, Hooks)) return addr;
if(dxw.dwFlags1 & MAPGDITOPRIMARY)
if(addr=RemapLibrary(proc, hModule, DDHooks)) return addr;
else
if(addr=RemapLibrary(proc, hModule, GDIHooks)) return addr;
if(addr=RemapLibrary(proc, hModule, Hooks)) return addr;
if(dxw.dwFlags1 & CLIENTREMAPPING)
if(addr=RemapLibrary(proc, hModule, RemapHooks)) return addr;
if(dxw.dwFlags3 & EMULATEDC){
if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, GDIHooks)) return addr;
}
if(dxw.dwFlags2 & HOOKGDI){
if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, GDIHooks)) return addr;
}
if(dxw.dwFlags1 & MAPGDITOPRIMARY){
if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, DDHooks)) return addr;
}
if ((dxw.dwFlags1 & EMULATESURFACE) && (dxw.dwFlags1 & HANDLEDC))
if(addr=RemapLibrary(proc, hModule, EmuHooks)) return addr;
if(dxw.dwFlags2 & DISABLEGAMMARAMP)
if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr;
return NULL;
}
@ -221,21 +287,35 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex)
OutTraceD("GetDeviceCaps: hdc=%x index=%x(%s) res=%x\n",
hdc, nindex, ExplainDeviceCaps(nindex), res);
#ifdef GDIEMULATIONONLY
switch(nindex){
case VERTRES:
res= dxw.GetScreenHeight();
OutTraceD("GetDeviceCaps: fix(0) VERTRES cap=%d\n", res);
break;
case HORZRES:
res= dxw.GetScreenWidth();
OutTraceD("GetDeviceCaps: fix(0) HORZRES cap=%d\n", res);
break;
}
return res;
#endif
// if you have a bypassed setting, use it first!
if(pSetDevMode){
switch(nindex){
case BITSPIXEL:
case COLORRES:
res = pSetDevMode->dmBitsPerPel;
OutTraceD("GetDeviceCaps: fix BITSPIXEL/COLORRES cap=%x\n",res);
OutTraceD("GetDeviceCaps: fix(1) BITSPIXEL/COLORRES cap=%x\n",res);
return res;
case HORZRES:
res = pSetDevMode->dmPelsWidth;
OutTraceD("GetDeviceCaps: fix HORZRES cap=%d\n", res);
OutTraceD("GetDeviceCaps: fix(1) HORZRES cap=%d\n", res);
return res;
case VERTRES:
res = pSetDevMode->dmPelsHeight;
OutTraceD("GetDeviceCaps: fix VERTRES cap=%d\n", res);
OutTraceD("GetDeviceCaps: fix(1) VERTRES cap=%d\n", res);
return res;
}
}
@ -243,26 +323,26 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex)
switch(nindex){
case VERTRES:
res= dxw.GetScreenHeight();
OutTraceD("GetDeviceCaps: fix VERTRES cap=%d\n", res);
OutTraceD("GetDeviceCaps: fix(2) VERTRES cap=%d\n", res);
break;
case HORZRES:
res= dxw.GetScreenWidth();
OutTraceD("GetDeviceCaps: fix HORZRES cap=%d\n", res);
OutTraceD("GetDeviceCaps: fix(2) HORZRES cap=%d\n", res);
break;
// WARNING: in no-emu mode, the INIT8BPP and INIT16BPP flags expose capabilities that
// are NOT implemented and may cause later troubles!
case RASTERCAPS:
if(dxw.dwFlags2 & INIT8BPP) {
res |= RC_PALETTE; // v2.02.12
OutTraceD("GetDeviceCaps: fix RASTERCAPS setting RC_PALETTE cap=%x\n",res);
OutTraceD("GetDeviceCaps: fix(2) RASTERCAPS setting RC_PALETTE cap=%x\n",res);
}
break;
case BITSPIXEL:
case COLORRES:
if(dxw.dwFlags2 & INIT8BPP|INIT16BPP){
if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix
if(dxw.dwFlags2 & INIT8BPP) res = 8;
if(dxw.dwFlags2 & INIT16BPP) res = 16;
OutTraceD("GetDeviceCaps: fix BITSPIXEL/COLORRES cap=%d\n",res);
OutTraceD("GetDeviceCaps: fix(2) BITSPIXEL/COLORRES cap=%d\n",res);
}
break;
}
@ -272,7 +352,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex)
case RASTERCAPS:
if((dxw.VirtualPixelFormat.dwRGBBitCount==8) || (dxw.dwFlags2 & INIT8BPP)){
res = RC_PALETTE;
OutTraceD("GetDeviceCaps: fix RASTERCAPS setting RC_PALETTE cap=%x\n",res);
OutTraceD("GetDeviceCaps: fix(3) RASTERCAPS setting RC_PALETTE cap=%x\n",res);
}
break;
case BITSPIXEL:
@ -282,15 +362,15 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex)
if(dxw.VirtualPixelFormat.dwRGBBitCount!=0) res = dxw.VirtualPixelFormat.dwRGBBitCount;
if(dxw.dwFlags2 & INIT8BPP) res = 8;
if(dxw.dwFlags2 & INIT16BPP) res = 16;
if(PrevRes != res) OutTraceD("GetDeviceCaps: fix BITSPIXEL/COLORRES cap=%d\n",res);
if(PrevRes != res) OutTraceD("GetDeviceCaps: fix(3) BITSPIXEL/COLORRES cap=%d\n",res);
break;
case SIZEPALETTE:
res = 256;
OutTraceD("GetDeviceCaps: fix SIZEPALETTE cap=%x\n",res);
OutTraceD("GetDeviceCaps: fix(3) SIZEPALETTE cap=%x\n",res);
break;
case NUMRESERVED:
res = 0;
OutTraceD("GetDeviceCaps: fix NUMRESERVED cap=%x\n",res);
OutTraceD("GetDeviceCaps: fix(3) NUMRESERVED cap=%x\n",res);
break;
}
}
@ -317,7 +397,7 @@ BOOL WINAPI extScaleWindowExtEx(HDC hdc, int Xnum, int Xdenom, int Ynum, int Yde
OutTraceD("ScaleWindowExtEx: hdc=%x num=(%d,%d) denom=(%d,%d) lpSize=%d\n",
hdc, Xnum, Ynum, Xdenom, Ydenom, lpSize);
if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()) return 1;
MessageBox(0, "ScaleWindowExtEx", "to fix", MB_OK | MB_ICONEXCLAMATION);
return (*pGDIScaleWindowExtEx)(hdc, Xnum, Xdenom, Ynum, Ydenom, lpSize);
}
@ -703,8 +783,6 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH
// the screen surface later on, on ReleaseDC or ddraw Blit / Flip operation. Scaling of rect coordinates is
// needed only in the first case, and must be avoided on the second, otherwise the image would be scaled twice!
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){
int nWDest, nHDest;
nWDest= nWidth;
@ -900,6 +978,8 @@ int WINAPI extGetClipBox(HDC hdc, LPRECT lprc)
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && (ret!=ERROR)){
OutTraceD("GetClipBox: scaling main win coordinates (%d,%d)-(%d,%d)\n",
lprc->left, lprc->top, lprc->right, lprc->bottom);
// current implementation is NOT accurate, since it always returns the whole
// virtual desktop area as the current clipbox...!!!
*lprc=dxw.GetScreenRect();
}
OutTraceD("GetClipBox: ret=%x(%s)\n", ret, sRetCodes[ret]);
@ -1047,9 +1127,16 @@ int WINAPI extStretchDIBits(HDC hdc, int XDest, int YDest, int nDestWidth, int n
OutTraceD("StretchDIBits: hdc=%x dest=(%d,%d)-(%d,%d) src=(%d,%d)-(%d,%d) rop=%x(%s)\n",
hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc, nSrcWidth, nSrcHeight, dwRop, ExplainROP(dwRop));
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.MapClient(&XDest, &YDest, &nDestWidth, &nDestHeight);
OutTraceD("StretchDIBits: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, nDestWidth, nDestHeight);
if (dxw.IsFullScreen()){
if(dxw.IsVirtual(hdc)){
XDest+=dxw.VirtualOffsetX;
YDest+=dxw.VirtualOffsetY;
OutTraceD("StretchDIBits: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, nDestWidth, nDestHeight);
}
else if (OBJ_DC == GetObjectType(hdc)){
dxw.MapClient(&XDest, &YDest, &nDestWidth, &nDestHeight);
OutTraceD("StretchDIBits: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, nDestWidth, nDestHeight);
}
}
ret=(*pStretchDIBits)(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc, nSrcWidth, nSrcHeight, lpBits, lpBitsInfo, iUsage, dwRop);
@ -1068,6 +1155,17 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW
OutTraceD("SetDIBitsToDevice: BitmapInfo dim=(%dx%d) Planes=%d BPP=%d Compression=%x SizeImage=%x\n",
bmi->biWidth, bmi->biHeight, bmi->biPlanes, bmi->biBitCount, bmi->biCompression, bmi->biSizeImage);
if (dxw.IsFullScreen() && dxw.IsVirtual(hdc)){
int X, Y;
X=XDest+dxw.VirtualOffsetX;
Y=YDest+dxw.VirtualOffsetY;
OutTraceD("SetDIBitsToDevice: virtual pos=(%d,%d)+(%d+%d)=(%d,%d)\n",
XDest, YDest, dxw.VirtualOffsetX, dxw.VirtualOffsetY, X, Y);
ret=(*pSetDIBitsToDevice)(hdc, X, Y, dwWidth, dwHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
if(!ret || (ret==GDI_ERROR)) OutTraceE("SetDIBitsToDevice: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
//else
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
DWORD OrigWidth, OrigHeight;
int OrigXDest, OrigYDest;
@ -1092,7 +1190,10 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW
OutTraceE("SetDIBitsToDevice: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!(ret=(*pGDIStretchBlt)(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY)))
OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
DeleteDC(hTempDc);
if(!(DeleteObject(hbmPic))) // v2.02.32 - avoid resource leakage
OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
if(!(DeleteDC(hTempDc)))
OutTraceE("DeleteDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__);
}
else{
ret=(*pSetDIBitsToDevice)(hdc, XDest, YDest, dwWidth, dwHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
@ -1321,6 +1422,139 @@ BOOL WINAPI extMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHei
return ret;
}
BOOL WINAPI extSetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint)
{
BOOL ret;
OutTraceD("SetViewportOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y);
if(dxw.IsVirtual(hdc)) {
OutTraceD("SetViewportOrgEx: virtual hdc\n");
dxw.VirtualOffsetX = X;
dxw.VirtualOffsetY = Y;
return TRUE;
}
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.MapClient(&X, &Y);
OutTraceD("SetViewportOrgEx: fixed pos=(%d,%d)\n", X, Y);
}
ret=(*pSetViewportOrgEx)(hdc, X, Y, lpPoint);
if(ret && lpPoint) {
OutTraceD("SetViewportOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient(lpPoint);
OutTraceD("SetViewportOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
}
if(!ret) OutTraceE("SetViewportOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
BOOL WINAPI extSetViewportExtEx(HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize)
{
BOOL ret;
OutTraceD("SetViewportExtEx: hdc=%x ext=(%d,%d)\n", hdc, nXExtent, nYExtent);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.MapClient(&nXExtent, &nYExtent);
OutTraceD("SetViewportExtEx: fixed ext=(%d,%d)\n", nXExtent, nYExtent);
}
ret=(*pSetViewportExtEx)(hdc, nXExtent, nYExtent, lpSize);
if(ret && lpSize) {
OutTraceD("SetViewportExtEx: previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient((LPPOINT)lpSize);
OutTraceD("SetViewportExtEx: fixed previous ext=(%d,%d)\n", lpSize->cx, lpSize->cy);
}
}
if(!ret) OutTraceE("SetViewportExtEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
BOOL WINAPI extGetViewportOrgEx(HDC hdc, LPPOINT lpPoint)
{
BOOL ret;
OutTraceD("GetViewportOrgEx: hdc=%x\n", hdc);
if(dxw.IsVirtual(hdc)) {
lpPoint->x = dxw.VirtualOffsetX;
lpPoint->y = dxw.VirtualOffsetY;
return TRUE;
}
ret=(*pGetViewportOrgEx)(hdc, lpPoint);
if(ret) {
OutTraceD("GetViewportOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient(lpPoint);
OutTraceD("GetViewportOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
}
if(!ret) OutTraceE("GetViewportOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
BOOL WINAPI extGetWindowOrgEx(HDC hdc, LPPOINT lpPoint)
{
BOOL ret;
OutTraceD("GetWindowOrgEx: hdc=%x\n", hdc);
ret=(*pGetWindowOrgEx)(hdc, lpPoint);
if(ret) {
OutTraceD("GetWindowOrgEx: ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient(lpPoint);
OutTraceD("GetWindowOrgEx: fixed ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
}
if(!ret) OutTraceE("GetWindowOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
BOOL WINAPI extSetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint)
{
BOOL ret;
OutTraceD("SetWindowOrgEx: hdc=%x pos=(%d,%d)\n", hdc, X, Y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.MapClient(&X, &Y);
OutTraceD("SetWindowOrgEx: fixed pos=(%d,%d)\n", X, Y);
}
ret=(*pSetWindowOrgEx)(hdc, X, Y, lpPoint);
if(ret && lpPoint) {
OutTraceD("SetWindowOrgEx: previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient(lpPoint);
OutTraceD("SetWindowOrgEx: fixed previous ViewPort=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
}
if(!ret) OutTraceE("SetWindowOrgEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
BOOL WINAPI extGetCurrentPositionEx(HDC hdc, LPPOINT lpPoint)
{
BOOL ret;
OutTraceD("GetCurrentPositionEx: hdc=%x\n", hdc);
ret=(*pGetCurrentPositionEx)(hdc, lpPoint);
if(ret) {
OutTraceD("GetCurrentPositionEx: pos=(%d,%d)\n", lpPoint->x, lpPoint->y);
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
dxw.UnmapClient(lpPoint);
OutTraceD("GetCurrentPositionEx: fixed pos=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
}
if(!ret) OutTraceE("GetCurrentPositionEx: ERROR ret=%x err=%d\n", ret, GetLastError());
return ret;
}
#if 0
// to map:
// GetCurrentPositionEx
@ -1332,6 +1566,7 @@ BOOL WINAPI extMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHei
// OffsetWindowOrgEx
// TransparentBlt
// to do: eliminate FIXTEXTOUT handling
// GetDCEx
BOOL SetTextJustification(
_In_ HDC hdc,

View File

@ -82,6 +82,12 @@ typedef HRGN (WINAPI *CreatePolygonRgn_Type)(const POINT *, int, int);
typedef int (WINAPI *DrawText_Type)(HDC, LPCTSTR, int, LPRECT, UINT);
typedef int (WINAPI *DrawTextEx_Type)(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
typedef BOOL (WINAPI *MaskBlt_Type)(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD);
typedef BOOL (WINAPI *SetViewportOrgEx_Type)(HDC, int, int, LPPOINT);
typedef BOOL (WINAPI *SetViewportExtEx_Type)(HDC, int, int, LPSIZE);
typedef BOOL (WINAPI *GetViewportOrgEx_Type)(HDC, LPPOINT);
typedef BOOL (WINAPI *GetWindowOrgEx_Type)(HDC, LPPOINT);
typedef BOOL (WINAPI *SetWindowOrgEx_Type)(HDC, int, int, LPPOINT);
typedef BOOL (WINAPI *GetCurrentPositionEx_Type)(HDC, LPPOINT);
// Kernel32.dll:
typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD);
@ -151,6 +157,8 @@ typedef BOOL (WINAPI *ShowWindow_Type)(HWND, int);
typedef LONG (WINAPI *TabbedTextOutA_Type)(HDC, int, int, LPCTSTR, int, int, const LPINT, int);
typedef BOOL (WINAPI *DestroyWindow_Type)(HWND);
typedef BOOL (WINAPI *CloseWindow_Type)(HWND);
typedef BOOL (WINAPI *SetSysColors_Type)(int, const INT *, const COLORREF *);
typedef HDC (WINAPI *GetDCEx_Type)(HWND, HRGN, DWORD);
// Winmm.dll:
typedef MCIERROR(WINAPI *mciSendCommand_Type)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
@ -239,6 +247,12 @@ DXWEXTERN CreatePolygonRgn_Type pCreatePolygonRgn DXWINITIALIZED;
DXWEXTERN DrawText_Type pDrawText DXWINITIALIZED;
DXWEXTERN DrawTextEx_Type pDrawTextEx DXWINITIALIZED;
DXWEXTERN MaskBlt_Type pMaskBlt DXWINITIALIZED;
DXWEXTERN SetViewportOrgEx_Type pSetViewportOrgEx DXWINITIALIZED;
DXWEXTERN SetViewportExtEx_Type pSetViewportExtEx DXWINITIALIZED;
DXWEXTERN GetViewportOrgEx_Type pGetViewportOrgEx DXWINITIALIZED;
DXWEXTERN GetWindowOrgEx_Type pGetWindowOrgEx DXWINITIALIZED;
DXWEXTERN SetWindowOrgEx_Type pSetWindowOrgEx DXWINITIALIZED;
DXWEXTERN GetCurrentPositionEx_Type pGetCurrentPositionEx DXWINITIALIZED;
// Kernel32.dll:
DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED;
@ -309,6 +323,8 @@ DXWEXTERN ShowWindow_Type pShowWindow DXWINITIALIZED;
DXWEXTERN TabbedTextOutA_Type pTabbedTextOutA DXWINITIALIZED;
DXWEXTERN DestroyWindow_Type pDestroyWindow DXWINITIALIZED;
DXWEXTERN CloseWindow_Type pCloseWindow DXWINITIALIZED;
DXWEXTERN SetSysColors_Type pSetSysColors DXWINITIALIZED;
DXWEXTERN GetDCEx_Type pGDIGetDCEx DXWINITIALIZED;
// Winmm.dll:
DXWEXTERN mciSendCommand_Type pmciSendCommand DXWINITIALIZED;
@ -390,6 +406,12 @@ extern HRGN WINAPI extCreatePolygonRgn(const POINT *, int, int);
extern int WINAPI extDrawText(HDC, LPCTSTR, int, LPRECT, UINT);
extern int WINAPI extDrawTextEx(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
extern BOOL WINAPI extMaskBlt(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD);
extern BOOL WINAPI extSetViewportOrgEx(HDC, int, int, LPPOINT);
extern BOOL WINAPI extSetViewportExtEx(HDC, int, int, LPSIZE);
extern BOOL WINAPI extGetViewportOrgEx(HDC, LPPOINT);
extern BOOL WINAPI extGetWindowOrgEx(HDC, LPPOINT);
extern BOOL WINAPI extSetWindowOrgEx(HDC, int, int, LPPOINT);
extern BOOL WINAPI extGetCurrentPositionEx(HDC, LPPOINT);
// Kernel32.dll:
extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD);
@ -464,6 +486,8 @@ extern BOOL WINAPI extShowWindow(HWND, int);
extern LONG WINAPI extTabbedTextOutA(HDC, int, int, LPCTSTR, int, int, const LPINT, int);
extern BOOL WINAPI extDestroyWindow(HWND);
extern BOOL WINAPI extCloseWindow(HWND);
extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *);
extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD);
// Winmm.dll:

View File

@ -33,6 +33,14 @@ static HookEntry_Type Hooks[]={
{"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA},
{"CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow},
{"DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow},
{"SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors},
{0, NULL, 0, 0} // terminator
};
static HookEntry_Type EmulateHooks[]={
{"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
//{"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetDC}, // not ready yet
{"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC},
{0, NULL, 0, 0} // terminator
};
@ -46,6 +54,7 @@ static HookEntry_Type DDHooks[]={
static HookEntry_Type GDIHooks[]={
{"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC},
{"GetDCEx", (FARPROC)NULL, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx},
{"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetDC},
{"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC},
{"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect},
@ -95,6 +104,8 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if (addr=RemapLibrary(proc, hModule, Hooks)) return addr;
if ((dxw.dwFlags3 & EMULATEDC) || (dxw.dwFlags2 & HOOKGDI) || (dxw.dwFlags1 & MAPGDITOPRIMARY))
if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr;
if (addr=RemapLibrary(proc, hModule, (dxw.dwFlags1 & MAPGDITOPRIMARY) ? DDHooks : GDIHooks)) return addr;
if (dxw.dwFlags1 & CLIENTREMAPPING)
if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr;
@ -114,7 +125,8 @@ static char *libname = "user32.dll";
void HookUser32(HMODULE hModule)
{
HookLibrary(hModule, Hooks, libname);
if ((dxw.dwFlags3 & EMULATEDC) || (dxw.dwFlags2 & HOOKGDI) || (dxw.dwFlags1 & MAPGDITOPRIMARY))
HookLibrary(hModule, EmulateHooks, libname);
HookLibrary(hModule, (dxw.dwFlags1 & MAPGDITOPRIMARY) ? DDHooks : GDIHooks, libname);
if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname);
if (dxw.dwFlags1 & MESSAGEPROC) HookLibrary(hModule, MessageHooks, libname);
@ -162,6 +174,9 @@ LONG WINAPI MyChangeDisplaySettings(char *fname, DEVMODE *lpDevMode, DWORD dwfla
{
HRESULT res;
// v2.02.32: reset the emulated DC used in EMULATEDC mode
dxw.ResetEmulatedDC();
// save desired settings first v.2.1.89
// v2.1.95 protect when lpDevMode is null (closing game... Jedi Outcast)
// v2.2.23 consider new width/height only when dmFields flags are set.
@ -218,8 +233,16 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam)
OutTraceD("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n",
ApiName, hwnd, wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags));
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
int UpdFlag = 0;
if(wp->cx>MaxX) { wp->cx=MaxX; UpdFlag=1; }
if(wp->cy>MaxY) { wp->cy=MaxY; UpdFlag=1; }
if (UpdFlag)
OutTraceD("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy);
}
if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13
//if (wp->flags & (SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.10
if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){
extern void CalculateWindowPos(HWND, DWORD, DWORD, LPWINDOWPOS);
@ -265,15 +288,6 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam)
}
}
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
int UpdFlag = 0;
if(wp->cx>MaxX) { wp->cx=MaxX; UpdFlag=1; }
if(wp->cy>MaxY) { wp->cy=MaxY; UpdFlag=1; }
if (UpdFlag)
OutTraceD("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy);
}
iLastCX= wp->cx;
iLastCY= wp->cy;
}
@ -493,11 +507,15 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong)
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
if(nIndex==GWL_STYLE){
OutTraceD("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong);
dwNewLong |= WS_OVERLAPPEDWINDOW;
dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_POPUP|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS);
dwNewLong &= ~WS_MAXIMIZE;
if(dxw.IsDesktop(hwnd)){
OutTraceD("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong);
dwNewLong |= WS_OVERLAPPEDWINDOW;
dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS);
}
}
if(nIndex==GWL_EXSTYLE){
// v2.02.32: disable topmost for main window only
if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){
OutTraceD("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong);
dwNewLong = dwNewLong & ~(WS_EX_TOPMOST);
}
@ -544,7 +562,8 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c
OutTraceD("SetWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n",
hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags);
if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){
//if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){
if (!dxw.IsDesktop(hwnd) || !dxw.IsFullScreen()){
// just proxy
res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags);
if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__);
@ -555,6 +574,7 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c
// Note: any attempt to change the window position, no matter where and how, through the
// SetWindowPos API is causing resizing to the default 1:1 pixed size in Commandos.
// in such cases, there is incompatibility between LOCKWINPOS and LOCKWINSTYLE.
OutTraceD("SetWindowPos: locked position\n");
return 1;
}
@ -1028,8 +1048,9 @@ static HWND WINAPI extCreateWindowCommon(
// no maximized windows in any case
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
OutTraceD("%s: handling PREVENTMAXIMIZE mode\n", ApiName);
dwStyle &= ~(WS_MAXIMIZE | WS_POPUP);
dwExStyle &= ~WS_EX_TOPMOST;
dwStyle &= ~WS_MAXIMIZE;
//dwStyle &= ~(WS_MAXIMIZE | WS_POPUP);
//dwExStyle &= ~WS_EX_TOPMOST;
}
// v2.1.92: fixes size & position for auxiliary big window, often used
@ -1045,7 +1066,7 @@ static HWND WINAPI extCreateWindowCommon(
((x<=0)&&(y<=0)) || ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT))
)
&&
(((DWORD)nWidth>=dxw.GetScreenWidth())&&((DWORD)nHeight>=dxw.GetScreenHeight()))
((nWidth>=(int)dxw.GetScreenWidth())&&(nHeight>=(int)dxw.GetScreenHeight()))
&&
!(dwExStyle & WS_EX_CONTROLPARENT) // Diablo fix
&&
@ -1427,21 +1448,11 @@ HDC WINAPI extGDIGetDC(HWND hwnd)
lochwnd=dxw.GethWnd();
}
#if 0
dxw.lpDDSPrimHDC=dxw.GetPrimarySurface();
if(dxw.lpDDSPrimHDC){
HRESULT rc;
OutTraceD("GDI.GetDC: using ddraw primary lpdds=%x\n", dxw.lpDDSPrimHDC);
rc=(*pGetDC)(dxw.lpDDSPrimHDC, &ret);
if(rc)
OutTraceE("GDI.GetDC ERROR: err=%x(%s) at %d\n", rc, ExplainDDError(rc), __LINE__);
else
OutTraceD("GDI.GetDC: hwnd=%x ret=%x\n", hwnd, ret);
return ret;
}
#endif
ret=(*pGDIGetDC)(lochwnd);
if(dxw.dwFlags3 & EMULATEDC)
ret=dxw.AcquireEmulatedDC(lochwnd);
else
ret=(*pGDIGetDC)(lochwnd);
if(ret){
OutTraceD("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret);
}
@ -1461,6 +1472,12 @@ HDC WINAPI extGDIGetDC(HWND hwnd)
return ret;
}
HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags)
{
MessageBox(0, "GetDCEx", "to fix", MB_OK | MB_ICONEXCLAMATION);
return (HDC)NULL;
}
HDC WINAPI extGDIGetWindowDC(HWND hwnd)
{
HDC ret;
@ -1471,7 +1488,9 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd)
OutTraceD("GDI.GetWindowDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd());
lochwnd=dxw.GethWnd();
}
ret=(*pGDIGetWindowDC)(lochwnd);
if(ret){
OutTraceD("GDI.GetWindowDC: hwnd=%x ret=%x\n", lochwnd, ret);
}
@ -1497,23 +1516,11 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC)
OutTraceD("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC);
if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd();
#if 0
if(dxw.lpDDSPrimHDC){
HRESULT rc;
OutTraceD("GDI.ReleaseDC: using ddraw primary lpdds=%x\n", dxw.lpDDSPrimHDC);
rc=(*pReleaseDC)(dxw.lpDDSPrimHDC, hDC);
sBlt("ReleaseDC", dxw.lpDDSPrimHDC, NULL, dxw.lpDDSPrimHDC, NULL, DDBLT_WAIT, 0, TRUE);
if(rc) {
OutTraceE("GDI.ReleaseDC ERROR: hwnd=%x err=%x(%s) at %d\n", hwnd, rc, ExplainDDError(rc), __LINE__);
}
else {
sBlt("ReleaseDC", dxw.lpDDSPrimHDC, NULL, dxw.lpDDSPrimHDC, NULL, DDBLT_WAIT, 0, TRUE);
}
return (rc ? 0 : 1);
}
#endif
res=(*pGDIReleaseDC)(hwnd, hDC);
if(dxw.dwFlags3 & EMULATEDC)
res=dxw.ReleaseEmulatedDC(hwnd);
else
res=(*pGDIReleaseDC)(hwnd, hDC);
if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__);
return(res);
}
@ -1527,11 +1534,11 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint)
OutTraceD("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen());
hdc=(*pBeginPaint)(hwnd, lpPaint);
//return hdc;
// if not in fullscreen mode, that's all!
if(!dxw.IsFullScreen()) return hdc;
if(dxw.dwFlags3 & EMULATEDC) return dxw.AcquireEmulatedDC(hwnd);
// on MAPGDITOPRIMARY, return the PrimHDC handle instead of the window DC
if(dxw.dwFlags1 & MAPGDITOPRIMARY) {
if(pGetDC && dxw.lpDDSPrimHDC){
@ -1560,8 +1567,17 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint)
BOOL ret;
HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc);
// proxy part ...
OutTraceD("GDI.EndPaint: hwnd=%x lpPaint=%x\n", hwnd, lpPaint);
if((dxw.dwFlags3 & EMULATEDC) && dxw.IsFullScreen()){
ret=dxw.ReleaseEmulatedDC(hwnd);
ret=(*pEndPaint)(hwnd, lpPaint);
OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret);
if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__);
return ret;
}
// proxy part ...
ret=(*pEndPaint)(hwnd, lpPaint);
OutTraceD("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret);
if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__);
@ -1782,3 +1798,16 @@ BOOL WINAPI extCloseWindow(HWND hWnd)
if(!res)OutTraceE("CloseWindow: ERROR err=%d\n", GetLastError());
return res;
}
BOOL WINAPI extSetSysColors(int cElements, const INT *lpaElements, const COLORREF *lpaRgbValues)
{
// v2.02.32: added to avoid SysColors changes by "Western Front"
BOOL ret;
OutTraceD("SetSysColors: Elements=%d\n", cElements);
if(dxw.dwFlags3 & LOCKSYSCOLORS) return TRUE;
ret=(*pSetSysColors)(cElements, lpaElements, lpaRgbValues);
if(!ret) OutTraceE("SetSysColors: ERROR er=%d\n", GetLastError());
return ret;
}

View File

@ -93,7 +93,6 @@
#define IDC_SIZY 1049
#define IDC_HOOKCHILDWIN 1050
#define IDC_MESSAGEPROC 1051
#define IDC_MAPGDITOPRIMARY 1052
#define IDC_RECOVERSCREENMODE 1053
#define IDC_REFRESHONRESIZE 1054
#define IDC_BACKBUFATTACH 1055
@ -107,7 +106,6 @@
#define IDC_CURSORTRACE 1063
#define IDC_IMPORTTABLE 1064
#define IDC_HANDLEEXCEPTIONS 1065
#define IDC_IMPORTTABLE2 1065
#define IDC_BLITFROMBACKBUFFER 1066
#define IDC_OUTDEBUG 1067
#define IDC_SUPPRESSCLIPPING 1068
@ -160,6 +158,11 @@
#define IDC_OUTREGISTRY 1115
#define IDC_NOWINDOWMOVE 1116
#define IDC_DISABLEHAL 1117
#define IDC_LOCKSYSCOLORS 1118
#define IDC_GDINONE 1119
#define IDC_GDISCALED 1120
#define IDC_EMULATEDC 1121
#define IDC_MAPGDITOPRIMARY 1122
#define ID_MODIFY 32771
#define ID_DELETE 32772
#define ID_ADD 32773
@ -209,7 +212,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 156
#define _APS_NEXT_COMMAND_VALUE 32825
#define _APS_NEXT_CONTROL_VALUE 1091
#define _APS_NEXT_CONTROL_VALUE 1092
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -33,6 +33,7 @@ void CTabColor::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_WIREFRAME, cTarget->m_WireFrame);
DDX_Check(pDX, IDC_BLACKWHITE, cTarget->m_BlackWhite);
DDX_Check(pDX, IDC_USERGB565, cTarget->m_UseRGB565);
DDX_Check(pDX, IDC_LOCKSYSCOLORS, cTarget->m_LockSysColors);
}
BEGIN_MESSAGE_MAP(CTabColor, CDialog)

View File

@ -26,9 +26,8 @@ void CTabGDI::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
DDX_Radio(pDX, IDC_GDINONE, cTarget->m_DCEmulationMode);
DDX_Check(pDX, IDC_FIXTEXTOUT, cTarget->m_FixTextOut);
DDX_Check(pDX, IDC_HOOKGDI, cTarget->m_HookGDI);
DDX_Check(pDX, IDC_MAPGDITOPRIMARY, cTarget->m_MapGDIToPrimary);
}
BEGIN_MESSAGE_MAP(CTabGDI, CDialog)

View File

@ -21,6 +21,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_DXVersion = -1;
m_Coordinates = 0;
m_DxEmulationMode = 0; // default: no emulation
m_DCEmulationMode = 0; // default: no emulation
m_HookDI = FALSE;
m_ModifyMouse = TRUE; // default true !!
m_OutTrace = FALSE;
@ -35,6 +36,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SuppressD3DExt = FALSE;
m_SetCompatibility = FALSE;
m_DisableHAL = FALSE;
m_LockSysColors = FALSE;
m_SaveCaps = FALSE;
m_SingleProcAffinity = FALSE;
m_LimitResources = FALSE;
@ -68,14 +70,12 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_MarkBlit = FALSE;
m_PreventMaximize = FALSE;
m_ClientRemapping = TRUE; // default true !!
m_MapGDIToPrimary = FALSE;
m_LockWinPos = FALSE;
m_LockWinStyle = FALSE;
m_FixParentWin = FALSE;
m_ModalStyle = FALSE;
m_KeepAspectRatio = FALSE;
m_ForceWinResize = FALSE;
m_HookGDI = FALSE;
m_HideMultiMonitor = FALSE;
m_WallpaperMode = FALSE;
m_FixD3DFrame = FALSE;

View File

@ -26,6 +26,7 @@ public:
int m_DXVersion;
int m_Coordinates;
int m_DxEmulationMode;
int m_DCEmulationMode;
BOOL m_HookDI;
BOOL m_ModifyMouse;
BOOL m_OutTrace;
@ -70,14 +71,12 @@ public:
BOOL m_MarkBlit;
BOOL m_PreventMaximize;
BOOL m_ClientRemapping;
BOOL m_MapGDIToPrimary;
BOOL m_LockWinPos;
BOOL m_LockWinStyle;
BOOL m_FixParentWin;
BOOL m_ModalStyle;
BOOL m_KeepAspectRatio;
BOOL m_ForceWinResize;
BOOL m_HookGDI;
BOOL m_HideMultiMonitor;
BOOL m_WallpaperMode;
BOOL m_FixD3DFrame;
@ -107,6 +106,7 @@ public:
BOOL m_SuppressIME;
BOOL m_SetCompatibility;
BOOL m_DisableHAL;
BOOL m_LockSysColors;
BOOL m_SaveCaps;
BOOL m_SingleProcAffinity;
BOOL m_WireFrame;

Binary file not shown.

View File

@ -438,10 +438,12 @@ IDD_TAB_GDI DIALOGEX 0, 0, 300, 240
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CONTROL "Scale font parameters",IDC_FIXTEXTOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,28,125,10
GROUPBOX "GDI Handling",IDC_STATIC,6,3,140,51
CONTROL "Hook GDI",IDC_HOOKGDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,16,119,10
CONTROL "Map GDI HDC to Primary DC",IDC_MAPGDITOPRIMARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,40,119,10
GROUPBOX "GDI Handling",IDC_STATIC,6,7,140,131
CONTROL "No GDI handling",IDC_GDINONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,17,26,67,10
CONTROL "Scaled GDI calls",IDC_HOOKGDI,"Button",BS_AUTORADIOBUTTON,17,38,66,10
CONTROL "Emulated Device Context",IDC_EMULATEDC,"Button",BS_AUTORADIOBUTTON,17,50,97,10
CONTROL "Map DC to Primary Surface",IDC_MAPGDITOPRIMARY,"Button",BS_AUTORADIOBUTTON,17,62,102,10
CONTROL "Scale font parameters",IDC_FIXTEXTOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,110,125,10
END
IDD_TAB_COLOR DIALOGEX 0, 0, 300, 240
@ -456,6 +458,7 @@ BEGIN
CONTROL "3D Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,64,96,10
CONTROL "Simulate BW monitor",IDC_BLACKWHITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,76,96,10
CONTROL "Set 16BPP RGB565 encoding",IDC_USERGB565,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,88,126,9
CONTROL "Lock Sys Colors",IDC_LOCKSYSCOLORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,100,126,9
END

Binary file not shown.

View File

@ -121,6 +121,15 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
case 2: t->flags |= LOCKEDSURFACE; break;
case 3: t->flags |= EMULATESURFACE; break;
}
t->flags2 &= ~HOOKGDI;
t->flags &= ~MAPGDITOPRIMARY;
t->flags3 &= ~EMULATEDC;
switch(dlg->m_DCEmulationMode){
case 0: break;
case 1: t->flags2 |= HOOKGDI; break;
case 2: t->flags3 |= EMULATEDC; break;
case 3: t->flags |= MAPGDITOPRIMARY; break;
}
if(dlg->m_HookDI) t->flags |= HOOKDI;
if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE;
if(dlg->m_OutTrace) t->tflags |= OUTDDRAWTRACE;
@ -141,6 +150,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT;
if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY;
if(dlg->m_DisableHAL) t->flags3 |= DISABLEHAL;
if(dlg->m_LockSysColors) t->flags3 |= LOCKSYSCOLORS;
if(dlg->m_SaveCaps) t->flags3 |= SAVECAPS;
if(dlg->m_SingleProcAffinity) t->flags3 |= SINGLEPROCAFFINITY;
if(dlg->m_SaveLoad) t->flags |= SAVELOAD;
@ -163,14 +173,12 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_MarkBlit) t->flags3 |= MARKBLIT;
if(dlg->m_PreventMaximize) t->flags |= PREVENTMAXIMIZE;
if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING;
if(dlg->m_MapGDIToPrimary) t->flags |= MAPGDITOPRIMARY;
if(dlg->m_LockWinPos) t->flags |= LOCKWINPOS;
if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE;
if(dlg->m_FixParentWin) t->flags |= FIXPARENTWIN;
if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE;
if(dlg->m_KeepAspectRatio) t->flags2 |= KEEPASPECTRATIO;
if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE;
if(dlg->m_HookGDI) t->flags2 |= HOOKGDI;
if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR;
if(dlg->m_WallpaperMode) t->flags2 |= WALLPAPERMODE;
if(dlg->m_FixD3DFrame) t->flags3 |= FIXD3DFRAME;
@ -235,6 +243,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
if(t->flags & LOCKEDSURFACE) dlg->m_DxEmulationMode = 2;
if(t->flags & EMULATESURFACE) dlg->m_DxEmulationMode = 3;
dlg->m_DCEmulationMode = 0;
if(t->flags2 & HOOKGDI) dlg->m_DCEmulationMode = 1;
if(t->flags3 & EMULATEDC) dlg->m_DCEmulationMode = 2;
if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3;
dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0;
dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0;
dlg->m_OutTrace = t->tflags & OUTDDRAWTRACE ? 1 : 0;
@ -253,6 +266,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0;
dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0;
dlg->m_DisableHAL = t->flags3 & DISABLEHAL ? 1 : 0;
dlg->m_LockSysColors = t->flags3 & LOCKSYSCOLORS ? 1 : 0;
dlg->m_SaveCaps = t->flags3 & SAVECAPS ? 1 : 0;
dlg->m_SingleProcAffinity = t->flags3 & SINGLEPROCAFFINITY ? 1 : 0;
dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0;
@ -277,14 +291,12 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_MarkBlit = t->flags3 & MARKBLIT ? 1 : 0;
dlg->m_PreventMaximize = t->flags & PREVENTMAXIMIZE ? 1 : 0;
dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0;
dlg->m_MapGDIToPrimary = t->flags & MAPGDITOPRIMARY ? 1 : 0;
dlg->m_LockWinPos = t->flags & LOCKWINPOS ? 1 : 0;
dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0;
dlg->m_FixParentWin = t->flags & FIXPARENTWIN ? 1 : 0;
dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0;
dlg->m_KeepAspectRatio = t->flags2 & KEEPASPECTRATIO ? 1 : 0;
dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0;
dlg->m_HookGDI = t->flags2 & HOOKGDI ? 1 : 0;
dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0;
dlg->m_WallpaperMode = t->flags2 & WALLPAPERMODE ? 1 : 0;
dlg->m_FixD3DFrame = t->flags3 & FIXD3DFRAME ? 1 : 0;