From a8a8f528684db031fe9138ab71562fdb9e89b0d0 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 27 Jan 2017 11:49:51 -0500 Subject: [PATCH] v2_04_08_src_fx1 Former-commit-id: eca03ce516319410cb1425bcca860a897f859006 --- Include/dxwnd.h | 2 + Release/.gitattributes | 1 + Release/dxwnd.dll | 3 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/Banzai Bug.dxw | 13 +- build/exports/Tomb Raider III.dxw | 15 +- ...hammer - Shadow of the Horned Rat (x2).dxw | 36 ++++ .../Warhammer - Shadow of the Horned Rat.dxw | 36 ++++ build/exports/dxwnd.reg | 52 +++++ build/readme-relnotes.txt | 14 +- dll/advapi.cpp | 38 ---- dll/ddcreates.cpp | 31 ++- dll/ddraw.cpp | 1 + dll/dibdump.cpp | 7 +- dll/dxhook.cpp | 11 +- dll/dxwcore.cpp | 4 +- dll/dxwcore.hpp | 22 ++ dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 639186 -> 680448 bytes dll/dxwnd.vs2008.vcproj | 4 + dll/emulateddc.cpp | 2 +- dll/fontstack.cpp | 69 ++++++ dll/gdi32.cpp | 138 +++++++++--- dll/queryint.cpp | 1 + dll/shareddc.cpp | 8 +- dll/syslibs.h | 149 ++++++++++++- dll/user32.cpp | 201 +++++------------- dll/winmm.cpp | 4 +- host/TabDirectX2.cpp | 1 + host/TabSysLibs.cpp | 1 + host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/dxwndhost.aps | Bin 260636 -> 260804 bytes host/dxwndhost.rc | Bin 150264 -> 150724 bytes host/dxwndhost.vs2008.suo | Bin 171008 -> 176128 bytes host/dxwndhostView.cpp | 6 +- host/resource | Bin 53554 -> 53738 bytes 38 files changed, 625 insertions(+), 259 deletions(-) create mode 100644 Release/.gitattributes create mode 100644 Release/dxwnd.dll create mode 100644 build/exports/Warhammer - Shadow of the Horned Rat (x2).dxw create mode 100644 build/exports/Warhammer - Shadow of the Horned Rat.dxw create mode 100644 build/exports/dxwnd.reg create mode 100644 dll/fontstack.cpp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 74be92b..bce14e7 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -270,6 +270,8 @@ #define MARKGDI32 0x00040000 // Marks (highlights with colored frames) the main GDI32 operations #define DUMPDIBSECTION 0x00080000 // dumps DIBs to BMP files for debugging purposes #define DUMPDEVCONTEXT 0x00100000 // dumps source HDC to BMP files for debugging purposes +#define QUALITYFONTS 0x00200000 // Forces adoption of high quality fonts (CLEARTYPE_NATURAL_QUALITY) +#define ALLOWSYSMEMON3DDEV 0x00400000 // Suppress DDSCAPS_SYSTEMMEMORY option when DDSCAPS_3DDEVICE is set // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/Release/.gitattributes b/Release/.gitattributes new file mode 100644 index 0000000..b110a24 --- /dev/null +++ b/Release/.gitattributes @@ -0,0 +1 @@ +*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/Release/dxwnd.dll b/Release/dxwnd.dll new file mode 100644 index 0000000..13f54df --- /dev/null +++ b/Release/dxwnd.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:941f77bf133938a99ebdcbea0c35f2f33248ac7c1d4e7d5fe9d799ce470b433d +size 782336 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9bb1960..13f54df 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03d7a189e3b95c69545b045eeef01fffafe7178f6c0892f1fa1d61eb810faa5c -size 780800 +oid sha256:941f77bf133938a99ebdcbea0c35f2f33248ac7c1d4e7d5fe9d799ce470b433d +size 782336 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index bd86e99..885de33 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdef6f8a6645074858924bffbe81e345ebafda4269521681fcad76f50d14a589 -size 673280 +oid sha256:743ed4e87aa9d02d8b85936799f99eb83bab948207f13d1a98497644ddd27b20 +size 673792 diff --git a/build/exports/Banzai Bug.dxw b/build/exports/Banzai Bug.dxw index c840edc..103ecb5 100644 --- a/build/exports/Banzai Bug.dxw +++ b/build/exports/Banzai Bug.dxw @@ -9,7 +9,7 @@ ver0=1 coord0=0 flag0=685899810 flagg0=1207959680 -flagh0=20 +flagh0=8212 flagi0=138412036 flagj0=4224 flagk0=131072 @@ -29,3 +29,14 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +startfolder0= +registry0= +monitorid0=0 +flagl0=0 +flagm0=0 +dflag0=0 +maxddinterface0=7 +slowratio0=1 +scanline0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/Tomb Raider III.dxw b/build/exports/Tomb Raider III.dxw index 5441868..34bf6ed 100644 --- a/build/exports/Tomb Raider III.dxw +++ b/build/exports/Tomb Raider III.dxw @@ -4,14 +4,14 @@ path0=D:\Games\Tomb Raider III\tomb3.exe launchpath0= module0= opengllib0= -notes0= +notes0=Working either with or without flip emulation\nDeinterlace movies increases the movie quality ver0=0 coord0=0 flag0=134217762 flagg0=1241513984 flagh0=20 flagi0=4194304 -flagj0=128 +flagj0=268435584 flagk0=0 tflag0=0 initx0=0 @@ -29,3 +29,14 @@ initts0=0 winver0=0 maxres0=0 swapeffect0=0 +startfolder0= +registry0= +monitorid0=0 +flagl0=0 +flagm0=0 +dflag0=0 +maxddinterface0=7 +slowratio0=1 +scanline0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/Warhammer - Shadow of the Horned Rat (x2).dxw b/build/exports/Warhammer - Shadow of the Horned Rat (x2).dxw new file mode 100644 index 0000000..8b0f4e6 --- /dev/null +++ b/build/exports/Warhammer - Shadow of the Horned Rat (x2).dxw @@ -0,0 +1,36 @@ +[target] +title0=Warhammer - Shadow of the Horned Rat (x2) +path0=D:\Games\Warhammer - Shadow of the Horned Rat\WHSHR.EXE +startfolder0= +launchpath0= +module0=GAMEF.DLL +opengllib0= +notes0=Game setup:\n\n1) unzip packed game RIP\n2) copy RLDDF.DLL from SYSTEM32 subfolder to game dir\n3) copy DxWnd wing32.dll to game dir\n4) turn digital audio OFF or add sound WAV file (it is hardcoded in virtual registry!)\nor copy wav files in \Remote\Binary\GLUE\SPEECH folder\n +registry0=\n[HKEY_LOCAL_MACHINE\SOFTWARE]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB]\n;"Options"="3,1,1,2,1,1,0,0" // High Quality, digital audio off\n"Options"="3,1,1,2,1,1,1,1" // High Quality, digital audio on\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallDir]\n@="\{path}"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallOption]\n@="Maximum"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\Language]\n@="ENG"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\LocalDir]\n@="\{path}\\FILE"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\RemoteDir]\n@="\{path}\\REMOTE"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\SaveDir]\n@="\{path}\\TEMP"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\UpdateDir]\n@="C:\\GAMES\\WARFB\\Update"\n\n[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedDLLs]\n"C:\\WINDOWS\\SYSTEM32\\WING.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WING32.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGDE.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGDIB.DRV"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGPAL.WND"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RLDDF.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RLDDI.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTF.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTI.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM64K.DLL"=hex:01,00,00,00 +ver0=0 +monitorid0=-1 +coord0=1 +flag0=-1473609686 +flagg0=1209270312 +flagh0=2163732 +flagi0=1212153860 +flagj0=5248 +flagk0=2195456 +flagl0=67141648 +flagm0=2105344 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=1280 +sizy0=960 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Warhammer - Shadow of the Horned Rat.dxw b/build/exports/Warhammer - Shadow of the Horned Rat.dxw new file mode 100644 index 0000000..4e1fc47 --- /dev/null +++ b/build/exports/Warhammer - Shadow of the Horned Rat.dxw @@ -0,0 +1,36 @@ +[target] +title0=Warhammer - Shadow of the Horned Rat +path0=D:\Games\Warhammer - Shadow of the Horned Rat\WHSHR.EXE +startfolder0= +launchpath0= +module0=GAMEF.DLL +opengllib0= +notes0=Game setup:\n\n1) unzip packed game RIP\n2) copy RLDDF.DLL from SYSTEM32 subfolder to game dir\n3) copy DxWnd wing32.dll to game dir\n4) turn digital audio OFF or add sound WAV file (it is hardcoded in virtual registry!)\nor copy wav files in \Remote\Binary\GLUE\SPEECH folder\n +registry0=\n[HKEY_LOCAL_MACHINE\SOFTWARE]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB]\n;"Options"="3,1,1,2,1,1,0,0" // High Quality, digital audio off\n"Options"="3,1,1,2,1,1,1,1" // High Quality, digital audio on\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallDir]\n@="\{path}"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallOption]\n@="Maximum"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\Language]\n@="ENG"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\LocalDir]\n@="\{path}\\FILE"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\RemoteDir]\n@="\{path}\\REMOTE"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\SaveDir]\n@="\{path}\\TEMP"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\UpdateDir]\n@="C:\\GAMES\\WARFB\\Update"\n\n[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedDLLs]\n"C:\\WINDOWS\\SYSTEM32\\WING.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WING32.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGDE.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGDIB.DRV"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\WINGPAL.WND"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RLDDF.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RLDDI.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTF.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTI.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG64K.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM16M.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM256.DLL"=hex:01,00,00,00\n"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM64K.DLL"=hex:01,00,00,00 +ver0=0 +monitorid0=-1 +coord0=0 +flag0=-1473609686 +flagg0=1209270312 +flagh0=2163732 +flagi0=1212153860 +flagj0=4224 +flagk0=2195456 +flagl0=67141648 +flagm0=2105344 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/dxwnd.reg b/build/exports/dxwnd.reg new file mode 100644 index 0000000..d871b30 --- /dev/null +++ b/build/exports/dxwnd.reg @@ -0,0 +1,52 @@ +[HKEY_LOCAL_MACHINE\SOFTWARE] + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape] + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB] +;"Options"="1,1,1,1,1,2,1,1" // digital audio on +"Options"="1,1,1,1,1,2,0,0" // digital audio off +;"Options"="0,0,0,0,0,0,0,0" //all off + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallDir] +@="\{path}" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallOption] +@="Maximum" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\Language] +@="ENG" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\LocalDir] +@="\{path}\\FILE" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\RemoteDir] +@="\{path}\\REMOTE" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\SaveDir] +@="\{path}\\TEMP" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\UpdateDir] +@="C:\\GAMES\\WARFB\\Update" + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedDLLs] +"C:\\WINDOWS\\SYSTEM32\\WING.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\WING32.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\WINGDE.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\WINGDIB.DRV"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\WINGPAL.WND"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RLDDF.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RLDDI.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTF.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTI.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG16M.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG256.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG64K.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM16M.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM256.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM64K.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG16M.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG256.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG64K.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM16M.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM256.DLL"=hex:01,00,00,00 +"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM64K.DLL"=hex:01,00,00,00 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index f224a5c..e637f59 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1473,4 +1473,16 @@ fix: DialogBoxParamA wrapper v2.04.07 fix: QueryInterface wrapper for ddraw classes unified in a single procedure. fix: D3D2 SwapTextureHandles hook fix - fixes "Wizardry Chronicle" texture problems -fix: string overflow in TextureHack procedure for D3D1-7 textures \ No newline at end of file +fix: string overflow in TextureHack procedure for D3D1-7 textures + +v2.04.08/fx1 +fix: improved DIB dumping & logging: fixed BMP header with negative size, dump only when DIB has attached image +fix: safe CreateWindow mode, preserves original size & position within win creation. Fixes "Warhammer SotHR" +blitting problems +fix: virtual registry file created by GUI and not extracted by the dll. Ths avoids getting the first matching entry. +fix: "Scale font parameters" fully revised, also renamed to "Scale font size" +add: "High quality fonts" flag to force antialiasing font style +fix: ddraw surface capability regression for emulated backbuffer: fixes "Dominant Species" textures in SW mode +fix: ddraw surface capability regression for direct primary/backbuffer: should fix "Tomb raider 3" in HW mode +fix: ddraw surface capability regression for zbuffer: fixes "Toca Touring Car" in SW mode +fix: in fx1, bug crashing app when querying unknown interfaces! diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 35c0788..fe1a392 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -182,48 +182,10 @@ static FILE *OpenFakeRegistry() DWORD dwAttrib; char sSourcePath[MAX_PATH+1]; char *p; - static BOOL LoadFromConfig = TRUE; dwAttrib = GetFileAttributes("dxwnd.dll"); if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return NULL; GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_PATH); p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")]; - if(LoadFromConfig){ - int Index; - char key[81]; - char name[MAX_PATH+1]; - char exepath[MAX_PATH+1]; - strcpy(p, "dxwnd.ini"); - GetModuleFileName(0, name, MAX_PATH); - //for(int i = 0; name[i]; i ++) name[i] = tolower(name[i]); - for(Index=0; Index0){ - char *FileBuf = NULL; - Unescape(RegBuf, &FileBuf); - strcpy(p, "dxwnd.reg"); - freg = fopen(sSourcePath,"w"); - fwrite(FileBuf, 1, strlen(FileBuf), freg); - fputs("\n", freg); - fclose(freg); - free(FileBuf); - } - free(RegBuf); - } - LoadFromConfig = FALSE; - } strcpy(p, "dxwnd.reg"); return fopen(sSourcePath,"r"); } diff --git a/dll/ddcreates.cpp b/dll/ddcreates.cpp index 04a36b4..3a17964 100644 --- a/dll/ddcreates.cpp +++ b/dll/ddcreates.cpp @@ -397,7 +397,12 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX); // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested // this impact also on capabilities for temporary surfaces for AERO optimized handling - if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + // v2.04.08: this seems not always true, so it can be bypassed by ALLOWSYSMEMON3DDEV, just in case. + // should be tested with "Tomb Raider 3" in no emulation mode + if(!(dxw.dwFlags8 & ALLOWSYSMEMON3DDEV)){ + if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + } // create Primary surface OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); @@ -474,7 +479,13 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - if(ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // necessary: Martian Gotic crashes otherwise + // necessary: Martian Gotic crashes otherwise + // v2.04.08: this seems no longer true in some cases, so ALLOWSYSMEMON3DDEV will bypass it. + // Should be tested with "Martian Gotic" and "Dominant Species" SW mode in emulation modes + if(!(dxw.dwFlags8 & ALLOWSYSMEMON3DDEV)){ + if((ddsd.dwFlags & DDSD_CAPS) && (ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + } // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); @@ -632,14 +643,22 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX); // v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - } - else { + // v2.04.08: possibly no longer true ... to test with "Tomb Raider 3" non emulated modes + if(dxw.dwFlags8 & ALLOWSYSMEMON3DDEV){ ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); } + else { + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + } + else { + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + } + } } if(dxw.dwFlags6 & NOSYSMEMBACKBUF) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 58fd01d..1d4f4f3 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2307,6 +2307,7 @@ void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER; + if(dxw.dwFlags8 & ALLOWSYSMEMON3DDEV) lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER; return; } diff --git a/dll/dibdump.cpp b/dll/dibdump.cpp index 095f976..f8ec768 100644 --- a/dll/dibdump.cpp +++ b/dll/dibdump.cpp @@ -18,6 +18,7 @@ void DumpDibSection(const BITMAPINFO *pbmi, UINT iUsage, VOID *pvBits) BITMAPFILEHEADER hdr; // bitmap file-header BITMAPV4HEADER pbi; // bitmap info-header int iScanLineSize; + LONG bV4SizeImage; if(iUsage != DIB_RGB_COLORS) return; if(prog==0) CreateDirectory(".\\bmp.out", NULL); @@ -29,7 +30,9 @@ void DumpDibSection(const BITMAPINFO *pbmi, UINT iUsage, VOID *pvBits) pbi.bV4Width = pbmi->bmiHeader.biWidth; pbi.bV4Height = pbmi->bmiHeader.biHeight; pbi.bV4BitCount = pbmi->bmiHeader.biBitCount; - pbi.bV4SizeImage = ((pbi.bV4Width * pbi.bV4BitCount + 0x1F) & ~0x1F)/8 * pbi.bV4Height; + bV4SizeImage = ((pbi.bV4Width * pbi.bV4BitCount + 0x1F) & ~0x1F)/8 * pbi.bV4Height; + if(bV4SizeImage < 0) bV4SizeImage = -bV4SizeImage; + pbi.bV4SizeImage = bV4SizeImage; pbi.bV4Height = - pbi.bV4Height; pbi.bV4Planes = pbmi->bmiHeader.biPlanes; pbi.bV4V4Compression = pbmi->bmiHeader.biCompression; @@ -45,7 +48,7 @@ void DumpDibSection(const BITMAPINFO *pbmi, UINT iUsage, VOID *pvBits) pbi.bV4AlphaMask = 0; pbi.bV4CSType = LCS_CALIBRATED_RGB; iScanLineSize = ((pbi.bV4Width * pbi.bV4BitCount + 0x1F) & ~0x1F)/8; - OutTrace("DumpDibSection: prog=%d size=%d wxh=(%dx%d) bc=%d sizeimg=%d planes=%d comp=%x ppm=(%dx%d) colors=%d imp=%d\n", + OutTrace("DumpDibSection: prog=%08.8d size=%d wxh=(%dx%d) bc=%d sizeimg=%d planes=%d comp=%x ppm=(%dx%d) colors=%d imp=%d\n", prog, pbi.bV4Size, pbi.bV4Width, pbi.bV4Height, pbi.bV4BitCount, pbi.bV4SizeImage, pbi.bV4Planes, pbi.bV4V4Compression, pbi.bV4XPelsPerMeter, pbi.bV4YPelsPerMeter, diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index a5d9ca1..4d4ac78 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -31,6 +31,7 @@ dxwSStack dxwss; dxwWStack dxwws; dxwCapsDB dxwcdb; dxwSDC sdc; +dxwFStack fontdb; GetWindowLong_Type pGetWindowLong; SetWindowLong_Type pSetWindowLong; HWND hTrayWnd; @@ -153,8 +154,8 @@ static char *Flag8Names[32]={ "VSYNCSCANLINES", "TRIMTEXTUREFORMATS", "NOHALDEVICE", "CLIPLOCK", "PRETENDVISIBLE", "RAWFORMAT", "WININSULATION", "FIXMOUSEHOOK", "DDSFORMAT", "HOOKWING32", "SEQUENCEDIAT", "D3D8BACK16", - "MARKWING32", "DYNAMICZCLEAN", "", "", - "", "", "", "", + "MARKWING32", "DYNAMICZCLEAN", "MARKGDI32", "DUMPDIBSECTION", + "DUMPDEVCONTEXT", "QUALITYFONTS", "ALLOWSYSMEMON3DDEV", "", "", "", "", "", "", "", "", "", }; @@ -163,11 +164,11 @@ static char *TFlagNames[32]={ "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE", "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "OUTD3DTRACE", - "OUTDXWINTRACE", "ADDTIMESTAMP", "OUTDEBUGSTRING", "ERASELOGFILE", - "", "", "", "", - "", "", "", "", + "OUTDXWINTRACE", "OUTWINGTRACE", "OUTOGLTRACE", "", "", "", "", "", "", "", "", "", + "", "", "", "ADDRELATIVETIME", + "**", "ADDTIMESTAMP", "OUTDEBUGSTRING", "ERASELOGFILE", }; char *GetDxWndPath() diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 6faa2e3..d57a22a 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -1062,7 +1062,7 @@ void dxwCore::ShowBanner(HWND hwnd) g_hbmBall = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BANNER)); HDC hdcMem = CreateCompatibleDC(hClientDC); - HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmBall); + HBITMAP hbmOld = (HBITMAP)(*pSelectObject)(hdcMem, g_hbmBall); GetObject(g_hbmBall, sizeof(bm), &bm); (*pGetWindowRect)(hwnd, &win); @@ -1090,7 +1090,7 @@ void dxwCore::ShowBanner(HWND hwnd) } SetStretchBltMode(hClientDC, StretchMode); (*pSetViewportOrgEx)(hClientDC, PrevViewPort.x, PrevViewPort.y, NULL); - SelectObject(hdcMem, hbmOld); + (*pSelectObject)(hdcMem, hbmOld); DeleteDC(hdcMem); (*pGDIReleaseDC)(hwnd, hClientDC); Sleep(200); diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 66e4698..113d4f3 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -2,6 +2,7 @@ #include "syslibs.h" #define DDSQLEN 0x20 +#define MAXFONTS 0x40 typedef struct { DWORD dwTimerType; @@ -40,6 +41,11 @@ typedef enum { SURFACE_ROLE_BACKBUFFER } Enum_Surface_Role_Type; +typedef struct { + HFONT font; + HFONT scaled; +} FontDB_Type; + class dxwCore { // Construction/destruction @@ -296,10 +302,26 @@ private: int WhndSize; }; +class dxwFStack +{ +public: + dxwFStack(); + virtual ~dxwFStack(); + +public: + void Push(HFONT, HFONT); + HFONT GetScaledFont(HFONT); + HFONT DeleteFont(HFONT); + +protected: + FontDB_Type *FontDB; +}; + extern dxwCore dxw; extern dxwSStack dxwss; extern dxwWStack dxwws; extern dxwCapsDB dxwcdb; +extern dxwFStack fontdb; typedef enum { SYSLIBIDX_KERNEL32 = 0, diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 8a9611a..b3bc16c 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.04.07.fx1" +#define VERSION "2.04.08.fx1" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 14a71b998d4c2a2c1f1bc1773261fe5693b619c6..19c5e0302e3e0381a94e4c843321b7f000a02cfe 100644 GIT binary patch delta 36548 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 + + diff --git a/dll/emulateddc.cpp b/dll/emulateddc.cpp index 458a794..4ffeceb 100644 --- a/dll/emulateddc.cpp +++ b/dll/emulateddc.cpp @@ -77,7 +77,7 @@ HDC dxwCore::AcquireEmulatedDC(HWND hwnd) if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight()))) OutTraceE("AcquireEmulatedDC: CreateCompatibleBitmap ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!(PrevSelection=SelectObject(VirtualHDC, VirtualPic))) + if(!(PrevSelection=(*pSelectObject)(VirtualHDC, VirtualPic))) OutTraceE("AcquireEmulatedDC: SelectObject ERROR err=%d at=%d\n", GetLastError(), __LINE__); else { if(!DeleteObject(PrevSelection)) diff --git a/dll/fontstack.cpp b/dll/fontstack.cpp new file mode 100644 index 0000000..84ff9c8 --- /dev/null +++ b/dll/fontstack.cpp @@ -0,0 +1,69 @@ +/* ------------------------------------------------------------------ */ +// Font Stack implementation +/* ------------------------------------------------------------------ */ + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include "dxwnd.h" +#include "dxwcore.hpp" + +dxwFStack::dxwFStack() +{ + FontDB = (FontDB_Type *)malloc(sizeof(FontDB_Type)*(MAXFONTS+1)); + memset(FontDB, 0, sizeof(FontDB)); +} + +dxwFStack::~dxwFStack() +{ + free(FontDB); +} + +void dxwFStack::Push(HFONT font, HFONT scaled) +{ + int i; + FontDB_Type *e; + for (i=0;ifont == 0) break; // got matching entry or end of the list + } + if(i == DDSQLEN) { + MessageBox(0, "Font stack is full", "DxWnd", MB_OK | MB_ICONEXCLAMATION); + return; + } + e->font=font; + e->scaled=scaled; +} + +HFONT dxwFStack::GetScaledFont(HFONT font) +{ + int i; + FontDB_Type *e; + for (i=0;ifont == font) return e->scaled; // got matching entry + if (e->font == 0) return 0; // got end of the list + } + return 0; // got max entries +} + +HFONT dxwFStack::DeleteFont(HFONT font) +{ + int i; + HFONT scaled; + FontDB_Type *e; + for (i=0;ifont == font) { + scaled = e->scaled; + break; // got matching entry + } + } + if(i==MAXFONTS) return NULL; + for (; i 0) dxw.MapClient(&nWidth, &nHeight); else { nHeight= -nHeight; dxw.MapClient(&nWidth, &nHeight); nHeight= -nHeight; } + HScaled = (*pGDICreateFont)(nHeight, nWidth, nEscapement, nOrientation, fnWeight, + fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, + fdwOutputPrecision, fdwClipPrecision, fdwQuality, + fdwPitchAndFamily, lpszFace); + + if(HScaled){ + OutTraceDW("CreateFontIndirect: associate font=%x scaled=%x\n", HFont, HScaled); + fontdb.Push(HFont, HScaled); + } + else{ + OutTraceE("CreateFontIndirect ERROR: scaled font err=%d\n", GetLastError()); + } } - return (*pGDICreateFont)(nHeight, nWidth, nEscapement, nOrientation, fnWeight, - fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, - fdwOutputPrecision, fdwClipPrecision, NONANTIALIASED_QUALITY, - fdwPitchAndFamily, lpszFace); + + if(HFont) + OutTraceDW("CreateFont: hfont=%x\n", HFont); + else + OutTraceDW("CreateFont ERROR: err=%d\n", GetLastError()); + return HFont; } // CreateFontIndirect hook routine to avoid font aliasing that prevents reverse blitting working on palettized surfaces +// NONANTIALIASED_QUALITY no longer necessary, since reverse blitting is no longer used HFONT WINAPI extCreateFontIndirect(const LOGFONT* lplf) { + HFONT HFont, HScaled; LOGFONT lf; - HFONT retHFont; OutTraceDW("CreateFontIndirect: h=%d w=%d face=\"%s\"\n", lplf->lfHeight, lplf->lfWidth, lplf->lfFaceName); + memcpy((char *)&lf, (char *)lplf, sizeof(LOGFONT)); - lf.lfQuality=NONANTIALIASED_QUALITY; + if(dxw.dwFlags8 & QUALITYFONTS) lf.lfQuality = BEST_QUALITY; + HFont=(*pGDICreateFontIndirect)(&lf); + if(dxw.dwFlags1 & FIXTEXTOUT) { + memcpy((char *)&lf, (char *)lplf, sizeof(LOGFONT)); + if(dxw.dwFlags8 & QUALITYFONTS) lf.lfQuality = BEST_QUALITY; if(lf.lfHeight > 0) dxw.MapClient((int *)&lf.lfWidth, (int *)&lf.lfHeight); else { lf.lfHeight= -lf.lfHeight; dxw.MapClient((int *)&lf.lfWidth, (int *)&lf.lfHeight); lf.lfHeight= -lf.lfHeight; } + HScaled=((*pGDICreateFontIndirect)(&lf)); + + if(HScaled){ + OutTraceDW("CreateFontIndirect: associate font=%x scaled=%x\n", HFont, HScaled); + fontdb.Push(HFont, HScaled); + } + else{ + OutTraceE("CreateFontIndirect ERROR: scaled font err=%d\n", GetLastError()); + } } - retHFont=((*pGDICreateFontIndirect)(&lf)); - if(retHFont) - OutTraceDW("CreateFontIndirect: hfont=%x\n", retHFont); + + if(HFont) + OutTraceDW("CreateFontIndirect: hfont=%x\n", HFont); else - OutTraceDW("CreateFontIndirect: error=%d at %d\n", GetLastError(), __LINE__); - return retHFont; + OutTraceE("CreateFontIndirect ERROR: err=%d\n", GetLastError()); + return HFont; } BOOL WINAPI extSetDeviceGammaRamp(HDC hDC, LPVOID lpRamp) @@ -1873,7 +1907,7 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW // dc to assign the needed size and color space to the temporary dc. if(!(hbmPic=CreateCompatibleBitmap(hdc, OrigWidth, OrigHeight))) OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!SelectObject(hTempDc, hbmPic)) + if(!(*pSelectObject)(hTempDc, hbmPic)) OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); if(!(ret=(*pSetDIBitsToDevice)(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse))) OutTraceE("SetDIBitsToDevice: ERROR err=%d at=%d\n", GetLastError(), __LINE__); @@ -3020,7 +3054,9 @@ HBITMAP WINAPI extCreateDIBSection(HDC hdc, const BITMAPINFO *pbmi, UINT iUsage, } else { OutTraceDW("CreateDIBSection: ret=%x\n", ret); - if(dxw.dwFlags8 & DUMPDIBSECTION) DumpDibSection(pbmi, iUsage, *ppvBits); + // beware: it is worth dumping the DIB section only when hSection is not NULL + // which means the bitmap is connected to a shared memory file + if((dxw.dwFlags8 & DUMPDIBSECTION) && hSection) DumpDibSection(pbmi, iUsage, *ppvBits); } return ret; @@ -3569,8 +3605,8 @@ BOOL WINAPI extGetTextExtentPointA(HDC hdc, LPCTSTR lpString, int cbString, LPSI // beware: size scaling is appropriate only when referred to video DC switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: - if(dxw.Windowize && dxw.IsToRemap(hdc)){ - dxw.UnmapClient((LPRECT)lpSize); + if(dxw.Windowize && (OBJ_DC == (*pGetObjectType)(hdc))){ + dxw.UnmapClient((LPPOINT)lpSize); OutTraceDW("GetTextExtentPointA: remapped size=(%dx%d)\n", lpSize->cx, lpSize->cy); } break; @@ -3584,7 +3620,7 @@ BOOL WINAPI extGetTextExtentPointA(HDC hdc, LPCTSTR lpString, int cbString, LPSI BOOL WINAPI extGetTextExtentPoint32A(HDC hdc, LPCTSTR lpString, int cbString, LPSIZE lpSize) { BOOL ret; - OutTraceDW("GetTextExtentPoint32A: hdc=%x string=\"%s\"(%d)\n", hdc, lpString, cbString); + OutTraceDW("GetTextExtentPoint32A: hdc=%x(%s) string=\"%s\"(%d)\n", hdc, GetObjectTypeStr(hdc), lpString, cbString); ret = (*pGetTextExtentPoint32A)(hdc, lpString, cbString, lpSize); if(!ret){ @@ -3596,8 +3632,8 @@ BOOL WINAPI extGetTextExtentPoint32A(HDC hdc, LPCTSTR lpString, int cbString, LP // beware: size scaling is appropriate only when referred to video DC switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: - if(dxw.Windowize && dxw.IsToRemap(hdc)){ - dxw.UnmapClient((LPRECT)lpSize); + if(dxw.Windowize && (OBJ_DC == (*pGetObjectType)(hdc))){ + dxw.UnmapClient((LPPOINT)lpSize); OutTraceDW("GetTextExtentPoint32A: remapped size=(%dx%d)\n", lpSize->cx, lpSize->cy); } break; @@ -3638,3 +3674,37 @@ LONG WINAPI extSetBitmapBits(HBITMAP hbmp, DWORD cBytes, VOID *lpBits) } #endif +HGDIOBJ WINAPI extSelectObject(HDC hdc, HGDIOBJ hgdiobj) +{ + HGDIOBJ ret; + OutTraceDW("SelectObject: hdc=%x(%s) obj=%x(%s)\n", hdc, GetObjectTypeStr(hdc), hgdiobj, GetObjectTypeStr((HDC)hgdiobj)); + if(GetObjectType(hgdiobj)==OBJ_FONT){ + if(GetObjectType(hdc)==OBJ_DC) { + HGDIOBJ scaled; + scaled = fontdb.GetScaledFont((HFONT)hgdiobj); + if(scaled) { + hgdiobj=scaled; + OutTraceDW("SelectObject: replaced font obj=%x\n", hgdiobj); + } + else{ + OutTraceE("SelectObject: unmatched font obj=%x\n", hgdiobj); + } + } + } + ret = (*pSelectObject)(hdc, hgdiobj); + return ret; +} + +BOOL WINAPI extDeleteObject(HGDIOBJ hgdiobj) +{ + BOOL ret; + HGDIOBJ scaledobj; + OutTraceDW("DeleteObject: obj=%x(%s)\n", hgdiobj, GetObjectTypeStr((HDC)hgdiobj)); + if(GetObjectType(hgdiobj)==OBJ_FONT){ + scaledobj=fontdb.DeleteFont((HFONT)hgdiobj); + OutTraceDW("DeleteObject: deleted font obj=%x scaled=%x\n", hgdiobj, scaledobj); + } + if(scaledobj) (*pDeleteObject)(scaledobj); + ret = (*pDeleteObject)(hgdiobj); + return ret; +} \ No newline at end of file diff --git a/dll/queryint.cpp b/dll/queryint.cpp index 9f4dfa3..541b2ab 100644 --- a/dll/queryint.cpp +++ b/dll/queryint.cpp @@ -49,6 +49,7 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte dxversion, lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); iObjectVersion = 0; + iObjectType = TYPE_OBJECT_UNKNOWN; switch(riid.Data1){ // DirectDraw case 0x6C14DB80: // IID_IDirectDraw diff --git a/dll/shareddc.cpp b/dll/shareddc.cpp index b9fd9e6..033175e 100644 --- a/dll/shareddc.cpp +++ b/dll/shareddc.cpp @@ -131,7 +131,7 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) _Warn("CreateCompatibleBitmap ERROR"); } - if(!SelectObject(VirtualHDC, VirtualPic)){ + if(!(*pSelectObject)(VirtualHDC, VirtualPic)){ OutTraceE("dxwSDC::GetPrimaryDC: SelectObject ERROR err=%d at=%d\n", GetLastError(), __LINE__); _Warn("SelectObject ERROR"); } @@ -311,9 +311,9 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen) void dxwSDC::copyDcAttributes(HDC destDC, HDC origDc, POINT origin) { - origFont = SelectObject(destDC, GetCurrentObject(origDc, OBJ_FONT)); - origBrush = SelectObject(destDC, GetCurrentObject(origDc, OBJ_BRUSH)); - origPen = SelectObject(destDC, GetCurrentObject(origDc, OBJ_PEN)); + origFont = (*pSelectObject)(destDC, GetCurrentObject(origDc, OBJ_FONT)); + origBrush = (*pSelectObject)(destDC, GetCurrentObject(origDc, OBJ_BRUSH)); + origPen = (*pSelectObject)(destDC, GetCurrentObject(origDc, OBJ_PEN)); if (GM_ADVANCED == GetGraphicsMode(origDc)){ SetGraphicsMode(destDC, GM_ADVANCED); diff --git a/dll/syslibs.h b/dll/syslibs.h index 808c91a..95f0ca4 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -5,7 +5,7 @@ for all system calls hooked by DxWnd: GDI32.dll Kernel32.dll ole32.dll -user32.dll.dll +user32.dll ====================================================================*/ @@ -139,6 +139,11 @@ typedef BOOL (WINAPI *PolyPolygon_Type)(HDC, const POINT *, const INT *, int); typedef BOOL (WINAPI *PlayEnhMetaFile_Type)(HDC, HENHMETAFILE, const RECT *); typedef UINT (WINAPI *SetPaletteEntries_Type)(HPALETTE, UINT, UINT, const PALETTEENTRY *); typedef int (WINAPI *SetROP2_Type)(HDC, int); +typedef int (WINAPI *EnumFontsA_Type)(HDC, LPCSTR, FONTENUMPROC, LPARAM); +typedef BOOL (WINAPI *GetTextExtentPointA_Type)(HDC, LPCTSTR, int, LPSIZE); +typedef BOOL (WINAPI *GetTextExtentPoint32A_Type)(HDC, LPCTSTR, int, LPSIZE); +typedef HGDIOBJ (WINAPI *SelectObject_Type)(HDC, HGDIOBJ); +typedef BOOL (WINAPI *DeleteObject_Type)(HGDIOBJ); // Kernel32.dll: typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); @@ -255,6 +260,45 @@ typedef HWND (WINAPI *WindowFromPoint_Type)(POINT); typedef HWND (WINAPI *ChildWindowFromPoint_Type)(HWND, POINT); typedef HWND (WINAPI *ChildWindowFromPointEx_Type)(HWND, POINT, UINT); typedef int (WINAPI *GetWindowTextA_Type)(HWND, LPTSTR, int); +typedef BOOL (WINAPI *BringWindowToTop_Type)(HWND); +typedef BOOL (WINAPI *SetForegroundWindow_Type)(HWND); +typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD); +typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); +typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); +typedef BOOL (WINAPI *IsIconic_Type)(HWND); +typedef BOOL (WINAPI *IsZoomed_Type)(HWND); +typedef HDESK (WINAPI *CreateDesktop_Type)(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); +typedef BOOL (WINAPI *SwitchDesktop_Type)(HDESK); +typedef HDESK (WINAPI *OpenDesktop_Type)(LPTSTR, DWORD, BOOL, ACCESS_MASK); +typedef BOOL (WINAPI *CloseDesktop_Type)(HDESK); +typedef int (WINAPI *ValidateRect_Type)(HWND, const RECT *); +typedef BOOL (WINAPI *ScrollWindow_Type)(HWND, int, int, const RECT *, const RECT *); +typedef INT_PTR (WINAPI *DialogBoxParamA_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); +typedef HWND (WINAPI *GetParent_Type)(HWND); +typedef BOOL (WINAPI *InvalidateRgn_Type)(HWND, HRGN, BOOL); +typedef BOOL (WINAPI *InvertRect_Type)(HDC, const RECT *); +typedef BOOL (WINAPI *ScrollDC_Type)(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); +typedef BOOL (WINAPI *DrawIcon_Type)(HDC hDC, int X, int Y, HICON hIcon); +typedef BOOL (WINAPI *DrawIconEx_Type)(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT); +typedef BOOL (WINAPI *DrawCaption_Type)(HWND, HDC, LPCRECT, UINT); +typedef BOOL (WINAPI *PaintDesktop_Type)(HDC); +typedef VOID (WINAPI *mouse_event_Type)(DWORD, DWORD, DWORD, DWORD, ULONG_PTR); +typedef BOOL (WINAPI *ShowScrollBar_Type)(HWND, int, BOOL); +typedef BOOL (WINAPI *DrawMenuBar_Type)(HWND); +//typedef BOOL (WINAPI *TranslateMessage_Type)(MSG *); +typedef BOOL (WINAPI *EnumDisplayDevicesA_Type)(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); +typedef BOOL (WINAPI *EnumDisplayDevicesW_Type)(LPCWSTR, DWORD, PDISPLAY_DEVICEW, DWORD); +typedef INT_PTR (WINAPI *DialogBoxIndirectParamA_Type)(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); +typedef HWND (WINAPI *GetFocus_Type)(void); +//typedef HWND (WINAPI *GetTopWindow_Type)(HWND); +typedef DWORD (WINAPI *GetWindowThreadProcessId_Type)(HWND, LPDWORD); +typedef HWND (WINAPI *GetWindow_Type)(HWND, UINT); +typedef BOOL (WINAPI *IsWindow_Type)(HWND); +typedef HWND (WINAPI *SetFocus_Type)(HWND); +typedef HBITMAP (WINAPI *LoadBitmapA_Type)(HINSTANCE, LPCSTR); +typedef BOOL (WINAPI *EnumWindows_Type)(WNDENUMPROC, LPARAM); +typedef BOOL (WINAPI *GetMessage_Type)(LPMSG, HWND, UINT, UINT); +typedef BOOL (WINAPI *PostMessage_Type)(HWND, UINT, WPARAM, LPARAM); // Winmm.dll: typedef MCIERROR(WINAPI *mciSendCommand_Type)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); @@ -272,7 +316,8 @@ hooked APIs real pointers #undef DXWEXTERN #undef DXWINITIALIZED #define DXWEXTERN -#define DXWINITIALIZED = NULL +//#define DXWINITIALIZED = NULL +#define DXWINITIALIZED #else #undef DXWEXTERN #undef DXWINITIALIZED @@ -410,6 +455,12 @@ DXWEXTERN PolyPolygon_Type pPolyPolygon DXWINITIALIZED; DXWEXTERN PlayEnhMetaFile_Type pPlayEnhMetaFile DXWINITIALIZED; DXWEXTERN SetPaletteEntries_Type pSetPaletteEntries DXWINITIALIZED; DXWEXTERN SetROP2_Type pSetROP2 DXWINITIALIZED; +DXWEXTERN EnumFontsA_Type pEnumFontsA DXWINITIALIZED; +DXWEXTERN GetTextExtentPointA_Type pGetTextExtentPointA DXWINITIALIZED; +DXWEXTERN GetTextExtentPoint32A_Type pGetTextExtentPoint32A DXWINITIALIZED; +DXWEXTERN SelectObject_Type pSelectObject DXWINITIALIZED; +DXWEXTERN DeleteObject_Type pDeleteObject DXWINITIALIZED; + // Kernel32.dll: DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED; @@ -529,6 +580,46 @@ DXWEXTERN WindowFromPoint_Type pWindowFromPoint DXWINITIALIZED; DXWEXTERN ChildWindowFromPoint_Type pChildWindowFromPoint DXWINITIALIZED; DXWEXTERN ChildWindowFromPointEx_Type pChildWindowFromPointEx DXWINITIALIZED; DXWEXTERN GetWindowTextA_Type pGetWindowTextA DXWINITIALIZED; +DXWEXTERN BringWindowToTop_Type pBringWindowToTop DXWINITIALIZED; +DXWEXTERN SetForegroundWindow_Type pSetForegroundWindow DXWINITIALIZED; +DXWEXTERN SetWindowsHookEx_Type pSetWindowsHookExA DXWINITIALIZED; +DXWEXTERN SetWindowsHookEx_Type pSetWindowsHookExW DXWINITIALIZED; +DXWEXTERN MessageBoxTimeoutA_Type pMessageBoxTimeoutA DXWINITIALIZED; +DXWEXTERN MessageBoxTimeoutW_Type pMessageBoxTimeoutW DXWINITIALIZED; +DXWEXTERN IsIconic_Type pIsIconic DXWINITIALIZED; +DXWEXTERN IsZoomed_Type pIsZoomed DXWINITIALIZED; +DXWEXTERN CreateDesktop_Type pCreateDesktop DXWINITIALIZED; +DXWEXTERN SwitchDesktop_Type pSwitchDesktop DXWINITIALIZED; +DXWEXTERN OpenDesktop_Type pOpenDesktop DXWINITIALIZED; +DXWEXTERN CloseDesktop_Type pCloseDesktop DXWINITIALIZED; +DXWEXTERN ValidateRect_Type pValidateRect DXWINITIALIZED; +DXWEXTERN ScrollWindow_Type pScrollWindow DXWINITIALIZED; +DXWEXTERN DialogBoxParamA_Type pDialogBoxParamA DXWINITIALIZED; +DXWEXTERN GetParent_Type pGetParent DXWINITIALIZED; +DXWEXTERN InvalidateRgn_Type pInvalidateRgn DXWINITIALIZED; +DXWEXTERN InvertRect_Type pInvertRect DXWINITIALIZED; +DXWEXTERN ScrollDC_Type pScrollDC DXWINITIALIZED; +DXWEXTERN DrawIcon_Type pDrawIcon DXWINITIALIZED; +DXWEXTERN DrawIconEx_Type pDrawIconEx DXWINITIALIZED; +DXWEXTERN DrawCaption_Type pDrawCaption DXWINITIALIZED; +DXWEXTERN PaintDesktop_Type pPaintDesktop DXWINITIALIZED; +DXWEXTERN mouse_event_Type pmouse_event DXWINITIALIZED; +DXWEXTERN ShowScrollBar_Type pShowScrollBar DXWINITIALIZED; +DXWEXTERN DrawMenuBar_Type pDrawMenuBar DXWINITIALIZED; +//TranslateMessage_Type pTranslateMessage DXWINITIALIZED; +DXWEXTERN EnumDisplayDevicesA_Type pEnumDisplayDevicesA DXWINITIALIZED; +DXWEXTERN EnumDisplayDevicesW_Type pEnumDisplayDevicesW DXWINITIALIZED; +DXWEXTERN DialogBoxIndirectParamA_Type pDialogBoxIndirectParamA DXWINITIALIZED; +DXWEXTERN GetFocus_Type pGetFocus DXWINITIALIZED; +//GetTopWindow_Type pGetTopWindow DXWINITIALIZED; +DXWEXTERN GetWindowThreadProcessId_Type pGetWindowThreadProcessId DXWINITIALIZED; +DXWEXTERN GetWindow_Type pGetWindow DXWINITIALIZED; +DXWEXTERN IsWindow_Type pIsWindow DXWINITIALIZED; +DXWEXTERN SetFocus_Type pSetFocus DXWINITIALIZED; +DXWEXTERN LoadBitmapA_Type pLoadBitmapA DXWINITIALIZED; +DXWEXTERN EnumWindows_Type pEnumWindows DXWINITIALIZED; +DXWEXTERN GetMessage_Type pGetMessageA, pGetMessageW DXWINITIALIZED; +DXWEXTERN PostMessage_Type pPostMessageA, pPostMessageW DXWINITIALIZED; // Winmm.dll: DXWEXTERN mciSendCommand_Type pmciSendCommandA DXWINITIALIZED; @@ -671,6 +762,11 @@ extern BOOL WINAPI extPolyPolygon(HDC, const POINT *, const INT *, int); extern BOOL WINAPI extPlayEnhMetaFile(HDC, HENHMETAFILE, const RECT *); extern UINT WINAPI extSetPaletteEntries(HPALETTE, UINT, UINT, const PALETTEENTRY *); extern int WINAPI extSetROP2(HDC, int); +extern int WINAPI extEnumFontsA(HDC, LPCSTR, FONTENUMPROC, LPARAM); +extern BOOL WINAPI extGetTextExtentPointA(HDC, LPCTSTR, int, LPSIZE); +extern BOOL WINAPI extGetTextExtentPoint32A(HDC, LPCTSTR, int, LPSIZE); +extern HGDIOBJ WINAPI extSelectObject(HDC, HGDIOBJ); +extern BOOL WINAPI extDeleteObject(HGDIOBJ); // Kernel32.dll: extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); @@ -792,6 +888,48 @@ extern HWND WINAPI extWindowFromPoint(POINT); extern HWND WINAPI extChildWindowFromPoint(HWND, POINT); extern HWND WINAPI extChildWindowFromPointEx(HWND, POINT, UINT); //extern int WINAPI extGetWindowTextA(HWND, LPTSTR, int); +extern BOOL WINAPI extBringWindowToTop(HWND); +extern BOOL WINAPI extSetForegroundWindow(HWND); +extern HHOOK WINAPI extSetWindowsHookExA(int, HOOKPROC, HINSTANCE, DWORD); +extern HHOOK WINAPI extSetWindowsHookExW(int, HOOKPROC, HINSTANCE, DWORD); +extern HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); +extern HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); +extern BOOL WINAPI extIsIconic(HWND); +extern BOOL WINAPI extIsZoomed(HWND); +extern HDESK WINAPI extCreateDesktop(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); +extern BOOL WINAPI extSwitchDesktop(HDESK); +extern HDESK WINAPI extOpenDesktop(LPTSTR, DWORD, BOOL, ACCESS_MASK); +extern BOOL WINAPI extCloseDesktop(HDESK); +extern int WINAPI extValidateRect(HWND, const RECT *); +extern BOOL extScrollWindow(HWND, int, int, const RECT *, const RECT *); +extern INT_PTR WINAPI extDialogBoxParamA(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); +extern HWND WINAPI extGetParent(HWND); +extern BOOL WINAPI extInvalidateRgn(HWND, HRGN, BOOL); +extern BOOL WINAPI extInvertRect(HDC, const RECT *); +extern BOOL WINAPI extScrollDC(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); +extern BOOL WINAPI extDrawIcon(HDC hDC, int X, int Y, HICON hIcon); +extern BOOL WINAPI extDrawIconEx(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT); +extern BOOL WINAPI extDrawCaption(HWND, HDC, LPCRECT, UINT); +extern BOOL WINAPI extPaintDesktop(HDC); +extern VOID WINAPI extmouse_event(DWORD, DWORD, DWORD, DWORD, ULONG_PTR); +extern BOOL WINAPI extShowScrollBar(HWND, int, BOOL); +extern BOOL WINAPI extDrawMenuBar(HWND); +//extern BOOL WINAPI extTranslateMessage(MSG *); +extern BOOL WINAPI extEnumDisplayDevicesA(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); +extern BOOL WINAPI extEnumDisplayDevicesW(LPCWSTR, DWORD, PDISPLAY_DEVICEW, DWORD); +extern INT_PTR WINAPI extDialogBoxIndirectParamA(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); +extern HWND WINAPI extGetFocus(void); +//extern HWND WINAPI extGetTopWindow(HWND); +extern DWORD WINAPI extGetWindowThreadProcessId(HWND, LPDWORD); +extern HWND WINAPI extGetWindow(HWND, UINT); +extern BOOL WINAPI extIsWindow(HWND); +extern HWND WINAPI extSetFocus(HWND); +extern HBITMAP WINAPI extLoadBitmapA(HINSTANCE, LPCSTR); +extern BOOL WINAPI extEnumWindows(WNDENUMPROC, LPARAM); +extern BOOL WINAPI extGetMessageA(LPMSG, HWND, UINT, UINT); +extern BOOL WINAPI extGetMessageW(LPMSG, HWND, UINT, UINT); +extern BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM); +extern BOOL WINAPI extPostMessageW(HWND, UINT, WPARAM, LPARAM); // Winmm.dll: extern MCIERROR WINAPI extmciSendCommandA(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); @@ -812,3 +950,10 @@ extern void HookImagehlpInit(); /* eof */ + + + + + + + diff --git a/dll/user32.cpp b/dll/user32.cpp index 61f7a2d..a9e4ddf 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -29,128 +29,6 @@ extern HDC hFlippedDC; //EnumDisplayMonitors_Type pEnumDisplayMonitors = NULL; //BOOL WINAPI extEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM); -typedef BOOL (WINAPI *BringWindowToTop_Type)(HWND); -BringWindowToTop_Type pBringWindowToTop = NULL; -BOOL WINAPI extBringWindowToTop(HWND); -typedef BOOL (WINAPI *SetForegroundWindow_Type)(HWND); -SetForegroundWindow_Type pSetForegroundWindow = NULL; -BOOL WINAPI extSetForegroundWindow(HWND); -typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD); -SetWindowsHookEx_Type pSetWindowsHookExA = NULL; -SetWindowsHookEx_Type pSetWindowsHookExW = NULL; -HHOOK WINAPI extSetWindowsHookExA(int, HOOKPROC, HINSTANCE, DWORD); -HHOOK WINAPI extSetWindowsHookExW(int, HOOKPROC, HINSTANCE, DWORD); -typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); -MessageBoxTimeoutA_Type pMessageBoxTimeoutA = NULL; -HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); -typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); -MessageBoxTimeoutW_Type pMessageBoxTimeoutW = NULL; -HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); -typedef BOOL (WINAPI *IsIconic_Type)(HWND); -IsIconic_Type pIsIconic = NULL; -BOOL WINAPI extIsIconic(HWND); -typedef BOOL (WINAPI *IsZoomed_Type)(HWND); -IsZoomed_Type pIsZoomed = NULL; -BOOL WINAPI extIsZoomed(HWND); -typedef HDESK (WINAPI *CreateDesktop_Type)(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); -CreateDesktop_Type pCreateDesktop = NULL; -HDESK WINAPI extCreateDesktop(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); -typedef BOOL (WINAPI *SwitchDesktop_Type)(HDESK); -SwitchDesktop_Type pSwitchDesktop = NULL; -BOOL WINAPI extSwitchDesktop(HDESK); -typedef HDESK (WINAPI *OpenDesktop_Type)(LPTSTR, DWORD, BOOL, ACCESS_MASK); -OpenDesktop_Type pOpenDesktop = NULL; -HDESK WINAPI extOpenDesktop(LPTSTR, DWORD, BOOL, ACCESS_MASK); -typedef BOOL (WINAPI *CloseDesktop_Type)(HDESK); -CloseDesktop_Type pCloseDesktop = NULL; -BOOL WINAPI extCloseDesktop(HDESK); -typedef int (WINAPI *ValidateRect_Type)(HWND, const RECT *); -ValidateRect_Type pValidateRect = NULL; -int WINAPI extValidateRect(HWND, const RECT *); -typedef BOOL (WINAPI *ScrollWindow_Type)(HWND, int, int, const RECT *, const RECT *); -ScrollWindow_Type pScrollWindow = NULL; -BOOL extScrollWindow(HWND, int, int, const RECT *, const RECT *); -typedef INT_PTR (WINAPI *DialogBoxParamA_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); -DialogBoxParamA_Type pDialogBoxParamA = NULL; -INT_PTR WINAPI extDialogBoxParamA(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); -typedef HWND (WINAPI *GetParent_Type)(HWND); -GetParent_Type pGetParent = NULL; -HWND WINAPI extGetParent(HWND); -typedef BOOL (WINAPI *InvalidateRgn_Type)(HWND, HRGN, BOOL); -InvalidateRgn_Type pInvalidateRgn = NULL; -BOOL WINAPI extInvalidateRgn(HWND, HRGN, BOOL); -typedef BOOL (WINAPI *InvertRect_Type)(HDC, const RECT *); -InvertRect_Type pInvertRect = NULL; -BOOL WINAPI extInvertRect(HDC, const RECT *); -typedef BOOL (WINAPI *ScrollDC_Type)(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); -ScrollDC_Type pScrollDC = NULL; -BOOL WINAPI extScrollDC(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); -typedef BOOL (WINAPI *DrawIcon_Type)(HDC hDC, int X, int Y, HICON hIcon); -DrawIcon_Type pDrawIcon = NULL; -BOOL WINAPI extDrawIcon(HDC hDC, int X, int Y, HICON hIcon); -typedef BOOL (WINAPI *DrawIconEx_Type)(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT); -DrawIconEx_Type pDrawIconEx = NULL; -BOOL WINAPI extDrawIconEx(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT); -typedef BOOL (WINAPI *DrawCaption_Type)(HWND, HDC, LPCRECT, UINT); -DrawCaption_Type pDrawCaption = NULL; -BOOL WINAPI extDrawCaption(HWND, HDC, LPCRECT, UINT); -typedef BOOL (WINAPI *PaintDesktop_Type)(HDC); -PaintDesktop_Type pPaintDesktop = NULL; -BOOL WINAPI extPaintDesktop(HDC); -typedef VOID (WINAPI *mouse_event_Type)(DWORD, DWORD, DWORD, DWORD, ULONG_PTR); -mouse_event_Type pmouse_event = NULL; -VOID WINAPI extmouse_event(DWORD, DWORD, DWORD, DWORD, ULONG_PTR); -typedef BOOL (WINAPI *ShowScrollBar_Type)(HWND, int, BOOL); -ShowScrollBar_Type pShowScrollBar = NULL; -BOOL WINAPI extShowScrollBar(HWND, int, BOOL); -typedef BOOL (WINAPI *DrawMenuBar_Type)(HWND); -DrawMenuBar_Type pDrawMenuBar = NULL; -BOOL WINAPI extDrawMenuBar(HWND); -//typedef BOOL (WINAPI *TranslateMessage_Type)(MSG *); -//TranslateMessage_Type pTranslateMessage = NULL; -//BOOL WINAPI extTranslateMessage(MSG *); -typedef BOOL (WINAPI *EnumDisplayDevicesA_Type)(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); -EnumDisplayDevicesA_Type pEnumDisplayDevicesA = NULL; -BOOL WINAPI extEnumDisplayDevicesA(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); -typedef BOOL (WINAPI *EnumDisplayDevicesW_Type)(LPCWSTR, DWORD, PDISPLAY_DEVICEW, DWORD); -EnumDisplayDevicesW_Type pEnumDisplayDevicesW = NULL; -BOOL WINAPI extEnumDisplayDevicesW(LPCWSTR, DWORD, PDISPLAY_DEVICEW, DWORD); -typedef INT_PTR (WINAPI *DialogBoxIndirectParamA_Type)(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); -DialogBoxIndirectParamA_Type pDialogBoxIndirectParamA = NULL; -INT_PTR WINAPI extDialogBoxIndirectParamA(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); -typedef HWND (WINAPI *GetFocus_Type)(void); -GetFocus_Type pGetFocus; -HWND WINAPI extGetFocus(void); -//typedef HWND (WINAPI *GetTopWindow_Type)(HWND); -//GetTopWindow_Type pGetTopWindow; -//HWND WINAPI extGetTopWindow(HWND); -typedef DWORD (WINAPI *GetWindowThreadProcessId_Type)(HWND, LPDWORD); -GetWindowThreadProcessId_Type pGetWindowThreadProcessId; -DWORD WINAPI extGetWindowThreadProcessId(HWND, LPDWORD); -typedef HWND (WINAPI *GetWindow_Type)(HWND, UINT); -GetWindow_Type pGetWindow; -HWND WINAPI extGetWindow(HWND, UINT); -typedef BOOL (WINAPI *IsWindow_Type)(HWND); -IsWindow_Type pIsWindow; -BOOL WINAPI extIsWindow(HWND); -typedef HWND (WINAPI *SetFocus_Type)(HWND); -SetFocus_Type pSetFocus; -HWND WINAPI extSetFocus(HWND); -typedef HBITMAP (WINAPI *LoadBitmapA_Type)(HINSTANCE, LPCSTR); -LoadBitmapA_Type pLoadBitmapA; -HBITMAP WINAPI extLoadBitmapA(HINSTANCE, LPCSTR); -typedef BOOL (WINAPI *EnumWindows_Type)(WNDENUMPROC, LPARAM); -EnumWindows_Type pEnumWindows; -BOOL WINAPI extEnumWindows(WNDENUMPROC, LPARAM); - -typedef BOOL (WINAPI *GetMessage_Type)(LPMSG, HWND, UINT, UINT); -GetMessage_Type pGetMessageA, pGetMessageW; -BOOL WINAPI extGetMessageA(LPMSG, HWND, UINT, UINT); -BOOL WINAPI extGetMessageW(LPMSG, HWND, UINT, UINT); -typedef BOOL (WINAPI *PostMessage_Type)(HWND, UINT, WPARAM, LPARAM); -PostMessage_Type pPostMessageA, pPostMessageW; -BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM); -BOOL WINAPI extPostMessageW(HWND, UINT, WPARAM, LPARAM); #ifdef TRACEPALETTE typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *); @@ -1026,14 +904,6 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); - - //HFONT hFont; - //hFont=CreateFont ( - // 30, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, - // FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, - // DEFAULT_PITCH | FF_SWISS, NULL); // "Arial"); - //SendMessage (hwnd, WM_SETFONT, WPARAM (hFont), TRUE); - return res; } @@ -1135,13 +1005,10 @@ LRESULT WINAPI extSendMessage(char *apiname, SendMessage_Type pSendMessage, HWND lParam = MAKELPARAM(curr.x, curr.y); OutTraceC("%s: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", apiname, hwnd, prev.x, prev.y, curr.x, curr.y); break; -#if 1 - // unnecessaty: set "Bypass font unsupported api" ?? case WM_FONTCHANGE: // suppress WM_FONTCHANGE avoids "Warhammer: Shadow of the Horned Rat" crash when entering battle return 0; break; -#endif default: break; } @@ -1704,10 +1571,13 @@ static BOOL IsFullscreenWindow( static HWND hLastFullScrWin = 0; static DDPIXELFORMAT ddpLastPixelFormat; +#define SAFEWINDOWCREATION TRUE + +typedef HWND (WINAPI *CreateWindow_Type)(DWORD, LPVOID, LPVOID, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); static HWND WINAPI CreateWindowCommon( LPCTSTR ApiName, - BOOL WideChar, + CreateWindow_Type pCreateWindow, DWORD dwExStyle, void *lpClassName, void *lpWindowName, @@ -1726,15 +1596,19 @@ static HWND WINAPI CreateWindowCommon( BOOL isNewDesktop; int iOrigW, iOrigH; extern void GetMonitorWorkarea(int, LPRECT, BOOL); + int origx, origy, origw, origh; + DWORD origstyle, origexstyle; + origx = x; + origy = y; + origw = nWidth; + origh = nHeight; + origstyle = dwStyle; + origexstyle = dwExStyle; iOrigW=nWidth; iOrigH=nHeight; if(!dxw.Windowize || (hWndParent == HWND_MESSAGE)){ // v2.02.87: don't process message windows (hWndParent == HWND_MESSAGE) - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - + hwnd= (*pCreateWindow)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) HookChildWndProc(hwnd, dwStyle, ApiName); @@ -1789,10 +1663,7 @@ static HWND WINAPI CreateWindowCommon( if(dxw.dwFlags5 & UNLOCKZORDER) dwExStyle &= ~WS_EX_TOPMOST ; if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness" - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + hwnd= (*pCreateWindow)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); OutTraceDW("%s: windowed mode ret=%x\n", ApiName, hwnd); return hwnd; } @@ -1826,10 +1697,24 @@ static HWND WINAPI CreateWindowCommon( // v2.04.05: the semaphore must be a counter, since within the CreateWin callback there could be other CreateWin calls. // happens in "Warhammer: Shadow of the Horned Rat" ! InMainWinCreation++; - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); +#if 1 + // SAFEWINDOWCREATION mode: fixes problems of "Warhammer shadow of the Horned rat", but also allows "Diablo" to run in fake fullscreen high-res mode. + // this way, any creation callback routine invoked within the window creation will receive only the original call parameters, while the new scaled + // values and adjusted styles will be applied only after the creation. + hwnd= (*pCreateWindow)(origexstyle, lpClassName, lpWindowName, origstyle, origx, origy, origw, origh, hWndParent, hMenu, hInstance, lpParam); + if (hwnd) { + (*pSetWindowLong)(hwnd, GWL_STYLE, dwStyle); + (*pSetWindowLong)(hwnd, GWL_EXSTYLE, dwExStyle); + (*pMoveWindow)(hwnd, x, y, nWidth, nHeight, FALSE); + } +#endif +#if 0 + hwnd= (*pCreateWindow)(dwExStyle, lpClassName, lpWindowName, dwStyle, origx, origy, origw, origh, hWndParent, hMenu, hInstance, lpParam); + if (hwnd)(*pMoveWindow)(hwnd, x, y, nWidth, nHeight, FALSE); +#endif +#if 0 + hwnd= (*pCreateWindow)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); +#endif InMainWinCreation--; if (hwnd==(HWND)NULL){ @@ -1921,10 +1806,10 @@ HWND WINAPI extCreateWindowExW( else sprintf(wString,"%d", nWidth); if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", + OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x depth=%d\n", ClassToWStr(lpClassName), lpWindowName, xString, yString, wString, hString, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), - hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); + hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu, InMainWinCreation); } OutTraceB("CreateWindowExW: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); @@ -1936,7 +1821,7 @@ HWND WINAPI extCreateWindowExW( nHeight = MainWin.bottom; } - return CreateWindowCommon("CreateWindowExW", TRUE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + return CreateWindowCommon("CreateWindowExW", (CreateWindow_Type)pCreateWindowExW, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); } // GHO: pro Diablo @@ -1964,10 +1849,10 @@ HWND WINAPI extCreateWindowExA( else sprintf(wString,"%d", nWidth); if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", + OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x depth=%d\n", ClassToStr(lpClassName), lpWindowName, xString, yString, wString, hString, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), - hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); + hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu, InMainWinCreation); } OutTraceB("CreateWindowExA: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); @@ -1979,7 +1864,7 @@ HWND WINAPI extCreateWindowExA( nHeight = MainWin.bottom; } - return CreateWindowCommon("CreateWindowExA", FALSE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + return CreateWindowCommon("CreateWindowExA", (CreateWindow_Type)CreateWindowExA, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); } extern void ExplainMsg(char *, HWND, UINT, WPARAM, LPARAM); @@ -1993,6 +1878,11 @@ LRESULT WINAPI extCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WP res = -1; if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcA", hwnd, Msg, wParam, &lParam); + if((dxw.dwFlags1 & FIXTEXTOUT) && (Msg == WM_SETFONT)){ + wParam = (WPARAM)fontdb.GetScaledFont((HFONT)wParam); + OutTraceDW("CallWindowProcA: replaced scaled font hfnt=%x\n", wParam); + } + if (res==(HRESULT)-1) return (*pCallWindowProcA)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); else @@ -2008,6 +1898,11 @@ LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WP res = -1; if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcW", hwnd, Msg, wParam, &lParam); + if((dxw.dwFlags1 & FIXTEXTOUT) && (Msg == WM_SETFONT)){ + wParam = (WPARAM)fontdb.GetScaledFont((HFONT)wParam); + OutTraceDW("CallWindowProcA: replaced scaled font hfnt=%x\n", wParam); + } + if (res==(HRESULT)-1) return (*pCallWindowProcW)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); else diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 40def0e..1e0aea0 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -672,7 +672,7 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) if(g_hbmJoy == NULL) return; // show nothing ... - HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmJoy); + HBITMAP hbmOld = (HBITMAP)(*pSelectObject)(hdcMem, g_hbmJoy); GetObject(g_hbmJoy, sizeof(bm), &bm); (*pGetWindowRect)(dxw.GethWnd(), &win); @@ -684,7 +684,7 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) (*pGDIBitBlt)(hClientDC, x-(w>>1), y-(h>>1), w, h, hdcMem, 0, 0, SRCPAINT); (*pSetViewportOrgEx)(hClientDC, PrevViewPort.x, PrevViewPort.y, NULL); - SelectObject(hdcMem, hbmOld); + (*pSelectObject)(hdcMem, hbmOld); DeleteDC(hdcMem); } diff --git a/host/TabDirectX2.cpp b/host/TabDirectX2.cpp index 9119a5e..2881915 100644 --- a/host/TabDirectX2.cpp +++ b/host/TabDirectX2.cpp @@ -48,6 +48,7 @@ void CTabDirectX2::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_CLEARTEXTUREFOURCC, cTarget->m_ClearTextureFourCC); DDX_Check(pDX, IDC_NODDEXCLUSIVEMODE, cTarget->m_NoDDExclusiveMode); DDX_Check(pDX, IDC_CREATEDESKTOP, cTarget->m_CreateDesktop); + DDX_Check(pDX, IDC_ALLOWSYSMEMON3DDEV, cTarget->m_AllowSysmemOn3DDev); // Vsync //DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad); diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 26e7efd..96c7554 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -31,6 +31,7 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_CLIENTREMAPPING, cTarget->m_ClientRemapping); DDX_Radio(pDX, IDC_GDINONE, cTarget->m_DCEmulationMode); DDX_Check(pDX, IDC_FIXTEXTOUT, cTarget->m_FixTextOut); + DDX_Check(pDX, IDC_QUALITYFONTS, cTarget->m_QualityFonts); DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect); DDX_Check(pDX, IDC_FIXCLIPPERAREA, cTarget->m_FixClipperArea); DDX_Check(pDX, IDC_SYNCPALETTE, cTarget->m_SyncPalette); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index e49df32..6edc9ea 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -211,6 +211,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ClearTextureFourCC = FALSE; m_NoDDExclusiveMode = FALSE; m_CreateDesktop = FALSE; + m_AllowSysmemOn3DDev = FALSE; m_VSyncMode = 0; m_VSyncImpl = 0; m_WaitMode = 0; @@ -254,6 +255,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoWinErrors = FALSE; m_PretendVisible = FALSE; m_WinInsulation = FALSE; + m_QualityFonts = FALSE; m_AnalyticMode = FALSE; m_NoPaletteUpdate = FALSE; m_WireFrame = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 84b7453..aeacd83 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -165,6 +165,7 @@ public: BOOL m_ClearTextureFourCC; BOOL m_NoDDExclusiveMode; BOOL m_CreateDesktop; + BOOL m_AllowSysmemOn3DDev; //BOOL m_ForceVSync; //BOOL m_ForceNoVSync; //BOOL m_ForceWait; @@ -210,6 +211,7 @@ public: BOOL m_NoWinErrors; BOOL m_PretendVisible; BOOL m_WinInsulation; + BOOL m_QualityFonts; BOOL m_AnalyticMode; BOOL m_NoPaletteUpdate; BOOL m_LimitResources; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 566bd4064a6bcaa82396395b67700cc60eb1d32b..445a770459ad9500d5ee3d391cc53324c6bfec13 100644 GIT binary patch delta 5136 zcmZWs3wTu3wccwVk^rF?C7DMunGh2pRFcd)lZwbBGf4&}Gt4(GavcB%sTu3 z|F!m7d#~ANPs`cscAdL!*=TSs&o59+ClqnI!no&_fIU)84)=3>tYPhqAo-84LV zNy5t?ob0QN#=O3Y`fBOsW=qASoAi7ci0*Sb%kqS3YNRn(S<^rQhm}3A!6KEOV89>r zNyf$mh>YGW%Zh|R%Q@H!39u#f~fEf>_jR0u(St$5+y{y+*zY#8Hh>_=wd<}@= z^9EQe9vrLBUYGFl`l>wjfoM1skvX`m>~#qX15I{5OSdt>d1$3Wbw01;%Gf4xbCEfxJwa85!i~XDq{d$>D{z&w4%%B- zucN&!v#`zL@glvkGa()91{+DsY;23zTx8~P5JxZQjBj0u7x0I}zB*5RG$ch%_O`fO zq%-^>i4Dm`EGuJOAc8*__#Z($@PiSyikagK`gan_irR2hsIJx%C8gWSwuxoqvP!on zIIlM{$l2Mu2~@U0gFjepm)W@;tQ*Aj7Y%#|h|-Jt$vdyO+P&@yPvsP=ONz?adkMJK zQ>XEDvp-!?HwHbm{>rAxfX^dSc9*k1gJ`>`E8Ue4gzBRW)zLanrCj!ME89I7uG;HY zGby*R_h~aO8u|=H8n-->SOK2QypNiGh2USfO`$QdwRp1vC#m)975Y1%e z>_7q=oXu@v2NT$p>1ZSVI{|3sbKBUbDmc~eYY2p@<(#y#pNTte&Qd<7Zfc!p#3c%( zDu1ED!Fl>L63|+Gf$u4h+xS=2x5^*z#pDi3?{Wt_q@ogtMWUX%s0usTVJ#dAtEh{8 zsiHJ>Os1fMAuwywe(jUP@o3?Ccv6C^l4ot5Q?^fj~@tsGOVqOGVXm=-8>RO@u3F|EJ<= z^8VUzNL@3x&BBh04aG*!cPbmEeH&nG>_h?^h;6g8lPaQC5%y5isa@x`IoT<|H&Y>B z%qlU6i6tY%^CbpMPlFL~Mm$tf0B7k_kGH2mI-JA%(;ypq#laFi^oegva!lvdsPx^W z<1R|w6HW4uJHxJYA?zM>F%_$p<=Z~ z&xdh5ISg|7a4u%QlbPnSSg0M-#VLz{kKkz4fr0;oV@L;j7%3)LP5e5J&*>nCXK-wn z_Ii%{b+o=Whz_e6Mu|_XxsWN2TTPH9hS^Mtjx+J_HodrwGSqW?Ne?E)Kv>&0gIGYA zk>gQ4A$8qd8LN5GNEOO-Vn>l*2X*6DJcbK499CGAAiMZe}^HPo< zXM>@{l9)Q`sfg8j{6RUVgYGSZ=v3;TkP17PO~jnKZ2KVT_1Dp@WtvL6m_sae8g)($ zZTG5_o4G`{Q(saxNYUXEksNKmTZ8&55~!7xbL`0ho#AJLY~pexo$TxuVRac`f|%^e zHQYKV35KF{tB?{Gn61!b_P%Zx98qI6CnAvOQel7wZ zH2`9bv2pJb8!K$1e6h zS*ZnX5#xS)Knn!px~HDvT4a9wou}6(g~j;%-+ivt@ZBKZYc|K9TXMe^hLiEEjooK;uW*uW9`6>>)Obo*%)qbuf=#zKqT5 z;2E-A8Lz{eTs~}H4=vfS9UFH+DK2XQH}2d8OWANAL536K)38Ge+q+e1}kBYQQh}lsXIv3 zjb?V{Wp~qN&!MXCV)tO)ZpeG;*gl|t-gRuB@>U)=an*N90k_VDip;ZEF3ogo zB*RT}aqcO_th~_-_)s&s9~s8j1l%em6Y!8UEqLLSl9L)9%2;MAW}jBf(2V7$iD|}0 zGRo)aqEeU_&F7*|Q^KXEG=KA{s2ONX;~L82?s_`Q;oww>lUunRD@OV&qQu@M`; zr$8$XQlJBHYf6!cvGe#YVSLhA?D<|X^TqwxPnOEfJwvczBu+d-@EzGWL)zw_;sUbp z4X&27<$mmz@B_23N5XI5j}m@(0h-SeJbx)pl-ApVGo%e~!UfU>y0KN-n*G?V@<*^o z+DWIeU)l*A&F9FvN8vc(2f1lX6{FGFWHPE zI8oXWr*Vd~Lpd&xcE~7fm6jD^H(9uZU-imroY*hnl}s68U8Zhnl)1DwXRHI%=^Uvf5SEWO48qbc!1Yk!#5Fc`clE$ z4=cv%9_ogbUk->zT_gStiC6Xv@QbeD7gNp?zE*Hv4;An@iI3r;3rb#o^U(pH*RSz; Yhvqzj?~#nYd`HPB^S@JY+i}JC|AN#iW&i*H delta 5326 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 R4=q)SX9eZv^(RCo{{rZ-p;`a{ delta 341 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 delta 3754 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 t->flags7 |= CLEARTEXTUREFOURCC; if(dlg->m_NoDDExclusiveMode) t->flags7 |= NODDEXCLUSIVEMODE; if(dlg->m_CreateDesktop) t->flags6 |= CREATEDESKTOP; + if(dlg->m_AllowSysmemOn3DDev) t->flags8 |= ALLOWSYSMEMON3DDEV; if(dlg->m_HandleAltF4) t->flags |= HANDLEALTF4; if(dlg->m_LimitFPS) t->flags2 |= LIMITFPS; if(dlg->m_SkipFPS) t->flags2 |= SKIPFPS; @@ -529,6 +530,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_NoWinErrors) t->flags7 |= NOWINERRORS; if(dlg->m_PretendVisible) t->flags8 |= PRETENDVISIBLE; if(dlg->m_WinInsulation) t->flags8 |= WININSULATION; + if(dlg->m_QualityFonts) t->flags8 |= QUALITYFONTS; if(dlg->m_AnalyticMode) t->flags3 |= ANALYTICMODE; if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS; if(dlg->m_InitialRes) t->flags7 |= INITIALRES; @@ -809,6 +811,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ClearTextureFourCC = t->flags7 & CLEARTEXTUREFOURCC ? 1 : 0; dlg->m_NoDDExclusiveMode = t->flags7 & NODDEXCLUSIVEMODE ? 1 : 0; dlg->m_CreateDesktop = t->flags6 & CREATEDESKTOP ? 1 : 0; + dlg->m_AllowSysmemOn3DDev = t->flags8 & ALLOWSYSMEMON3DDEV ? 1 : 0; dlg->m_HandleAltF4 = t->flags & HANDLEALTF4 ? 1 : 0; dlg->m_LimitFPS = t->flags2 & LIMITFPS ? 1 : 0; dlg->m_SkipFPS = t->flags2 & SKIPFPS ? 1 : 0; @@ -853,6 +856,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoWinErrors = t->flags7 & NOWINERRORS ? 1 : 0; dlg->m_PretendVisible = t->flags8 & PRETENDVISIBLE ? 1 : 0; dlg->m_WinInsulation = t->flags8 & WININSULATION ? 1 : 0; + dlg->m_QualityFonts = t->flags8 & QUALITYFONTS ? 1 : 0; dlg->m_AnalyticMode = t->flags3 & ANALYTICMODE ? 1 : 0; dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0; dlg->m_InitialRes = t->flags7 & INITIALRES ? 1 : 0; @@ -3350,7 +3354,7 @@ void CDxwndhostView::OnRun(BOOL bForceNoHook) if(MessageBoxLang(DXW_STRING_VREG_UPDATE,DXW_STRING_WARNING, MB_OKCANCEL|MB_ICONINFORMATION)==IDOK) this->SaveConfigFile(); } - OutTrace("export virtual registry\n"); + OutTrace("export virtual registry entry[%d]\n"); FILE *regfp; char *Registry; Registry = PrivateMaps[i].registry; diff --git a/host/resource b/host/resource index cb0ccec337ae317cf8c3bb5aeeafb0235695637b..bf16a1603106c75ecf612ddddcd958121a8ce6b9 100644 GIT binary patch delta 104 zcmdnAi22oG<_+f-O;!+Q5e;MrWpHHhVen)KVTfdKWAJD2V+fhNkVAR00W-_w4=ZFq ys+2)0e1LM{48cHE!3@3(u0RY@Ys}yRgsu!>lMnVvGFvj3O-@`Uz4^kTBs~C{IU33U delta 14 WcmaF0n0eD8<_+f-ZEjnfq6Yvvz6W*y