From a077bb011a90716525b0c4044453966a947b5ec4 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 16 Dec 2016 11:48:42 -0500 Subject: [PATCH] v2_04_00_src Former-commit-id: 97c27fb1c865e6a42bebde9cfd6d7935937bea24 --- Include/dxwnd.h | 3 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 43 - build/exports/Jagged Alliance 2 Gold.dxw | 36 + .../Need for Speed 5 Porsche Unleashed.dxw | 3 +- build/exports/Rayman 2 (GOG).dxw | 14 +- build/exports/Titanic.dxw | 36 + build/readme-relnotes.txt | 19 +- dll/d3dtexture.cpp | 606 +++++++--- dll/ddblit.cpp | 2 +- dll/ddcreates.cpp | 167 +-- dll/ddraw.cpp | 110 +- dll/ddtexture.cpp | 50 +- dll/dinput.cpp | 4 +- dll/dxhook.cpp | 10 +- dll/dxwcore.cpp | 11 +- dll/dxwnd.aps | Bin 58248 -> 58232 bytes dll/dxwnd.cpp | 3 +- dll/dxwnd.vs2008.suo | Bin 0 -> 367104 bytes dll/dxwnd.vs2008.vcproj | 4 + dll/hd3d7.cpp | 2 +- dll/hddraw.h | 3 + dll/stb_dxt.h | 1043 +++++++++++++++++ dll/user32.cpp | 38 +- host/TabDirect3D.cpp | 1 + host/TabInput.cpp | 2 +- host/TabSysLibs.cpp | 1 + host/TargetDlg.cpp | 10 +- host/TargetDlg.h | 4 +- host/dxelevate.cpp | 3 + host/dxwndhost.aps | Bin 0 -> 255188 bytes host/dxwndhost.rc | Bin 140602 -> 141464 bytes host/dxwndhost.vs2008.suo | Bin 111104 -> 119808 bytes host/dxwndhostView.cpp | 35 +- host/resource | Bin 51894 -> 52170 bytes 36 files changed, 1893 insertions(+), 376 deletions(-) delete mode 100644 build/dxwnd.ini create mode 100644 build/exports/Jagged Alliance 2 Gold.dxw create mode 100644 build/exports/Titanic.dxw create mode 100644 dll/dxwnd.vs2008.suo create mode 100644 dll/stb_dxt.h create mode 100644 host/dxwndhost.aps diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 1a2ea4d..477de08 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -258,6 +258,9 @@ #define NOHALDEVICE 0x00000040 // Simulates a situation of lack of 3D hardware support, like in presence of remote desktop #define CLIPLOCKED 0x00000080 // never destroy cursor clipper on window move events .... #define PRETENDVISIBLE 0x00000100 // Pretend the main window is visible (IsWindowVisible) and on Z-order top (GetTopWindow) +#define RAWFORMAT 0x00000200 // texture dump / hack are performed in raw format, compression / decompression to be made offline +#define WININSULATION 0x00000400 // EnumerateWin finds no windows! +#define FIXMOUSEHOOK 0x00000800 // fixes mouse coordinates retrieved through MouseProc routine associated to SetWindowsHook(WH_MOUSE,..) // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 3b0b72e..ca8bd2d 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf023536d20b33dd428096f18a29788e47eba0691547598d6de7ef7cc877956f -size 710144 +oid sha256:b3e4a919d94a65a136733126cb2ab2ea7ec6ea20d20d06acc7fc826fb8dd7bce +size 756736 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 743c81a..678ae18 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3840ce99c26e25e77df3d855fbd91c5533f0fcff4e4a876dc88b62a465d66b62 +oid sha256:f4781f62e3b9bbc3cb28f6ab03585167d87e0352520ba25ee7ad0102ad02a244 size 668160 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index 0727a81..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,43 +0,0 @@ -[window] -exportpath=D:\DxWnd.develop\v2_03_99fx2_src\build\exports\ -exepath=F:\Games\The Sting!\TheSting!\ -posx=1154 -posy=553 -sizx=320 -sizy=200 -[target] -title0=The Sting! -path0=F:\Games\The Sting!\TheSting!\Sting.exe -startfolder0= -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=0 -monitorid0=0 -coord0=0 -flag0=136314914 -flagg0=1207959552 -flagh0=16 -flagi0=138412036 -flagj0=4224 -flagk0=65536 -flagl0=0 -flagm0=0 -tflag0=0 -dflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=-1 -swapeffect0=0 -maxddinterface0=7 -slowratio0=1 -scanline0=1 -initresw0=0 -initresh0=0 diff --git a/build/exports/Jagged Alliance 2 Gold.dxw b/build/exports/Jagged Alliance 2 Gold.dxw new file mode 100644 index 0000000..6c39636 --- /dev/null +++ b/build/exports/Jagged Alliance 2 Gold.dxw @@ -0,0 +1,36 @@ +[target] +title0=Jagged Alliance 2 Gold +path0=F:\Games\Jagged Alliance 2 Gold\ja2.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=-1474297694 +flagg0=1744832768 +flagh0=8212 +flagi0=138412036 +flagj0=5248 +flagk0=2162696 +flagl0=16 +flagm0=2305 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Need for Speed 5 Porsche Unleashed.dxw b/build/exports/Need for Speed 5 Porsche Unleashed.dxw index a42a283..40c72ba 100644 --- a/build/exports/Need for Speed 5 Porsche Unleashed.dxw +++ b/build/exports/Need for Speed 5 Porsche Unleashed.dxw @@ -10,7 +10,7 @@ registry0= ver0=0 monitorid0=-1 coord0=0 -flag0=136314914 +flag0=136314922 flagg0=1207959552 flagh0=20 flagi0=138412036 @@ -33,3 +33,4 @@ maxddinterface0=7 slowratio0=2 initresw0=800 initresh0=600 +scanline0=1 diff --git a/build/exports/Rayman 2 (GOG).dxw b/build/exports/Rayman 2 (GOG).dxw index 660378c..6c6b9d4 100644 --- a/build/exports/Rayman 2 (GOG).dxw +++ b/build/exports/Rayman 2 (GOG).dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=1 coord0=0 -flag0=402653219 +flag0=402653235 flagg0=1208025104 flagh0=20 flagi0=4194304 @@ -26,7 +26,17 @@ launchpath0= notes0= registry0= flagj0=128 -flagk0=65536 +flagk0=268500992 winver0=0 maxres0=0 swapeffect0=0 +startfolder0= +monitorid0=0 +flagl0=0 +flagm0=0 +dflag0=0 +maxddinterface0=7 +slowratio0=1 +scanline0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/Titanic.dxw b/build/exports/Titanic.dxw new file mode 100644 index 0000000..2843337 --- /dev/null +++ b/build/exports/Titanic.dxw @@ -0,0 +1,36 @@ +[target] +title0=Titanic +path0=F:\Games\Titanic\TI.noshim.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=-1474293726 +flagg0=1745879072 +flagh0=540692 +flagi0=138412036 +flagj0=4224 +flagk0=67584 +flagl0=269484032 +flagm0=1024 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index f553d73..a0c6723 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1372,15 +1372,22 @@ fix: recovered DEFAULTMESSAGES option fix: normalized output for ddraw GetScanLine() method fix: fixed the policy for redrecting the WindowProc routine. Fixes "Ultimate Spiderman" clipping problems, and possibly much more -v2.03.99/fx1-3 +v2.03.99 fix: unwanted hook to directsound when passing by CoCreateInstance() fix: transient mode, now checks for both the target and the launcher to be dead before terminating add: Direct3D TRIMTEXTUREFORMAT flag, to mimic MS "DirectXTrimTextureFormat" shim. Fixes problems in "Heavy Gear 2" and "Star Wars: Rogue Squardon 3D". add: D3DDevice GetCaps hooking and full dump of D3DDevice capabilities add: "No HAL Device" flag, making it unavailable the IID_Direct3DHALDevice device. Fixes "Grand Prix World" when the 3D car models are invisible. add: reorganization of mouse clipper fields, with the addition of LOCK mode (useful for Tribal Rage) -fix: handling of Lock/Unlock methods differentiated in ddraw 4 vs. 7. Fixes "Hoyle Casino Empire" -fix: texture hack now search for hacked textures in the texture.in folder, as stated in the documentation -fix: D3D7 EnumDevices hexdump fixed -add: flag "Pretend Win visible on top" (PRETENDVISIBLE) to let the program believe that the main window is always visible and on z-order top as a fullscreen window should be -fix: fixed some divide by 0 conditions when window is minimized \ No newline at end of file + +v2.04.00 +add: texture management for D3D textures: XCTn compressed textures, raw mode, texture highlight and hack +add: Input / "fix MOUSEHOOK callback" option, fixes "Jagged Alliance 2" mouse problems +add: GDI / "Pretend Win visible & on top" option: experimental, let the program believe that the main window is visible and on top of z-order as usually happens to full screen applications +add: GDI / "Win insulation" flag: avoid enumerating windows so that the program can't interfere with them. Fixes "Tribal Rage" damages to desktop. +add: hook to ddraw DuplicateSurface() method, so far for logging only. +fix: eliminated possible divide by 0 exception when minimizing windows +fix: mouse clipping now selected by radio buttons (default, off, on, locked) +fix: bug in D3D device enumeration log +fix: bug in Hybrid and GDI ddraw surface rendering +fix: missing "No HAL Device" flag default to disabled diff --git a/dll/d3dtexture.cpp b/dll/d3dtexture.cpp index 01c6f4b..e9bac6b 100644 --- a/dll/d3dtexture.cpp +++ b/dll/d3dtexture.cpp @@ -8,7 +8,23 @@ #include "syslibs.h" #include "stdio.h" +#define STB_DXT_IMPLEMENTATION +#include "stb_dxt.h" + extern unsigned int HashSurface(BYTE *, int, int, int); +extern char *GetDxWndPath(); + +static unsigned int HashBuffer(BYTE *buf, int len) +{ + unsigned int b = 378551; + unsigned int a = 63689; + DWORD hash = 0; + for(int i = 0; i < len; i++){ + hash = (hash * a) + (*buf++); + a = a * b; + } + return hash; +} static WORD Melt_123(WORD c1, WORD c2) { @@ -124,34 +140,191 @@ char *ExplainD3DSurfaceFormat(DWORD dwFormat) return s; } -#define GRIDSIZE 16 - -void D3DTextureHighlight(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) +static int FormatColorDepth(D3DFORMAT Format) { - switch (Desc.Format){ + int iColorDepth = 0; + switch (Format){ case D3DFMT_X8R8G8B8: - case D3DFMT_A8R8G8B8: - { - DWORD *p; - DWORD color; - color=(DWORD)(rand() & 0x00FFFFFF); - for(UINT y=0; y> 2); - for(UINT x=0; x> 2); - for(UINT x=0; x>2); y+=2) - // memset((BYTE *)LockedRect.pBits + (y * LockedRect.Pitch), 0x00, LockedRect.Pitch); - default: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + case D3DFMT_A8: + case D3DFMT_L8: + iColorDepth = 32; + break; + case D3DFMT_DXT1: + case D3DFMT_A4R4G4B4: // AoE III + case D3DFMT_X4R4G4B4: + case D3DFMT_A1R5G5B5: // AoE III + case D3DFMT_X1R5G5B5: + case D3DFMT_R5G6B5: + iColorDepth = 16; break; } + return iColorDepth; +} + +// FormatColorBytes macro gives color depth in bytes by dividing by 8 (=> lshift 3) +#define FormatColorBytes(Format) (FormatColorDepth(Format) >> 3) + +static DWORD TextureSize(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) +{ + DWORD dwSize; + + // calculate the texture size + switch (Desc.Format){ + case D3DFMT_A4R4G4B4: + case D3DFMT_X4R4G4B4: + case D3DFMT_X1R5G5B5: + case D3DFMT_A1R5G5B5: + case D3DFMT_R5G6B5: + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + //case D3DFMT_A8: + //case D3DFMT_L8: + dwSize = Desc.Width * Desc.Height * FormatColorBytes(Desc.Format); + break; + case D3DFMT_DXT1: + case D3DFMT_DXT2: + case D3DFMT_DXT3: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + dwSize = (Desc.Width * Desc.Height * FormatColorBytes(Desc.Format)) / 4; + break; + default: + dwSize = 0; // 0 = unknown or not interesting + break; + } + return dwSize; +} + +static DWORD D3DHash(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) +{ + DWORD hash; + static BOOL DoOnce = TRUE; + + // calculate the bitmap hash + hash = 0; + switch (Desc.Format){ + // hash for uncompressed bmp-like formats with possible empty area at end of pitch size + case D3DFMT_A4R4G4B4: + case D3DFMT_X4R4G4B4: + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + case D3DFMT_R5G6B5: + case D3DFMT_X1R5G5B5: + case D3DFMT_A1R5G5B5: + case D3DFMT_A8: + case D3DFMT_L8: + hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height); + break; + // hash for fixed ratio compressed formats + case D3DFMT_DXT1: + case D3DFMT_DXT2: + case D3DFMT_DXT3: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + hash = HashBuffer((BYTE *)LockedRect.pBits, TextureSize(Desc, LockedRect)); + break; + case D3DFMT_V8U8: + case D3DFMT_Q8W8V8U8: // Tiger Woods PGA Tour 08 + case D3DFMT_V16U16: + case D3DFMT_Q16W16V16U16: + case D3DFMT_CxV8U8: + case D3DFMT_L6V5U5: + case D3DFMT_X8L8V8U8: + case D3DFMT_A2W10V10U10: + // Bumpmap surfaces, dump is meaningless ..... + break; + default: + char sMsg[80+1]; + if(DoOnce){ + sprintf_s(sMsg, 80, "Unhandled texture type=%d(%s)", Desc.Format, ExplainD3DSurfaceFormat(Desc.Format)); + MessageBox(0, sMsg, "WARN", MB_OK | MB_ICONEXCLAMATION); + DoOnce = FALSE; + } + break; + } + return hash; +} + +BOOL SetBMPStruct(LPBITMAPV4HEADER lpBV4Hdr, LPBITMAPFILEHEADER lpBFHdr, D3DSURFACE_DESC Desc) +{ + // set bmp invariant parameters + memset((void *)lpBV4Hdr, 0, sizeof(BITMAPV4HEADER)); + lpBV4Hdr->bV4Size = sizeof(BITMAPV4HEADER); + lpBV4Hdr->bV4Width = Desc.Width; + lpBV4Hdr->bV4Height = Desc.Height; + lpBV4Hdr->bV4Planes = 1; + lpBV4Hdr->bV4V4Compression = BI_BITFIELDS; + lpBV4Hdr->bV4XPelsPerMeter = 1; + lpBV4Hdr->bV4YPelsPerMeter = 1; + lpBV4Hdr->bV4ClrUsed = 0; + lpBV4Hdr->bV4ClrImportant = 0; + lpBV4Hdr->bV4CSType = LCS_CALIBRATED_RGB; + lpBFHdr->bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" + lpBFHdr->bfReserved1 = 0; + lpBFHdr->bfReserved2 = 0; + + switch (Desc.Format){ + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + case D3DFMT_DXT2: + case D3DFMT_DXT3: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + case D3DFMT_A8: + case D3DFMT_L8: + lpBV4Hdr->bV4BitCount = 32; + lpBV4Hdr->bV4RedMask = 0x00FF0000; + lpBV4Hdr->bV4GreenMask = 0x0000FF00; + lpBV4Hdr->bV4BlueMask = 0x000000FF; + lpBV4Hdr->bV4AlphaMask = 0xFF000000; + break; + case D3DFMT_DXT1: + lpBV4Hdr->bV4BitCount = 16; + lpBV4Hdr->bV4RedMask = 0xF800; + lpBV4Hdr->bV4GreenMask = 0x07E0; + lpBV4Hdr->bV4BlueMask = 0x001F; + lpBV4Hdr->bV4AlphaMask = 0x0000; + break; + case D3DFMT_A4R4G4B4: // AoE III + case D3DFMT_X4R4G4B4: + lpBV4Hdr->bV4BitCount = 16; + lpBV4Hdr->bV4RedMask = 0x0F00; + lpBV4Hdr->bV4GreenMask = 0x00F0; + lpBV4Hdr->bV4BlueMask = 0x000F; + lpBV4Hdr->bV4AlphaMask = 0xF000; + break; + case D3DFMT_A1R5G5B5: // AoE III + case D3DFMT_X1R5G5B5: + lpBV4Hdr->bV4BitCount = 16; + lpBV4Hdr->bV4RedMask = 0x7C00; + lpBV4Hdr->bV4GreenMask = 0x03E0; + lpBV4Hdr->bV4BlueMask = 0x001F; + lpBV4Hdr->bV4AlphaMask = 0x8000; + break; + case D3DFMT_R5G6B5: + lpBV4Hdr->bV4BitCount = 16; + lpBV4Hdr->bV4RedMask = 0x7C00; + lpBV4Hdr->bV4GreenMask = 0x03E0; + lpBV4Hdr->bV4BlueMask = 0x001F; + lpBV4Hdr->bV4AlphaMask = 0x0000; + break; + } + + lpBV4Hdr->bV4SizeImage = ((lpBV4Hdr->bV4Width * lpBV4Hdr->bV4BitCount + 0x1F) & ~0x1F)/8 * lpBV4Hdr->bV4Height; + lpBV4Hdr->bV4Height = - lpBV4Hdr->bV4Height; + + // Compute the size of the entire file. + lpBFHdr->bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + lpBV4Hdr->bV4Size + lpBV4Hdr->bV4ClrUsed * sizeof(RGBQUAD) + lpBV4Hdr->bV4SizeImage); + + // Compute the offset to the array of color indices. + lpBFHdr->bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + lpBV4Hdr->bV4Size + lpBV4Hdr->bV4ClrUsed * sizeof (RGBQUAD); + + return 0; } void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) @@ -165,10 +338,10 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) int iSurfaceSize, iScanLineSize; char pszFile[MAX_PATH]; DWORD hash; + BOOL IsRaw = (dxw.dwFlags8 & RAWFORMAT); if(DoOnce){ char sProfilePath[MAX_PATH]; - extern char *GetDxWndPath(); sprintf(sProfilePath, "%s\\dxwnd.ini", GetDxWndPath()); MinTexX=GetPrivateProfileInt("Texture", "MinTexX", 0, sProfilePath); MaxTexX=GetPrivateProfileInt("Texture", "MaxTexX", 0, sProfilePath); @@ -193,136 +366,35 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) } iSurfaceSize = Desc.Height * LockedRect.Pitch; - // calculate the bitmap hash - hash = 0; - switch (Desc.Format){ - case D3DFMT_A4R4G4B4: - case D3DFMT_X4R4G4B4: - case D3DFMT_X8R8G8B8: - case D3DFMT_A8R8G8B8: - case D3DFMT_R5G6B5: - case D3DFMT_X1R5G5B5: - case D3DFMT_A1R5G5B5: - case D3DFMT_A8: - case D3DFMT_L8: - hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height); - break; - case D3DFMT_DXT1: - hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch / 6, Desc.Width / 6, Desc.Height); - break; - case D3DFMT_DXT2: - case D3DFMT_DXT3: - hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch / 4, Desc.Width / 4, Desc.Height); - break; - case D3DFMT_DXT4: - case D3DFMT_DXT5: - hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch / 4, Desc.Width / 4, Desc.Height); - break; - case D3DFMT_V8U8: - case D3DFMT_Q8W8V8U8: // Tiger Woods PGA Tour 08 - case D3DFMT_V16U16: - case D3DFMT_Q16W16V16U16: - case D3DFMT_CxV8U8: - case D3DFMT_L6V5U5: - case D3DFMT_X8L8V8U8: - case D3DFMT_A2W10V10U10: - // Bumpmap surfaces, dump is meaningless ..... - break; - default: - char sMsg[80+1]; - static BOOL DoOnce = TRUE; - if(DoOnce){ - sprintf_s(sMsg, 80, "Unhandled texture type=%d(%s)", Desc.Format, ExplainD3DSurfaceFormat(Desc.Format)); - MessageBox(0, sMsg, "WARN", MB_OK | MB_ICONEXCLAMATION); - DoOnce = FALSE; - } - break; + // skip unsupported raw compressions + if(!TextureSize(Desc, LockedRect)){ + OutTrace("TextureDump: UNSUPPORTED\n"); + break; } + // calculate the bitmap hash + hash = D3DHash(Desc, LockedRect); if(!hash) { OutTrace("TextureDump: hash=NULL\n"); break; // almost certainly, an empty black surface! } // Create the .BMP file. - extern char *GetDxWndPath(); - sprintf_s(pszFile, MAX_PATH, "%s\\texture.out\\texture.%03d.%03d.%s.%08X.bmp", - GetDxWndPath(), Desc.Width, Desc.Height, ExplainD3DSurfaceFormat(Desc.Format), hash); + sprintf_s(pszFile, MAX_PATH, "%s\\texture.out\\texture.%03d.%03d.%s.%08X.%s", + GetDxWndPath(), Desc.Width, Desc.Height, ExplainD3DSurfaceFormat(Desc.Format), + hash, IsRaw ? "raw" : "bmp"); hf = fopen(pszFile, "wb"); if(!hf) break; - // set bmp invariant parameters - memset((void *)&pbi, 0, sizeof(BITMAPV4HEADER)); - pbi.bV4Size = sizeof(BITMAPV4HEADER); - pbi.bV4Width = Desc.Width; - pbi.bV4Height = Desc.Height; - pbi.bV4Planes = 1; - pbi.bV4V4Compression = BI_BITFIELDS; - pbi.bV4XPelsPerMeter = 1; - pbi.bV4YPelsPerMeter = 1; - pbi.bV4ClrUsed = 0; - pbi.bV4ClrImportant = 0; - pbi.bV4CSType = LCS_CALIBRATED_RGB; - hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" - hdr.bfReserved1 = 0; - hdr.bfReserved2 = 0; - - switch (Desc.Format){ - case D3DFMT_X8R8G8B8: - case D3DFMT_A8R8G8B8: - case D3DFMT_DXT2: - case D3DFMT_DXT3: - case D3DFMT_DXT4: - case D3DFMT_DXT5: - case D3DFMT_A8: - case D3DFMT_L8: - pbi.bV4BitCount = 32; - pbi.bV4RedMask = 0x00FF0000; - pbi.bV4GreenMask = 0x0000FF00; - pbi.bV4BlueMask = 0x000000FF; - pbi.bV4AlphaMask = 0xFF000000; - break; - case D3DFMT_DXT1: - pbi.bV4BitCount = 16; - pbi.bV4RedMask = 0xF800; - pbi.bV4GreenMask = 0x07E0; - pbi.bV4BlueMask = 0x001F; - pbi.bV4AlphaMask = 0x0000; - break; - case D3DFMT_A4R4G4B4: // AoE III - case D3DFMT_X4R4G4B4: - pbi.bV4BitCount = 16; - pbi.bV4RedMask = 0x0F00; - pbi.bV4GreenMask = 0x00F0; - pbi.bV4BlueMask = 0x000F; - pbi.bV4AlphaMask = 0xF000; - break; - case D3DFMT_A1R5G5B5: // AoE III - case D3DFMT_X1R5G5B5: - pbi.bV4BitCount = 16; - pbi.bV4RedMask = 0x7C00; - pbi.bV4GreenMask = 0x03E0; - pbi.bV4BlueMask = 0x001F; - pbi.bV4AlphaMask = 0x8000; - break; - case D3DFMT_R5G6B5: - pbi.bV4BitCount = 16; - pbi.bV4RedMask = 0x7C00; - pbi.bV4GreenMask = 0x03E0; - pbi.bV4BlueMask = 0x001F; - pbi.bV4AlphaMask = 0x0000; - break; + if(IsRaw){ + fwrite((BYTE *)LockedRect.pBits, TextureSize(Desc, LockedRect), 1, hf); + fclose(hf); + return; } - pbi.bV4SizeImage = ((pbi.bV4Width * pbi.bV4BitCount + 0x1F) & ~0x1F)/8 * pbi.bV4Height; + // set bmp invariant parameters + if (SetBMPStruct(&pbi, &hdr, Desc)) break; iScanLineSize = ((pbi.bV4Width * pbi.bV4BitCount + 0x1F) & ~0x1F)/8; - pbi.bV4Height = - pbi.bV4Height; - - // Compute the size of the entire file. - hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbi.bV4Size + pbi.bV4ClrUsed * sizeof(RGBQUAD) + pbi.bV4SizeImage); - - // Compute the offset to the array of color indices. - hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbi.bV4Size + pbi.bV4ClrUsed * sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file. fwrite((LPVOID)&hdr, sizeof(BITMAPFILEHEADER), 1, hf); @@ -531,6 +603,260 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) void D3DTextureHack(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) { + static BOOL DoOnce = TRUE; + static int MinTexX, MinTexY, MaxTexX, MaxTexY; + FILE *hf; + BITMAPFILEHEADER hdr; // bitmap file-header + BITMAPV4HEADER pbi; // bitmap info-header + int iSurfaceSize, iScanLineSize; + char pszFile[MAX_PATH]; + DWORD hash; + int w, h; + BOOL IsRaw = (dxw.dwFlags8 & RAWFORMAT); + + OutTraceB("TextureHack(D3D)\n"); + + if(DoOnce){ + char sProfilePath[MAX_PATH]; + sprintf(sProfilePath, "%s\\dxwnd.ini", GetDxWndPath()); + MinTexX=GetPrivateProfileInt("Texture", "MinTexX", 0, sProfilePath); + MaxTexX=GetPrivateProfileInt("Texture", "MaxTexX", 0, sProfilePath); + MinTexY=GetPrivateProfileInt("Texture", "MinTexY", 0, sProfilePath); + MaxTexY=GetPrivateProfileInt("Texture", "MaxTexY", 0, sProfilePath); + OutTrace("TextureHack: size min=(%dx%d) max=(%dx%d)\n", MinTexX, MinTexY, MaxTexX, MaxTexY); + sprintf_s(pszFile, MAX_PATH, "%s\\texture.in", GetDxWndPath()); + DoOnce = FALSE; + } + + while(TRUE){ // fake loop + w = Desc.Width; + h = Desc.Height; + if((MinTexX && (wMaxTexX)) || (MaxTexY && (h>MaxTexY))) { + OutTrace("TextureHack: SKIP big texture\n"); + break; + } + iSurfaceSize = Desc.Height * LockedRect.Pitch; + + // calculate the bitmap hash + hash = D3DHash(Desc, LockedRect); + if(!hash) { + OutTrace("TextureHack: hash=NULL\n"); + break; // almost certainly, an empty black surface! + } + + // Look for the .BMP file. + sprintf_s(pszFile, MAX_PATH, "%s\\texture.in\\texture.%03d.%03d.%s.%08X.%s", + GetDxWndPath(), Desc.Width, Desc.Height, ExplainD3DSurfaceFormat(Desc.Format), + hash, IsRaw ? "raw" : "bmp"); + hf = fopen(pszFile, "rb"); + if(!hf) break; // no updated texture to load + + OutTrace("TextureHack: IMPORT path=%s\n", pszFile); + + if(IsRaw){ + fread((BYTE *)LockedRect.pBits, TextureSize(Desc, LockedRect), 1, hf); + fclose(hf); + return; + } + + int iBitCount = FormatColorDepth(Desc.Format); + if(iBitCount == 0){ + OutTrace("TextureHack: unsupported format=%x\n", Desc.Format); + break; + } + iScanLineSize = ((Desc.Width * iBitCount + 0x1F) & ~0x1F)/8; + + while(TRUE) { // fake loop to ensure final fclose + // Read the BITMAPFILEHEADER from the .BMP file (and throw away ...). + if(fread((LPVOID)&hdr, sizeof(BITMAPFILEHEADER), 1, hf) != 1)break; + + // Read the BITMAPINFOHEADER (and throw away ...). + // If the file contains BITMAPV4HEADER or BITMAPV5HEADER, no problem: next fseek will settle things + if(fread((LPVOID)&pbi, sizeof(BITMAPINFOHEADER), 1, hf) != 1) break; + + // skip the RGBQUAD array if the editor inserted one + fseek(hf, hdr.bfOffBits, SEEK_SET); + + switch (Desc.Format){ + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + // Read the new texture from the .BMP file. + if(pbi.bV4Height < 0){ + // biHeight < 0 -> scan lines from top to bottom, same as surface/texture convention + for(int y=0; y<(int)Desc.Height; y++){ + BYTE *p = (BYTE *)LockedRect.pBits + (LockedRect.Pitch * y); + fseek(hf, hdr.bfOffBits + (iScanLineSize * y), SEEK_SET); + if(fread((LPVOID)p, LockedRect.Pitch, 1, hf) != 1) break; + } + } + else { + // biHeight > 0 -> scan lines from bottom to top, inverse order as surface/texture convention + for(int y=0; y<(int)Desc.Height; y++){ + BYTE *p = (BYTE *)LockedRect.pBits + (LockedRect.Pitch * ((Desc.Height-1) - y)); + fseek(hf, hdr.bfOffBits + (iScanLineSize * y), SEEK_SET); + if(fread((LPVOID)p, LockedRect.Pitch, 1, hf) != 1) break; + } + } + break; + case D3DFMT_DXT1: + // Read the new texture from the .BMP file. + if(pbi.bV4Height < 0){ + BYTE *p = (BYTE *)LockedRect.pBits; + BYTE *fb; + fb = (BYTE *)malloc(Desc.Width * Desc.Height * sizeof(WORD)); + if(!fb) { + OutTrace("TextureHack: malloc error\n"); + break; + } + fseek(hf, hdr.bfOffBits, SEEK_SET); + if(fread((LPVOID)fb, Desc.Height * Desc.Width * (iBitCount / 8), 1, hf) != 1) { + OutTrace("TextureHack: fread error\n"); + free(fb); + break; + } + // biHeight < 0 -> scan lines from top to bottom, same as surface/texture convention + for(int y=0; y<(int)Desc.Height; y+=4){ + for(int x=0; x<(int)Desc.Width; x+=4){ + OutTrace("Compressing line=%d row=%d\n", y, x); + stb_compress_dxt_block(p, fb, FALSE, STB_DXT_NORMAL); + p += (16 * sizeof(DWORD) / 8); + OutTrace("Compression done\n"); + fb += 4 * 2; + } + } + free(fb); + } + break; + case D3DFMT_DXT5: + // Read the new texture from the .BMP file. + if(pbi.bV4Height < 0){ + BYTE *p = (BYTE *)LockedRect.pBits; + BYTE *fb; + fb = (BYTE *)malloc(Desc.Width * Desc.Height * sizeof(DWORD)); + if(!fb) { + OutTrace("TextureHack: malloc error\n"); + break; + } + fseek(hf, hdr.bfOffBits, SEEK_SET); + if(fread((LPVOID)fb, Desc.Height * Desc.Width * (iBitCount / 8), 1, hf) != 1) { + OutTrace("TextureHack: fread error\n"); + free(fb); + break; + } + // biHeight < 0 -> scan lines from top to bottom, same as surface/texture convention + for(int y=0; y<(int)Desc.Height; y+=4){ + for(int x=0; x<(int)Desc.Width; x+=4){ + OutTrace("Compressing line=%d row=%d\n", y, x); + stb_compress_dxt_block(p, fb, FALSE, STB_DXT_NORMAL); + p += (16 * sizeof(DWORD) / 4); + OutTrace("Compression done\n"); + fb += 4 * 4; + } + } + free(fb); + } + break; + } + + OutTrace("TextureHack: TEXTURE LOAD DONE\n"); + break; + } + + fclose(hf); + break; + } +} + +#define GRIDSIZE 16 + +void D3DTextureHighlight(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) +{ + switch (Desc.Format){ + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + { + DWORD *p; + DWORD color; + color=(DWORD)(rand() & 0x00FFFFFF); + for(UINT y=0; y> 2); + for(UINT x=0; x> 2); + for(UINT x=0; xCreateClipper(0, &lpddC, NULL); - if (res) OutTraceE("CreateSurface: CreateClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); + if (res) OutTraceE("BuildRealSurfaces: CreateClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); res=lpddC->SetHWnd(0, dxw.GethWnd()); - if (res) OutTraceE("CreateSurface: SetHWnd ERROR res=%x(%s)\n", res, ExplainDDError(res)); + if (res) OutTraceE("BuildRealSurfaces: SetHWnd ERROR res=%x(%s)\n", res, ExplainDDError(res)); res=lpDDSEmu_Prim->SetClipper(lpddC); - if (res) OutTraceE("CreateSurface: SetClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); + if (res) OutTraceE("BuildRealSurfaces: SetClipper ERROR res=%x(%s)\n", res, ExplainDDError(res)); } // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! // better avoid it or hook just useful methods. @@ -146,19 +146,19 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa ddsd.dwHeight = dxw.GetScreenHeight() << 1; } - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); + OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); if(res) { ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); + OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); } if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildRealSurfaces: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return; } - OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); + OutTraceDW("BuildRealSurfaces: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); dxwss.PopSurface(lpDDSEmu_Back); //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); @@ -190,7 +190,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildPrimaryEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildPrimaryEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // emulated primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); @@ -200,7 +200,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // then save it dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + OutTraceDW("BuildPrimaryEmu: DDSD_PIXELFORMAT color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); @@ -213,16 +213,16 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwHeight = dxw.GetScreenHeight(); // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + OutTraceDW("BuildPrimaryEmu: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildPrimaryEmu: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } iBakBufferVersion=dxversion; // v2.03.01 - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("BuildPrimaryEmu: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); HookDDSurface(lplpdds, dxversion, TRUE); // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... @@ -232,12 +232,12 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + if(res) OutTrace("BuildPrimaryEmu: CreatePalette ERROR err=%x at %d\n", res, __LINE__); } // this must be done after hooking - who knows why? res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + OutTraceE("BuildPrimaryEmu: SetPalette ERROR err=%x at %d\n", res, __LINE__); } else iDDPExtraRefCounter++; } @@ -263,7 +263,7 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildPrimaryFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildPrimaryFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // emulated primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); @@ -273,7 +273,7 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea // then save it dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + OutTraceDW("BuildPrimaryFlippable: DDSD_PIXELFORMAT color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); // dwFlags ddsd.dwFlags &= ~(DDSD_REFRESHRATE); @@ -293,16 +293,16 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea ddsd.dwHeight = dxw.GetScreenHeight(); // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + OutTraceDW("BuildPrimaryFlippable: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildPrimaryFlippable: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } iBakBufferVersion=dxversion; // v2.03.01 - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("BuildPrimaryFlippable: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); HookDDSurface(lplpdds, dxversion, TRUE); // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... @@ -312,12 +312,12 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + if(res) OutTrace("BuildPrimaryFlippable: CreatePalette ERROR err=%x at %d\n", res, __LINE__); } // this must be done after hooking - who knows why? res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + OutTraceE("BuildPrimaryFlippable: SetPalette ERROR err=%x at %d\n", res, __LINE__); } else iDDPExtraRefCounter++; } @@ -341,12 +341,12 @@ static HRESULT BuildPrimaryFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCre DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildPrimaryFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildPrimaryFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // genuine primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); + OutTraceDW("BuildPrimaryFullscreen: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ @@ -360,20 +360,20 @@ static HRESULT BuildPrimaryFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCre case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); + OutTraceE("BuildPrimaryFullscreen: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); (*pGetGDISurface)(lpPrimaryDD, &lpPrim); while ((*pReleaseSMethod(dxversion))(lpPrim)); res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); } /* fall through */ if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildPrimaryFullscreen: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } } - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("BuildPrimaryFullscreen: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); iBakBufferVersion=dxversion; @@ -388,7 +388,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildPrimaryDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildPrimaryDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // genuine primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); // v2.03.98 - when going to fullscreen mode and no emulation do not alter the capability masks, or in other words ... @@ -400,7 +400,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); + OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ @@ -414,20 +414,20 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); + OutTraceE("BuildPrimaryDir: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); (*pGetGDISurface)(lpPrimaryDD, &lpPrim); while ((*pReleaseSMethod(dxversion))(lpPrim)); res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); } /* fall through */ if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildPrimaryDir: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } } - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + OutTraceDW("BuildPrimaryDir: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); if(dxw.dwFlags1 & EMULATEBUFFER){ @@ -440,13 +440,13 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.ddsCaps.dwCaps = 0; if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__)); + OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); + OutTraceE("BuildPrimaryDir: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); return res; } - OutTraceDW("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); + OutTraceDW("BuildPrimaryDir: created FIX DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim(2)", __LINE__); } @@ -462,7 +462,7 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildBackBufferEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildBackBufferEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // create BackBuffer surface memcpy(&ddsd, lpddsd, lpddsd->dwSize); ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); @@ -481,15 +481,15 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.dwHeight = dxw.GetScreenHeight(); GetPixFmt(&ddsd); - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + OutTraceDW("BuildBackBufferEmu: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildBackBufferEmu: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("BuildBackBufferEmu: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 @@ -498,12 +498,12 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + if(res) OutTrace("BuildBackBufferEmu: CreatePalette ERROR err=%x at %d\n", res, __LINE__); } // this must be done after hooking - who knows why? res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + OutTraceE("BuildBackBufferEmu: SetPalette ERROR err=%x at %d\n", res, __LINE__); } else iDDPExtraRefCounter++; } @@ -524,7 +524,7 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); //MessageBox(NULL, "BuildBackBufferFlippable", "DxWnd", MB_OK); // create BackBuffer surface @@ -540,15 +540,15 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC ddsd.dwHeight = dxw.GetScreenHeight(); GetPixFmt(&ddsd); - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + OutTraceDW("BuildBackBufferFlippable: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildBackBufferFlippable: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("BuildBackBufferFlippable: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 @@ -557,12 +557,12 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ res=(*pCreatePaletteMethod(dxversion))(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL); - if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__); + if(res) OutTrace("BuildBackBufferFlippable: CreatePalette ERROR err=%x at %d\n", res, __LINE__); } // this must be done after hooking - who knows why? res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { - OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); + OutTraceE("BuildBackBufferFlippable: SetPalette ERROR err=%x at %d\n", res, __LINE__); } else iDDPExtraRefCounter++; } @@ -574,7 +574,7 @@ static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type p { HRESULT res; LPDIRECTDRAWSURFACE lpDDSPrim; - OutTraceDW("DEBUG: AttachBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("AttachBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // retrieve the attached backbuffer surface and hook it @@ -594,11 +594,11 @@ static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type p lpDDSPrim = dxwss.GetPrimarySurface(); res = (*pGetAttachedSurface)(lpDDSPrim, (LPDDSCAPS)&caps, lplpdds); if(res){ - OutTraceE("CreateSurface: GetAttachedSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("AttachBackBufferFlippable: GetAttachedSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } - OutTraceDW("CreateSurface: retrieved BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("AttachBackBufferFlippable: retrieved BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 @@ -608,13 +608,13 @@ static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type p static HRESULT BuildBackBufferFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { - OutTraceDW("DEBUG: BuildBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); return DD_OK; } static HRESULT AttachBackBufferFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { - OutTraceDW("DEBUG: AttachBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("AttachBackBufferFullscreen: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); return DD_OK; } @@ -623,7 +623,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildBackBufferDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildBackBufferDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // create BackBuffer surface // ClearSurfaceDesc((void *)&ddsd, dxversion); memcpy(&ddsd, lpddsd, lpddsd->dwSize); @@ -664,24 +664,24 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS (*pReleaseSMethod(dxversion))(lpPrim); ddsd.dwWidth = prim.dwWidth; ddsd.dwHeight = prim.dwHeight; - OutTraceDW("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); + OutTraceDW("BuildBackBufferDir: BMX FIX res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); } - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + OutTraceDW("BuildBackBufferDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceDW("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); + OutTraceDW("BuildBackBufferDir: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); } if(res){ - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildBackBufferDir: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } } - OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + OutTraceDW("BuildBackBufferDir: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 @@ -694,7 +694,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildGenericEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildGenericEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... FixSurfaceCaps(&ddsd, dxversion); // It looks that DDSCAPS_SYSTEMMEMORY surfaces can perfectly be DDSCAPS_3DDEVICE as well. @@ -708,24 +708,24 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ){ DWORD dwWidth; dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; - if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); + if(dwWidth != ddsd.dwWidth) OutTraceDW("BuildGenericEmu: POWER2WIDTH fix surface width %d->%d\n", ddsd.dwWidth, dwWidth); ddsd.dwWidth = dwWidth; } } res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ - OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + OutTraceDW("BuildGenericEmu: CreateSurface ERROR res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); } if (res) { - OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildGenericEmu: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + OutTraceDW("BuildGenericEmu: CREATED lpddsd=%x version=%d %s\n", *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. @@ -733,9 +733,9 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) - OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); + OutTraceE("BuildGenericEmu: SetPalette ERROR lpdds=%x res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); else { - OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); + OutTraceDW("BuildGenericEmu: applied palette lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); iDDPExtraRefCounter++; } } @@ -751,7 +751,7 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea DDSURFACEDESC2 ddsd; HRESULT res; - OutTraceDW("DEBUG: BuildGenericFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildGenericFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... FixSurfaceCaps(&ddsd, dxversion); @@ -761,24 +761,24 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea ){ DWORD dwWidth; dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; - if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); + if(dwWidth != ddsd.dwWidth) OutTraceDW("BuildGenericFlippable: POWER2WIDTH fix surface width %d->%d\n", ddsd.dwWidth, dwWidth); ddsd.dwWidth = dwWidth; } } res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ - OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + OutTraceDW("BuildGenericFlippable: CreateSurface ERROR res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); } if (res) { - OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildGenericFlippable: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + OutTraceDW("BuildGenericFlippable: CREATED lpddsd=%x version=%d %s\n", *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. @@ -786,9 +786,9 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) - OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); + OutTraceE("BuildGenericFlippable: SetPalette ERROR on lpdds=%x res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); else { - OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); + OutTraceDW("BuildGenericFlippable: applied palette lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); iDDPExtraRefCounter++; } } @@ -803,25 +803,25 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf { HRESULT res; - OutTraceDW("DEBUG: BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); + OutTraceDW("BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("BuildGenericDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); if(res){ // v2.02.60: Ref. game Incoming GOG release, post by Marek, error DDERR_UNSUPPORTED while trying to create ZBUFFER surface if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && ((res==DDERR_OUTOFVIDEOMEMORY)||(res==DDERR_UNSUPPORTED))){ - OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + OutTraceDW("BuildGenericDir: CreateSurface ERROR res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); } if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("BuildGenericDir: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } } - OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + OutTraceDW("BuildGenericDir: CREATED lpddsd=%x version=%d %s\n", *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); // hooks .... @@ -1037,8 +1037,9 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface dxwss.PopSurface(*lplpdds); if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { // v2.03.82: save ZBUFFER capabilities for later fix in D3D CreateDevice - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); OutTraceDW("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); + lpDDZBuffer = *lplpdds; + dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); } } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 6439d92..ae63747 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -76,6 +76,11 @@ HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURF HRESULT WINAPI extCreateSurface3(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); +HRESULT WINAPI extDuplicateSurface1(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR *); +HRESULT WINAPI extDuplicateSurface2(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR *); +HRESULT WINAPI extDuplicateSurface3(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR *); +HRESULT WINAPI extDuplicateSurface4(LPDIRECTDRAW, LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 FAR *); +HRESULT WINAPI extDuplicateSurface7(LPDIRECTDRAW, LPDIRECTDRAWSURFACE7, LPDIRECTDRAWSURFACE7 FAR *); HRESULT WINAPI extFlipToGDISurface1(LPDIRECTDRAW); HRESULT WINAPI extFlipToGDISurface2(LPDIRECTDRAW); HRESULT WINAPI extFlipToGDISurface3(LPDIRECTDRAW); @@ -314,6 +319,9 @@ Compact_Type pCompact; CreateClipper_Type pCreateClipper1, pCreateClipper2, pCreateClipper3, pCreateClipper4, pCreateClipper7; CreatePalette_Type pCreatePalette1, pCreatePalette2, pCreatePalette3, pCreatePalette4, pCreatePalette7; CreateSurface1_Type pCreateSurface1, pCreateSurface2, pCreateSurface3, pCreateSurface4, pCreateSurface7; +DuplicateSurface_Type pDuplicateSurface1, pDuplicateSurface2, pDuplicateSurface3; +DuplicateSurface4_Type pDuplicateSurface4; +DuplicateSurface7_Type pDuplicateSurface7; EnumDisplayModes1_Type pEnumDisplayModes1, pEnumDisplayModes2, pEnumDisplayModes3; EnumDisplayModes4_Type pEnumDisplayModes4, pEnumDisplayModes7; EnumSurfaces1_Type pEnumSurfaces1; @@ -416,7 +424,7 @@ GammaRamp_Type pDDSetGammaRamp; extern PALETTEENTRY DefaultSystemPalette[256]; LPDIRECTDRAWSURFACE lpDDSEmu_Prim=NULL; LPDIRECTDRAWSURFACE lpDDSEmu_Back=NULL; -LPDIRECTDRAWSURFACE lpDDZBuffer=NULL; +LPDIRECTDRAWSURFACE lpDDZBuffer=NULL; // BEWARE! Likely, this global is useless .... // v2.1.87: lpPrimaryDD is the DIRECTDRAW object to which the primary surface and all // the service objects (emulated backbuffer, emulater primary, ....) are attached. LPDIRECTDRAW lpPrimaryDD=NULL; @@ -1156,10 +1164,11 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) switch(dxversion) { case 1: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)"); - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper1, (void **)&pCreateClipper1, "CreateClipper(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD1, (void **)&pReleaseD1, "Release(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper1, (void **)&pCreateClipper1, "CreateClipper(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette1, (void **)&pCreatePalette1, "CreatePalette(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface1, (void **)&pDuplicateSurface1, "DuplicateSurface(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes1, (void **)&pEnumDisplayModes1, "EnumDisplayModes(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface1, (void **)&pFlipToGDISurface1, "FlipToGDISurface(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)"); @@ -1174,10 +1183,11 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) break; case 2: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD2, (void **)&pQueryInterfaceD2, "QueryInterface(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper2, (void **)&pCreateClipper2, "CreateClipper(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD2, (void **)&pReleaseD2, "Release(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper2, (void **)&pCreateClipper2, "CreateClipper(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette2, (void **)&pCreatePalette2, "CreatePalette(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface2, (void **)&pDuplicateSurface2, "DuplicateSurface(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes2, (void **)&pEnumDisplayModes2, "EnumDisplayModes(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface2, (void **)&pFlipToGDISurface2, "FlipToGDISurface(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); @@ -1194,10 +1204,11 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) break; case 3: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD3, (void **)&pQueryInterfaceD3, "QueryInterface(D3)"); - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper3, (void **)&pCreateClipper3, "CreateClipper(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD3, (void **)&pReleaseD3, "Release(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper3, (void **)&pCreateClipper3, "CreateClipper(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette3, (void **)&pCreatePalette3, "CreatePalette(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface3, (void **)&pCreateSurface3, "CreateSurface(D3)"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface3, (void **)&pDuplicateSurface3, "DuplicateSurface(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes3, (void **)&pEnumDisplayModes3, "EnumDisplayModes(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface3, (void **)&pFlipToGDISurface3, "FlipToGDISurface(D3)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps3D, (void **)&pGetCaps3D, "GetCaps(D3)"); @@ -1214,10 +1225,11 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) break; case 4: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD4, (void **)&pQueryInterfaceD4, "QueryInterface(D4)"); - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper4, (void **)&pCreateClipper4, "CreateClipper(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD4, (void **)&pReleaseD4, "Release(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper4, (void **)&pCreateClipper4, "CreateClipper(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette4, (void **)&pCreatePalette4, "CreatePalette(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface4, (void **)&pDuplicateSurface4, "DuplicateSurface(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes4, (void **)&pEnumDisplayModes4, "EnumDisplayModes(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface4, (void **)&pFlipToGDISurface4, "FlipToGDISurface(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps4D, (void **)&pGetCaps4D, "GetCaps(D4)"); @@ -1236,10 +1248,11 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) break; case 7: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD7, (void **)&pQueryInterfaceD7, "QueryInterface(D7)"); - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper7, (void **)&pCreateClipper7, "CreateClipper(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD7, (void **)&pReleaseD7, "Release(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper7, (void **)&pCreateClipper7, "CreateClipper(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette7, (void **)&pCreatePalette7, "CreatePalette(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface7, (void **)&pDuplicateSurface7, "DuplicateSurface(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes7, (void **)&pEnumDisplayModes7, "EnumDisplayModes(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface7, (void **)&pFlipToGDISurface7, "FlipToGDISurface(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps7D, (void **)&pGetCaps7D, "GetCaps(D7)"); @@ -1835,18 +1848,21 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, return DD_OK; } -static HRESULT WINAPI extInitialize(Initialize_Type pInitialize, LPDIRECTDRAW lpdd, GUID FAR *lpguid) +static HRESULT WINAPI extInitialize(int dxversion, Initialize_Type pInitialize, LPDIRECTDRAW lpdd, GUID FAR *lpguid) { HRESULT res; GUID FAR *lpPrivGuid = lpguid; - OutTraceDDRAW("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); + OutTraceDDRAW("Initialize(%d): lpdd=%x guid=%x(%s)\n", dxversion, lpdd, lpguid, ExplainGUID(lpguid)); if((dxw.dwFlags3 & FORCESHEL) && (lpguid==NULL)) lpPrivGuid=(GUID FAR *)DDCREATE_EMULATIONONLY; res=(*pInitialize)(lpdd, lpPrivGuid); - if(res == DDERR_ALREADYINITIALIZED) res=DD_OK; // v2.03.18: this error could be caused by the CoCreateInstance implementation + if(res == DDERR_ALREADYINITIALIZED) { + OutTrace("Initialize: SKIP DDERR_ALREADYINITIALIZED error\n"); + res=DD_OK; // v2.03.18: this error could be caused by the CoCreateInstance implementation + } if(dxw.dwFlags3 & COLORFIX) (((DDRAWI_DIRECTDRAW_INT *)lpdd))->lpLcl->dwAppHackFlags |= 0x800; if(res) OutTraceE("Initialize ERROR: res=%x(%s)\n", res, ExplainDDError(res)); @@ -1854,15 +1870,15 @@ static HRESULT WINAPI extInitialize(Initialize_Type pInitialize, LPDIRECTDRAW lp } HRESULT WINAPI extInitialize1(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ return extInitialize(pInitialize1, lpdd, lpguid); } +{ return extInitialize(1, pInitialize1, lpdd, lpguid); } HRESULT WINAPI extInitialize2(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ return extInitialize(pInitialize2, lpdd, lpguid); } +{ return extInitialize(2, pInitialize2, lpdd, lpguid); } HRESULT WINAPI extInitialize3(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ return extInitialize(pInitialize3, lpdd, lpguid); } +{ return extInitialize(3, pInitialize3, lpdd, lpguid); } HRESULT WINAPI extInitialize4(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ return extInitialize(pInitialize4, lpdd, lpguid); } +{ return extInitialize(4, pInitialize4, lpdd, lpguid); } HRESULT WINAPI extInitialize7(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ return extInitialize(pInitialize7, lpdd, lpguid); } +{ return extInitialize(7, pInitialize7, lpdd, lpguid); } static HRESULT WINAPI extRestoreDisplayMode(int dxversion, RestoreDisplayMode_Type pRestoreDisplayMode, LPDIRECTDRAW lpdd) { @@ -2203,7 +2219,7 @@ HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, char sInfo[81]; strcpy(sInfo, ""); if (dxversion>=4) sprintf(sInfo, " dwRefresh=%i dwFlags=%x", dwrefreshrate, dwflags); - OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i%s\n", + OutTrace("SetDisplayMode(%d): dwWidth=%i dwHeight=%i dwBPP=%i%s\n", dxversion, dwwidth, dwheight, dwbpp, sInfo); } @@ -2625,6 +2641,9 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceDW("GetAttachedSurface(%d): NOHALDEVICE no attached ZBUFFER\n", dxversion); return DDERR_NOTFOUND; } + + // attempt to fix S.C.A.R.S. black screen bug ... failed + //if(lpddsc->dwCaps == (DDSCAPS_TEXTURE|DDSCAPS_MIPMAP)) lpddsc->dwCaps = DDSCAPS_TEXTURE; } else { // Virtual primary surfaces are created with no DDSCAPS_3DDEVICE caps, so don't look for it .... @@ -3138,7 +3157,7 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds bEmulatedFlip = dxw.Windowize || dxw.IsEmulated; IsPrim=dxwss.IsAPrimarySurface(lpdds); - OutTraceDDRAW("Flip(%d): %s lpdds=%x%s, src=%x, flags=%x(%s) version=%d\n", + OutTraceDDRAW("Flip(%d): %s lpdds=%x%s, src=%x, flags=%x(%s)\n", dxversion, bEmulatedFlip?"EMULATED":"GENUINE", lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); @@ -3985,20 +4004,18 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA } res=(*pUnlock)(lpdds, lprect); + if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (IsPrim && res==DD_OK) { if(dxversion < 4) lprect=NULL; // v2.03.60 res=sBlt(dxversion, pBlt, "Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); } - if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; - if((dxw.dwFlags5 & TEXTUREMASK) && (!IsPrim)) { // Texture Handling on Unlock TextureHandling(lpdds, dxversion); } - + OutTraceB("Unlock OK\n"); return res; } @@ -4091,8 +4108,16 @@ static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECT res=(*pUnlock)(lpdds, lprect); if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if (IsPrim && res==DD_OK) sBlt(dxversion, pBlt, "Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); + if (IsPrim && res==DD_OK) { + if(dxversion < 4) lprect=NULL; // v2.03.60 + res=sBlt(dxversion, pBlt, "Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); + } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; + if((dxw.dwFlags5 & TEXTUREMASK) && (!IsPrim)) { + // Texture Handling on Unlock + TextureHandling(lpdds, dxversion); + } + OutTraceB("Unlock OK\n"); return res; } @@ -4603,6 +4628,7 @@ static HRESULT WINAPI extSetColorKey(SetColorKey_Type pSetColorKey, LPDIRECTDRAW res=(*pSetColorKey)(lpdds, flags, lpDDColorKey); if(res) OutTraceE("SetColorKey: ERROR flags=%x lpdds=%x res=%x(%s)\n", flags, lpdds, res, ExplainDDError(res)); + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -4617,32 +4643,33 @@ HRESULT WINAPI extSetColorKey4(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLOR HRESULT WINAPI extSetColorKey7(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) { return extSetColorKey(pSetColorKey7, lpdds, flags, lpDDColorKey); } -static HRESULT WINAPI extGetColorKey(GetColorKey_Type pGetColorKey, LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +static HRESULT WINAPI extGetColorKey(int dxversion, GetColorKey_Type pGetColorKey, LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) { HRESULT res; BOOL IsPrim; IsPrim=dxwss.IsAPrimarySurface(lpdds); - OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", - lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); + OutTraceDDRAW("GetColorKey(S%d): lpdds=%x%s flags=%x(%s)\n", + dxversion, lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); if(res) OutTraceE("GetColorKey: ERROR lpdds=%x flags=%x res=%x(%s)\n", lpdds, flags, res, ExplainDDError(res)); else OutTraceDDRAW("GetColorKey: colors=(L:%x,H:%x)\n", lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } HRESULT WINAPI extGetColorKey1(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ return extGetColorKey(pGetColorKey1, lpdds, flags, lpDDColorKey); } +{ return extGetColorKey(1, pGetColorKey1, lpdds, flags, lpDDColorKey); } HRESULT WINAPI extGetColorKey2(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ return extGetColorKey(pGetColorKey2, lpdds, flags, lpDDColorKey); } +{ return extGetColorKey(2, pGetColorKey2, lpdds, flags, lpDDColorKey); } HRESULT WINAPI extGetColorKey3(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ return extGetColorKey(pGetColorKey3, lpdds, flags, lpDDColorKey); } +{ return extGetColorKey(3, pGetColorKey3, lpdds, flags, lpDDColorKey); } HRESULT WINAPI extGetColorKey4(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ return extGetColorKey(pGetColorKey4, lpdds, flags, lpDDColorKey); } +{ return extGetColorKey(4, pGetColorKey4, lpdds, flags, lpDDColorKey); } HRESULT WINAPI extGetColorKey7(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ return extGetColorKey(pGetColorKey7, lpdds, flags, lpDDColorKey); } +{ return extGetColorKey(7, pGetColorKey7, lpdds, flags, lpDDColorKey); } static HRESULT WINAPI extEnumAttachedSurfaces(EnumAttachedSurfaces_Type pEnumAttachedSurfaces, LPDIRECTDRAWSURFACE lpdds, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) { @@ -4858,6 +4885,7 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI } if(IsFixed) OutTraceDW("GetCaps(S%d): lpdds=%x FIXED %s caps=%x(%s)\n", dxInterface, lpdds, sLabel, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); + //if(IsDebug) HexTrace((unsigned char *)caps, sizeof(DDSCAPS)); return res; } @@ -4947,6 +4975,7 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS if(IsFixed){ OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, sLabel, __LINE__)); + //if(IsDebug) HexTrace((unsigned char *)lpddsd, sizeof(DDSURFACEDESC)); } return DD_OK; @@ -5478,3 +5507,26 @@ HRESULT WINAPI extCompact(LPDIRECTDRAW lpdd) OutTraceDW("Compact: lpdd=%x\n", lpdd); return DD_OK; } + +HRESULT WINAPI extDuplicateSurface(int dxversion, DuplicateSurface_Type pDuplicateSurface, LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE FAR *lpddsdest) +{ + HRESULT res; + OutTrace("DuplicateSurface(%d): lpdd=%x lpddsrc=%x\n", dxversion, lpdd, lpddssrc); + res = (*pDuplicateSurface)(lpdd, lpddssrc, lpddsdest); + if(res) + OutTrace("DuplicateSurface: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + else + OutTrace("DuplicateSurface: lpddsdest=%x\n", *lpddsdest); + return res; +} + +HRESULT WINAPI extDuplicateSurface1(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE FAR *lpddsdest) +{ return extDuplicateSurface(1, pDuplicateSurface1, lpdd, lpddssrc, lpddsdest); } +HRESULT WINAPI extDuplicateSurface2(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE FAR *lpddsdest) +{ return extDuplicateSurface(2, pDuplicateSurface2, lpdd, lpddssrc, lpddsdest); } +HRESULT WINAPI extDuplicateSurface3(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE FAR *lpddsdest) +{ return extDuplicateSurface(3, pDuplicateSurface3, lpdd, lpddssrc, lpddsdest); } +HRESULT WINAPI extDuplicateSurface4(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE4 lpddssrc, LPDIRECTDRAWSURFACE4 FAR *lpddsdest) +{ return extDuplicateSurface(4, (DuplicateSurface_Type)pDuplicateSurface4, lpdd, (LPDIRECTDRAWSURFACE)lpddssrc, (LPDIRECTDRAWSURFACE *)lpddsdest); } +HRESULT WINAPI extDuplicateSurface7(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE7 lpddssrc, LPDIRECTDRAWSURFACE7 FAR *lpddsdest) +{ return extDuplicateSurface(7, (DuplicateSurface_Type)pDuplicateSurface7, lpdd, (LPDIRECTDRAWSURFACE)lpddssrc, (LPDIRECTDRAWSURFACE *)lpddsdest); } diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index 8cd171d..1d3e915 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -187,6 +187,7 @@ static void TextureDump(LPDIRECTDRAWSURFACE s, int dxversion) static int MinTexX, MinTexY, MaxTexX, MaxTexY; static BOOL DoOnce = TRUE; char pszFile[MAX_PATH]; + BOOL IsRaw = (dxw.dwFlags8 & RAWFORMAT); OutTraceB("TextureDump(%d): lpdds=%x\n", dxversion, s); @@ -228,6 +229,10 @@ static void TextureDump(LPDIRECTDRAWSURFACE s, int dxversion) OutTrace("TextureDump: SKIP 0BPP texture\n"); break; } + if((ddsd.lPitch == 0) || (ddsd.dwHeight == 0)) { + OutTrace("TextureDump: SKIP void texture\n"); + break; + } iSurfaceSize = ddsd.dwHeight * ddsd.lPitch; @@ -266,11 +271,18 @@ static void TextureDump(LPDIRECTDRAWSURFACE s, int dxversion) } // Create the .BMP file. - sprintf_s(pszFile, MAX_PATH, "%s\\texture.out\\texture.%03d.%03d.%s.%08X.bmp", - GetDxWndPath(), ddsd.dwWidth, ddsd.dwHeight, SurfaceType(ddsd.ddpfPixelFormat), hash); + sprintf_s(pszFile, MAX_PATH, "%s\\texture.out\\texture.%03d.%03d.%s.%08X.%s", + GetDxWndPath(), ddsd.dwWidth, ddsd.dwHeight, SurfaceType(ddsd.ddpfPixelFormat), + hash, IsRaw ? "raw" : "bmp"); hf = fopen(pszFile, "wb"); if(!hf) break; + if(IsRaw){ + fwrite((BYTE *)ddsd.lpSurface, ddsd.lPitch * ddsd.dwHeight, 1, hf); + fclose(hf); + return; + } + hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbi.bV4Size + pbi.bV4ClrUsed * sizeof(RGBQUAD) + pbi.bV4SizeImage); @@ -309,6 +321,7 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) DDSURFACEDESC2 ddsd; int w, h, iSurfaceSize, iScanLineSize; HRESULT res; + BOOL IsRaw = (dxw.dwFlags8 & RAWFORMAT); OutTraceB("TextureHack(%d): lpdds=%x\n", dxversion, s); @@ -332,6 +345,26 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) char pszFile[81]; int iSizeImage; + // calculate the bitmap hash + DWORD hash; + hash = HashSurface((BYTE *)ddsd.lpSurface, ddsd.lPitch, ddsd.dwWidth, ddsd.dwHeight); + if(!hash) break; // almost certainly, an empty black surface! + + // Look for the .BMP file. + sprintf_s(pszFile, MAX_PATH, "%s\\texture.in\\texture.%03d.%03d.%s.%08X.%s", + GetDxWndPath(), ddsd.dwWidth, ddsd.dwHeight, SurfaceType(ddsd.ddpfPixelFormat), + hash, IsRaw ? "raw" : "bmp"); + hf = fopen(pszFile, "rb"); + if(!hf) break; // no updated texture to load + + OutTrace("TextureHack: IMPORT path=%s\n", pszFile); + + if(IsRaw){ + fread((BYTE *)ddsd.lpSurface, ddsd.lPitch * ddsd.dwHeight, 1, hf); + fclose(hf); + return; + } + memset((void *)&pbi, 0, sizeof(BITMAPINFOHEADER)); pbi.biSize = sizeof(BITMAPINFOHEADER); pbi.biWidth = ddsd.dwWidth; @@ -341,19 +374,6 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) iSizeImage = pbi.biSizeImage; iScanLineSize = ((pbi.biWidth * pbi.biBitCount + 0x1F) & ~0x1F)/8; - // calculate the bitmap hash - DWORD hash; - hash = HashSurface((BYTE *)ddsd.lpSurface, ddsd.lPitch, ddsd.dwWidth, ddsd.dwHeight); - if(!hash) break; // almost certainly, an empty black surface! - - // Look for the .BMP file. - sprintf_s(pszFile, MAX_PATH, "%s\\texture.in\\texture.%03d.%03d.%s.%08X.bmp", - GetDxWndPath(), ddsd.dwWidth, ddsd.dwHeight, SurfaceType(ddsd.ddpfPixelFormat), hash); - hf = fopen(pszFile, "rb"); - if(!hf) break; // no updated texture to load - - OutTrace("HASH bmp file %x\n", hf); - while(TRUE) { // fake loop to ensure final fclose // Read the BITMAPFILEHEADER from the .BMP file (and throw away ...). if(fread((LPVOID)&hdr, sizeof(BITMAPFILEHEADER), 1, hf) != 1)break; diff --git a/dll/dinput.cpp b/dll/dinput.cpp index b2d1482..b2c0108 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -222,7 +222,7 @@ HRESULT WINAPI extDirectInputCreateA(HINSTANCE hinst, DWORD dwversion, LPDIRECTI { HRESULT res; - OutTraceDW("DirectInputCreateA: version=%x\n", dwversion); + OutTraceDW("DirectInputCreateA(%x)\n", dwversion); res = (*pDirectInputCreateA)(hinst, dwversion, lplpdi, pu); if(res) { @@ -251,7 +251,7 @@ HRESULT WINAPI extDirectInputCreateW(HINSTANCE hinst, DWORD dwversion, LPDIRECTI { HRESULT res; - OutTraceDW("DirectInputCreateW: version=%x\n", dwversion); + OutTraceDW("DirectInputCreateW(%x)\n", dwversion); res = (*pDirectInputCreateW)(hinst, dwversion, lplpdi, pu); if(res) { diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4343855..60e910e 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -142,7 +142,7 @@ static char *Flag7Names[32]={ static char *Flag8Names[32]={ "FORCEWAIT", "FORCENOWAIT", "FORCEVSYNC", "FORCENOVSYNC", "VSYNCSCANLINES", "TRIMTEXTUREFORMATS", "NOHALDEVICE", "CLIPLOCK", - "", "", "", "", + "PRETENDVISIBLE", "RAWFORMAT", "WININSULATION", "FIXMOUSEHOOK", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1380,14 +1380,6 @@ void HookInit(TARGETMAP *target, HWND hwnd) SetDllDirectory(sSourcePath); if(dxw.bHintActive) ShowHint(HINT_HINT); - if(dxw.dwFlags5 & HYBRIDMODE) { - // special mode settings .... - dxw.dwFlags1 |= EMULATESURFACE; - dxw.dwFlags2 |= SETCOMPATIBILITY; - dxw.dwFlags5 &= ~(BILINEARFILTER | AEROBOOST); - } - if(dxw.dwFlags5 & GDIMODE) dxw.dwFlags1 |= EMULATESURFACE; - if(dxw.dwFlags5 & STRESSRESOURCES) dxw.dwFlags5 |= LIMITRESOURCES; if(DoOnce){ DoOnce = FALSE; diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 24f3577..5abda56 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -94,7 +94,6 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags8 = target->flags8; dwTFlags = target->tflags; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; - IsEmulated = (dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) ? TRUE : FALSE; IsVisible = TRUE; if(dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; gsModules = target->module; @@ -151,6 +150,16 @@ void dxwCore::InitTarget(TARGETMAP *target) if (dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; if (dwFlags6 & SHAREDDC) GDIEmulationMode = GDIMODE_SHAREDDC; + if(dwFlags5 & HYBRIDMODE) { + // special mode settings .... + dwFlags1 |= EMULATESURFACE; + dwFlags2 |= SETCOMPATIBILITY; + dwFlags5 &= ~(BILINEARFILTER | AEROBOOST); + } + if(dwFlags5 & GDIMODE) dwFlags1 |= EMULATESURFACE; + if(dwFlags5 & STRESSRESOURCES) dwFlags5 |= LIMITRESOURCES; + IsEmulated = (dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) ? TRUE : FALSE; // includes also the HYBRIDMODE and GDIMODE cases .... + extern GetWindowLong_Type pGetWindowLong; extern SetWindowLong_Type pSetWindowLong; // made before hooking !!! diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index 1a299718fea858b3e7d7b2df016345753045dd78..f1007ebb106399950f6ab8f306e74705748cb483 100644 GIT binary patch delta 280 zcmeA;&ivyT^8^J(gNcgD%oz_ECKo&q6Elf7Fo;h|ElG??$;pXHsVL7&(JM;cSe|-^ zv0(DuJK=&R4Dk#GKp4-E#E{BR!jL%G{jN5n^JK|;os<9Em0@(=EO{@Ik@5QE()-<< zaMLDpJ+MUL`J(V9pztoE@WdY4BI%2LC^@;}p$enH!vwq`~BaKyt<8hd@$cGUH=;#yOJ}AIq~9FflOv Vxii`Au^j7lMh1onlQSR70{{jNW~cxF delta 308 zcmexyjJe}D^8^J(!-y+qElN*~Ny*8HNvSB$OVKMzW&i^2 z$&8GO8>czlVJw<_^G>+1F+)6qC4(uD%wSDVpga_-%wV6t=aoO>6T z85r(P&b{Bwg)n+D;{!`%t}`mP6_tA&mCO0i7Fn|SO84V}*K2&E~!!TLy zk<7$tLTq9{H@^Y%CbK;fW3-qo`^cCvW^&*od7$G8f#jaa6M>}3. #include "TlHelp32.h" -#define VERSION "2.03.99.fx3" +#define VERSION "2.03.40" #define DDTHREADLOCK 1 -//#define LOCKTHREADS LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam); diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo new file mode 100644 index 0000000000000000000000000000000000000000..64774c14869f67a07accfe91e3f9bb4325163055 GIT binary patch literal 367104 zcmeF41)vs1-}Vn7qI3ud2(On5#~yo{Ez*IZh>EwubkRdhe`)X2TJVc+|t3) zK~f$mpOjZ(e;1In`%{WYg`~n#QK_bMh*VW7E|riPq#b`cgw_ywplMTxu*ek(x@)q~=l!siibp zDl4^?+DL7sc2Xayx71PUBz2a$NL{6FQg^9`)KlsuRglU{eWiXH?O2ee#(g;AQJN%8mX4F=NK>V0(sXHt zG*g--&6bXrj+IW3PL#;g$qxHyNs}~Zs`kc2g;Nr9XyP7PF_oH7w9|GoPr(t@r=L1- zOST+}*J^FHMC@Klagx@)vr-==uYDrdyID{)xtJQ6kUn8FDNC2~i}lkUn5wPQOO6Ia`pIwV zJN5rzZFK7YG5nT)gu>wxbvmy9?e&|sh`LMtzf^HU{ihy>`cJ*2{?k^_X6&r~lRoVf zVW|JZ^gGml>MGM#D9n(k`{$P&h=ux3I}z$X%MSIQ zHe$X+{l8V~ME##Dz5VdCS%d!dL&r5wjQya}3E#7c_R79$O9}b+nO5a*8S}HB+o_Zc z*56rbxhJY6t|et?OJ-=RPf|-eSbjaV+I4hP;%^=O9igeyREh>G?s)wh9OY!k-_fK$ zxuG8Z3GTxWmczbJu1B&}9j$h3xJpc_O7vLeFGHmyRY%uZIx;rWQF^dSb34%yI%Vn)OQuPJ!*ex|CtBdG5t2mLx%EjthV_i<(gwsR&8(< zwf_fdIi!sx7P^~1Y%7k{*pBIQ{Gr{QtaQgJ2NSbQoj%LnAAfQwUD{S`$Mo4#l)t`8 zd%Cv8?v4RUKU-Mdo~}RJtApAZjH3)k;HlCmt#hi5NE`{LYafi)ufAf_l^?c6s(Mqk zRPqNaPFwwD&S?s#Ch|$?Uo7oy3H&=bpsbEp2_L1rWacCM{!htIGME4U?L)~LsqMx7 z%+U7QU*@9pr^Wpp_NN8y=0`5|WU^&TNx47?J}gnMp1P_*;V*yt;&=GVs_b7$^h07! zKcvXavEgt{ zYp8Re20AC<_)t^l7L66wlUGmYCk@5xDi(h`sQ$FmoF^uZGc$Kcw`ZdDiBqL_M@{@| z-ZHdDr)g>nt$C$=$lI>lpV_Kc^hoJ-?ArFF{i9zJmbhd3-BmItC{@lw25OJc7EaRH z%&v|BHPrs8+nMN>?rHnSJ`e3b?fo>RIYlYa;$J$D)kH-^|=JRr;hG zEUZ^n;e#rtom@fMX}Kd+{w8?I@jCa?w5i$#SsjV$DE+)jj6OPf$SU11?HARD1#C1~ zR%NqUqL;jXOM4%!Cp{6)x-xV|nq1%dsv))1inkF@_CDGuR=V<+S@Y=0@87&+mc6~n zN3sQItsE!oegoCxy4sFy5-mV|dDQTBZULCqT8tK`leLK^K0ws zOYZM<{i_?FDY9W;fo>`JA1gWjmxIdpJp1?4e|YAB^_-IEJmtfp6}MbhzI?}9-rss+ z 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欌w-aOU1luT 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 z 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 k-`Ktl`%anigX;g&bI@?fawu3$-XgasU7T literal 0 HcmV?d00001 diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index 2b33143..9a268e4 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -598,6 +598,10 @@ RelativePath=".\smack.h" > + + diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 897ff5a..8549c61 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -698,7 +698,7 @@ HRESULT WINAPI extQueryInterfaceD3(int d3dversion, QueryInterfaceD3_Type pQueryI HRESULT res; OutTraceD3D("QueryInterfaceD3(%d): d3d=%x REFIID=%x obj=%x\n", d3dversion, lpd3d, riid.Data1, ppvObj); - d3dversion=0; + //d3dversion=0; res=(*pQueryInterfaceD3)(lpd3d, riid, ppvObj); //switch(riid.Data1){ // case 0x3BBA0080: d3dversion=1; break; diff --git a/dll/hddraw.h b/dll/hddraw.h index d7d76dc..0931285 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -26,6 +26,9 @@ typedef HRESULT (WINAPI *CreatePalette_Type)(LPDIRECTDRAW, DWORD, LPPALETTEENTRY typedef HRESULT (WINAPI *CreateSurface1_Type)(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); typedef HRESULT (WINAPI *CreateSurface2_Type)(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); typedef HRESULT (WINAPI *CreateSurface_Type)(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); +typedef HRESULT (WINAPI *DuplicateSurface_Type)(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR *); +typedef HRESULT (WINAPI *DuplicateSurface4_Type)(LPDIRECTDRAW, LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 FAR *); +typedef HRESULT (WINAPI *DuplicateSurface7_Type)(LPDIRECTDRAW, LPDIRECTDRAWSURFACE7, LPDIRECTDRAWSURFACE7 FAR *); typedef HRESULT (WINAPI *EnumDisplayModes1_Type)(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); typedef HRESULT (WINAPI *EnumDisplayModes4_Type)(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); typedef HRESULT (WINAPI *EnumSurfaces1_Type)(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMSURFACESCALLBACK); diff --git a/dll/stb_dxt.h b/dll/stb_dxt.h new file mode 100644 index 0000000..318e306 --- /dev/null +++ b/dll/stb_dxt.h @@ -0,0 +1,1043 @@ +// stb_dxt.h - Real-Time DXT1/DXT5 compressor +// Based on original by fabian "ryg" giesen v1.04 +// Custom version, modified by Yann Collet +// +/* + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - RygsDXTc source repository : http://code.google.com/p/rygsdxtc/ + +*/ +// use '#define STB_DXT_IMPLEMENTATION' before including to create the implementation +// +// USAGE: +// call stb_compress_dxt_block() for every block (you must pad) +// source should be a 4x4 block of RGBA data in row-major order; +// A is ignored if you specify alpha=0; you can turn on dithering +// and "high quality" using mode. +// +// version history: +// v1.06 - (cyan) implement Fabian Giesen's comments +// v1.05 - (cyan) speed optimizations +// v1.04 - (ryg) default to no rounding bias for lerped colors (as per S3TC/DX10 spec); +// single color match fix (allow for inexact color interpolation); +// optimal DXT5 index finder; "high quality" mode that runs multiple refinement steps. +// v1.03 - (stb) endianness support +// v1.02 - (stb) fix alpha encoding bug +// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom +// v1.00 - (stb) first release + +#ifndef STB_INCLUDE_STB_DXT_H +#define STB_INCLUDE_STB_DXT_H + + +//******************************************************************* +// Enable custom Optimisations +// Comment this define if you want to revert to ryg's original code +#define NEW_OPTIMISATIONS +//******************************************************************* + +// compression mode (bitflags) +#define STB_DXT_NORMAL 0 +#define STB_DXT_DITHER 1 // use dithering. dubious win. never use for normal maps and the like! +#define STB_DXT_HIGHQUAL 2 // high quality mode, does two refinement steps instead of 1. ~30-40% slower. + +void rygCompress( unsigned char *dst, unsigned char *src, int w, int h, int isDxt5 ); + +// TODO remove these, not working properly.. +void rygCompressYCoCg( unsigned char *dst, unsigned char *src, int w, int h ); +void linearize( unsigned char * dst, const unsigned char * src, int n ); + +void stb_compress_dxt_block(unsigned char *dest, const unsigned char *src, int alpha, int mode); +#define STB_COMPRESS_DXT_BLOCK + +#ifdef STB_DXT_IMPLEMENTATION + +// configuration options for DXT encoder. set them in the project/makefile or just define +// them at the top. + +// STB_DXT_USE_ROUNDING_BIAS +// use a rounding bias during color interpolation. this is closer to what "ideal" +// interpolation would do but doesn't match the S3TC/DX10 spec. old versions (pre-1.03) +// implicitly had this turned on. +// +// in case you're targeting a specific type of hardware (e.g. console programmers): +// NVidia and Intel GPUs (as of 2010) as well as DX9 ref use DXT decoders that are closer +// to STB_DXT_USE_ROUNDING_BIAS. AMD/ATI, S3 and DX10 ref are closer to rounding with no bias. +// you also see "(a*5 + b*3) / 8" on some old GPU designs. +// #define STB_DXT_USE_ROUNDING_BIAS + +#include +#include +#include +#include // memset +#include +#include +#include + + +static unsigned char stb__Expand5[32]; +static unsigned char stb__Expand6[64]; +static unsigned char stb__OMatch5[256][2]; +static unsigned char stb__OMatch6[256][2]; +static unsigned char stb__QuantRBTab[256+16]; +static unsigned char stb__QuantGTab[256+16]; + +static int stb__Mul8Bit(int a, int b) +{ + int t = a*b + 128; + return (t + (t >> 8)) >> 8; +} + +static void stb__From16Bit(unsigned char *out, unsigned short v) +{ + int rv = (v & 0xf800) >> 11; + int gv = (v & 0x07e0) >> 5; + int bv = (v & 0x001f) >> 0; + + out[0] = stb__Expand5[rv]; + out[1] = stb__Expand6[gv]; + out[2] = stb__Expand5[bv]; + out[3] = 0; +} + +static unsigned short stb__As16Bit(int r, int g, int b) +{ + return (stb__Mul8Bit(r,31) << 11) + (stb__Mul8Bit(g,63) << 5) + stb__Mul8Bit(b,31); +} + +// linear interpolation at 1/3 point between a and b, using desired rounding type +static int stb__Lerp13(int a, int b) +{ +#ifdef STB_DXT_USE_ROUNDING_BIAS + // with rounding bias + return a + stb__Mul8Bit(b-a, 0x55); +#else + // without rounding bias + // replace "/ 3" by "* 0xaaab) >> 17" if your compiler sucks or you really need every ounce of speed. + return (2*a + b) / 3; +#endif +} + +// lerp RGB color +static void stb__Lerp13RGB(unsigned char *out, unsigned char *p1, unsigned char *p2) +{ + out[0] = stb__Lerp13(p1[0], p2[0]); + out[1] = stb__Lerp13(p1[1], p2[1]); + out[2] = stb__Lerp13(p1[2], p2[2]); +} + +/****************************************************************************/ + +// compute table to reproduce constant colors as accurately as possible +static void stb__PrepareOptTable(unsigned char *Table,const unsigned char *expand,int size) +{ + int i,mn,mx; + for (i=0;i<256;i++) { + int bestErr = 256; + for (mn=0;mn> 4)]; + ep1[0] = bp[ 0] - dp[ 0]; + dp[ 4] = quant[bp[ 4] + ((7*ep1[0] + 3*ep2[2] + 5*ep2[1] + ep2[0]) >> 4)]; + ep1[1] = bp[ 4] - dp[ 4]; + dp[ 8] = quant[bp[ 8] + ((7*ep1[1] + 3*ep2[3] + 5*ep2[2] + ep2[1]) >> 4)]; + ep1[2] = bp[ 8] - dp[ 8]; + dp[12] = quant[bp[12] + ((7*ep1[2] + 5*ep2[3] + ep2[2]) >> 4)]; + ep1[3] = bp[12] - dp[12]; + bp += 16; + dp += 16; + et = ep1, ep1 = ep2, ep2 = et; // swap + } + } +} + +// The color matching function +static unsigned int stb__MatchColorsBlock(unsigned char *block, unsigned char *color,int dither) +{ + unsigned int mask = 0; + int dirr = color[0*4+0] - color[1*4+0]; + int dirg = color[0*4+1] - color[1*4+1]; + int dirb = color[0*4+2] - color[1*4+2]; + int dots[16]; + int stops[4]; + int i; + int c0Point, halfPoint, c3Point; + + for(i=0;i<16;i++) + dots[i] = block[i*4+0]*dirr + block[i*4+1]*dirg + block[i*4+2]*dirb; + + for(i=0;i<4;i++) + stops[i] = color[i*4+0]*dirr + color[i*4+1]*dirg + color[i*4+2]*dirb; + + // think of the colors as arranged on a line; project point onto that line, then choose + // next color out of available ones. we compute the crossover points for "best color in top + // half"/"best in bottom half" and then the same inside that subinterval. + // + // relying on this 1d approximation isn't always optimal in terms of euclidean distance, + // but it's very close and a lot faster. + // http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html + + c0Point = (stops[1] + stops[3]) >> 1; + halfPoint = (stops[3] + stops[2]) >> 1; + c3Point = (stops[2] + stops[0]) >> 1; + + if(!dither) + { + // the version without dithering is straightforward + +#ifdef NEW_OPTIMISATIONS + const int indexMap[8] = { 0 << 30,2 << 30,0 << 30,2 << 30,3 << 30,3 << 30,1 << 30,1 << 30 }; + + for(int i=0;i<16;i++) + { + int dot = dots[i]; + mask >>= 2; + + int bits =( (dot < halfPoint) ? 4 : 0 ) + | ( (dot < c0Point) ? 2 : 0 ) + | ( (dot < c3Point) ? 1 : 0 ); + + mask |= indexMap[bits]; + } + +#else + for (i=15;i>=0;i--) { + int dot = dots[i]; + mask <<= 2; + + if(dot < halfPoint) + mask |= (dot < c0Point) ? 1 : 3; + else + mask |= (dot < c3Point) ? 2 : 0; + } +#endif + + } else { + // with floyd-steinberg dithering + int err[8],*ep1 = err,*ep2 = err+4; + int *dp = dots, y; + + c0Point <<= 4; + halfPoint <<= 4; + c3Point <<= 4; + for(i=0;i<8;i++) + err[i] = 0; + + for(y=0;y<4;y++) + { + int dot,lmask,step; + + dot = (dp[0] << 4) + (3*ep2[1] + 5*ep2[0]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[0] = dp[0] - stops[step]; + lmask = step; + + dot = (dp[1] << 4) + (7*ep1[0] + 3*ep2[2] + 5*ep2[1] + ep2[0]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[1] = dp[1] - stops[step]; + lmask |= step<<2; + + dot = (dp[2] << 4) + (7*ep1[1] + 3*ep2[3] + 5*ep2[2] + ep2[1]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[2] = dp[2] - stops[step]; + lmask |= step<<4; + + dot = (dp[3] << 4) + (7*ep1[2] + 5*ep2[3] + ep2[2]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[3] = dp[3] - stops[step]; + lmask |= step<<6; + + dp += 4; + mask |= lmask << (y*8); + { int *et = ep1; ep1 = ep2; ep2 = et; } // swap + } + } + + return mask; +} + +// The color optimization function. (Clever code, part 1) +static void stb__OptimizeColorsBlock(unsigned char *block, unsigned short *pmax16, unsigned short *pmin16) +{ + unsigned char *minp, *maxp; + double magn; + int v_r,v_g,v_b; + static const int nIterPower = 4; + float covf[6],vfr,vfg,vfb; + + // determine color distribution + int cov[6]; + int mu[3],min[3],max[3]; + int ch,i,iter; + + for(ch=0;ch<3;ch++) + { + const unsigned char *bp = ((const unsigned char *) block) + ch; + int muv,minv,maxv; + +#ifdef NEW_OPTIMISATIONS +# define MIN(a,b) (int)a + ( ((int)b-a) & ( ((int)b-a) >> 31 ) ) +# define MAX(a,b) (int)a + ( ((int)b-a) & ( ((int)a-b) >> 31 ) ) +# define RANGE(a,b,n) int min##n = MIN(a,b); int max##n = a+b - min##n; muv += a+b; +# define MINMAX(a,b,n) int min##n = MIN(min##a, min##b); int max##n = MAX(max##a, max##b); + + muv = 0; + RANGE(bp[0], bp[4], 1); + RANGE(bp[8], bp[12], 2); + RANGE(bp[16], bp[20], 3); + RANGE(bp[24], bp[28], 4); + RANGE(bp[32], bp[36], 5); + RANGE(bp[40], bp[44], 6); + RANGE(bp[48], bp[52], 7); + RANGE(bp[56], bp[60], 8); + + MINMAX(1,2,9); + MINMAX(3,4,10); + MINMAX(5,6,11); + MINMAX(7,8,12); + + MINMAX(9,10,13); + MINMAX(11,12,14); + + minv = MIN(min13,min14); + maxv = MAX(max13,max14); + +#else + muv = minv = maxv = bp[0]; + for(i=4;i<64;i+=4) + { + muv += bp[i]; + if (bp[i] < minv) minv = bp[i]; + else if (bp[i] > maxv) maxv = bp[i]; + } +#endif + + mu[ch] = (muv + 8) >> 4; + min[ch] = minv; + max[ch] = maxv; + } + + // determine covariance matrix + for (i=0;i<6;i++) + cov[i] = 0; + + for (i=0;i<16;i++) + { + int r = block[i*4+0] - mu[0]; + int g = block[i*4+1] - mu[1]; + int b = block[i*4+2] - mu[2]; + + cov[0] += r*r; + cov[1] += r*g; + cov[2] += r*b; + cov[3] += g*g; + cov[4] += g*b; + cov[5] += b*b; + } + + // convert covariance matrix to float, find principal axis via power iter + for(i=0;i<6;i++) + covf[i] = cov[i] / 255.0f; + + vfr = (float) (max[0] - min[0]); + vfg = (float) (max[1] - min[1]); + vfb = (float) (max[2] - min[2]); + + for(iter=0;iter magn) magn = fabs(vfg); + if (fabs(vfb) > magn) magn = fabs(vfb); + + if(magn < 4.0f) + { // too small, default to luminance + v_r = 299; // JPEG YCbCr luma coefs, scaled by 1000. + v_g = 587; + v_b = 114; + } else { + magn = 512.0 / magn; + v_r = (int) (vfr * magn); + v_g = (int) (vfg * magn); + v_b = (int) (vfb * magn); + } + + +#ifdef NEW_OPTIMISATIONS + // Pick colors at extreme points + int mind, maxd; + mind = maxd = block[0]*v_r + block[1]*v_g + block[2]*v_b; + minp = maxp = block; + for(i=1;i<16;i++) + { + int dot = block[i*4+0]*v_r + block[i*4+1]*v_g + block[i*4+2]*v_b; + + if (dot < mind) { + mind = dot; + minp = block+i*4; + continue; + } + + if (dot > maxd) { + maxd = dot; + maxp = block+i*4; + } + } +#else + int mind = 0x7fffffff,maxd = -0x7fffffff; + // Pick colors at extreme points + for(i=0;i<16;i++) + { + int dot = block[i*4+0]*v_r + block[i*4+1]*v_g + block[i*4+2]*v_b; + + if (dot < mind) { + mind = dot; + minp = block+i*4; + } + + if (dot > maxd) { + maxd = dot; + maxp = block+i*4; + } + } +#endif + + *pmax16 = stb__As16Bit(maxp[0],maxp[1],maxp[2]); + *pmin16 = stb__As16Bit(minp[0],minp[1],minp[2]); +} + +inline static int stb__sclamp(float y, int p0, int p1) +{ + int x = (int) y; + +#ifdef NEW_OPTIMISATIONS + x = x>p1 ? p1 : x; + return x p1) return p1; + return x; +#endif +} + +// The refinement function. (Clever code, part 2) +// Tries to optimize colors to suit block contents better. +// (By solving a least squares system via normal equations+Cramer's rule) +static int stb__RefineBlock(unsigned char *block, unsigned short *pmax16, unsigned short *pmin16, unsigned int mask) +{ + static const int w1Tab[4] = { 3,0,2,1 }; + static const int prods[4] = { 0x090000,0x000900,0x040102,0x010402 }; + // ^some magic to save a lot of multiplies in the accumulating loop... + // (precomputed products of weights for least squares system, accumulated inside one 32-bit register) + + float frb,fg; + unsigned short oldMin, oldMax, min16, max16; + int i, akku = 0, xx,xy,yy; + int At1_r,At1_g,At1_b; + int At2_r,At2_g,At2_b; + unsigned int cm = mask; + + oldMin = *pmin16; + oldMax = *pmax16; + + if((mask ^ (mask<<2)) < 4) // all pixels have the same index? + { + // yes, linear system would be singular; solve using optimal + // single-color match on average color + int r = 8, g = 8, b = 8; + for (i=0;i<16;++i) { + r += block[i*4+0]; + g += block[i*4+1]; + b += block[i*4+2]; + } + + r >>= 4; g >>= 4; b >>= 4; + + max16 = (stb__OMatch5[r][0]<<11) | (stb__OMatch6[g][0]<<5) | stb__OMatch5[b][0]; + min16 = (stb__OMatch5[r][1]<<11) | (stb__OMatch6[g][1]<<5) | stb__OMatch5[b][1]; + } else { + At1_r = At1_g = At1_b = 0; + At2_r = At2_g = At2_b = 0; + for (i=0;i<16;++i,cm>>=2) + { + int step = cm&3; + int w1 = w1Tab[step]; + int r = block[i*4+0]; + int g = block[i*4+1]; + int b = block[i*4+2]; + + akku += prods[step]; + At1_r += w1*r; + At1_g += w1*g; + At1_b += w1*b; + At2_r += r; + At2_g += g; + At2_b += b; + } + + At2_r = 3*At2_r - At1_r; + At2_g = 3*At2_g - At1_g; + At2_b = 3*At2_b - At1_b; + + // extract solutions and decide solvability + xx = akku >> 16; + yy = (akku >> 8) & 0xff; + xy = (akku >> 0) & 0xff; + + frb = 3.0f * 31.0f / 255.0f / (xx*yy - xy*xy); + fg = frb * 63.0f / 31.0f; + + // solve. + max16 = stb__sclamp((At1_r*yy - At2_r*xy)*frb+0.5f,0,31) << 11; + max16 |= stb__sclamp((At1_g*yy - At2_g*xy)*fg +0.5f,0,63) << 5; + max16 |= stb__sclamp((At1_b*yy - At2_b*xy)*frb+0.5f,0,31) << 0; + + min16 = stb__sclamp((At2_r*xx - At1_r*xy)*frb+0.5f,0,31) << 11; + min16 |= stb__sclamp((At2_g*xx - At1_g*xy)*fg +0.5f,0,63) << 5; + min16 |= stb__sclamp((At2_b*xx - At1_b*xy)*frb+0.5f,0,31) << 0; + } + + *pmin16 = min16; + *pmax16 = max16; + return oldMin != min16 || oldMax != max16; +} + +// Color block compression +static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, int mode) +{ + unsigned int mask; + int i; + int dither; + int refinecount; + unsigned short max16, min16; + unsigned char dblock[16*4],color[4*4]; + + dither = mode & STB_DXT_DITHER; + refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1; + + // check if block is constant + for (i=1;i<16;i++) + if (((unsigned int *) block)[i] != ((unsigned int *) block)[0]) + break; + + if(i == 16) + { // constant color + int r = block[0], g = block[1], b = block[2]; + mask = 0xaaaaaaaa; + max16 = (stb__OMatch5[r][0]<<11) | (stb__OMatch6[g][0]<<5) | stb__OMatch5[b][0]; + min16 = (stb__OMatch5[r][1]<<11) | (stb__OMatch6[g][1]<<5) | stb__OMatch5[b][1]; + } else + { + // first step: compute dithered version for PCA if desired + if(dither) + stb__DitherBlock(dblock,block); + + // second step: pca+map along principal axis + stb__OptimizeColorsBlock(dither ? dblock : block,&max16,&min16); + if (max16 != min16) + { + stb__EvalColors(color,max16,min16); + mask = stb__MatchColorsBlock(block,color,dither); + } else + mask = 0; + + // third step: refine (multiple times if requested) + for (i=0;i> 8); + dest[2] = (unsigned char) (min16); + dest[3] = (unsigned char) (min16 >> 8); + dest[4] = (unsigned char) (mask); + dest[5] = (unsigned char) (mask >> 8); + dest[6] = (unsigned char) (mask >> 16); + dest[7] = (unsigned char) (mask >> 24); +} + +// Alpha block compression (this is easy for a change) +static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src,int mode) +{ + int i,dist,bias,dist4,dist2,bits,mask; + + // find min/max color + int mn,mx; + + mn = mx = src[3]; + for (i=1;i<16;i++) + { + if (src[i*4+3] < mn) mn = src[i*4+3]; + else if (src[i*4+3] > mx) mx = src[i*4+3]; + } + + // encode them + ((unsigned char *)dest)[0] = mx; + ((unsigned char *)dest)[1] = mn; + dest += 2; + +#ifdef NEW_OPTIMISATIONS + // mono-alpha shortcut + if (mn==mx) + { + *(unsigned short*)dest = 0; + dest += 2; + *(unsigned int*)dest = 0; + return; + } +#endif + + // determine bias and emit color indices + // given the choice of mx/mn, these indices are optimal: + // http://fgiesen.wordpress.com/2009/12/15/dxt5-alpha-block-index-determination/ + dist = mx-mn; + //printf("mn = %i; mx = %i; dist = %i\n", mn, mx, dist); + dist4 = dist*4; + dist2 = dist*2; + bias = (dist < 8) ? (dist - 1) : (dist/2 + 2); + bias -= mn * 7; + bits = 0, mask=0; + + for (i=0;i<16;i++) + { + int a = src[i*4+3]*7 + bias; + int ind,t; + + // select index. this is a "linear scale" lerp factor between 0 (val=min) and 7 (val=max). + t = (a >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t; + t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t; + ind += (a >= dist); + + // turn linear scale into DXT index (0/1 are extremal pts) + ind = -ind & 7; + ind ^= (2 > ind); + + // write index + mask |= ind << bits; + if((bits += 3) >= 8) + { + *dest++ = mask; + mask >>= 8; + bits -= 8; + } + } +} + + +static void stb__InitDXT() +{ + int i; + for(i=0;i<32;i++) + stb__Expand5[i] = (i<<3)|(i>>2); + + for(i=0;i<64;i++) + stb__Expand6[i] = (i<<2)|(i>>4); + + for(i=0;i<256+16;i++) + { + int v = i-8 < 0 ? 0 : i-8 > 255 ? 255 : i-8; + stb__QuantRBTab[i] = stb__Expand5[stb__Mul8Bit(v,31)]; + stb__QuantGTab[i] = stb__Expand6[stb__Mul8Bit(v,63)]; + } + + stb__PrepareOptTable(&stb__OMatch5[0][0],stb__Expand5,32); + stb__PrepareOptTable(&stb__OMatch6[0][0],stb__Expand6,64); +} + + +void stb_compress_dxt_block(unsigned char *dest, const unsigned char *src, int alpha, int mode) +{ + static int init=1; + if (init) + { + stb__InitDXT(); + init=0; + } + + if (alpha) + { + stb__CompressAlphaBlock(dest,(unsigned char*) src,mode); + dest += 8; + } + + stb__CompressColorBlock(dest,(unsigned char*) src,mode); +} + +int imin(int x, int y) { return (x < y) ? x : y; } + + + + + +static void extractBlock(const unsigned char *src, int x, int y, + int w, int h, unsigned char *block) +{ + int i, j; + +#ifdef NEW_OPTIMISATIONS + if ((w-x >=4) && (h-y >=4)) + { + // Full Square shortcut + src += x*4; + src += y*w*4; + for (i=0; i < 4; ++i) + { + *(unsigned int*)block = *(unsigned int*) src; block += 4; src += 4; + *(unsigned int*)block = *(unsigned int*) src; block += 4; src += 4; + *(unsigned int*)block = *(unsigned int*) src; block += 4; src += 4; + *(unsigned int*)block = *(unsigned int*) src; block += 4; + src += (w*4) - 12; + } + return; + } +#endif + + int bw = imin(w - x, 4); + int bh = imin(h - y, 4); + int bx, by; + + const int rem[] = + { + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 2, 0, + 0, 1, 2, 3 + }; + + for(i = 0; i < 4; ++i) + { + by = rem[(bh - 1) * 4 + i] + y; + for(j = 0; j < 4; ++j) + { + bx = rem[(bw - 1) * 4 + j] + x; + block[(i * 4 * 4) + (j * 4) + 0] = + src[(by * (w * 4)) + (bx * 4) + 0]; + block[(i * 4 * 4) + (j * 4) + 1] = + src[(by * (w * 4)) + (bx * 4) + 1]; + block[(i * 4 * 4) + (j * 4) + 2] = + src[(by * (w * 4)) + (bx * 4) + 2]; + block[(i * 4 * 4) + (j * 4) + 3] = + src[(by * (w * 4)) + (bx * 4) + 3]; + } + } +} + + // should be a pretty optimized 0-255 clamper +inline static unsigned char clamp255( int n ) +{ + if( n > 255 ) n = 255; + if( n < 0 ) n = 0; + return n; +} + + +void rgbToYCoCgBlock( unsigned char * dst, const unsigned char * src ) +{ + // Calculate Co and Cg extents + int extents = 0; + int n = 0; + int iY, iCo, iCg; //, r, g, b; + int blockCo[16]; + int blockCg[16]; + int i; + + const unsigned char *px = src; + for(i=0;i extents) extents = -iCo; + if( iCo > extents) extents = iCo; + if(-iCg > extents) extents = -iCg; + if( iCg > extents) extents = iCg; + + blockCo[n] = iCo; + blockCg[n++] = iCg; + + px += 4; + } + + // Co = -510..510 + // Cg = -510..510 + float scaleFactor = 1.0f; + if(extents > 127) + scaleFactor = (float)extents * 4.0f / 510.0f; + + // Convert to quantized scalefactor + unsigned char scaleFactorQuantized = (unsigned char)(ceil((scaleFactor - 1.0f) * 31.0f / 3.0f)); + + // Unquantize + scaleFactor = 1.0f + (float)(scaleFactorQuantized / 31.0f) * 3.0f; + + unsigned char bVal = (unsigned char)((scaleFactorQuantized << 3) | (scaleFactorQuantized >> 2)); + + unsigned char *outPx = dst; + + n = 0; + px = src; + /* + for(i=0;i<16;i++) + { + // Calculate components + iY = ( px[0] + (px[1]<<1) + px[2] + 2 ) / 4; + iCo = ((blockCo[n] / scaleFactor) + 128); + iCg = ((blockCg[n] / scaleFactor) + 128); + + if(iCo < 0) iCo = 0; else if(iCo > 255) iCo = 255; + if(iCg < 0) iCg = 0; else if(iCg > 255) iCg = 255; + if(iY < 0) iY = 0; else if(iY > 255) iY = 255; + + px += 4; + + outPx[0] = (unsigned char)iCo; + outPx[1] = (unsigned char)iCg; + outPx[2] = bVal; + outPx[3] = (unsigned char)iY; + + outPx += 4; + }*/ + for(i=0;i<16;i++) + { + // Calculate components + int r = px[0]; + int g = (px[1] + 1) >> 1; + int b = px[2]; + int tmp = (2 + r + b) >> 2; + + // Co + iCo = clamp255( 128 + ((r - b + 1) >> 1) ); + // Y + iY = clamp255( g + tmp ); + // Cg + iCg = clamp255( 128 + g - tmp ); + + px += 4; + + outPx[0] = (unsigned char)iCo; + outPx[1] = (unsigned char)iCg; + outPx[2] = bVal; + outPx[3] = (unsigned char)iY; + + outPx += 4; + } + +} + + +void rygCompress( unsigned char *dst, unsigned char *src, int w, int h, int isDxt5 ) +{ + + unsigned char block[64]; + int x, y; + + for(y = 0; y < h; y += 4) + { + for(x = 0; x < w; x += 4) + { + extractBlock(src, x, y, w, h, block); + stb_compress_dxt_block(dst, block, isDxt5, 10); + dst += isDxt5 ? 16 : 8; + } + } +} + +void rygCompressYCoCg( unsigned char *dst, unsigned char *src, int w, int h ) +{ + unsigned char block[64]; + unsigned char ycocgblock[64]; + int x, y; + + for(y = 0; y < h; y += 4) + { + for(x = 0; x < w; x += 4) + { + extractBlock(src, x, y, w, h, block); + rgbToYCoCgBlock(ycocgblock,block); + stb_compress_dxt_block(dst, ycocgblock, 1, 10); + dst += 16; + } + } + +} + +static void stbgl__compress(unsigned char *p, unsigned char *rgba, int w, int h, int isDxt5) +{ + int i,j,y,y2; + int alpha = isDxt5; + + for (j=0; j < w; j += 4) { + int x=4; + for (i=0; i < h; i += 4) { + unsigned char block[16*4]; + if (i+3 >= w) x = w-i; + for (y=0; y < 4; ++y) { + if (j+y >= h) break; + memcpy(block+y*16, rgba + w*4*(j+y) + i*4, x*4); + } + if (x < 4) { + switch (x) { + case 0: assert(0); + case 1: + for (y2=0; y2 < y; ++y2) { + memcpy(block+y2*16+1*4, block+y2*16+0*4, 4); + memcpy(block+y2*16+2*4, block+y2*16+0*4, 8); + } + break; + case 2: + for (y2=0; y2 < y; ++y2) + memcpy(block+y2*16+2*4, block+y2*16+0*4, 8); + break; + case 3: + for (y2=0; y2 < y; ++y2) + memcpy(block+y2*16+3*4, block+y2*16+1*4, 4); + break; + } + } + y2 = 0; + for(; y<4; ++y,++y2) + memcpy(block+y*16, block+y2*16, 4*4); + stb_compress_dxt_block(p, block, alpha, 10); + p += alpha ? 16 : 8; + } + } + // assert(p <= end); +} + +static inline unsigned char linearize(unsigned char inByte) +{ + float srgbVal = ((float)inByte) / 255.0f; + float linearVal; + + if(srgbVal < 0.04045) + linearVal = srgbVal / 12.92f; + else + linearVal = pow( (srgbVal + 0.055f) / 1.055f, 2.4f); + + return (unsigned char)(floor(sqrt(linearVal)* 255.0 + 0.5)); +} + +void linearize( unsigned char * dst, const unsigned char * src, int n ) +{ + n*=4; + for( int i = 0; i < n; i++ ) + dst[i] = linearize(src[i]); +} + + + +#endif // STB_DXT_IMPLEMENTATION + +#endif // STB_INCLUDE_STB_DXT_H diff --git a/dll/user32.cpp b/dll/user32.cpp index 553d6f3..e165fc7 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -13,6 +13,7 @@ #include "dxhelper.h" #include "shareddc.hpp" #include +#include #define FIXCHILDSIZE FALSE @@ -139,6 +140,9 @@ 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); @@ -248,7 +252,9 @@ static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "EnumDisplayDevicesW", (FARPROC)EnumDisplayDevicesW, (FARPROC *)&pEnumDisplayDevicesW, (FARPROC)extEnumDisplayDevicesW}, //{HOOK_IAT_CANDIDATE, 0, "LoadBitmapA", (FARPROC)NULL, (FARPROC *)&pLoadBitmapA, (FARPROC)extLoadBitmapA}, - + + {HOOK_IAT_CANDIDATE, 0, "EnumWindows", (FARPROC)NULL, (FARPROC *)&pEnumWindows, (FARPROC)extEnumWindows}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -3633,6 +3639,7 @@ LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam) */ HOOKPROC glpMessageHookProcessFunction; +HOOKPROC glpMouseHookProcessFunction; LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) { @@ -3651,6 +3658,19 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) return ret; } +LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam) +{ + LRESULT ret; + OutTraceC("MouseHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); + MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; + if (pMouseStruct != NULL){ + OutTraceC("MouseHookProc: event=%s pos=(%d,%d)\n", ExplainWinMessage(wParam), pMouseStruct->pt.x, pMouseStruct->pt.y); + extGetCursorPos(&(pMouseStruct->pt)); + } + ret = (*glpMouseHookProcessFunction)(code, wParam, lParam); + return ret; +} + static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) { HHOOK ret; @@ -3677,6 +3697,12 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, return NULL; } + if((dxw.dwFlags8 & FIXMOUSEHOOK) && (idHook == WH_MOUSE)){ + OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active\n"); + glpMouseHookProcessFunction = lpfn; + lpfn=extMouseHookProc; + } + ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId); return ret; @@ -4083,6 +4109,16 @@ HBITMAP WINAPI extLoadBitmapA(HINSTANCE hInstance, LPCSTR lpBitmapName) return ret; } +BOOL WINAPI extEnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) +{ + OutTrace("EnumerateWindows\n"); + if(dxw.dwFlags8 & WININSULATION){ + OutTrace("EnumerateWindows: BYPASS\n"); + return TRUE; + } + return (*pEnumWindows)(lpEnumFunc, lParam); +} + // To do: // GrayStringA // GrayStringW \ No newline at end of file diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index 8f3e2a1..663d255 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -42,6 +42,7 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) // Texture management DDX_Radio(pDX, IDC_TEXTURENONE, cTarget->m_TextureHandling); + DDX_Check(pDX, IDC_RAWFORMAT, cTarget->m_RawFormat); // 3D Effects DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); diff --git a/host/TabInput.cpp b/host/TabInput.cpp index 9bc5602..7134faa 100644 --- a/host/TabInput.cpp +++ b/host/TabInput.cpp @@ -36,7 +36,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_KEEPCURSORWITHIN, cTarget->m_KeepCursorWithin); DDX_Check(pDX, IDC_KEEPCURSORFIXED, cTarget->m_KeepCursorFixed); DDX_Check(pDX, IDC_MESSAGEPROC, cTarget->m_MessageProc); - //DDX_Check(pDX, IDC_NOMOUSEPROC, cTarget->m_NoMouseProc); + DDX_Check(pDX, IDC_FIXMOUSEHOOK, cTarget->m_FixMouseHook); DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST); DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown); DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse); diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 113de62..26e7efd 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -36,6 +36,7 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SYNCPALETTE, cTarget->m_SyncPalette); DDX_Check(pDX, IDC_NOWINERRORS, cTarget->m_NoWinErrors); DDX_Check(pDX, IDC_PRETENDVISIBLE, cTarget->m_PretendVisible); + DDX_Check(pDX, IDC_WININSULATION, cTarget->m_WinInsulation); // OpenGL DDX_Check(pDX, IDC_HOOKOPENGL, cTarget->m_HookOpenGL); // duplicated diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 8d19f83..7ae61d3 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -60,6 +60,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressD3DExt = FALSE; m_Enum16bitModes = FALSE; m_TrimTextureFormats = FALSE; + m_NoHALDevice = FALSE; + m_RawFormat = FALSE; m_SetCompatibility = TRUE; // default true !! m_AEROBoost = TRUE; // default true !! m_DiabloTweak = FALSE; @@ -185,10 +187,9 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_HideMultiMonitor = FALSE; m_FixD3DFrame = FALSE; m_NoWindowMove = FALSE; - //m_Force16BPP = FALSE; m_HookChildWin = FALSE; m_MessageProc = FALSE; - //m_NoMouseProc = FALSE; + m_FixMouseHook = FALSE; m_FixNCHITTEST = FALSE; m_RecoverScreenMode = FALSE; m_RefreshOnResize = FALSE; @@ -197,10 +198,6 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_BackBufAttach = FALSE; m_ClearTextureFourCC = FALSE; m_NoDDExclusiveMode = FALSE; - //m_ForceVSync = FALSE; - //m_ForceNoVSync = FALSE; - //m_ForceWait = FALSE; - //m_ForceNoWait = FALSE; m_VSyncMode = 0; m_VSyncImpl = 0; m_WaitMode = 0; @@ -243,6 +240,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SyncPalette = FALSE; m_NoWinErrors = FALSE; m_PretendVisible = FALSE; + m_WinInsulation = FALSE; m_AnalyticMode = FALSE; m_NoPaletteUpdate = FALSE; m_WireFrame = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 32c9e42..49e2651 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -148,7 +148,7 @@ public: BOOL m_NoWindowMove; BOOL m_HookChildWin; BOOL m_MessageProc; - //BOOL m_NoMouseProc; + BOOL m_FixMouseHook; BOOL m_FixNCHITTEST; BOOL m_RecoverScreenMode; BOOL m_RefreshOnResize; @@ -201,6 +201,7 @@ public: BOOL m_SyncPalette; BOOL m_NoWinErrors; BOOL m_PretendVisible; + BOOL m_WinInsulation; BOOL m_AnalyticMode; BOOL m_NoPaletteUpdate; BOOL m_LimitResources; @@ -263,6 +264,7 @@ public: BOOL m_SuppressD3DExt; BOOL m_Enum16bitModes; BOOL m_TrimTextureFormats; + BOOL m_RawFormat; BOOL m_LimitScreenRes; BOOL m_InitialRes; BOOL m_MaximumRes; diff --git a/host/dxelevate.cpp b/host/dxelevate.cpp index 9f42d24..150eae8 100644 --- a/host/dxelevate.cpp +++ b/host/dxelevate.cpp @@ -31,9 +31,12 @@ BOOL DxSelfElevate(CDxwndhostView *view) { // Launch itself as administrator. SHELLEXECUTEINFO sei = { sizeof(sei) }; + char CurrentDir[MAX_PATH+1]; CString args; sei.lpVerb = "runas"; sei.lpFile = szPath; + ::GetCurrentDirectory(MAX_PATH, CurrentDir); + sei.lpDirectory = CurrentDir; //sei.hwnd = (HWND)this->GetMainWnd(); sei.hwnd = (HWND)NULL; // set to NULL to force the confirmation dialog on top of everything... sei.nShow = SW_NORMAL; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps new file mode 100644 index 0000000000000000000000000000000000000000..63805106230ecf6f5c9dd9dc57deecb7efead0c9 GIT binary patch literal 255188 zcmd442e@lTbv8WLjSi+8Fkl-9HehqKr6cLkx1_Ce#MO~xN#~w>E>0A%O$o*(HpP$v z=?M@LLMrK`lTI4xA(iwmg@klS2tCw5NJ!%Ueb-vkwsawf{LlA%m&e?z^{$ycv!<E&O^Y{@Zhhu7|&GyX}PG7oKPTaDVWYbKP~1xn^+d;f>c_ zb=~zZxc-Klo_oy;iq%$YwY9an<>qUzdFD;GJnx$8Zhhg6*YRIh-F&V4zUS5ReUoIj z@?|;St(LCQ+;VqRzOug@odQp@ z;qGK9tI5G?Hk}>JKrP&z6YAn*Y<4My{-zeIa&x7>pwc{G_FKx*6D?!lUVv0skI zK8H5@E6cgW_ffLZgx~5o^cGJ=H_#lq?y^X&_Ge2p&-RXch-N!0$JKI))@X0BkNed9 z>He(5_uCEkut-Jojz>LIpJh) z!{KNmO$X{0sr^-Xu$;OkMoB||TSGKJYq%n#bwDdH-XxvzbwO)l+@-V~&{}R=X_KjM z+UC}_YiEp&EpWD7CnxgL9oHpsuo_g0lgsH0q^{dh5*vHa9Duar9ur9_+9vXRY$SR? zxMri_9vA7-0q~(l;T|8Ud(-Jjp*=xqi@nkQ0)(b}q7rt;(_T4Vp#u*`y8v45Nint6 z6B24{yOQ+&YB=H$--38CW0EkPRT$!1kZoTH`_sXJ@)T~Mq;YvL>F<%N>8hA4l3Q-5 zWF4QF)~4j%cDqVGRm~TpseGr6=~_N~FoA$ZLv*w)NOz>f$+X%(7?=UK-M&r?>D(4W? zQoaIVPZfe>P~QFN!Gh(2tY=DJl&7lkv>cGQ?XFhha60c-rxr&O$-eF833)ONK*uc- zK&RxbM%OJ9>SXHaJMKW~`{n834C8jIDBLL}u_1Rc74=AMVM!Dzvy$^_IIk9Lzhc{+ zwv0!o55wxSRkYoa()Tcv?j80I=8GvsTy)$S1qP!<*&A2=@n|-aX>AK@)>9N)>`f2T zL_6*p1x_Ki>2k{Dr`q4IFc)uO1^Y||ha*|(Fd>rMaG#~*lT|g-?;nnqdn0xltY#|( zA^Q1lZyVDUs7?3TN?jbxW~kv}aJrh$r*q1s*>X=+5Xh-&vV_DiAD>~%HMiZ<6yxLr zu?>JnAvN3XT7{RRrHq8;j=RpjG@c$J2ds$KD}nL|(!#pK4_vXprQ%jYeMlnb;dJHU3^LG9v<)Q2SI z)PWArCewp?Uy9dp&sP}p_nU0zW=8?H-4`m@8;_R5`E=hzr!yXwVp+gCQ*}{VVWeP&1STZmOss&pY%lnrnAJVz2v+cgZvN}1M8LjQU(rB1ejMi~qr8Le? zSRbHSO(!EvY|OdqUZ$XEf~dn%x>#q&z1$LE0O;fh_U@K@MI`SIMx+()tChxy4Buog zA5&f4>Nedg6&jW&F^~9VtlM&5qjZR%H!tyH_c;U(Qdm zZAt97uT$a}DwpQbb+3*jev^DV?(3C^t~Dzs)fmK`E%yydM5i504|T}xG~72Tbppj; zGLaQ*r*PloSvk$gj$>=5<-S>|Hns1T`zTzwkL|C&H-SX}i}XP@~%PrCrP@;;V@->;o`wpf1jt&J2Qv#ue z`%e4N!FWt1y*Czm;l4}h(h+7A2Q4Oh_uWcmi3a1bOD^Pq z+z%?U!16klX}KIiJ(iIL-2ITkQV(?726UF!DajP0pj!fKx*t}oKfok1m}9QgJ!J!W z%a16;Za(MEDX9Dn=r2F2Ae0X2SNq`N$J*}46gZq7wp(eEj{9*%IKN`4?@!0F1~;I_ z{DdMHXOrnf^4W1e8EA_>b~$XNV#~c=saBN%=KMy{a6hF~Ec@eff$3(>JfQRZw9>Jb zB5SDQ^AWl(25h5fx}Q;u?W0T8bTSsG<$l(n>15eE!dytfLnrzn zm`A74_iWTOpb-7M(p3$u2BRtFI;QBlU+^iYI@IhU-O?pKvwPD;!#Bgj@)#|CtvUyINYAP;Q2 zH!6TmxL+<#GXJ*wb*0J3U+i(Vp_Sk_jFYXaHHM+!H9SM0r zY5HwXN2@6_RHonY#2HrXF}@0=oa}{rlSj(&Y!8|PCp4A@iqr2Zgz>pq@iT}VTNq^W`jNAj}*a7 zKRvAGg$e{#i9ZhXYMy)_TG#(k1e~*xEK#&e{D~5w1EY_bLP6uipGNv&AUEBg1u_O_ z(pR8Q{ds_-DMF%-dviq8Akf(Ey1xj-WGF*b`b(vkg8}ry(?@Dnpb_FN3Sf9t&=6+J z`Cz%=AceB@R|-uq5OhK&xp052WUkqM(+qmk{f*LLWZ+WGS(6%j1M1S>hK$f-bS98p zBh3?k=P}a^B}v=;y^=+J(b0~Din(>%KiGG$re~@_1B%jH6~pve0h9eqqrKzaW=XK0 zfFidzwab|wO42`O^gT@5q&M6@DIKd8=2!hN^rN>cm5aL3n(m*KW_m%GBB2+(LlIkq zhtu6%Ee^D!cPccmFkLL5>&nKn(P_JPDZn{lmn#lS({b-sDwm8=iItIZfO_;E&%A`` zh`Lb&y3u=;sB7QebO{p<*`Xf2FJ}+Kq1$l(q7X)VbAaq=kZeGCdcTsn_aF6Fw1tu0 zbRV#sP(WFQ%*fS%^7KK41|#Uo)8%1Ra_WHs^&z9HnxJ-s29&1{D_yq+W(#dVfBJ~h zWwC;K%_(A6>fP;6jt8Q|VN(b(B>|E=_Sh4pa1kG@$zf4a>RXHY<(PK-`Xsc00?pJ1z&jh5{46EjEw zYuX9LY?SG$T|kREC(!psyL)5&he8!FtDPHw!2xy00$S90fre=tOFI$voM&hKMr zt1~}A67IMQ6vo0Jg9DxD6oIb0odSDDJ?JXBa1~IaZtt@bg|UG8bO)uN zX}V)Zgc?vlZMu^ZPan-jQaWf$cUBU|4mS7&l%%^v3dT$U&FHR5nUDH=W;QLL7Try$ ziz&~4Lw)^tXMkB%Lb-^ap)2SsFiZEnxCo$!2n)BC%RPeg9$m# zVE4ftNde=~W%eoTmAML77lvZ=5Cv2*IxJ@u43W|XP>&v}*aGAg=JI|yhhkemMS55Q zs3ufEL;8$_+MmwY0Rkw1AFuc>*w#iX93X(iKV{SG#5Z2>K&UIR(_CM<^XL zHTK{0>5=O4#9Ho=9)oH>;$&GsJ9?B7p`9pI1|gxgyHX)rpfI$kdx-U?fQodLqTJR} zj!e>Zk5;1UMu#{S;|PLww54>a1WTx!y^<1#Zq!h^oM~YP2n!kMF!w8cLJK0yhe6FR zpdvMM%DA{kTOr0;FSv^(}nu=rpgj)4DrJowjmj~te z$x|3nb-IFX^?1b&CT0KX1DsUh8_=wtpj7$v6p8_lgbL_YPgJ^AdN(55?n#Pp~T>F4b260}x|bG$CfkL_2PvSlFOqOCm~40i~)^OjI{n z(vSo?)lkXS-Rv)zMq&FPL*aIn0gYwF&>eaKF?1)` zmG15@a70!>*?O{lS10j0-gYMq9~_p4Qf9IIFm1<;6{Fzw&;=9cgySFT*M7usRtQso z^a!Y669u3E^-rQ_Pv_X__p!}oqd^awDqKz$Ba9%*6B^h|iMm7{%xSYEP`IlTpeq)c z0vgynp_-wlfcCXW$VJPzx7{)!Hwz=T-GP!9Fnycduz==u%9v*dm=O+WNM=F0?ojE{ z&%HIifXa2+XU>zV6^~4yjqb6o(7lcnM3d@)md?q<8t#l@nDcR1NgF}|d)8ATk@Mss zWG6_|T@w*ZBWPnLXt~df8L1=J3psRM@@O=`RqC!Rpr6w4Rt!}ijO}h(#K`58uPQz%WkZZ z`Bi9UH`U1eD73TZ*2w%ORJ6~nk>!)y?&cbq;)SAiON~tNLQ#8OjZE>va`pTgnc{_} z_JSH�zEZg>^dX35D&}I-M1T%J!l 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≈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 delta 217 zcmbPnkz>~>jtw$QldrHW*}RYGi~Z&X=Zw(lQd*1x)9X?h)h5f$Y+y8)Jb&g^RwD)- z2Ghw8bId1Cn3cwA0OC#m*up3|saavN$?Oz%usnmo^oL@Mrkj_{sSy=6WH1G)GGs7f zumsbF3>K3UR~k>Y*upcpXw#I*Z&ElW2kjD@+)$)6*=_SWW)lX3$+Uko-&oqiR}Y{plf<=rr Qt<%G^0e3o2R?%rIrG2|Q8WN0@33w1T5+{*n6@}sue z(AQ1sWy=^<8`fpDz&zOh&UT#)<9H_R-JX-qpKPyR{bPdSEqeY;rGE*)8K>kfS?l$f1fmM;v{+%bLZNaQYGzUWf4Ry@~u5qz7_a zn8yfzjvjVJc=mi-{7V;YlL))Z1TjM_5Z-Mz2v=iA9t;VQXNTlr$Op21q;fAcRwoCq z#W2x~VbkQmF|F-O^B;*ZJ%d&G%`op!zNah8C|6fZCYP>`B%2Dacj|=$Xq*?Fc92^g z?M*XdC$#mw8lIZ}qIrcWgeR)i#JkUv^1gQgZF`e@739kUv{WMW^^=7EDt;rOnPo$t{T_KdEDsEV43HLP9Hwt}ZH;uL~M;q08 zQaEjlSZGuk`NjhL-C*2rtTw7t-?c`|uW`iH?k@@pjzQrGJTCcfkpC9)J9*}{cqu^V z=a=#P2BfjFpzclNe}TLOc^mQ$F`?0Q~N%*(PTZ#PPy317F``e zPF+z=PPM=tqRX9R(I=f$rRO?nwXQ0oZ2xA7*RQ0Ie_!#6jHMd=d?6~z>T#+1mU#VH zB&~XZ!c7qmp-1e&H$!$n=IBHd{g#gFGbWm6c?U%2nJIq8U!lDX`5WY2$OXuG2>Zx0 zkoO>GA>EL3kc*HHAw2x|k$(XByFB+cRxWC>p#KY_=si8h9?*50+I43X4OCM)W$(A{ z#Pm4Skxu_4#Nd#`)1rX$!8=x8O!l1(&vEHm5krGjWlyduJjg>%)*UG{4&zU24u#K{ znSvu#(wWtc1Lh!}zG-@L8HKAW*Fxw!{^nK4UCEg6n!X_|VPw)Lqp{~-o9d=;J*0>h z>!XFVTAlwiL08++gRmbXW_I*A^_3zR9G-!7+*LzSs{2~Fo>@kh^!^#NP<6Y*XujtN zc{~{U9>qPPdFuJzS=w1kIb4S|2Xi%FQDUj;`h!!YUS8R6O;ye9!Ldt>RdD|6jY?(h`H%vOj|2RPWVr{pwFCL3JIp@xc8XMUCmn zq8h%9zkiI6FwXj-WN3ASjGog)eRfko{&mO!KSP%cJ;|>d`5ozzD%kJ(Y0Xn*oBW*t*;jA z^P%Wu_*J*=-9c{puHHKX8<^|dbv3`=Z0Ok$*x{=&fgZOMuNL+>T8b$oXffu+Fjn}^ zkPAzZz-^A>wTjWL1IR^%dh1%6t;%misfr$pM3w@-RUFM#b-5VvOgbN@^BgpXeKwY- z0uHPwdbH2)sk+ROd}3oAXtCIsYTRX%8Z)7Dvcmfrjk6-d0$hZSq9<*HO>98v?#(7F*LCZ$jaj+;hzRxZ3MU5{S-V59RCOY|h zi6|1z*CM!oPcSG!Flf1tNY5EhPAbJYU8kPA{WNw;vp%(s9NKNi1z};IlakczUjNZ| z0yXf`Eca|MziD=W|3hSq(mR83#+}tZ#{wtfZhjJnEJRNlMhC3Z(UtlARC1ap1p!nJx&$#psMRG!3UJL3b5U9Nnpl)*x0OemI+#Q9^sdE*fQ`RNuWUwtZa_ zJwm#vistJ2wQ%7_*I+Rk*3$Im2#WH={aij!E1I&F4&W`j)VJcQC^fO&-Ao5eHhKUr z>V0*(^wr0x%eocp2LbGHDpSsUSNj){G=g;f&!}F1mP{qOd=$D_059bqFP!06zUbL$ zl|CCviK?PAinm6V&kH4ZB1SRXc&>(1i^rqm*dFR|@C_<(j}A#JIL6!5e}Q5>58}p+ ziu&Jsbju;yj~krtM~m$Mg8LfMo1UZBto)0j&i|^t_Lo#>mtW>A(s%IVdgiKi&I{1$y>Qisl7le;enyAZYg?OvY54su>zv ze}p%@@zufmW^q95^ajgSPRxog=5n+ow|BIyyD5*SF$ZBIuIUdpy>T_gV4%yqGu;Kx zzAHNn9cX-lHmesp6LwR)b&P?3Dsj*^ZNGx)O8l}(N=4vI9F%0EZ5UO9e`aj$FsL=u zrkqro;3@GUzy>eK^Oj&=w8LK_^dt;k2+U%paz)-sSVPk1qG_mpaVN#} zze73ko9L^Z?>j#c?~HhHE*F!AQNCs!CH_C%wQ#nJEHqqS+DAL;`1*64yMh#hrQse; zgbebAMq@g50kcJrZ$Rh7KLMC!K=`KsrvzNxnJt72h0bZeFusZ$5cW%9{Qj`TsN>vd z73hY3L=1l=ECuYCuoJ=(!A=VMv#=pxZwNarY#i7bVdsSb85e}TZ$bOqYi{HNfgg$C zRIrbQ-4qrJc1sw4OX0G~5EFDx5yE)HPGMET`27-L%Y+T!@h_K$`z4!oL^8NSk+b%%Y%k$`|H_ zK2g8>eHvW1Qcx1my<+ym0QRu3y~4QYK4Gs4;|Y9C*aczSt&753LEf(LypM!F82M-~ zt1}Am5Q_&+a7>;RNq}A=Y_2dK$G3zn5yoYf3R@;@4A^pEHNu92tr50fSSr~4L6P{2 zv{@jJWQ#iT_~5#S0?0Ng`mit_+atoB4X`^T>`%htVfVVQH-zz#dsA2_!ai?6o_mMf zTGPC&&Ts>!3oI8yo`c!K)(A@kTPtk0uwh_75%z0gT=qA@P7C9P&j`CDjO+Wzz8HUz zZV60*-Xn%F2r1laW`n%p#fTTiqZ=Y@ae!Twum)k=$V2M+nS*m1g>aXf#Og6&+`Y$z zJuQq^=owu!nufsv;u}l4?^fdZoT3*Fq9p!6^OeiSPqhIFQDM<2=k@ri=0>DmKAMu_ zcpZN)^}i+cPXc>8xM`Rhw*-XYV0uW(dA`coKEk;x!*^0d;qjg*{7-;tZ`>a1jl$be zz~qm@wjLN9H+cekE)0fQAI1BD{`aAwI2CJvkkrbe4NRb|gPR zGgZj)1T!MHnzDbQji(=BXJ!?}6&=8O@RD%o^o7=g!c1VSb2^N?U)1wre1O7F`zdwa zryP76^Hr8BdYgaH|k3;S7}z(IgdLFdSJ zSQxvER_J`B+5*^R=D&#av zAdmPH=%bNe7M2aY96Bcp?jJl`qaaqkiy(yxW8EQas4%WC19~R%Okruz-3|$*Qw4$< zcS7fMmoOe_CG-;HRl?YVt$@xQSQ%iq0Xpx8jl$BQPlL|sQDLnANZ3vX)}KehavP8v zGX{8{dD?$0h9+Tb=YT$+&4jt3o1t@Z3uB*W^i`}*Wwq4jSkO!Uy-Caty{+~f-yhD)>Ch=cf33RQ!MWJ?f=-531^$ zQL1B3#*JrMslm307CuT`ITlKB6QLhL+D UPVB^rb=Q+{ZupO^{|?Ui4-i8&rvLx| delta 4046 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 PWaiGZ6u9dHEZF`7sT@QK diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index b03b12c..6721961 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -222,7 +222,6 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HotPatch) t->flags4 |= HOTPATCH; if(dlg->m_FullScreenOnly) t->flags3 |= FULLSCREENONLY; if(dlg->m_ShowHints) t->flags7 |= SHOWHINTS; - //if(dlg->m_FilterMessages) t->flags3 |= FILTERMESSAGES; if(dlg->m_PeekAllMessages) t->flags3 |= PEEKALLMESSAGES; if(dlg->m_NoWinPosChanges) t->flags5 |= NOWINPOSCHANGES; if(dlg->m_MessagePump) t->flags5 |= MESSAGEPUMP; @@ -234,7 +233,6 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) } switch(dlg->m_DxEmulationMode){ - //case 0: t->flags |= AUTOMATIC; break; case 0: break; case 1: t->flags |= EMULATEBUFFER; break; case 2: t->flags |= LOCKEDSURFACE; break; @@ -262,7 +260,6 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 1: t->flags2 |= GDISTRETCHED; break; case 2: t->flags3 |= GDIEMULATEDC; break; case 3: t->flags6 |= SHAREDDC; break; - //case 3: t->flags |= MAPGDITOPRIMARY; break; } switch(dlg->m_ResTypes){ @@ -353,7 +350,6 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_OutDebug) t->tflags |= OUTDEBUG; if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE; if(dlg->m_OutDebugString) t->tflags |= OUTDEBUGSTRING; - //if(dlg->m_EraseLogFile) t->tflags |= ERASELOGFILE; if(dlg->m_AddTimeStamp) t->tflags |= ADDTIMESTAMP; if(dlg->m_AddRelativeTime) t->tflags |= ADDRELATIVETIME; if(dlg->m_OutWinMessages) t->tflags |= OUTWINMESSAGES; @@ -388,6 +384,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_Enum16bitModes) t->flags7 |= ENUM16BITMODES; if(dlg->m_TrimTextureFormats) t->flags8 |= TRIMTEXTUREFORMATS; + if(dlg->m_RawFormat) t->flags8 |= RAWFORMAT; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST; if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; @@ -423,20 +420,15 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_LimitScreenRes) t->flags4 |= LIMITSCREENRES; if(dlg->m_SingleProcAffinity) t->flags3 |= SINGLEPROCAFFINITY; if(dlg->m_UseLastCore) t->flags5 |= USELASTCORE; - //if(dlg->m_SaveLoad) t->flags |= SAVELOAD; if(dlg->m_SlowDown) t->flags |= SLOWDOWN; if(dlg->m_BlitFromBackBuffer) t->flags |= BLITFROMBACKBUFFER; if(dlg->m_NoFlipEmulation) t->flags4 |= NOFLIPEMULATION; if(dlg->m_LockColorDepth) t->flags7 |= LOCKCOLORDEPTH; - //if(dlg->m_SuppressClipping) t->flags |= SUPPRESSCLIPPING; - //if(dlg->m_ForceClipper) t->flags3 |= FORCECLIPPER; if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP; if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH; if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH; if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME; - //if(dlg->m_EnableClipping) t->flags |= DISABLECLIPPING; - //if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR; if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY; if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT; if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; @@ -468,15 +460,12 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR; if(dlg->m_FixD3DFrame) t->flags3 |= FIXD3DFRAME; if(dlg->m_NoWindowMove) t->flags3 |= NOWINDOWMOVE; - //if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP; if(dlg->m_HookChildWin) t->flags |= HOOKCHILDWIN; if(dlg->m_MessageProc) t->flags |= MESSAGEPROC; - //if(dlg->m_NoMouseProc) t->flags6 |= NOMOUSEPROC; + if(dlg->m_FixMouseHook) t->flags8 |= FIXMOUSEHOOK; if(dlg->m_FixNCHITTEST) t->flags2 |= FIXNCHITTEST; if(dlg->m_RecoverScreenMode) t->flags2 |= RECOVERSCREENMODE; if(dlg->m_RefreshOnResize) t->flags2 |= REFRESHONRESIZE; - //if(dlg->m_Init8BPP) t->flags2 |= INIT8BPP; - //if(dlg->m_Init16BPP) t->flags2 |= INIT16BPP; if(dlg->m_BackBufAttach) t->flags2 |= BACKBUFATTACH; if(dlg->m_ClearTextureFourCC) t->flags7 |= CLEARTEXTUREFOURCC; if(dlg->m_NoDDExclusiveMode) t->flags7 |= NODDEXCLUSIVEMODE; @@ -523,14 +512,11 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SyncPalette) t->flags6 |= SYNCPALETTE; if(dlg->m_NoWinErrors) t->flags7 |= NOWINERRORS; if(dlg->m_PretendVisible) t->flags8 |= PRETENDVISIBLE; + if(dlg->m_WinInsulation) t->flags8 |= WININSULATION; if(dlg->m_AnalyticMode) t->flags3 |= ANALYTICMODE; if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS; if(dlg->m_InitialRes) t->flags7 |= INITIALRES; if(dlg->m_MaximumRes) t->flags7 |= MAXIMUMRES; - //if(dlg->m_ForceVSync) t->flags8 |= FORCEVSYNC; - //if(dlg->m_ForceNoVSync) t->flags8 |= FORCENOVSYNC; - //if(dlg->m_ForceWait) t->flags8 |= FORCEWAIT; - //if(dlg->m_ForceNoWait) t->flags8 |= FORCENOWAIT; t->posx = dlg->m_PosX; t->posy = dlg->m_PosY; t->sizx = dlg->m_SizX; @@ -577,7 +563,6 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0; dlg->m_FullScreenOnly = t->flags3 & FULLSCREENONLY ? 1 : 0; dlg->m_ShowHints = t->flags7 & SHOWHINTS ? 1 : 0; - //dlg->m_FilterMessages = t->flags3 & FILTERMESSAGES ? 1 : 0; dlg->m_PeekAllMessages = t->flags3 & PEEKALLMESSAGES ? 1 : 0; dlg->m_NoWinPosChanges = t->flags5 & NOWINPOSCHANGES ? 1 : 0; dlg->m_MessagePump = t->flags5 & MESSAGEPUMP ? 1 : 0; @@ -601,7 +586,6 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; if(t->flags6 & SHAREDDC ) dlg->m_DCEmulationMode = 3; - //if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; dlg->m_ResTypes = 0; if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0; @@ -690,6 +674,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_Enum16bitModes = t->flags7 & ENUM16BITMODES ? 1 : 0; dlg->m_TrimTextureFormats = t->flags8 & TRIMTEXTUREFORMATS ? 1 : 0; + dlg->m_RawFormat = t->flags8 & RAWFORMAT ? 1 : 0; dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0; dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; @@ -744,20 +729,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ClearTarget = t->flags5 & CLEARTARGET ? 1 : 0; dlg->m_FixPitch = t->flags6 & FIXPITCH ? 1 : 0; dlg->m_Power2Width = t->flags6 & POWER2WIDTH ? 1 : 0; - //dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; dlg->m_NoFlipEmulation = t->flags4 & NOFLIPEMULATION ? 1 : 0; dlg->m_LockColorDepth = t->flags7 & LOCKCOLORDEPTH ? 1 : 0; -// dlg->m_SuppressClipping = t->flags & SUPPRESSCLIPPING ? 1 : 0; -// dlg->m_ForceClipper = t->flags3 & FORCECLIPPER ? 1 : 0; dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0; dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0; dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0; dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0; dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0; - //dlg->m_EnableClipping = t->flags & DISABLECLIPPING ? 1 : 0; - //dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0; dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0; dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0; dlg->m_SharedDC = t->flags6 & SHAREDDC ? 1 : 0; @@ -790,9 +770,9 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0; dlg->m_FixD3DFrame = t->flags3 & FIXD3DFRAME ? 1 : 0; dlg->m_NoWindowMove = t->flags3 & NOWINDOWMOVE ? 1 : 0; - //dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0; dlg->m_HookChildWin = t->flags & HOOKCHILDWIN ? 1 : 0; dlg->m_MessageProc = t->flags & MESSAGEPROC ? 1 : 0; + dlg->m_FixMouseHook = t->flags8 & FIXMOUSEHOOK ? 1 : 0; dlg->m_FixNCHITTEST = t->flags2 & FIXNCHITTEST ? 1 : 0; dlg->m_RecoverScreenMode = t->flags2 & RECOVERSCREENMODE ? 1 : 0; dlg->m_RefreshOnResize = t->flags2 & REFRESHONRESIZE ? 1 : 0; @@ -842,14 +822,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SyncPalette = t->flags6 & SYNCPALETTE ? 1 : 0; 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_AnalyticMode = t->flags3 & ANALYTICMODE ? 1 : 0; dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0; dlg->m_InitialRes = t->flags7 & INITIALRES ? 1 : 0; dlg->m_MaximumRes = t->flags7 & MAXIMUMRES ? 1 : 0; - //dlg->m_ForceVSync = t->flags8 & FORCEVSYNC ? 1 : 0; - //dlg->m_ForceNoVSync = t->flags8 & FORCENOVSYNC ? 1 : 0; - //dlg->m_ForceWait = t->flags8 & FORCEWAIT ? 1 : 0; - //dlg->m_ForceNoWait = t->flags8 & FORCENOWAIT ? 1 : 0; dlg->m_PosX = t->posx; dlg->m_PosY = t->posy; dlg->m_SizX = t->sizx; diff --git a/host/resource b/host/resource index 6babaaad765681c05956f4bf9c991507a19020bf..b14d3a8457fa9a84e67f0f521ea9c664ff25d8d7 100644 GIT binary patch delta 99 zcmV-p0G$7}l>^F`1F+U6lU^VO2~7Y`0961}07a8;VJVXiCkB(U3>vf2COmc%LjYd@ zQUE~!R{%x;PXJN?O#nfYVOJ@WFardW;-4Io9yAICNdQg&Q#oq5|-<_*`>HXEs1lxHSYrrb