From 3db9abb9ba5bec229eb465c35e7a5fa3fdd209c2 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 30 Aug 2013 12:38:14 -0400 Subject: [PATCH] v2_02_32_src Former-commit-id: fe45ae6a326109606378d67a657b9f0080001fd2 --- Include/dxwnd.h | 2 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 283 +++++++++++++++++++++++---------- build/readme-relnotes.txt | 12 +- dll/ddraw.cpp | 39 +++-- dll/dxhook.cpp | 17 +- dll/dxwcore.cpp | 97 +++++++++++- dll/dxwcore.hpp | 9 ++ dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 190464 -> 186368 bytes dll/gdi32.cpp | 325 ++++++++++++++++++++++++++++++++------ dll/syslibs.h | 24 +++ dll/user32.cpp | 137 +++++++++------- host/Resource.h | 9 +- host/TabColor.cpp | 1 + host/TabGDI.cpp | 3 +- host/TargetDlg.cpp | 4 +- host/TargetDlg.h | 4 +- host/dxwndhost.aps | Bin 162364 -> 140852 bytes host/dxwndhost.rc | 11 +- host/dxwndhost.vs2008.suo | Bin 300032 -> 301568 bytes host/dxwndhostView.cpp | 20 ++- 23 files changed, 775 insertions(+), 230 deletions(-) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index ff68a31..c5c9c31 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -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 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 20beb27..ecaa169 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff5e1a04f90b69aaeac5520885d280a978746c9674a5085725d17d45593af92a -size 378368 +oid sha256:47630d9ec2f6d6c9eb9b588acadace0fa49394596c03a977bb3d062a07a60074 +size 385024 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 2b35524..875807d 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a15a98b4e75ff8b03d04af4bf9b30445a6af7324468d3276316063fede54375a +oid sha256:f985fae11aaa4f10de4c9135577527784e1b153c6403a2f5b01666f0996b8a29 size 524288 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 87e2011..4c98059 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -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 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index a4408ae..55f7628 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index c8bf804..8902eb1 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -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__); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4167413..5503136 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -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); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index a5f2e80..6f3eed6 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -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); +} diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 48d475b..4b912fb 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -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; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 5c59ddf..06cdc25 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.31" +#define VERSION "2.02.32" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 74a50d904141fe0cd54ad032db0461f837b6bb7b..b327df8810f53769ee839902c19c15f8c151d019 100644 GIT binary patch delta 16345 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 delta 24698 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 ZbZCyh>iRE#h$k6;^cQm%G>-Ul{~zU;z&8K@ diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 3dd8717..4b47582 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -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, diff --git a/dll/syslibs.h b/dll/syslibs.h index f2c8401..e2b2c98 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -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: diff --git a/dll/user32.cpp b/dll/user32.cpp index c6b8a8b..adc21d9 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -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; +} diff --git a/host/Resource.h b/host/Resource.h index c005824..c256518 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -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 diff --git a/host/TabColor.cpp b/host/TabColor.cpp index 7802c47..692c411 100644 --- a/host/TabColor.cpp +++ b/host/TabColor.cpp @@ -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) diff --git a/host/TabGDI.cpp b/host/TabGDI.cpp index 7531046..9eda571 100644 --- a/host/TabGDI.cpp +++ b/host/TabGDI.cpp @@ -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) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index fc78335..0f75ead 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -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; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index d0c95d1..a18a025 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -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; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 35bd6aea5e9db4b3926f4579ce52453b1f2c624c..f0015a50fa15a8f0baafc946b173b9285f09a3f0 100644 GIT binary patch delta 4630 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 delta 17785 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 fjU^X+eD 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 |= 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;