From 59d70d43dbe68a90d0957b0ae1ae4acd77847532 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 4 Jun 2016 12:45:32 -0400 Subject: [PATCH] v2_03_60_src Former-commit-id: 24ef75f92ead3d9ea0b1a6c8e13290f0e352eed1 --- Include/dxwnd.h | 2 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 316 +++ build/dxwnd.reg | 14 + build/exports/Actua Soccer 3.dxw | 7 + build/exports/Alien Nations.dxw | 8 +- build/exports/Ancient Evil demo.dxw | 6 +- build/exports/Army Men RTS.dxw | 6 +- build/exports/Arx Fatalis.dxw | 7 +- build/exports/Atlantis - The Lost Tales.dxw | 6 +- build/exports/Betrayal in Antara.dxw | 29 + build/exports/Black Thorn.dxw | 8 +- build/exports/Blood 2 the Chosen.dxw | 29 + build/exports/Bugs Bunny Lost In Time.dxw | 29 + build/exports/Carmageddon (gore).dxw | 6 + build/exports/Carmageddon (no gore).dxw | 8 +- build/exports/Chaos Island (rip).dxw | 29 + build/exports/Chicago 1930.dxw | 3 + .../Close Combat 5 Invasion Normandy.dxw | 8 +- build/exports/Cydonia.dxw | 6 +- build/exports/Deadlock II.dxw | 6 +- build/exports/Diablo.dxw | 12 +- build/exports/European Air War.dxw | 6 +- build/exports/Fallout.dxw | 8 +- build/exports/Mechcommander Gold.dxw | 29 + .../Microsoft Golf '98 trial (win).dxw | 29 + build/exports/No Respect (1.1).dxw | 29 + build/exports/No Respect.dxw | 29 + build/exports/Phantasmagoria 2.dxw | 29 + build/exports/Runaway.dxw | 29 + build/exports/Warhammer 40K Chaos Gate.dxw | 15 +- build/readme-relnotes.txt | 8 + build/redist/.gitattributes | 1 - build/redist/ICCVID.DLL | Bin 92160 -> 0 bytes build/redist/S3DTKW.DLL | Bin 72704 -> 0 bytes build/redist/_isresce.dll | 3 - build/redist/d3drm.dll | 3 - build/redist/dplay.dll | 3 - build/redist/dpwsock.dll | 3 - build/redist/setup32.exe | 3 - build/redist/vbruntimes.exe | 3 - dll/ddblit.cpp | 74 +- dll/ddraw.cpp | 2028 +++++++++-------- dll/ddshot.cpp | 12 +- dll/ddtexture.cpp | 24 +- dll/dxemublt.cpp | 294 +-- dll/dxhook.cpp | 4 +- dll/dxwcore.cpp | 23 +- dll/dxwcore.hpp | 2 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 304640 -> 421888 bytes dll/dxwnd.vs2008.vcproj | 8 +- dll/gdi32.cpp | 12 +- dll/gdiblt.cpp | 13 +- dll/hd3d7.cpp | 1 + dll/hddraw.h | 34 +- dll/kernel32.cpp | 48 +- dll/mincaps.cpp | 270 +++ dll/shareddc.cpp | 16 +- dll/user32.cpp | 12 +- host/TabDebug.cpp | 2 + host/TabDirect3D.cpp | 7 +- host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 166212 -> 166648 bytes host/dxwndhost.rc | Bin 112756 -> 112928 bytes host/dxwndhost.vs2008.suo | Bin 92672 -> 93184 bytes host/dxwndhostView.cpp | 2 + host/host.aps | Bin 47504 -> 47504 bytes host/resource | Bin 39752 -> 39844 bytes 71 files changed, 2432 insertions(+), 1239 deletions(-) create mode 100644 build/dxwnd.ini create mode 100644 build/dxwnd.reg create mode 100644 build/exports/Betrayal in Antara.dxw create mode 100644 build/exports/Blood 2 the Chosen.dxw create mode 100644 build/exports/Bugs Bunny Lost In Time.dxw create mode 100644 build/exports/Chaos Island (rip).dxw create mode 100644 build/exports/Mechcommander Gold.dxw create mode 100644 build/exports/Microsoft Golf '98 trial (win).dxw create mode 100644 build/exports/No Respect (1.1).dxw create mode 100644 build/exports/No Respect.dxw create mode 100644 build/exports/Phantasmagoria 2.dxw create mode 100644 build/exports/Runaway.dxw delete mode 100644 build/redist/.gitattributes delete mode 100644 build/redist/ICCVID.DLL delete mode 100644 build/redist/S3DTKW.DLL delete mode 100644 build/redist/_isresce.dll delete mode 100644 build/redist/d3drm.dll delete mode 100644 build/redist/dplay.dll delete mode 100644 build/redist/dpwsock.dll delete mode 100644 build/redist/setup32.exe delete mode 100644 build/redist/vbruntimes.exe create mode 100644 dll/mincaps.cpp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 0414d79..a3aae5a 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -97,7 +97,7 @@ #define GDIEMULATEDC 0x00008000 // Map GDI/user32 calls to primary to a memory surface to be stretch-blitted to the primary #define FULLSCREENONLY 0x00010000 // assume that the program is always in fullscreen mode #define FONTBYPASS 0x00020000 // bypass font unsupported API -//#define YUV2RGB 0x00040000 // Simulate YUV to RGB color conversion +#define MINIMALCAPS 0x00040000 // Simulate minimal HW caps (copied from VMWare virtual screen) #define DEFAULTMESSAGES 0x00080000 // peocess offending messages that are typical of a window with default action #define BUFFEREDIOFIX 0x00100000 // fix buffered IO incompatibilities between pre-Win98 and post-WinNT #define FILTERMESSAGES 0x00200000 // ignore offending messages that are typical of a window and are hot handled by a fullscreeen app diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 95dafc8..dea13f3 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a1ab8f9170fce5bf01058d18f19fba15c7014eb872a8e7a2ec36f4e2ea399bc -size 628736 +oid sha256:d9ac1cecea05e3987a704ea216ebfd79278c9f38a36182164400643fb9e2e1f2 +size 635392 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 62116aa..68e5def 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f7c9d1fe78caeb4054e32420034aba59350b965fb86959352d22a1a46a32ea8 +oid sha256:11ea6c6d9b9ff87c162d3aad1c917218d5385f076c45bac305777a949fa9e331 size 555520 diff --git a/build/dxwnd.ini b/build/dxwnd.ini new file mode 100644 index 0000000..055dd29 --- /dev/null +++ b/build/dxwnd.ini @@ -0,0 +1,316 @@ +[window] +posx=50 +posy=50 +sizx=320 +sizy=200 +exportpath=D:\DxWnd\v2_03_60_src\build\exports\ +exepath=D:\Games\Warhammer 40K - Rites of War RIP\ +[target] +title0=Imperialism +path0=D:\Games\Imperialism\Imperialism.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=1744839201 +flagg0=671088640 +flagh0=32788 +flagi0=4194308 +flagj0=0 +flagk0=0 +flagl0=0 +flagm0=0 +tflag0=6466 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +title1=\Warhammer 40K - Rites of War +path1=D:\Games\Warhammer 40K - Rites of War RIP\row.exe +launchpath1= +module1= +opengllib1= +notes1= +registry1= +ver1=0 +coord1=0 +flag1=153092128 +flagg1=1207959552 +flagh1=20 +flagi1=138543108 +flagj1=4224 +flagk1=65536 +flagl1=0 +flagm1=0 +tflag1=-2147477245 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=-1 +swapeffect1=0 +maxddinterface1=7 +title2=Runaway +path2=D:\Games\MVM 2004 - Runaway\Runaway.exe +launchpath2= +module2= +opengllib2= +notes2= +registry2= +ver2=0 +coord2=0 +flag2=136314912 +flagg2=1207959552 +flagh2=20 +flagi2=138412038 +flagj2=266368 +flagk2=65536 +flagl2=0 +flagm2=0 +tflag2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +swapeffect2=0 +maxddinterface2=7 +title3=Betrayal in Antara +path3=D:\Games\Betrayal in Antara\ANTARAR.EXE +launchpath3= +module3= +opengllib3= +notes3= +registry3= +ver3=0 +coord3=0 +flag3=681574434 +flagg3=1207959552 +flagh3=20 +flagi3=138412036 +flagj3=4224 +flagk3=65536 +flagl3=0 +flagm3=0 +tflag3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=-1 +swapeffect3=0 +maxddinterface3=7 +title4=Blood 2 the Chosen +path4=D:\Games\Blood2\CLIENT.EXE +launchpath4=D:\Games\Blood2\BLOOD2.EXE +module4= +opengllib4= +notes4= +registry4= +ver4=0 +coord4=0 +flag4=136315042 +flagg4=1207959552 +flagh4=20 +flagi4=138412036 +flagj4=4224 +flagk4=65536 +flagl4=0 +flagm4=0 +tflag4=0 +posx4=50 +posy4=50 +sizx4=1200 +sizy4=900 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=-1 +swapeffect4=0 +maxddinterface4=7 +title5=Bugs Bunny Lost In Time +path5=D:\Games\Bugs.Bunny.Lost.In.Time\bin\bugs.exe +launchpath5= +module5= +opengllib5= +notes5= +registry5= +ver5=7 +coord5=0 +flag5=681574434 +flagg5=1209139200 +flagh5=20 +flagi5=138412036 +flagj5=4224 +flagk5=98304 +flagl5=0 +flagm5=0 +tflag5=0 +posx5=50 +posy5=50 +sizx5=800 +sizy5=600 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=-1 +swapeffect5=0 +maxddinterface5=7 +title6=Microsoft Golf '98 trial (win) +path6=D:\Games\MSGolf98\MSGOLF98\GAME.EXE +launchpath6= +module6= +opengllib6= +notes6= +registry6=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"InstallType"="1"\n"InstallPath"="D:\\Games\\MSGolf98\\MSGOLF98\\"\n"CDPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\MSGolf98\\MSGOLF98"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009\n +ver6=0 +coord6=0 +flag6=136314914 +flagg6=-671088640 +flagh6=1302 +flagi6=1212547076 +flagj6=4224 +flagk6=67436544 +flagl6=4 +flagm6=0 +tflag6=0 +posx6=50 +posy6=50 +sizx6=0 +sizy6=0 +maxfps6=0 +initts6=0 +winver6=0 +maxres6=-1 +swapeffect6=0 +maxddinterface6=7 +title7=No Respect (1.1) +path7=D:\Games\No Respect\nr11.exe +launchpath7= +module7= +opengllib7= +notes7= +registry7= +ver7=0 +coord7=0 +flag7=681574434 +flagg7=1207959552 +flagh7=20 +flagi7=138412036 +flagj7=4224 +flagk7=327680 +flagl7=0 +flagm7=0 +tflag7=0 +posx7=50 +posy7=50 +sizx7=800 +sizy7=600 +maxfps7=0 +initts7=0 +winver7=0 +maxres7=-1 +swapeffect7=0 +maxddinterface7=7 +title8=No Respect +path8=D:\Games\No Respect\NR.EXE +launchpath8= +module8= +opengllib8= +notes8= +registry8= +ver8=0 +coord8=0 +flag8=136314914 +flagg8=1207959552 +flagh8=20 +flagi8=138412036 +flagj8=4224 +flagk8=327680 +flagl8=0 +flagm8=0 +tflag8=0 +posx8=50 +posy8=50 +sizx8=800 +sizy8=600 +maxfps8=0 +initts8=0 +winver8=0 +maxres8=-1 +swapeffect8=0 +maxddinterface8=7 +title9=Phantasmagoria 2 +path9=D:\Games\Phantasmagoria 2\SIERRAW.EXE +launchpath9= +module9= +opengllib9= +notes9= +registry9= +ver9=0 +coord9=0 +flag9=681574434 +flagg9=1207959552 +flagh9=20 +flagi9=138412036 +flagj9=4224 +flagk9=65536 +flagl9=0 +flagm9=0 +tflag9=0 +posx9=50 +posy9=50 +sizx9=800 +sizy9=600 +maxfps9=0 +initts9=0 +winver9=0 +maxres9=-1 +swapeffect9=0 +maxddinterface9=7 +title10=Silver +path10=D:\Games\Silver\silver.exe +launchpath10= +module10= +opengllib10= +notes10= +registry10= +ver10=0 +coord10=0 +flag10=136314998 +flagg10=1207959552 +flagh10=20 +flagi10=138412036 +flagj10=4224 +flagk10=268500992 +flagl10=0 +flagm10=0 +tflag10=0 +posx10=50 +posy10=50 +sizx10=800 +sizy10=600 +maxfps10=0 +initts10=0 +winver10=0 +maxres10=-1 +swapeffect10=0 +maxddinterface10=7 diff --git a/build/dxwnd.reg b/build/dxwnd.reg new file mode 100644 index 0000000..ead38c6 --- /dev/null +++ b/build/dxwnd.reg @@ -0,0 +1,14 @@ +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft] +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games] +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98] +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo] +"AppPath"="D:\\Games\\MSGolf98\\MSGOLF98" +"InstallType"="1" +"InstallPath"="D:\\Games\\MSGolf98\\MSGOLF98\\" +"CDPath"="D:\\Games\\MSGolf98\\MSGOLF98" +"Launched"="1" +"PID"="" +"Path"="D:\\Games\\MSGolf98\\MSGOLF98" +"VersionType"="TrialVersion" +"InstalledGroup"="1" +"LangID"=dword:00000009 diff --git a/build/exports/Actua Soccer 3.dxw b/build/exports/Actua Soccer 3.dxw index f429d80..c8e5a6c 100644 --- a/build/exports/Actua Soccer 3.dxw +++ b/build/exports/Actua Soccer 3.dxw @@ -26,3 +26,10 @@ launchpath0= winver0=0 maxres0=0 flagj0=128 +notes0= +registry0= +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Alien Nations.dxw b/build/exports/Alien Nations.dxw index 90744e4..ca6fbe0 100644 --- a/build/exports/Alien Nations.dxw +++ b/build/exports/Alien Nations.dxw @@ -10,9 +10,9 @@ coord0=0 flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=134217732 +flagi0=138412036 flagj0=4224 -flagk0=0 +flagk0=32768 tflag0=0 initx0=0 inity0=0 @@ -29,3 +29,7 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Ancient Evil demo.dxw b/build/exports/Ancient Evil demo.dxw index c702448..8923a00 100644 --- a/build/exports/Ancient Evil demo.dxw +++ b/build/exports/Ancient Evil demo.dxw @@ -25,7 +25,11 @@ initts0=0 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 winver0=0 maxres0=0 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Army Men RTS.dxw b/build/exports/Army Men RTS.dxw index e89ee1b..135f858 100644 --- a/build/exports/Army Men RTS.dxw +++ b/build/exports/Army Men RTS.dxw @@ -25,7 +25,11 @@ initts0=0 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 winver0=0 maxres0=0 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Arx Fatalis.dxw b/build/exports/Arx Fatalis.dxw index 45ee414..af8bdc3 100644 --- a/build/exports/Arx Fatalis.dxw +++ b/build/exports/Arx Fatalis.dxw @@ -8,10 +8,10 @@ notes0= registry0= ver0=0 coord0=0 -flag0=136314918 +flag0=136331302 flagg0=1207959552 flagh0=65552 -flagi0=138412036 +flagi0=138936320 flagj0=4224 flagk0=65536 tflag0=0 @@ -30,3 +30,6 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Atlantis - The Lost Tales.dxw b/build/exports/Atlantis - The Lost Tales.dxw index 2702d15..bcd236c 100644 --- a/build/exports/Atlantis - The Lost Tales.dxw +++ b/build/exports/Atlantis - The Lost Tales.dxw @@ -12,7 +12,7 @@ flagg0=1207959552 flagh0=20 flagi0=138412036 flagj0=4224 -flagk0=0 +flagk0=32768 tflag0=0 initx0=0 inity0=0 @@ -29,3 +29,7 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Betrayal in Antara.dxw b/build/exports/Betrayal in Antara.dxw new file mode 100644 index 0000000..3e69289 --- /dev/null +++ b/build/exports/Betrayal in Antara.dxw @@ -0,0 +1,29 @@ +[target] +title0=Betrayal in Antara +path0=D:\Games\Betrayal in Antara\ANTARAR.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Black Thorn.dxw b/build/exports/Black Thorn.dxw index 8ac0a98..2b6dfb0 100644 --- a/build/exports/Black Thorn.dxw +++ b/build/exports/Black Thorn.dxw @@ -12,8 +12,8 @@ flagg0=1207959552 flagh0=20 flagi0=4325380 flagj0=128 -flagk0=0 -tflag0=6210 +flagk0=65536 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -29,3 +29,7 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Blood 2 the Chosen.dxw b/build/exports/Blood 2 the Chosen.dxw new file mode 100644 index 0000000..a50f7bb --- /dev/null +++ b/build/exports/Blood 2 the Chosen.dxw @@ -0,0 +1,29 @@ +[target] +title0=Blood 2 the Chosen +path0=D:\Games\Blood2\CLIENT.EXE +launchpath0=D:\Games\Blood2\BLOOD2.EXE +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136315042 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=1200 +sizy0=900 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Bugs Bunny Lost In Time.dxw b/build/exports/Bugs Bunny Lost In Time.dxw new file mode 100644 index 0000000..ed93a8e --- /dev/null +++ b/build/exports/Bugs Bunny Lost In Time.dxw @@ -0,0 +1,29 @@ +[target] +title0=Bugs Bunny Lost In Time +path0=D:\Games\Bugs.Bunny.Lost.In.Time\bin\bugs.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=7 +coord0=0 +flag0=681574434 +flagg0=1209139200 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=98304 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Carmageddon (gore).dxw b/build/exports/Carmageddon (gore).dxw index bdb2cf6..3db7019 100644 --- a/build/exports/Carmageddon (gore).dxw +++ b/build/exports/Carmageddon (gore).dxw @@ -27,3 +27,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +registry0= +flagk0=32768 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Carmageddon (no gore).dxw b/build/exports/Carmageddon (no gore).dxw index 6993126..78a1679 100644 --- a/build/exports/Carmageddon (no gore).dxw +++ b/build/exports/Carmageddon (no gore).dxw @@ -12,7 +12,7 @@ flagg0=1207959552 flagh0=20 flagi0=138412036 flagj0=4224 -tflag0=512 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,3 +27,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +registry0= +flagk0=32768 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Chaos Island (rip).dxw b/build/exports/Chaos Island (rip).dxw new file mode 100644 index 0000000..16fa3b1 --- /dev/null +++ b/build/exports/Chaos Island (rip).dxw @@ -0,0 +1,29 @@ +[target] +title0=Chaos Island (RIP) +path0=D:\Games\Chaos Island\CIsland.exe +launchpath0= +module0= +opengllib0= +notes0=Needs proper registry emulation file +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE]\n[HKEY_LOCAL_MACHINE\SOFTWARE\DreamWorks Interactive]\n[HKEY_LOCAL_MACHINE\SOFTWARE\DreamWorks Interactive\ChaosIsland]\n"Data Drive"=".\\"\n"PID"="71239-442-3367621-91206"\n"Installed Directory"=".\\"\n"Run File"=".\\"\n"InstallType"=dword:00000001\n"KBPS_OTHER"=dword:00000000\n"KBPS"=dword:00000000\n"Installed"=dword:00000001\n"NextTip"=dword:00000001\n"StartupTips"=dword:00000001\n"FPS"=dword:00000003\n\n +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1744830464 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +flagk0=0 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Chicago 1930.dxw b/build/exports/Chicago 1930.dxw index f909143..a998e94 100644 --- a/build/exports/Chicago 1930.dxw +++ b/build/exports/Chicago 1930.dxw @@ -30,3 +30,6 @@ flagj0=128 flagk0=65536 swapeffect0=0 registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Close Combat 5 Invasion Normandy.dxw b/build/exports/Close Combat 5 Invasion Normandy.dxw index 9de7a68..be0d103 100644 --- a/build/exports/Close Combat 5 Invasion Normandy.dxw +++ b/build/exports/Close Combat 5 Invasion Normandy.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1744830464 flagh0=20 flagi0=4194308 @@ -27,3 +27,9 @@ maxres0=-1 launchpath0= notes0= flagj0=128 +registry0= +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Cydonia.dxw b/build/exports/Cydonia.dxw index fee7f4b..fe64521 100644 --- a/build/exports/Cydonia.dxw +++ b/build/exports/Cydonia.dxw @@ -12,7 +12,7 @@ flagg0=1207959552 flagh0=20 flagi0=138543108 flagj0=4224 -flagk0=0 +flagk0=268500992 tflag0=0 initx0=0 inity0=0 @@ -29,3 +29,7 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Deadlock II.dxw b/build/exports/Deadlock II.dxw index 484bb5a..f3b2b75 100644 --- a/build/exports/Deadlock II.dxw +++ b/build/exports/Deadlock II.dxw @@ -6,8 +6,8 @@ module0= opengllib0= ver0=7 coord0=0 -flag0=-2013265886 -flagg0=1209008128 +flag0=-2013249502 +flagg0=1207959552 flagh0=20 flagi0=138412036 flagj0=128 @@ -28,7 +28,7 @@ winver0=0 maxres0=-1 notes0= registry0= -flagk0=0 +flagk0=327680 flagl0=0 flagm0=0 swapeffect0=0 diff --git a/build/exports/Diablo.dxw b/build/exports/Diablo.dxw index 1e7c9cd..cc2421a 100644 --- a/build/exports/Diablo.dxw +++ b/build/exports/Diablo.dxw @@ -5,8 +5,8 @@ module0= opengllib0= ver0=1 coord0=0 -flag0=138428448 -flagg0=1242562576 +flag0=138428450 +flagg0=1241514000 flagh0=20 flagi0=4194304 tflag0=0 @@ -26,4 +26,10 @@ launchpath0= winver0=0 maxres0=0 notes0= -flagj0=8388737 +flagj0=129 +registry0= +flagk0=262144 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/European Air War.dxw b/build/exports/European Air War.dxw index 114d435..cebee33 100644 --- a/build/exports/European Air War.dxw +++ b/build/exports/European Air War.dxw @@ -13,7 +13,7 @@ flagh0=20 flagi0=138412036 flagj0=4224 flagk0=0 -tflag0=-2147477245 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -29,3 +29,7 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Fallout.dxw b/build/exports/Fallout.dxw index a74e5df..2d93619 100644 --- a/build/exports/Fallout.dxw +++ b/build/exports/Fallout.dxw @@ -6,7 +6,7 @@ opengllib0= ver0=1 coord0=0 flag0=134217762 -flagg0=1207959552 +flagg0=1744830464 flagh0=20 flagi0=4194308 tflag0=0 @@ -25,7 +25,11 @@ initts0=0 winver0=0 maxres0=-1 launchpath0= -notes0= +notes0=On Win10 it was necessary to activate Hook DLL flag and clean system shims. flagj0=128 flagk0=0 swapeffect0=0 +registry0= +flagl0=0 +flagm0=0 +maxddinterface0=7 diff --git a/build/exports/Mechcommander Gold.dxw b/build/exports/Mechcommander Gold.dxw new file mode 100644 index 0000000..b614152 --- /dev/null +++ b/build/exports/Mechcommander Gold.dxw @@ -0,0 +1,29 @@ +[target] +title0=Mechcommander Gold +path0=D:\Games\Mechcommander Gold RIP\Mechcommander\MCX.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681590818 +flagg0=1207959552 +flagh0=20 +flagi0=138412038 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Microsoft Golf '98 trial (win).dxw b/build/exports/Microsoft Golf '98 trial (win).dxw new file mode 100644 index 0000000..01114d2 --- /dev/null +++ b/build/exports/Microsoft Golf '98 trial (win).dxw @@ -0,0 +1,29 @@ +[target] +title0=Microsoft Golf '98 trial (win) +path0=D:\Games\MSGolf98\MSGOLF98\GAME.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"InstallType"="1"\n"InstallPath"="D:\\Games\\MSGolf98\\MSGOLF98\\"\n"CDPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\MSGolf98\\MSGOLF98"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009\n +ver0=0 +coord0=0 +flag0=136314914 +flagg0=-671088640 +flagh0=1302 +flagi0=1212547076 +flagj0=4224 +flagk0=67436544 +flagl0=4 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=0 +sizy0=0 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/No Respect (1.1).dxw b/build/exports/No Respect (1.1).dxw new file mode 100644 index 0000000..3573e79 --- /dev/null +++ b/build/exports/No Respect (1.1).dxw @@ -0,0 +1,29 @@ +[target] +title0=No Respect (1.1) +path0=D:\Games\No Respect\nr11.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=327680 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/No Respect.dxw b/build/exports/No Respect.dxw new file mode 100644 index 0000000..1bafdb3 --- /dev/null +++ b/build/exports/No Respect.dxw @@ -0,0 +1,29 @@ +[target] +title0=No Respect +path0=D:\Games\No Respect\NR.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=327680 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Phantasmagoria 2.dxw b/build/exports/Phantasmagoria 2.dxw new file mode 100644 index 0000000..d0a3ab1 --- /dev/null +++ b/build/exports/Phantasmagoria 2.dxw @@ -0,0 +1,29 @@ +[target] +title0=Phantasmagoria 2 +path0=D:\Games\Phantasmagoria 2\SIERRAW.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Runaway.dxw b/build/exports/Runaway.dxw new file mode 100644 index 0000000..76dc15d --- /dev/null +++ b/build/exports/Runaway.dxw @@ -0,0 +1,29 @@ +[target] +title0=Runaway +path0=D:\Games\MVM 2004 - Runaway\Runaway.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314912 +flagg0=1207959552 +flagh0=20 +flagi0=138412038 +flagj0=266368 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/exports/Warhammer 40K Chaos Gate.dxw b/build/exports/Warhammer 40K Chaos Gate.dxw index 1d4db28..4ace0b7 100644 --- a/build/exports/Warhammer 40K Chaos Gate.dxw +++ b/build/exports/Warhammer 40K Chaos Gate.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=679494176 -flagg0=134217728 +flag0=679494178 +flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,12 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +registry0= +flagj0=128 +flagk0=65536 +flagl0=0 +flagm0=0 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 566cdee..4562ff4 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1060,3 +1060,11 @@ fix: reorganized menu commands fix: proper handling of DEFAULT win size on CreateWindowEx - fixes "Imperialism" problem fix: fixed stretced blit operation because Blt behaves differently from StretchBlt. Fixes "3D Minigolf" partial background fix: GetPixel logging + +v2.03.59 +fix: added extra ref to surface for ddraw version 2: fixes "Warhammer Chaos Gate" +add: view shims menu command, to analyze Win7/Win10 compatibility patches +GUI: added the hook tab to move hooking flags in a single tab page + +v2.03.60 +too many things, sorry, I'll fix it later. \ No newline at end of file diff --git a/build/redist/.gitattributes b/build/redist/.gitattributes deleted file mode 100644 index b110a24..0000000 --- a/build/redist/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/build/redist/ICCVID.DLL b/build/redist/ICCVID.DLL deleted file mode 100644 index ae34f204816ba3ef83a94bec83c6a67b208f56e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92160 zcmeEv31Ab&_y25?wxLZ)fEEfwsTi=d714r%6fBe;PzpWhfkIKiSP>DS6_mr)(9+Ek z#Tyk*@IX=Ys{(>T(*iA*a*13j;FVfX5am!Y|IeG}kMHsO``XRSzIpTJdh_P( z?96QH^$VDmF{Z=ib~CmLEG7#lA5vxQ~P_EJ+j z#9ChxBxtT--37)5%2?A3xF%e2z%gd#ehp*%4hYIWhqr)HZV(JWB#NhAikD3hSTY6Q zC@?e87YQt^4I%2m^8yXR?oKL!i?mXk}gKWfhv z*HX`(_AOYAt=#Gjwxhb3^2}^$jK!Q|mEv_-Qj9dpVwQf<7FfchYMx)I+ICoba*1Q6 zf6;YrDDjZ%Rn+$sfF#UYlqG39pr+J{@(+0Gb@^ZXI)wv{W z@n}(#buyP2pM0uuMwn|mAVzpypxq!?cO5gX+$I`KXkn_bl3l;M-7)23sd~q0EAnoz zt=CnUnB)#_!^~IWO2Czg>n2ixUA9;i{5rL!srCj7E_j^c*-{~^b#5Qt!l_C}|)PR_}Lfxezhk7B$sL0V?$Rrhcix=`L6&dP0Xp4e^IjJozUkh@-8pRO)9d77xG;d>7CGXD$+Y4yNdKqs8B`D^x}D=ihRfm znF3_~GeB@LQRN>a~ELVL?UF`&NkEdtaQ3sjLOf%F#S6KB08G2e|~lEz7vuq=-> zZUYVH*s6CO$5kpa)C;*-=5{7(i*(YsvPRlgCr;aBaoSKPPAApO-9fR=NZVv_QVFSd zNY(k>z#g4M7N;5#r$AYpuAvN2AMviJt}5~dL{mFXF!3L5iREgAYET@cSHn)6QMiov zif|A})a+wGK^=vqWy&dTAX=)~bqG*1|CWl}1f+M(K0!>jQ>Q?0h|b@EU~~t$X4@!D zI8BXA9aZI+ry`eoB{P(`RZET5EU!|fdbuP>Cl&tfC{|N7yASLet=Z2`D|Hgwr>+vK zfkd731IoKj-X>bAlbaBrmSB;JyaPz@I-h%v-svi7g;Tpl+T#+Ge;M1`51Zp+Nk?O+b! zx)#?UT#gAAMi=a_Y>b-**hV9yQZjyw>(cyT2+D)^CgZwtA~{ z&AmyWy401F7mV_w0U4sDLnkqbgLD~EVzO1r9+D=Fh?5ywr8xg|;-3MMkhJs+*Gkk@ zNjb)FU194qcjy?fiz&~8SyCyMmLm(RFnTk7zW_w~Y^#*)k4);N$0^h*4l^J@lW|>~ zK3N<*K^$h1N{bL64i1r4EF{m=2zQ1quhKD8&KY=6CZvbT5oi?$8>HeQA_Kk1>4!zQ zZ`S((#i%m$QfWE7C|w&RcU2q#90SuO7V;<#ilmpoFvFBaS(TC}Nkv5nPEX5lnMN^Y zTW_l5j8%G0WJpH=^wOXy(nFMfnj})3jC9wYEIEqgR_H4iELeb`f8d`Q_@@T`seyk- z4G0QoIA|5naqv^XpF@BGdJe4=2;>l?fPq7>0QbVCHa<0vB`WqChx@OBCqJ;Zg-G9J(pcox^1cL~!V#KqQAK1)@1zu0T%? zS18bn!<7nL#UVz4-W>WUa5aZ(6zI#Lp90r%=&wL5hXD!<cehxMT=5i=epp?Tr1N*r&jL4hIxC$l)^uKIia-0*5#p zR^SMSFBSNT!`BLY!{J*6TpVf?_>M!Z0!KL#Wt5buq4}aDHdfZnsrvo!@E8p3ozXaRpu* zn6%Y4r`B1cEqjoXns+%BZra2Voi5W=Upc?jX!qi8pK-<0ahOMr z+Op$pv9kzej;h>o#*aMCLt*yA_DZBV`i6mJw=i6Sam7KzG_Kh0JfcCij4QS}4{K`X z{pfZ(x0o~si#}ymRE?F_jf&xD{^Q(i(rho<1DXoZsP&~{c@X~rXXhr9W^2(WAa#ON ztwt5ggZNKU9d|j2FHQD?b(~~&M@;tZ&T5lYTP^=P51UX8&&3N=?0J4v;Kk&9fhu4g?}LlU>kg)>GL{s9hoTEmf(FWfx*4*~xC*e9>$n!M zm7BO4;QgMEI#B(AK7SFf+&am8+QiJI9zpbA#lC>UbhfSH0r8rtp7LwdVb;bAqd zD2HtOXd3^b z-OQnj(+F@i0r(*)Lk_f%xu>Y&G|$p6Gyd7!y~0fjm!NriEx?*P)&z%bCbVl0EIt%*A3cH<_2L7iH) zd)0a?>!REPrQMrE6aoeFf4pS2N_$(Xw7k@nZyR5zGEs$X#!+8ga=vy{^+z1yHP9bE z?b)Q(AeHq8w8jNCAgK-h&Yya!GQ1nD5}5$#mZ}Xv67D_5qis?dR0P~C0ZO9&s8f?% zi@E555}Fu;UbXk2XH+p9&3|aL-0d@lQhF+u2l1bz`pNJV>iEda4x6BQs_SBLpA*Uj z`s{C)ALx<$Df5sst}E1mtC)~{@Z#FSdjJziOQ2-(Af*aiz;|wUONHz}joVFA@H#B_ zDuDYS6SP90VDb+UIt5%TSo9IX<-%1$KVguNETjqfx-|&vM@pz)hgHRUJkktCin{`xBD>s7c;@n z?XL9r-0%f6LFaZGf>mEf_y#hev)i2mALa7~#T^H?6VtSJyYGQ-24h#Vo80ab@W+Dc z^47F2Oz;!h>cZUaap0WBSUBq~Tr0#0iNbKVdnhQ7nnu&g?aqdOh+Kl!0!ko+3z0%E zp+AdryPrZ>Pp>f6#qF+c1a}I!%b6f(QKn0cwD!sEz5=cQw->(`G&;T89jo{S_>i}FXe)FOE)u$;O%z%`&=$czo!TczXyYF$bk=tfEJC!|Lck79vZ*1_%m z6#l;OL-Anon*nhtzmdT9W9(9)hj4|^$L;QnupJ6t@46BOwMt;Ov%A=ARw}$CydnHc zSS5TYR0!3=Hn;mIV)>yaPQab1NSQuF=qOx_TwTsfF;GYlQuHH*EWMYMx!sen*sM3w zV|slskI_ZwE=0HL<#s=hkO+p_3Ii7lS_SvPjN0=P__`uByu5@2~s4?RJ+V&K*j9>q8+ET_F=!K&A)i2MIp)4QUH$ zDvviIxceLAvla5mZb4@5 zWpjmRg(bSzgyq6}!fIiiutC@?Z1>yac5lTBtEh4;-TG25CFoDzVmN(*)?IBSJgw>C z3%aC{25ZbttCZ+}?JcIli>^%wDGZbR`v(*T0;jX~Ptp|xNE=~DY^odzV=ib@;jWl+ zek*f{DSw|<5=yh9Prk1BdYyco^X@GMh)FszNiQZD?1=$(tN*nL7Gp^^Mu}^02{D$W z!UNTor;8kG>g4{ts;3n4%%g1tvpvr*a%>xp(aIPM3igX5#~QqG_Bl-mr3q%bGtpg$Jt4d-(ZBXecYu(im&Qg@L_?Di zIU6}5+Q*$5VJvwN>$7+hVXg;l!{nC28aop`c9dVk%(M(mrwBlM+eTgK9%qHAbkEs# zJ8L!Cokp7-;RRoledGL6Cy}{sl3vF%m5JI*08VSe7-Z7E4kciBA2$Eg2$vSq$jmMvPtDg6?4cE=A>QS zC8y-x-mshKshjBJBFTyQ|_*xqXOygS~R@KteTxkbSueP$3#^=fYUIg=Z=5 zQ;PcnTwZeHO5Q8cq$K^`J^Qc9^3cMUyz5x0U&@%^N7)kmC{uzTWoekPq)_bzzMZ>S zY2G`4B=+@za#_FNcmGoEEO5op?aEygzxx!wJWowXa|2ajASJO3m0Yl!d|c2E{0|BG zfTjhV>Q3;ZIurb;t^_}-Bf*bqQ}Cl&6#S_61V5@ZRnU+Ay9C{)3OdG5St3aLw6^cV zlvwFD?MF0d)%f>6F})L3#Gk6v8B6v-3l;quUeLPe*Gr6Z_o31FSRn>$;+T1Xac!c` z5fXP2g=22fS4##k=a~RZJa64zWBHZr*d*Q@ zl$L?fWa@vySUQ>V_z)I>7ya7JSW*U0Q|%)1cKPqh{RGPWF09>dStt9Pce1Y3$u2d{ z-H!q(oh&~d<6sN>81*pCAMRoPmP6=aj*tyV9J9L%f}A4t&X)DDMj|Kae0v$$RW;r5 zBL?RUVP^EHrrPsE-k$$AN*zt5?xps$?#7ZwQ8<*nrPAtKv2z!M!`A!5?V?1dmQj0I z0p)K2?`4-6OXg88YqDMFS*hU2e@o6MQqK3Fhc!QrwUx)Q!ihA71!D{=h~Qm|K++n924o|MuEVO_o23@^?YpHrLER-g&ijFYLCU(b%4X9 ztIAbnOSX#-9aq1;g!L6Grh(lxY4{O?rJ;Dq*JS@Cv1qyd@*gM(rUu<8S-e2{cqILOL_0#dg9+)UsO}$f%bYF72@Y1XW@GN$en( z+#{5AAq@<0uOQmPY4s9i`%$OUWIrm7tY>&rN3ZG6C3p02NNy8$_p28oxBoq*qv?d2 zv8ps<=r2Jz_~_}8ND^IomCw~Lx3=m@nI|wwdERL}YLZgpO@yM_edphuQ)B7fRDBmClg*Fsp03fP{w^NTLj7&Wf~GM0_YHc+d9*iHUbIks z%aqON@05{$jsE@*m88D@zP-izn=BG8|1DABviahX=|wf|R4pDzTD*zzZ`!yP>+wI6 zo5yQP{=7CHnoe@ik|!WL^j(^Xl&6SYGw7DA8K$~wRZN9aEHcze7 z=9gtOC&w?hSfBqFl`g)%Hh%)8P@dx&Rl6P`YC@&UQcNSImx#crYvfFY8rqqd`?GNsgzY%$?oyjw2n#|qkQjLTr~OJ(c9dgGu# zQ*9fd1aDLuM?$zG)tu(YdMn+LusuUcMSipN*unWTUL@MqhuLOtX9azwgzZu)7V-|A zh(N3Du*PaTE706Iv+Z!(4u?fKjqB{&>DCn(we$1|o68_3?5+){O4v84khRoU!CPEw*TGD(EtiNegJUZX(NY??6?wo=9a# zbKQ^AJrKte!-rPzrOo!xTC0k}z>H_(RNO?3Ts=~PNlbMW_}R+4)@p6#fiVZfghSvg z=H^NXhoTUgaIoK4mvQbhNRLa_&j*O#04e-0**Jq@;j$;M7ZN0gFrE&fXu*oSK zS$ZMikdScDxNeZYarxjlA;BQE5wl$VcNt4UAl#H0-X1=+tMRSfGninPTcT)223l?= zm|LsjCh%&&M0#=t^nFn3K{0iel(4E4Q+B4(Ls$nPQbVHHBdlV=_ju?2J;$OLI+8PK za2oJG0{^3m_viTgNz@Q@3PGoM5TUWr{?y=!8spqI5L%V+K^SA_(5z@oF=4Ni@PQ}U zy_9U2m{2YylzSnOXu@_eVZD^F-W$u;0wA$pkk~Jj*j`G>DrKR%vwj2eHx(I(TuAqm zP>2cDQbM&i7ZcT^Ec97hrG%~CVIdSo-HQvRRV?lV`K)PA4b+m#pShP;{wg$?n=k87!W^-oNzF&YS4|SDwOdcKYge<`C9lXFJe`~K_tXe z$~tIVt5>8tvK56Iz(_8Bz5Uxbh=xwEG3Q_>H#!E+SV$+moI!e-bnF(a@qwmuB!xIe z%t}iKrUvzoZQYKMX2;_+^O>Fj9l#B%Y|Z?BL0d%agZ(W4}FZG0CTM zz0|Gr((#g0g@HJs2hY8<3EsL|!(y=WzQQW)7w4C*M;g{)){+B-N2?MiQKeKRP9evN zEQiq;QI$B0qf3j(0aTSz#t5oP=`{#}6~!`(iE&mjdk7*~jO#Y@mEpD{zgfjOiDF{1 zab1;hxl>FWZl;O$KXRTr> z?{NbJHao~##cu>wYqSo~vN^33gceL5ATr00AU8$w(=ti}3Xxd1Rnamp6s%W9w(CA< zN~^>fqDFgT(})hWYK=LTjx?zoWV;rDgmC@dB<98ke!%ZUi>GGy8rN+oIUp|LmFUow z8s`pxlCxrP)k{U?pcTWa;!SW_RXiG+9KNQXPAqCm#}lEw!Dse;v}M;N?M}P;3*WG$rITscqCCw zoJIKl-qCzA%_WRT!Wu;7B1b{zP>r5Morkn_nc}iYB=j-}RTz<$?V9-^^?D5L#<^V3 zf$l90=!+vEs!HdBteP67bP0a92f&v&h7_4~O#n1};zZ-RT4_W6@hrg%(U8iXA1s)q z1xxUoo{`V81+)88tF*F%_ECRiP z$o3k`7u8Yk%y#v~J$!0+&30W@AJN_y!4KPzkBy*(e0}J^3-m^l^c)qrnW$Mpsmze48oxzI;)t1 zE7QMLXLZN>JCX&fI8qm9tJD{7gkZA)Sj59-an)K$&4BXY_%fK_gA6$0D=Ztj#{f%w zO%W229-%st2AQOkS<*XHdD88Z=wLG`Wr~Pnh~PCNeux`a$tL663a|zfOVP{>ln5bV zR$D)2oa-PwXyrSq46K_Ohqv?L(iTVb(~dF6n06lsOmt(uO$rh*(B6Pjn8g!e`%j1T67FYMv-IDZkSw_tSw8{ zlqCyg`o;)`PZr9OgUXTv%aU7_B{xBW=Q6^NzRI)|O!nS5zQl(Q230Y??$w49tQ+ngI&K`0k( zjP+zYj2$Nmd7|b9Y)@Oen^+aha=dvEuH)H5^t(0?!i-H3X;Kg<^ti#0*de{Jl{9zH zQQXu9z~h1^%{860`fy7G%oZ|6DGHG)glR6ClR|hjlI_iDtW_Gf7MZbFtC(BMANqx7}>!`MsHPtHeh%ks^b~=`Al(|3t4RJ5sOTV+3wmhnGsBw9PartIi z9sT%MKx;RHdCVs4#!?cqN)Hg;Vcsas};;C!OUYtI^&Z+P-Fj`Bh(Po6&aA+pM>{Xd)2!STRx zV%N{+gemkmu}Q zg0}|jYSiCR3)#=oBuihZuy@I+g05(xA&|DWnSDjQ;HgUPc&*d(nFg0S1uwd7#h#Gc*?Bb9{$ z@u(Jva12IaK^6FoMnJEaa{Pv)NWF{?>_?)wi$GVh=#2Mo!EMYYNM{&g57Rgg>+ORD zyq*cF#{FPzP&Ex}D4@kS?|G2g1B=d@3R)GNZDTCq<|EVvMaB-Qd$A+)TRmoP;Ge3q zI=|5)nGoCzZeaDS{Q<@2k+Aq zh!#PPmF$q)jUzen#D#W`wpC&3507fSP%q)m!@)QxG$F2ENf|1ypq*4gjc7Y0q-D9X z{CV|(eF%#97Vt3#P@HiZdlHsn>#2Bqai63O+S?xo^BLzkh@{*eU~`4r&a|CA83RX| zDIbd!Eso>2Vq%x4k(TYwGNDy!N6Pnp%mje~GK7%VLekojyrem@b?9HzZkq9<8b|qYAB`)l2O1vj)5|zN z66%(#80rtU^%m%tYmoUQT&g<;{yTBqkLz(aTj#_=|cD#{Y2UEz3l2|ka?bgPnzz+QN{UAg?`BKgI zaMo@e?v28f7F#>Xn~F*t=7>%}0IQ*%xOQQa!Ou|e`bL7|YVN0?$oRB0CDd(ksw*xEU%0yOa`i^Z{qq#O^DePPjF`#xq;aFaO@eIq4W zYFF$ecG66pbb^l44T$nEQJQP_Moufl2s8Dov7w8--xWW?G?OqbM3@;S%rpx#!>er6;|L_~ z)0T_eMLr+^MhzYO`g=mE;>Uo9o&KyUK9@XI@uOrXO?HOMPO|I_ zA%_dtleQyT@%9^WjPtY!&NCXEV<^Vwt04i}3g;Ou<{re9NgQWfhepA~7H<^kkyYSA z2Ox@>Q>x+%WS-l_lo{I1A|4ImXYj*>p`2_*2tyJ!K2%6l*z`;nbx|~OFDgW(n9^JB zt-8ug^{7J?0sG=+=%B}Ny^CuXuJ3UL-p0&baP`NPgNqM*b^Vpj%g)Kd6O#MB7ey`*PIw4gn8FN`auv>aE5t7M7VTk9WlfN)Y$wEPr~2W~tAOO?>4^86gy zO=ml*&y>=2*|v)AInrH*EZfHJU>gpL?QK-1S|5(laUxXuDX2)HU_6}{9dk_5;#ky~ z$zpu6g!y9Bx>cGKrja(J!h{ULyl6-2i4__lHjLv6kK!>Dv3v>pfN(UP2(d?|jHlv_owly8W|0G*Fw z8c<7QYh}S=ay_<;8}g?TC+Z5aqz8&nPSl@SnqhE$tC6ZkBLAVQ30s!#2Llh7vh?53 z!;edA`7<-oCL5$3L-E|C5a#&Vs`Qd`Xju*?ESi%c6w=^m#-z_io}6At%vBIy13`VS zH&kIXX-MikY3aaNGC;p)1vOv@@sL-WdS!9WBq_}#f!*gk|9COqBIY|2=x?K)OC zSkg$>>m0Y~MZqyxFOJqpVR#`Uj)ncEa||{)ZZr8H!W_4Ssfab`$3$jxhTAH_v9qR* zdEsKr+O)koBHqHvIY0u(iEsfm>LE_(J;wu;PcCGSgA zcUZQK%x&w7=^UA>>|K;;GH7FFuFjXp5Sd$V6J|(cZip|9IWkw?V5w~0r0tx!e!eup zk-7D@ZiYtYhWgT66q&1R%ak*u-AS7;a|K^2ePpiQ7o&;H)%aq9B6EX$F{a2|dCRFM zj~yd(mF=Bs6}5}ZZRZ=SQ)I5P;Zx1g4N<#L-+9`|T&*u@U}SEfFQ!douFsxUdtO*% zuCm8eX6O7)SNx0nK1?t9ttQ7Rc7Tj%H`_LbW5U6miY>EUV6aI}D3?v@=M(T+Wws&a z0N##b{#zQU%Yu?^ugMm00)i%6!+*8-#U@BttNxJ{oxXxGT`sxoiGq5g#f`@MM(cf} zi*(9y9Ft0zJ<%_6L)~rhIm+i$zYodjUprMJeTF@#%1$@ORMHiAC1w@FYzfdMRoI=1 zGK>V8mw>;*hR&E}F_gG5-}kZ2Efi{CYCwq;|E`OJ%Gfi#opEjtbemzeUs_F{?zTMk z+uh7u{7Vc1r*|*@Ut3e=MMfs<@-a$ZJ1ee9 z#@WsYoy+r1?*)I?7Y&)Ic}&C0+bN<~^2CCW2O2}}fvxDts7kp5yMP-Y7fA{--6h}| zs6qHFY^L-eC%W;67wLGV4mF%scbhSh)r(&j));B~hg7a8g-R+7#u>>|4cXGY`iX97 zuns?MDXknT=8{J|`MeF^)ZkgFYa=Qmh<@3*-H945n8ol7pa`;rObjsr&%EMz1d#dC5 zN7d{o;!M@mr!fI2Zw$F+UL(<06g7f8+!)eatWu&VwqM+ZrgT?zom@kzk((+)P!FQ= z5|PpM(>*}RvQISfy-Jed`r4ZbxW+5~>2OPN zEyDG(a&3USAJ-4KbOp@Z5tjv5KU@=VJ&4PRYb&ljxV};Rzrxia4o-K_;yF4%-%38} zHc&avHprkJa|=Xk$sJh8%)@a#fNMLh1GtXk@`FxP`N+@Z^i)2ST><J zw{Vr?+K%gMTyi|+q+N|xJ#)9t1uNwyKo6c|4-1%M#+3Hry*Yw>bX$dipZ!knLkMJ> zL_Key*9>LjD=h(-ZD?c{_q16BHQpOreYS2(e9t!aR*PM*RT*2h<=x8|c4@P>=TrjP zU0kW)#SKw3$G?y$}vQTkQaFztJnTDZZ&K2QyDJ_&w3!_e6t#3d}4Vf?-5GQ445Pfv4IrmYjk8 z*jNjYfSYKkBzby~CqTV}+|!`};yf^yN#NlmNjgr0ThMs=NtzmQit33|JvXXd2vKA* zcw{noWHNYel#4JNd9CS-a>%03OCvX}e13qou@3g%Sdh_bTc9@^OK3kwgC2ce>21)X z`RM>PXf64404~@*rvv;S6>OZO)tF#^|34(ygH^#s>-p#~&Ehfloo}o(+FqhYKd%ns z+5;zc(h!LV_0?5FofPh+lX^AOJ)U56Pz-;hWA0R%!ZWB+?u{k6s(^!u&)BC9sa&04 zYbDnxUYa9Z);?ZJ0+_nw@Uqff`=B}w)*o&E(!>hi_8Ps06)tYjU(ef8jrUhPdMW*t zH{yBwD{qFsw-Ik?yb(wIO^ry0)zm)N$oQ>UoO}QIWuIPTHzoUel5!edF&1+>PSD>crC%jiGe~uj$h52*{(G|Jb9fj= z*cqzqs+p8+=JUu`<308}PmkrI*F=x?NW=dL(ZgYz@(ER{?I?@hvHz^-O;$y(q3y3( z{AlUDI4apahm233oR&36YR;FwE<`)M@TyE^$uNn)K2=C zuizLWXiuNw-}|F?x3okvEGH}5FE717)YRmOg`Q#@C}&qELLa(lmCQ)FuyG=yW%Tcmb14`yBXsWt0c+ z2zO>8{jhBND9c3-o#-$ZIdo5JD=zz^CN9`@HjlU9aR(_RZt|6!RS2^k$9`#pjTXr7S;(dQG)Z!Rjm~_%% zKHxAvi~p$o+I_{fd!R!~4q&g(0mQtI5?w=%vo;_OpJgr^qYId|0magzs3F*P(}qgs zTQFsP0KJH|9StwpL<5^}LWkfrd>9o7 zIJ^#{*YCiZVs@g$VfGx2Jzk@w$#=XIRw;RijP^zmnR<_R^Uhy1Wuq)zX$^&d#bm^o zA`+E7UQh{%ZzE_z#T?)Xlgz2yE}@rv_Ao7u;o}wL{fwPou)(C|6H@k~As_T9D`5bC3KXj;YZy zcSkPK$?^o^s>ZaB^OV^hC#Xqy_$mB7CGEz$Ylyu)P>>Y;fw-l0@pJ{8}UI%%$;3WYt#BdnaCA}d~KqLc-~ zM-VPSm3wtiitN*Xq!m1W6Un?9poqj1zZ(<}c-uSKX%Q3Go?Ky-6BWdj zR?Pa-FJeIJqMz_G+OrIh+%eQsTk-zM3v15`hVY7B-H>G9-`YvNWkxN~AMd0_-%c8+ zbkZR2PTKmqFn(K%VzRO+`@8BfvS(K!cc zvCiBPT^dvFhUM9H@%6x!AJ_ze!4HWN|CXcXowDZx9)u~c^01DqEQ3hxXDYQz= zK1j#QV;|(_Fr!@dLH>1xa>SOR2!sru>XjxCnz{0NdDJM|g_ntH_rYaHa zDFU&ABK9WYsN@Eym`z0F;cyW+q%wOuEq1BcJMdp7YwtK z2}@`823oq5AJXb{P@EVqE6R^(f%Ge?&{?{mgnEQorF0DsZ`B}1>xMB5atwT27aW5d z#K0b8uQXsq`}6dvy?G4e3SVmX&Q*IEw#Jw8sp3*Wet zOjK_EJObk!Cc6CO5k?)$E~NbWmX_b}mzAGBgLmQO4{Eaguanzf!`q*X zai#oTG3vEH#X$R044sZ*DDCeRqmlN%4l#K9Qw*j3y<&LUpXjLlHBGet@xQP9a%nE4 z{Q8!b-(dNx%KyWKlwZOQtpMzH(xc{EW00|@`%!yQ14@JR_H-k{=mDfXR2n*)-aa&# zp1nJw!-b*4VN3ORN)L}aT+_(5HksOFY5Vjyq=9FCJUi3=%ARs0+I}SIeIu#sxw(GQ z^BrVJkRcBOMt1BR!yU)Ab|E6Se~F zaDHdNaD|}?M@1kBMwm7-hEl|_jNi4#t<%*RG#HkElm{}cgdzg7Q;SYjx?y7 zG+U*Ax*O|>*FI-AWGUEC%7lCGCpx^=%SBBDoR zRP^ONujqBo;tys@}AD%hqk%KKgk3j-9)9 zf3oM(z5Dj-@0nPt37(``yY-UKk?(qpMDMu4h#%xjao1U z8iGxM!L3a}t&MFAMpN5hlc`;6Q=1TDo3^2*w(Z)R+J$sz6A~KMHne@mcI`WK3h5Bm zIW(-JxqZh@<_?`YUli8ad~rv!xl1SWMd6(D>)z@6x`dv(8S2V8S)|ABq`$6nVjcEEMl4j35Mf8ce4Vz0Yy@PO;$;s?eJ8gkvB!3oz5 zj!%q>ACfd^NJ8@9gv6ooiAlqTBqgULBo9qV96D@x(y)}&
VLsN#295y^PEhTkC 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 D@$M7t diff --git a/build/redist/S3DTKW.DLL b/build/redist/S3DTKW.DLL deleted file mode 100644 index 00a8e5d9be51949f6c051aa53042ccd8be171bba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72704 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 I>on&70jcMwU;qFB diff --git a/build/redist/_isresce.dll b/build/redist/_isresce.dll deleted file mode 100644 index 1278e06..0000000 --- a/build/redist/_isresce.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:011e92e868f1f09904bef59b46972c318c2867c279380182e23bc1fd7eaf1d11 -size 31744 diff --git a/build/redist/d3drm.dll b/build/redist/d3drm.dll deleted file mode 100644 index 623c3cb..0000000 --- a/build/redist/d3drm.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd80f3839a035b6b52362735b22eb8d2523d3434bf18afb3e0f1b5ace84357b0 -size 437008 diff --git a/build/redist/dplay.dll b/build/redist/dplay.dll deleted file mode 100644 index 42e2b0c..0000000 --- a/build/redist/dplay.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8194ca60e6eda8f5c3fe67990bb38f7d3e68e9beba9d6adf5c68fab9478b94f5 -size 57344 diff --git a/build/redist/dpwsock.dll b/build/redist/dpwsock.dll deleted file mode 100644 index 086de94..0000000 --- a/build/redist/dpwsock.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fe37bba5475b66375d286ee92bc10cfcdeff6e9fa1ef112eb2813b86d4d4065 -size 42768 diff --git a/build/redist/setup32.exe b/build/redist/setup32.exe deleted file mode 100644 index ab18f51..0000000 --- a/build/redist/setup32.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aaa614fdf6986017cbe6ade045d404f08872e6a90d6a0d54c30e438a2bdee65 -size 677888 diff --git a/build/redist/vbruntimes.exe b/build/redist/vbruntimes.exe deleted file mode 100644 index 6e4f6ba..0000000 --- a/build/redist/vbruntimes.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b34beff662415ef318ea0bba7f0f01faf8a5593e3903e4645e290077cd74d6e3 -size 2765965 diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 1619a66..d250848 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -13,23 +13,31 @@ extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; extern LPDIRECTDRAW lpPrimaryDD; extern Blt_Type pBlt; -extern ReleaseS_Type pReleaseS; +extern ReleaseS_Type pReleaseSMethod(); extern CreateSurface1_Type pCreateSurface1; extern CreateSurface1_Type pCreateSurface2; extern CreateSurface1_Type pCreateSurface3; extern CreateSurface2_Type pCreateSurface4; extern CreateSurface2_Type pCreateSurface7; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); +extern Unlock4_Type pUnlockMethod(); extern HDC hFlippedDC; extern BOOL bFlippedDC; -extern ReleaseDC_Type pReleaseDC; +extern ReleaseDC_Type pReleaseDC1; +extern ReleaseDC_Type pReleaseDC2; +extern ReleaseDC_Type pReleaseDC3; +extern ReleaseDC_Type pReleaseDC4; +extern ReleaseDC_Type pReleaseDC7; extern void BlitError(HRESULT, LPRECT, LPRECT, int); extern void BlitTrace(char *, LPRECT, LPRECT, int); extern void DescribeSurface(LPDIRECTDRAWSURFACE, int, char *, int); extern void TextureHandling(LPDIRECTDRAWSURFACE); +extern GetSurfaceDesc2_Type pGetSurfaceDescMethod(); +extern int GetSurfaceDescSize(); +extern GetSurfaceDesc2_Type GetSurfaceDescMethod(); +extern Blt_Type pBltMethod(); -static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, +static HRESULT sBltNoPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) { RECT srcrect; @@ -89,8 +97,8 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // } // break; case DDERR_SURFACEBUSY: - (*pUnlockMethod(lpdds))(lpdds, NULL); - if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); + (*pUnlockMethod())(lpdds, NULL); + if (lpddssrc) (*pUnlockMethod())(lpddssrc, NULL); if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx); break; @@ -110,7 +118,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest return res; } -static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, +static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx, BOOL isFlipping) { HRESULT res; @@ -184,7 +192,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest if (lpdds != lpddssrc) { dxw.ShowOverlay(lpddssrc); if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, __LINE__); - res=(*pPrimaryBlt)(lpdds, &destrect, lpddssrc, lpsrcrect); + res=(*pPrimaryBlt)(dxversion, pBlt, lpdds, &destrect, lpddssrc, lpsrcrect); } if(res){ BlitError(res, lpsrcrect, &destrect, __LINE__); @@ -194,8 +202,8 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest } // Try to handle HDC lock concurrency.... if(res==DDERR_SURFACEBUSY){ - (*pUnlockMethod(lpdds))(lpdds, NULL); - if(lpddssrc) (*pUnlockMethod(lpdds))(lpdds, NULL); + (*pUnlockMethod())(lpdds, NULL); + if(lpddssrc) (*pUnlockMethod())(lpdds, NULL); if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, __LINE__); res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); @@ -203,26 +211,26 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // Try to handle DDBLT_KEYSRC on primary surface if((res==DDERR_INVALIDPARAMS) && (dwflags & DDBLT_KEYSRC)){ // to do: handle possible situations with surface 2 / 4 / 7 types - DDSURFACEDESC ddsd; - LPDIRECTDRAWSURFACE lpddsTmp; - extern GetSurfaceDesc_Type pGetSurfaceDesc1; + DDSURFACEDESC2 ddsd; + LPDIRECTDRAWSURFACE2 lpddsTmp; + extern CreateSurface2_Type pCreateSurfaceMethod(); if (IsDebug) BlitTrace("KEYSRC", lpsrcrect, &destrect, __LINE__); memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - (*pGetSurfaceDesc1)(lpddssrc, &ddsd); - res=(*pCreateSurface1)(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); + ddsd.dwSize = GetSurfaceDescSize(); + (*pGetSurfaceDescMethod())((LPDIRECTDRAWSURFACE2)lpddssrc, &ddsd); + res=(*pCreateSurfaceMethod())(lpPrimaryDD, &ddsd, (LPDIRECTDRAWSURFACE *)&lpddsTmp, NULL); if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // copy background - res= (*pBlt)(lpddsTmp, lpsrcrect, lpdds, &destrect, DDBLT_WAIT, NULL); + res= (*pBlt)((LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, lpdds, &destrect, DDBLT_WAIT, NULL); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // overlay texture - res= (*pBlt)(lpddsTmp, lpsrcrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); + res= (*pBlt)((LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); // copy back to destination - res= (*pBlt)(lpdds, &destrect, lpddsTmp, lpsrcrect, DDBLT_WAIT, lpddbltfx); + res= (*pBlt)(lpdds, &destrect, (LPDIRECTDRAWSURFACE)lpddsTmp, lpsrcrect, DDBLT_WAIT, lpddbltfx); if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); - (*pReleaseS)(lpddsTmp); + (*pReleaseSMethod())((LPDIRECTDRAWSURFACE)lpddsTmp); } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; } @@ -287,14 +295,24 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // Try to handle HDC lock concurrency.... if(res==DDERR_SURFACEBUSY){ - if (bFlippedDC) (*pReleaseDC)(lpdds, hFlippedDC); + if (bFlippedDC) { + ReleaseDC_Type pReleaseDC; + switch(dxversion){ + case 1: pReleaseDC=pReleaseDC1; break; + case 2: pReleaseDC=pReleaseDC2; break; + case 3: pReleaseDC=pReleaseDC3; break; + case 4: pReleaseDC=pReleaseDC4; break; + case 7: pReleaseDC=pReleaseDC7; break; + } + (*pReleaseDC)(lpdds, hFlippedDC); + } // v2.03.49: resumed because if fixes locked surfaces on "Red Alert 1" on WinXP as reported by cloudstr if(lpddssrc) { // lpddssrc could be NULL!!! - res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); + res=(*pUnlockMethod())(lpddssrc, NULL); if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpddssrc, res, ExplainDDError(res)); } - res=(*pUnlockMethod(lpdds))(lpdds, NULL); // v2.03.24 reintroduced because of "Virtua Cop" + res=(*pUnlockMethod())(lpdds, NULL); // v2.03.24 reintroduced because of "Virtua Cop" if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpdds, res, ExplainDDError(res)); if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, __LINE__); @@ -307,7 +325,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest } LPDIRECTDRAWSURFACE lpDDSSource; - if (res=(*pColorConversion)(lpdds, emurect, &lpDDSSource)) { + if (res=(*pColorConversion)(dxversion, lpdds, emurect, &lpDDSSource)) { OutTraceE("sBlt ERROR: Color conversion failed res=%x(%s)\n", res, ExplainDDError(res)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; @@ -321,7 +339,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest emurect.bottom <<= 1; } if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__); - res=(*pPrimaryBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect); + res=(*pPrimaryBlt)(dxversion, pBlt, lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect); if (res) BlitError(res, &emurect, &destrect, __LINE__); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; @@ -329,7 +347,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest return res; } -HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, +HRESULT WINAPI sBlt(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx, BOOL isFlipping) { POINT p = {0, 0}; @@ -396,9 +414,9 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, } if(ToPrim) - res = sBltToPrimary(api, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, isFlipping); + res = sBltToPrimary(dxversion, pBlt, api, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, isFlipping); else - res = sBltNoPrimary(api, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); + res = sBltNoPrimary(dxversion, pBlt, api, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); return res; } \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 4567e6e..f59e964 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1,6 +1,3 @@ -// to do: duplicate EnumSurfaces(D) handling -// fix Unlock duplicate hook in Judge Dredd Pinball - #define _CRT_SECURE_NO_WARNINGS #define INITGUID //#define FULLHEXDUMP @@ -21,6 +18,7 @@ extern BOOL IsChangeDisplaySettingsHotPatched; DWORD dwBackBufferCaps; extern void TextureHandling(LPDIRECTDRAWSURFACE); +extern void SetMinimalCaps(LPDDCAPS, LPDDCAPS); ColorConversion_Type pColorConversion = NULL; HDC hFlippedDC = NULL; @@ -29,8 +27,10 @@ BOOL bFlippedDC = FALSE; // DirectDraw API HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFIID, IUnknown FAR *); -HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK, LPVOID); -HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX, LPVOID, DWORD); +HRESULT WINAPI extDirectDrawEnumerateA(LPDDENUMCALLBACKA, LPVOID); +HRESULT WINAPI extDirectDrawEnumerateExA(LPDDENUMCALLBACKEXA, LPVOID, DWORD); +HRESULT WINAPI extDirectDrawEnumerateW(LPDDENUMCALLBACKW, LPVOID); +HRESULT WINAPI extDirectDrawEnumerateExW(LPDDENUMCALLBACKEXW, LPVOID, DWORD); HRESULT WINAPI extDirectDrawCreateClipper(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown *); // DirectDraw @@ -43,7 +43,10 @@ ULONG WINAPI extReleaseD2(LPDIRECTDRAW); ULONG WINAPI extReleaseD4(LPDIRECTDRAW); ULONG WINAPI extReleaseD7(LPDIRECTDRAW); /*** IDirectDraw methods ***/ -HRESULT WINAPI extCreateClipper(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); +HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); +HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); +HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); +HRESULT WINAPI extCreateClipper7(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); @@ -52,8 +55,10 @@ HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURF HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW); +HRESULT WINAPI extFlipToGDISurface1(LPDIRECTDRAW); +HRESULT WINAPI extFlipToGDISurface2(LPDIRECTDRAW); +HRESULT WINAPI extFlipToGDISurface4(LPDIRECTDRAW); +HRESULT WINAPI extFlipToGDISurface7(LPDIRECTDRAW); HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW, LPDDSURFACEDESC); HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW, LPDDSURFACEDESC); HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW, LPDDSURFACEDESC2); @@ -63,8 +68,13 @@ HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); +HRESULT WINAPI extEnumDisplayModes2(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); -HRESULT WINAPI extInitialize(LPDIRECTDRAW, FAR GUID *); +HRESULT WINAPI extEnumDisplayModes7(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); +HRESULT WINAPI extInitialize1(LPDIRECTDRAW, FAR GUID *); +HRESULT WINAPI extInitialize2(LPDIRECTDRAW, FAR GUID *); +HRESULT WINAPI extInitialize4(LPDIRECTDRAW, FAR GUID *); +HRESULT WINAPI extInitialize7(LPDIRECTDRAW, FAR GUID *); HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW, HWND, DWORD); @@ -73,12 +83,17 @@ HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); -HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW, DWORD, HANDLE); +HRESULT WINAPI extWaitForVerticalBlank1(LPDIRECTDRAW, DWORD, HANDLE); +HRESULT WINAPI extWaitForVerticalBlank2(LPDIRECTDRAW, DWORD, HANDLE); +HRESULT WINAPI extWaitForVerticalBlank4(LPDIRECTDRAW, DWORD, HANDLE); +HRESULT WINAPI extWaitForVerticalBlank7(LPDIRECTDRAW, DWORD, HANDLE); /*** Added in the V2 Interface ***/ HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); +HRESULT WINAPI extGetAvailableVidMem7(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); /*** Added in the V4 Interface ***/ -HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW); +HRESULT WINAPI extTestCooperativeLevel4(LPDIRECTDRAW); +HRESULT WINAPI extTestCooperativeLevel7(LPDIRECTDRAW); // STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; // STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); @@ -87,17 +102,46 @@ HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); // DirectDrawSurface -HRESULT WINAPI extQueryInterfaceS(void *, REFIID, LPVOID *); -HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE); +HRESULT WINAPI extQueryInterfaceS1(void *, REFIID, LPVOID *); +HRESULT WINAPI extQueryInterfaceS2(void *, REFIID, LPVOID *); +HRESULT WINAPI extQueryInterfaceS3(void *, REFIID, LPVOID *); +HRESULT WINAPI extQueryInterfaceS4(void *, REFIID, LPVOID *); +HRESULT WINAPI extQueryInterfaceS7(void *, REFIID, LPVOID *); +HRESULT WINAPI extReleaseS1(LPDIRECTDRAWSURFACE); +HRESULT WINAPI extReleaseS2(LPDIRECTDRAWSURFACE); +HRESULT WINAPI extReleaseS3(LPDIRECTDRAWSURFACE); +HRESULT WINAPI extReleaseS4(LPDIRECTDRAWSURFACE); +HRESULT WINAPI extReleaseS7(LPDIRECTDRAWSURFACE); /*** IDirectDrawSurface methods ***/ -HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); -HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); -HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); -HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extAddAttachedSurface1(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extAddAttachedSurface2(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extAddAttachedSurface3(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extAddAttachedSurface4(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extAddAttachedSurface7(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extBlt1(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); +HRESULT WINAPI extBlt2(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); +HRESULT WINAPI extBlt3(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); +HRESULT WINAPI extBlt4(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); +HRESULT WINAPI extBlt7(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); +HRESULT WINAPI extBltFast1(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); +HRESULT WINAPI extBltFast2(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); +HRESULT WINAPI extBltFast3(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); +HRESULT WINAPI extBltFast4(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); +HRESULT WINAPI extBltFast7(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); +HRESULT WINAPI extDeleteAttachedSurface1(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extDeleteAttachedSurface2(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extDeleteAttachedSurface3(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extDeleteAttachedSurface4(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); +HRESULT WINAPI extDeleteAttachedSurface7(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE, LPVOID, LPDDENUMSURFACESCALLBACK); -HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); +HRESULT WINAPI extFlip1(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); +HRESULT WINAPI extFlip2(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); +HRESULT WINAPI extFlip3(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); +HRESULT WINAPI extFlip4(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); +HRESULT WINAPI extFlip7(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); +HRESULT WINAPI extGetAttachedSurface2(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); @@ -106,27 +150,68 @@ HRESULT WINAPI extGetCaps2S(LPDIRECTDRAWSURFACE, LPDDSCAPS); HRESULT WINAPI extGetCaps3S(LPDIRECTDRAWSURFACE, LPDDSCAPS); HRESULT WINAPI extGetCaps4S(LPDIRECTDRAWSURFACE, LPDDSCAPS2); HRESULT WINAPI extGetCaps7S(LPDIRECTDRAWSURFACE, LPDDSCAPS2); -HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); -HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); -HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); -HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); +HRESULT WINAPI extGetColorKey1(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); +HRESULT WINAPI extGetColorKey2(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); +HRESULT WINAPI extGetColorKey3(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); +HRESULT WINAPI extGetColorKey4(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); +HRESULT WINAPI extGetColorKey7(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); +HRESULT WINAPI extGetDC1(LPDIRECTDRAWSURFACE, HDC FAR *); +HRESULT WINAPI extGetDC2(LPDIRECTDRAWSURFACE, HDC FAR *); +HRESULT WINAPI extGetDC3(LPDIRECTDRAWSURFACE, HDC FAR *); +HRESULT WINAPI extGetDC4(LPDIRECTDRAWSURFACE, HDC FAR *); +HRESULT WINAPI extGetDC7(LPDIRECTDRAWSURFACE, HDC FAR *); +HRESULT WINAPI extGetPalette1(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); +HRESULT WINAPI extGetPalette2(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); +HRESULT WINAPI extGetPalette3(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); +HRESULT WINAPI extGetPalette4(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); +HRESULT WINAPI extGetPalette7(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); +HRESULT WINAPI extGetPixelFormat1(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); +HRESULT WINAPI extGetPixelFormat2(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); +HRESULT WINAPI extGetPixelFormat3(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); +HRESULT WINAPI extGetPixelFormat4(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); +HRESULT WINAPI extGetPixelFormat7(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd); -HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd); +HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd); +HRESULT WINAPI extGetSurfaceDesc3(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd); +HRESULT WINAPI extGetSurfaceDesc4(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd); HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd); -// STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; -HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); -HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); -HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC); +HRESULT WINAPI extLock1(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLock2(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLock3(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLock4(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLock7(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLockDir1(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLockDir2(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLockDir3(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLockDir4(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extLockDir7(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); +HRESULT WINAPI extReleaseDC1(LPDIRECTDRAWSURFACE, HDC); +HRESULT WINAPI extReleaseDC2(LPDIRECTDRAWSURFACE, HDC); +HRESULT WINAPI extReleaseDC3(LPDIRECTDRAWSURFACE, HDC); +HRESULT WINAPI extReleaseDC4(LPDIRECTDRAWSURFACE, HDC); +HRESULT WINAPI extReleaseDC7(LPDIRECTDRAWSURFACE, HDC); HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE, LPDIRECTDRAWCLIPPER); HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); -HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); -HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extSetPalette1(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); +HRESULT WINAPI extSetPalette2(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); +HRESULT WINAPI extSetPalette3(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); +HRESULT WINAPI extSetPalette4(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); +HRESULT WINAPI extSetPalette7(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); HRESULT WINAPI extUnlock1(LPDIRECTDRAWSURFACE, LPVOID); -HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extUnlock2(LPDIRECTDRAWSURFACE, LPVOID); +HRESULT WINAPI extUnlock3(LPDIRECTDRAWSURFACE, LPVOID); +HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extUnlock7(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extUnlockDir1(LPDIRECTDRAWSURFACE, LPVOID); +HRESULT WINAPI extUnlockDir2(LPDIRECTDRAWSURFACE, LPVOID); +HRESULT WINAPI extUnlockDir3(LPDIRECTDRAWSURFACE, LPVOID); +HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extUnlockDir7(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extCreateSurface(int, CreateSurface_Type, LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extSetSurfaceDesc(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); +HRESULT WINAPI extSetSurfaceDesc3(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); +HRESULT WINAPI extSetSurfaceDesc4(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); +HRESULT WINAPI extSetSurfaceDesc7(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); // DirectDrawClipper HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER); @@ -150,123 +235,88 @@ int WINAPI extGDIReleaseDC(HWND, HDC); /* DirectDraw APIs */ DirectDrawCreate_Type pDirectDrawCreate = NULL; DirectDrawCreateEx_Type pDirectDrawCreateEx = NULL; -DirectDrawEnumerate_Type pDirectDrawEnumerate = NULL; -DirectDrawEnumerateEx_Type pDirectDrawEnumerateEx = NULL; +DirectDrawEnumerateA_Type pDirectDrawEnumerateA = NULL; +DirectDrawEnumerateW_Type pDirectDrawEnumerateW = NULL; +DirectDrawEnumerateExA_Type pDirectDrawEnumerateExA = NULL; +DirectDrawEnumerateExW_Type pDirectDrawEnumerateExW = NULL; DirectDrawCreateClipper_Type pDirectDrawCreateClipper = NULL; HandleDDThreadLock_Type pAcquireDDThreadLock = NULL; HandleDDThreadLock_Type pReleaseDDThreadLock = NULL; /* DirectDraw hook pointers */ -QueryInterface_Type pQueryInterfaceD1; -QueryInterface_Type pQueryInterfaceD2; -QueryInterface_Type pQueryInterfaceD4; -QueryInterface_Type pQueryInterfaceD7; +QueryInterface_Type pQueryInterfaceD1, pQueryInterfaceD2, pQueryInterfaceD4, pQueryInterfaceD7; AddRefD_Type pAddRefD; -ReleaseD_Type pReleaseD1 = NULL; -ReleaseD_Type pReleaseD2 = NULL; -ReleaseD_Type pReleaseD4 = NULL; -ReleaseD_Type pReleaseD7 = NULL; +ReleaseD_Type pReleaseD1, pReleaseD2, pReleaseD4, pReleaseD7; Compact_Type pCompact; -CreateClipper_Type pCreateClipper=NULL; -CreatePalette_Type pCreatePalette1; -CreatePalette_Type pCreatePalette2; -CreatePalette_Type pCreatePalette4; -CreatePalette_Type pCreatePalette7; -CreateSurface1_Type pCreateSurface1; -CreateSurface1_Type pCreateSurface2; -CreateSurface1_Type pCreateSurface3; -CreateSurface2_Type pCreateSurface4; -CreateSurface2_Type pCreateSurface7; -DuplicateSurface_Type pDuplicateSurface; -EnumDisplayModes1_Type pEnumDisplayModes1; -EnumDisplayModes4_Type pEnumDisplayModes4; +CreateClipper_Type pCreateClipper1, pCreateClipper2, pCreateClipper4, pCreateClipper7; +CreatePalette_Type pCreatePalette1, pCreatePalette2, pCreatePalette4, pCreatePalette7; +CreateSurface1_Type pCreateSurface1, pCreateSurface2, pCreateSurface3, pCreateSurface4, pCreateSurface7; +EnumDisplayModes1_Type pEnumDisplayModes1, pEnumDisplayModes2; +EnumDisplayModes4_Type pEnumDisplayModes4, pEnumDisplayModes7; EnumSurfaces1_Type pEnumSurfaces1; EnumSurfaces4_Type pEnumSurfaces4; -FlipToGDISurface_Type pFlipToGDISurface; -GetCapsD_Type pGetCaps1D; -GetCapsD_Type pGetCaps2D; -GetCapsD_Type pGetCaps4D; -GetCapsD_Type pGetCaps7D; -GetDisplayMode_Type pGetDisplayMode1; -GetDisplayMode_Type pGetDisplayMode2; -GetDisplayMode4_Type pGetDisplayMode4; -GetDisplayMode4_Type pGetDisplayMode7; +FlipToGDISurface_Type pFlipToGDISurface1, pFlipToGDISurface2, pFlipToGDISurface4, pFlipToGDISurface7; +GetCapsD_Type pGetCaps1D, pGetCaps2D, pGetCaps4D, pGetCaps7D; +GetDisplayMode_Type pGetDisplayMode1, pGetDisplayMode2; +GetDisplayMode4_Type pGetDisplayMode4, pGetDisplayMode7; GetFourCCCodes_Type pGetFourCCCodes; -GetGDISurface_Type pGetGDISurface1; -GetGDISurface_Type pGetGDISurface2; -GetGDISurface_Type pGetGDISurface4; -GetGDISurface_Type pGetGDISurface7; +GetGDISurface_Type pGetGDISurface1, pGetGDISurface2, pGetGDISurface4, pGetGDISurface7; GetMonitorFrequency_Type pGetMonitorFrequency; GetScanLine_Type pGetScanLine; GetVerticalBlankStatus_Type pGetVerticalBlankStatus; -Initialize_Type pInitialize; +Initialize_Type pInitialize1, pInitialize2, pInitialize4, pInitialize7; RestoreDisplayMode_Type pRestoreDisplayMode; -SetCooperativeLevel_Type pSetCooperativeLevel1; -SetCooperativeLevel_Type pSetCooperativeLevel2; -SetCooperativeLevel_Type pSetCooperativeLevel4; -SetCooperativeLevel_Type pSetCooperativeLevel7; +SetCooperativeLevel_Type pSetCooperativeLevel1, pSetCooperativeLevel2, pSetCooperativeLevel4, pSetCooperativeLevel7; SetDisplayMode1_Type pSetDisplayMode1; -SetDisplayMode2_Type pSetDisplayMode2; -SetDisplayMode2_Type pSetDisplayMode4; -SetDisplayMode2_Type pSetDisplayMode7; -WaitForVerticalBlank_Type pWaitForVerticalBlank; +SetDisplayMode2_Type pSetDisplayMode2, pSetDisplayMode4, pSetDisplayMode7; +WaitForVerticalBlank_Type pWaitForVerticalBlank1, pWaitForVerticalBlank2, pWaitForVerticalBlank4, pWaitForVerticalBlank7; GetSurfaceFromDC_Type pGetSurfaceFromDC; -GetAvailableVidMem_Type pGetAvailableVidMem; -GetAvailableVidMem_Type pGetAvailableVidMem2; -GetAvailableVidMem_Type pGetAvailableVidMem4; +GetAvailableVidMem_Type pGetAvailableVidMem2, pGetAvailableVidMem4, pGetAvailableVidMem7; RestoreAllSurfaces_Type pRestoreAllSurfaces; -TestCooperativeLevel_Type pTestCooperativeLevel; +TestCooperativeLevel_Type pTestCooperativeLevel4, pTestCooperativeLevel7; GetDeviceIdentifier_Type pGetDeviceIdentifier; /* DirectDrawSurface hook pointers */ -QueryInterface_Type pQueryInterfaceS; +QueryInterface_Type pQueryInterfaceS1, pQueryInterfaceS2, pQueryInterfaceS3, pQueryInterfaceS4, pQueryInterfaceS7; AddRefS_Type pAddRefS; -ReleaseS_Type pReleaseS; -AddAttachedSurface_Type pAddAttachedSurface; +ReleaseS_Type pReleaseS1, pReleaseS2, pReleaseS3, pReleaseS4, pReleaseS7; +AddAttachedSurface_Type pAddAttachedSurface1, pAddAttachedSurface2, pAddAttachedSurface3, pAddAttachedSurface4, pAddAttachedSurface7; AddOverlayDirtyRect_Type pAddOverlayDirtyRect; -Blt_Type pBlt; -BltBatch_Type pBltBatch; -BltFast_Type pBltFast; -DeleteAttachedSurface_Type pDeleteAttachedSurface; +Blt_Type pBlt1, pBlt2, pBlt3, pBlt4, pBlt7; +//BltBatch_Type pBltBatch; +BltFast_Type pBltFast1, pBltFast2, pBltFast3, pBltFast4, pBltFast7; +DeleteAttachedSurface_Type pDeleteAttachedSurface1, pDeleteAttachedSurface2, pDeleteAttachedSurface3, pDeleteAttachedSurface4, pDeleteAttachedSurface7; EnumAttachedSurfaces_Type pEnumAttachedSurfaces; EnumOverlayZOrders_Type pEnumOverlayZOrders; -Flip_Type pFlip; -GetAttachedSurface_Type pGetAttachedSurface1; -GetAttachedSurface_Type pGetAttachedSurface3; -GetAttachedSurface_Type pGetAttachedSurface4; -GetAttachedSurface_Type pGetAttachedSurface7; +Flip_Type pFlip1, pFlip2, pFlip3, pFlip4, pFlip7; +GetAttachedSurface_Type pGetAttachedSurface1, pGetAttachedSurface2, pGetAttachedSurface3, pGetAttachedSurface4, pGetAttachedSurface7; GetBltStatus_Type pGetBltStatus; -GetCapsS_Type pGetCaps1S; -GetCapsS_Type pGetCaps2S; -GetCapsS_Type pGetCaps3S; -GetCaps2S_Type pGetCaps4S; -GetCaps2S_Type pGetCaps7S; +GetCapsS_Type pGetCaps1S, pGetCaps2S, pGetCaps3S, pGetCaps4S, pGetCaps7S; GetClipper_Type pGetClipper; -GetColorKey_Type pGetColorKey; -GetDC_Type pGetDC; +GetColorKey_Type pGetColorKey1, pGetColorKey2, pGetColorKey3, pGetColorKey4, pGetColorKey7; +GetDC_Type pGetDC1, pGetDC2, pGetDC3, pGetDC4, pGetDC7; GetFlipStatus_Type pGetFlipStatus; GetOverlayPosition_Type pGetOverlayPosition; -GetPalette_Type pGetPalette; -GetPixelFormat_Type pGetPixelFormat; -GetSurfaceDesc_Type pGetSurfaceDesc1; -GetSurfaceDesc2_Type pGetSurfaceDesc4; -GetSurfaceDesc2_Type pGetSurfaceDesc7; +GetPalette_Type pGetPalette1, pGetPalette2, pGetPalette3, pGetPalette4, pGetPalette7; +GetPixelFormat_Type pGetPixelFormat1, pGetPixelFormat2, pGetPixelFormat3, pGetPixelFormat4, pGetPixelFormat7; +GetSurfaceDesc_Type pGetSurfaceDesc1, pGetSurfaceDesc2, pGetSurfaceDesc3; +GetSurfaceDesc2_Type pGetSurfaceDesc4, pGetSurfaceDesc7; +Lock_Type pLock1, pLock2, pLock3, pLock4, pLock7; //Initialize IsLost_Type pIsLost; -Lock_Type pLock; -ReleaseDC_Type pReleaseDC; +ReleaseDC_Type pReleaseDC1, pReleaseDC2, pReleaseDC3, pReleaseDC4, pReleaseDC7; Restore_Type pRestore; SetClipper_Type pSetClipper; SetColorKey_Type pSetColorKey; SetOverlayPosition_Type pSetOverlayPosition; -SetPalette_Type pSetPalette; -Unlock1_Type pUnlock1; -Unlock4_Type pUnlock4; +SetPalette_Type pSetPalette1, pSetPalette2, pSetPalette3, pSetPalette4, pSetPalette7; +Unlock1_Type pUnlock1, pUnlock2, pUnlock3; +Unlock4_Type pUnlock4, pUnlock7; UpdateOverlay_Type pUpdateOverlay; UpdateOverlayDisplay_Type pUpdateOverlayDisplay; UpdateOverlayZOrder_Type pUpdateOverlayZOrder; -SetSurfaceDesc_Type pSetSurfaceDesc; +SetSurfaceDesc_Type pSetSurfaceDesc3, pSetSurfaceDesc4, pSetSurfaceDesc7; /* DirectDrawClipper hook pointers */ QueryInterface_Type pQueryInterfaceC; @@ -319,15 +369,15 @@ static void SetPixFmt(LPDDSURFACEDESC2); static void GetPixFmt(LPDDSURFACEDESC2); static HookEntryEx_Type ddHooks[]={ - {HOOK_HOT_CANDIDATE, 0, "DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate}, - {HOOK_HOT_CANDIDATE, 0, "DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx}, - {HOOK_HOT_CANDIDATE, 0, "DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate}, - {HOOK_HOT_CANDIDATE, 0, "DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx}, - {HOOK_HOT_CANDIDATE, 0, "DirectDrawCreateClipper", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateClipper, (FARPROC)extDirectDrawCreateClipper}, - {HOOK_HOT_CANDIDATE, 0, "AcquireDDThreadLock", (FARPROC)NULL, (FARPROC *)&pAcquireDDThreadLock, (FARPROC)NULL}, - {HOOK_HOT_CANDIDATE, 0, "ReleaseDDThreadLock", (FARPROC)NULL, (FARPROC *)&pReleaseDDThreadLock, (FARPROC)NULL}, - //{HOOK_IAT_CANDIDATE, 0, "DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate}, - //{HOOK_IAT_CANDIDATE, 0, "DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate}, + {HOOK_HOT_CANDIDATE, 0x08, "DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate}, + {HOOK_HOT_CANDIDATE, 0x0A, "DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx}, + {HOOK_HOT_CANDIDATE, 0x0B, "DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateA, (FARPROC)extDirectDrawEnumerateA}, + {HOOK_HOT_CANDIDATE, 0x0C, "DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExA, (FARPROC)extDirectDrawEnumerateExA}, + {HOOK_HOT_CANDIDATE, 0x09, "DirectDrawCreateClipper", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateClipper, (FARPROC)extDirectDrawCreateClipper}, + {HOOK_HOT_CANDIDATE, 0x01, "AcquireDDThreadLock", (FARPROC)NULL, (FARPROC *)&pAcquireDDThreadLock, (FARPROC)NULL}, + {HOOK_HOT_CANDIDATE, 0x15, "ReleaseDDThreadLock", (FARPROC)NULL, (FARPROC *)&pReleaseDDThreadLock, (FARPROC)NULL}, + {HOOK_IAT_CANDIDATE, 0x0E, "DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate}, + {HOOK_IAT_CANDIDATE, 0x0D, "DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -339,7 +389,7 @@ FARPROC Remap_ddraw_ProcAddress(LPCSTR proc, HMODULE hModule) return NULL; } -extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); +extern HRESULT WINAPI sBlt(int, Blt_Type pBlt, char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); /* ------------------------------------------------------------------------------ */ // auxiliary (static) functions @@ -355,11 +405,11 @@ static HRESULT myGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpdds) { HRESULT res; switch(lpddHookedVersion(lpdd)){ + default: case 1: res=(*pGetDisplayMode1)(lpdd, lpdds); break; case 2: res=(*pGetDisplayMode2)(lpdd, lpdds); break; case 4: res=(*pGetDisplayMode4)(lpdd, (LPDDSURFACEDESC2)lpdds); break; case 7: res=(*pGetDisplayMode7)(lpdd, (LPDDSURFACEDESC2)lpdds); break; - default: res=(*pGetDisplayMode1)(lpdd, lpdds); break; } return res; } @@ -437,43 +487,6 @@ static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) OutTrace("PixelFormat: lpdds=%x %s\n", DumpPixelFormat(lpdds)); } -void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int line) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - int dwSize = (dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); - memset(&ddsd, 0, dwSize); - ddsd.dwSize = dwSize; - switch (dxversion){ - case 0: - case 1: - case 2: - case 3: - if (pGetSurfaceDesc1) - res=(*pGetSurfaceDesc1)(lpdds, (LPDDSURFACEDESC)&ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - break; - case 4: - case 5: - case 6: - if (pGetSurfaceDesc4) - res=(*pGetSurfaceDesc4)((LPDIRECTDRAWSURFACE2)lpdds, &ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - break; - case 7: - if (pGetSurfaceDesc7) - res=(*pGetSurfaceDesc7)((LPDIRECTDRAWSURFACE2)lpdds, &ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - break; - } - if(res)return; - OutTraceDW("Surface %s: ddsd=%x dxversion=%d %s\n", - label, lpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line)); -} - /* ------------------------------------------------------------------------------ */ // auxiliary (static) functions for palette handling /* ------------------------------------------------------------------------------ */ @@ -546,7 +559,7 @@ void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) isPaletteUpdated = TRUE; } -void InitDDScreenParameters(LPDIRECTDRAW lpdd) +void InitDDScreenParameters(int dxversion, LPDIRECTDRAW lpdd) { HRESULT res; DDSURFACEDESC2 ddsd; @@ -560,15 +573,23 @@ void InitDDScreenParameters(LPDIRECTDRAW lpdd) OutTraceDW("InitDDScreenParameters: Actual %s\n", DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); dxw.ActualPixelFormat=ddsd.ddpfPixelFormat; if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; - SetBltTransformations(); + SetBltTransformations(dxversion); return; } -void InitDSScreenParameters(LPDIRECTDRAWSURFACE lpdds) +void InitDSScreenParameters(int dxversion, LPDIRECTDRAWSURFACE lpdds) { HRESULT res; DDPIXELFORMAT p; DDSURFACEDESC2 ddsd; + GetPixelFormat_Type pGetPixelFormat; + switch(dxversion){ + case 1: pGetPixelFormat=pGetPixelFormat1; break; + case 2: pGetPixelFormat=pGetPixelFormat2; break; + case 3: pGetPixelFormat=pGetPixelFormat3; break; + case 4: pGetPixelFormat=pGetPixelFormat4; break; + case 7: pGetPixelFormat=pGetPixelFormat7; break; + } p.dwSize=sizeof(DDPIXELFORMAT); if(res=(*pGetPixelFormat)(lpdds, &p)){ OutTraceE("GetPixelFormat: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -576,13 +597,13 @@ void InitDSScreenParameters(LPDIRECTDRAWSURFACE lpdds) } ddsd.ddpfPixelFormat = p; - OutTraceDW("InitDSScreenParameters: Actual %s\n", DumpPixelFormat(&ddsd)); + OutTraceDW("InitDSScreenParameters: version=%d Actual %s\n", dxversion, DumpPixelFormat(&ddsd)); dxw.ActualPixelFormat = p; - SetBltTransformations(); + SetBltTransformations(dxversion); return; } -void InitScreenParameters() +void InitScreenParameters(int dxversion) { DEVMODE CurrDevMode; static int DoOnce = FALSE; @@ -607,8 +628,8 @@ void InitScreenParameters() // initialize to default null values, but dwRGBBitCount dxw.ActualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; dxw.VirtualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; // until set differently - OutTraceDW("InitScreenParameters: RGBBitCount=%d\n", CurrDevMode.dmBitsPerPel); - SetBltTransformations(); + OutTraceDW("InitScreenParameters: dxversion=%d RGBBitCount=%d\n", dxversion, CurrDevMode.dmBitsPerPel); + SetBltTransformations(dxversion); return; } @@ -696,8 +717,10 @@ static void BypassGOGDDrawRedirector() GetSystemDirectory(sSysLibraryPath, MAX_PATH); strcat(sSysLibraryPath, "\\ddraw.dll"); hinst = LoadLibrary(sSysLibraryPath); - pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); + pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + pDirectDrawEnumerateExA = (DirectDrawEnumerateExA_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); + pDirectDrawEnumerateW = (DirectDrawEnumerateW_Type)GetProcAddress(hinst, "DirectDrawEnumerateW"); + pDirectDrawEnumerateExW = (DirectDrawEnumerateExW_Type)GetProcAddress(hinst, "DirectDrawEnumerateExW"); pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); pDirectDrawCreateEx = (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); } @@ -735,13 +758,14 @@ int HookDirectDraw(HMODULE module, int version) case 1: case 2: case 3: + case 4: case 5: case 6: HookLibraryEx(module, ddHooks, "ddraw.dll"); if(!pDirectDrawCreate){ // required for IAT patching hinst = LoadLibrary("ddraw.dll"); pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); } if(pDirectDrawCreate){ LPDIRECTDRAW lpdd; @@ -759,8 +783,8 @@ int HookDirectDraw(HMODULE module, int version) HookLibraryEx(module, ddHooks, "ddraw.dll"); if(!pDirectDrawCreate){ // required for IAT patching in "Crimson skies" hinst = LoadLibrary("ddraw.dll"); - pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); + pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + pDirectDrawEnumerateExA = (DirectDrawEnumerateExA_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); pDirectDrawCreateEx = (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); } @@ -778,158 +802,143 @@ int HookDirectDraw(HMODULE module, int version) return 0; } -Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE lpdds) +CreatePalette_Type pCreatePaletteMethod(int dxversion) { - // to do: return extUnlock for unhooked surfaces - - char sMsg[81]; - void * extUnlock = NULL; - if(lpdds){ - __try{ // v2.02.31: catch some possible exception (i.e. Abomination in EMULATION mode) - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - OutTraceE("Exception at %d\n",__LINE__); - extUnlock=NULL; - }; - if(extUnlock==(void *)extUnlock1) return (Unlock4_Type)pUnlock1; - if(extUnlock==(void *)extUnlock4) return (Unlock4_Type)pUnlock4; - if(extUnlock==(void *)extUnlockDir1) return (Unlock4_Type)pUnlock1; - if(extUnlock==(void *)extUnlockDir4) return (Unlock4_Type)pUnlock4; + CreatePalette_Type pCreatePalette; + switch(dxversion){ + case 1: pCreatePalette = pCreatePalette1; break; + case 2: pCreatePalette = pCreatePalette2; break; + case 4: pCreatePalette = pCreatePalette4; break; + case 7: pCreatePalette = pCreatePalette7; break; } - sprintf_s(sMsg, 80, "pUnlockMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pUnlockMethod", MB_OK | MB_ICONEXCLAMATION); - if (pUnlock4) return pUnlock4; - return (Unlock4_Type)pUnlock1; + return pCreatePalette; } -#if 0 -Lock_Type pLockMethod(LPDIRECTDRAWSURFACE lpdds) +SetPalette_Type pSetPaletteMethod(int dxversion) { - char sMsg[81]; - void * extLock = NULL; - if(lpdds){ - __try{ // v2.02.31: catch some possible exception (i.e. Abomination in EMULATION mode) - extLock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - OutTraceE("Exception at %d\n",__LINE__); - extLock=NULL; - }; - if(extUnlock==(void *)extUnlock1) return pLock1; - if(extUnlock==(void *)extUnlock4) return pLock4; - if(extUnlock==(void *)extUnlockDir1) return pLock1; - if(extUnlock==(void *)extUnlockDir4) return pLock4; + SetPalette_Type pSetPalette; + switch(dxversion){ + case 1: pSetPalette=pSetPalette1; break; + case 2: pSetPalette=pSetPalette2; break; + case 4: pSetPalette=pSetPalette4; break; + case 7: pSetPalette=pSetPalette7; break; } - sprintf_s(sMsg, 80, "pLockMethod: pUnlock(%x) can't match %x\n", lpdds, extLock); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pLockMethod", MB_OK | MB_ICONEXCLAMATION); - if (pLock4) return pLock4; - return pLock1; + return pSetPalette; } -#endif -CreateSurface2_Type pCreateSurfaceMethod(LPDIRECTDRAWSURFACE lpdds) +ReleaseS_Type pReleaseSMethod() { - char sMsg[81]; - void * extUnlock = NULL; - if(lpdds){ - __try{ // v2.02.31: catch some possible exception (i.e. Abomination in EMULATION mode) - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); } - __except (EXCEPTION_EXECUTE_HANDLER){ - OutTraceE("Exception at %d\n",__LINE__); - extUnlock = NULL; - }; - if(extUnlock==(void *)extUnlock1) return (CreateSurface2_Type)pCreateSurface1; - if(extUnlock==(void *)extUnlock4) return pCreateSurface7 ? (CreateSurface2_Type)pCreateSurface7 : (CreateSurface2_Type)pCreateSurface4; - if(extUnlock==(void *)extUnlockDir1) return (CreateSurface2_Type)pCreateSurface1; - if(extUnlock==(void *)extUnlockDir4) return pCreateSurface7 ? (CreateSurface2_Type)pCreateSurface7 : (CreateSurface2_Type)pCreateSurface4; + ReleaseS_Type pReleaseS; + switch(iBakBufferVersion){ + case 1: pReleaseS=pReleaseS1; break; + case 2: pReleaseS=pReleaseS2; break; + case 3: pReleaseS=pReleaseS3; break; + case 4: pReleaseS=pReleaseS4; break; + case 7: pReleaseS=pReleaseS7; break; } - sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pCreateSurfaceMethod", MB_OK | MB_ICONEXCLAMATION); - if (pCreateSurface7) return pCreateSurface7; - if (pCreateSurface4) return pCreateSurface4; - return (CreateSurface2_Type)pCreateSurface1; + return pReleaseS; } -GetSurfaceDesc2_Type pGetSurfaceDescMethod(LPDIRECTDRAWSURFACE lpdds) +ReleaseDC_Type pReleaseDCMethod() { - char sMsg[81]; - void * extUnlock; - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - if(extUnlock==(void *)extUnlock1) return (GetSurfaceDesc2_Type)pGetSurfaceDesc1; - if(extUnlock==(void *)extUnlock4) return pGetSurfaceDesc7 ? pGetSurfaceDesc7 : pGetSurfaceDesc4; - if(extUnlock==(void *)extUnlockDir1) return (GetSurfaceDesc2_Type)pGetSurfaceDesc1; - if(extUnlock==(void *)extUnlockDir4) return pGetSurfaceDesc7 ? pGetSurfaceDesc7 : pGetSurfaceDesc4; - sprintf_s(sMsg, 80, "pGetSurfaceDescMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pGetSurfaceDescMethod", MB_OK | MB_ICONEXCLAMATION); - if (pGetSurfaceDesc4) return pGetSurfaceDesc4; - return (GetSurfaceDesc2_Type)pGetSurfaceDesc1; -} - -int SurfaceDescrSize(LPDIRECTDRAWSURFACE lpdds) -{ - char sMsg[81]; - void * extUnlock; - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - if(extUnlock==(void *)extUnlock1) return sizeof(DDSURFACEDESC); - if(extUnlock==(void *)extUnlock4) return sizeof(DDSURFACEDESC2); - if(extUnlock==(void *)extUnlockDir1) return sizeof(DDSURFACEDESC); - if(extUnlock==(void *)extUnlockDir4) return sizeof(DDSURFACEDESC2); - sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "SurfaceDescrSize", MB_OK | MB_ICONEXCLAMATION); - return sizeof(DDSURFACEDESC); -} - -int SurfaceDescrSizeD(LPDIRECTDRAW lpdd) -{ - char sMsg[81]; - void *extCreateSurface = NULL; - - if(lpdd){ - __try{ - extCreateSurface=(void *)*(DWORD *)(*(DWORD *)lpdd + 24); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - return sizeof(DDSURFACEDESC); - }; - if(extCreateSurface==(void *)extCreateSurface7) return sizeof(DDSURFACEDESC2); - if(extCreateSurface==(void *)extCreateSurface4) return sizeof(DDSURFACEDESC2); - if(extCreateSurface==(void *)extCreateSurface2) return sizeof(DDSURFACEDESC); - if(extCreateSurface==(void *)extCreateSurface1) return sizeof(DDSURFACEDESC); + ReleaseDC_Type pReleaseDC; + switch(iBakBufferVersion){ + case 1: pReleaseDC=pReleaseDC1; break; + case 2: pReleaseDC=pReleaseDC2; break; + case 3: pReleaseDC=pReleaseDC3; break; + case 4: pReleaseDC=pReleaseDC4; break; + case 7: pReleaseDC=pReleaseDC7; break; } - sprintf_s(sMsg, 80, "SurfaceDescrSizeD(%x) can't match %x\n", lpdd, extCreateSurface); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "SurfaceDescrSizeD", MB_OK | MB_ICONEXCLAMATION); - return sizeof(DDSURFACEDESC); + return pReleaseDC; } -int lpddsHookedVersion(LPDIRECTDRAWSURFACE lpdds) +Blt_Type pBltMethod() { - char sMsg[81]; - void * extGetCaps = NULL; - - if(lpdds){ - __try{ - extGetCaps=(void *)*(DWORD *)(*(DWORD *)lpdds + 56); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - extGetCaps=NULL; - }; - if(extGetCaps==(void *)extGetCaps1S) return 1; - if(extGetCaps==(void *)extGetCaps2S) return 2; - if(extGetCaps==(void *)extGetCaps3S) return 3; - if(extGetCaps==(void *)extGetCaps4S) return 4; - if(extGetCaps==(void *)extGetCaps7S) return 7; + Blt_Type pBlt; + switch(iBakBufferVersion){ + case 1: pBlt=pBlt1; break; + case 2: pBlt=pBlt2; break; + case 3: pBlt=pBlt3; break; + case 4: pBlt=pBlt4; break; + case 7: pBlt=pBlt7; break; } - sprintf_s(sMsg, 80, "lpddsHookedVersion(%x) can't match %x\n", lpdds, extGetCaps); - OutTraceDW(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "lpddsHookedVersion", MB_OK | MB_ICONEXCLAMATION); - return 0; + return pBlt; +} + +GetDC_Type pGetDCMethod() +{ + GetDC_Type pGetDC; + switch(iBakBufferVersion){ + case 1: pGetDC=pGetDC1; break; + case 2: pGetDC=pGetDC2; break; + case 3: pGetDC=pGetDC3; break; + case 4: pGetDC=pGetDC4; break; + case 7: pGetDC=pGetDC7; break; + } + return pGetDC; +} + +Unlock4_Type pUnlockMethod() +{ + Unlock4_Type pUnlock; + switch(iBakBufferVersion){ + case 1: pUnlock=(Unlock4_Type)pUnlock1; break; + case 2: pUnlock=(Unlock4_Type)pUnlock2; break; + case 3: pUnlock=(Unlock4_Type)pUnlock3; break; + case 4: pUnlock=(Unlock4_Type)pUnlock4; break; + case 7: pUnlock=(Unlock4_Type)pUnlock7; break; + } + return pUnlock; +} + +Lock_Type pLockMethod() +{ + Lock_Type pLock; + switch(iBakBufferVersion){ + case 1: pLock=pLock1; break; + case 2: pLock=pLock2; break; + case 3: pLock=pLock3; break; + case 4: pLock=pLock4; break; + case 7: pLock=pLock7; break; + } + return pLock; +} + +CreateSurface2_Type pCreateSurfaceMethod() +{ + CreateSurface2_Type pCreateSurface; + switch(iBakBufferVersion){ + case 1: pCreateSurface=(CreateSurface2_Type)pCreateSurface1; break; + case 2: pCreateSurface=(CreateSurface2_Type)pCreateSurface2; break; + case 3: pCreateSurface=(CreateSurface2_Type)pCreateSurface3; break; + case 4: pCreateSurface=(CreateSurface2_Type)pCreateSurface4; break; + case 7: pCreateSurface=(CreateSurface2_Type)pCreateSurface7; break; + } + return pCreateSurface; +} + +GetSurfaceDesc2_Type pGetSurfaceDescMethod() +{ + GetSurfaceDesc2_Type pGetSurfaceDesc; + pGetSurfaceDesc = NULL; + switch(iBakBufferVersion){ + case 1: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc1; break; + case 2: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc2; break; + case 3: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc3; break; + case 4: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc4; break; + case 7: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc7; break; + } + return pGetSurfaceDesc; +} + +int lpddsHookedVersion() +{ + return iBakBufferVersion; +} + +int GetSurfaceDescSize() +{ + return (iBakBufferVersion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); } int lpddHookedVersion(LPDIRECTDRAW lpdd) @@ -955,13 +964,35 @@ int lpddHookedVersion(LPDIRECTDRAW lpdd) return 0; } -void RegisterPixelFormat(LPDIRECTDRAWSURFACE lpdds) +void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int line) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + GetSurfaceDesc2_Type pGetSurfaceDesc = NULL; + int dwSize = (dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); + memset(&ddsd, 0, dwSize); + ddsd.dwSize = dwSize; + pGetSurfaceDesc = pGetSurfaceDescMethod(); + if(pGetSurfaceDesc==NULL) return; + res=(*pGetSurfaceDescMethod())((LPDIRECTDRAWSURFACE2)lpdds, &ddsd); + if(res)return; + OutTraceDW("Surface %s: ddsd=%x dxversion=%d %s\n", + label, lpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line)); +} + +void RegisterPixelFormat(int dxversion, LPDIRECTDRAWSURFACE lpdds) { DDSURFACEDESC2 ddsdpix; memset((void *)&ddsdpix, 0, sizeof(DDSURFACEDESC2)); - ddsdpix.dwSize = SurfaceDescrSize(lpdds); + ddsdpix.dwSize = (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); ddsdpix.dwFlags = DDSD_PIXELFORMAT; - (*pGetSurfaceDescMethod(lpdds))((LPDIRECTDRAWSURFACE2)lpdds, &ddsdpix); + switch(dxversion){ + case 1: if(pGetSurfaceDesc1)(*pGetSurfaceDesc1)((LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)&ddsdpix); break; + case 2: if(pGetSurfaceDesc2)(*pGetSurfaceDesc2)((LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)&ddsdpix); break; + case 3: if(pGetSurfaceDesc3)(*pGetSurfaceDesc3)((LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)&ddsdpix); break; + case 4: if(pGetSurfaceDesc4)(*pGetSurfaceDesc4)((LPDIRECTDRAWSURFACE2)lpdds, &ddsdpix); break; + case 7: if(pGetSurfaceDesc7)(*pGetSurfaceDesc7)((LPDIRECTDRAWSURFACE2)lpdds, &ddsdpix); break; + } GetHookInfo()->pfd=ddsdpix.ddpfPixelFormat; // v2.02.88 OutTraceB("RegisterPixelFormat: lpdds=%x %s\n", lpdds, DumpPixelFormat(&ddsdpix)); } @@ -1013,18 +1044,17 @@ static void GetPixFmt(LPDDSURFACEDESC2 lpdd) // hook query functions that determines the object versioning .... /* ------------------------------------------------------------------ */ -int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE lpdds) +int Set_dwSize_From_Surface() { - int dxversion; - if (lpdds==NULL || - lpdds==lpDDSEmu_Prim || - lpdds==lpDDSEmu_Back - ) - dxversion=lpddHookedVersion(lpPrimaryDD); // v2.01.87-v2.02.31 fix - else - dxversion=lpddsHookedVersion(lpdds); - - return (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); + int size; + switch(iBakBufferVersion){ + case 1: size=sizeof(DDSURFACEDESC); break; + case 2: size=sizeof(DDSURFACEDESC); break; + case 3: size=sizeof(DDSURFACEDESC); break; + case 4: size=sizeof(DDSURFACEDESC2); break; + case 7: size=sizeof(DDSURFACEDESC2); break; + } + return size; } int Set_dwSize_From_DDraw(LPDIRECTDRAW lpdd) @@ -1037,100 +1067,82 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", *lplpdd, dxversion, GetCurrentThreadId()); - // IDIrectDraw::CreateClipper - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper, (void **)&pCreateClipper, "CreateClipper(D)"); - // IDIrectDraw::QueryInterface - // IDIrectDraw::CreateSurface - // IDIrectDraw::Release switch(dxversion) { - default: 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 + 20), extCreatePalette1, (void **)&pCreatePalette1, "CreatePalette(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(D1)"); - break; - case 2: - SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD2, (void **)&pQueryInterfaceD2, "QueryInterface(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD2, (void **)&pReleaseD2, "Release(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette2, (void **)&pCreatePalette2, "CreatePalette(D2)"); - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(D2)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD4, (void **)&pQueryInterfaceD4, "QueryInterface(D4)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD4, (void **)&pReleaseD4, "Release(D4)"); - SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette4, (void **)&pCreatePalette4, "CreatePalette(D4)"); - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(D4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD7, (void **)&pQueryInterfaceD7, "QueryInterface(D7)"); - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD7, (void **)&pReleaseD7, "Release(D7)"); - SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette7, (void **)&pCreatePalette7, "CreatePalette(D7)"); - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(D7)"); - break; - } - // IDIrectDraw::DuplicateSurface - SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface, (void **)&pDuplicateSurface, "DuplicateSurface(D)"); - // IDIrectDraw::EnumDisplayModes - switch(dxversion) { - case 1: - case 2: SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes1, (void **)&pEnumDisplayModes1, "EnumDisplayModes(D1)"); - break; - case 4: - case 7: - SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes4, (void **)&pEnumDisplayModes4, "EnumDisplayModes(D4)"); - break; - } - // IDIrectDraw::FlipToGDISurface - SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface, (void **)&pFlipToGDISurface, "FlipToGDISurface(D)"); - // IDIrectDraw::GetCaps - // IDIrectDraw::SetCooperativeLevel - // IDIrectDraw::GetDisplayMode - // IDIrectDraw::SetDisplayMode - switch(dxversion) { - case 1: + SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface1, (void **)&pFlipToGDISurface1, "FlipToGDISurface(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode1, (void **)&pGetDisplayMode1, "GetDisplayMode(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface1, (void **)&pGetGDISurface1, "GetGDISurface(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize1, (void **)&pInitialize1, "Initialize(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel1, (void **)&pSetCooperativeLevel1, "SetCooperativeLevel(D1)"); SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank1, (void **)&pWaitForVerticalBlank1, "WaitForVerticalBlank(D1)"); 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 + 20), extCreatePalette2, (void **)&pCreatePalette2, "CreatePalette(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes2, (void **)&pEnumDisplayModes2, "EnumDisplayModes(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface2, (void **)&pFlipToGDISurface2, "FlipToGDISurface(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface2, (void **)&pGetGDISurface2, "GetGDISurface(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize2, (void **)&pInitialize2, "Initialize(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel2, (void **)&pSetCooperativeLevel2, "SetCooperativeLevel(D2)"); SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank2, (void **)&pWaitForVerticalBlank2, "WaitForVerticalBlank(D2)"); + // added in v2 interface + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem2, (void **)&pGetAvailableVidMem2, "GetAvailableVidMem(D2)"); 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 + 20), extCreatePalette4, (void **)&pCreatePalette4, "CreatePalette(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(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)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode4, (void **)&pGetDisplayMode4, "GetDisplayMode(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface4, (void **)&pGetGDISurface4, "GetGDISurface(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize4, (void **)&pInitialize4, "Initialize(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel4, (void **)&pSetCooperativeLevel4, "SetCooperativeLevel(D4)"); SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode4, (void **)&pSetDisplayMode4, "SetDisplayMode(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank4, (void **)&pWaitForVerticalBlank4, "WaitForVerticalBlank(D4)"); + // added in v2 interface + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem4, (void **)&pGetAvailableVidMem4, "GetAvailableVidMem(D4)"); + // added in v4 interface + SetHook((void *)(**(DWORD **)lplpdd + 104), extTestCooperativeLevel4, (void **)&pTestCooperativeLevel4, "TestCooperativeLevel(D4)"); 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 + 20), extCreatePalette7, (void **)&pCreatePalette7, "CreatePalette(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(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)"); SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode7, (void **)&pGetDisplayMode7, "GetDisplayMode(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface7, (void **)&pGetGDISurface7, "GetGDISurface(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize7, (void **)&pInitialize7, "Initialize(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel7, (void **)&pSetCooperativeLevel7, "SetCooperativeLevel(D7)"); SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode7, (void **)&pSetDisplayMode7, "SetDisplayMode(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank7, (void **)&pWaitForVerticalBlank7, "WaitForVerticalBlank(D7)"); + // added in v2 interface + SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem7, (void **)&pGetAvailableVidMem7, "GetAvailableVidMem(D7)"); + // added in v4 interface + SetHook((void *)(**(DWORD **)lplpdd + 104), extTestCooperativeLevel7, (void **)&pTestCooperativeLevel7, "TestCooperativeLevel(D7)"); break; } - // IDIrectDraw::Initialize - SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize, (void **)&pInitialize, "Initialize(D)"); - // IDIrectDraw::WaitForVerticalBlank - SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank, (void **)&pWaitForVerticalBlank, "WaitForVerticalBlank(D)"); - // IDIrectDraw::GetAvailableVidMem - if (dxversion == 2) - SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem2, (void **)&pGetAvailableVidMem2, "GetAvailableVidMem(D2)"); - if (dxversion >= 4){ - // IDIrectDraw::GetAvailableVidMem - SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMem4, (void **)&pGetAvailableVidMem4, "GetAvailableVidMem(D4)"); - // IDIrectDraw::TestCooperativeLevel - SetHook((void *)(**(DWORD **)lplpdd + 104), extTestCooperativeLevel, (void **)&pTestCooperativeLevel, "TestCooperativeLevel(D)"); - } } static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) @@ -1156,195 +1168,145 @@ static void HookDDPalette(LPDIRECTDRAWPALETTE FAR* lplpDDPalette) SetHook((void *)(**(DWORD **)lplpDDPalette + 24), extSetEntries, (void **)&pSetEntries, "SetEntries(P)"); } -static void HookDDSurfacePrim(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) +static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPrim) { - OutTraceDW("Hooking surface as primary dds=%x dxversion=%d thread_id=%x\n", - *lplpdds, dxversion, GetCurrentThreadId()); + BOOL bEmu = (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)); + if(iBakBufferVersion==0) iBakBufferVersion=dxversion; // v2.03.60 + + OutTraceDW("Hooking surface dds=%x dxversion=%d prim=%x thread_id=%x\n", + *lplpdds, dxversion, isPrim, GetCurrentThreadId()); - // IDirectDrawSurface::Query - SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS, (void **)&pQueryInterfaceS, "QueryInterface(S)"); - // IDirectDrawSurface::Release - SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS, (void **)&pReleaseS, "Release(S)"); - // IDirectDrawSurface::AddAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface, (void **)&pAddAttachedSurface, "AddAttachedSurface(S)"); - // IDirectDrawSurface::Blt - SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt, (void **)&pBlt, "Blt(S)"); - // IDirectDrawSurface::BltFast - SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); - // IDirectDrawSurface::DeleteAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)"); // IDirectDrawSurface::EnumAttachedSurfaces SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)"); - // IDirectDrawSurface::Flip - SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip, (void **)&pFlip, "Flip(S)"); - // IDirectDrawSurface::GetAttachedSurface switch(dxversion) { case 1: - case 2: + SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS1, (void **)&pQueryInterfaceS1, "QueryInterface(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS1, (void **)&pReleaseS1, "Release(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface1, (void **)&pAddAttachedSurface1, "AddAttachedSurface(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast1, (void **)&pBltFast1, "BltFast(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt1, (void **)&pBlt1, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface1, (void **)&pDeleteAttachedSurface1, "DeleteAttachedSurface(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip1, (void **)&pFlip1, "Flip(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); - break; - } - // IDirectDrawSurface::GetCaps - switch(dxversion) { - case 1: SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps1S, (void **)&pGetCaps1S, "GetCaps(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey1, (void **)&pGetColorKey1, "GetColorKey(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC1, (void **)&pGetDC1, "GetDC(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette1, (void **)&pGetPalette1, "GetPalette(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat1, (void **)&pGetPixelFormat1, "GetPixelFormat(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc1, (void **)&pGetSurfaceDesc1, "GetSurfaceDesc(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 100), bEmu ? extLock1 : extLockDir1, (void **)&pLock1, "Lock(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 128), bEmu ? extUnlock1 : extUnlockDir1, (void **)&pUnlock1, "Unlock(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC1, (void **)&pReleaseDC1, "ReleaseDC(S1)"); break; case 2: + SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS2, (void **)&pQueryInterfaceS2, "QueryInterface(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS2, (void **)&pReleaseS2, "Release(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface2, (void **)&pAddAttachedSurface2, "AddAttachedSurface(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast2, (void **)&pBltFast2, "BltFast(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt2, (void **)&pBlt2, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface2, (void **)&pDeleteAttachedSurface2, "DeleteAttachedSurface(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip2, (void **)&pFlip2, "Flip(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface2, (void **)&pGetAttachedSurface2, "GetAttachedSurface(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps2S, (void **)&pGetCaps2S, "GetCaps(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey2, (void **)&pGetColorKey2, "GetColorKey(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC2, (void **)&pGetDC2, "GetDC(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette2, (void **)&pGetPalette2, "GetPalette(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat2, (void **)&pGetPixelFormat2, "GetPixelFormat(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc2, (void **)&pGetSurfaceDesc2, "GetSurfaceDesc(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 100), bEmu ? extLock2 : extLockDir2, (void **)&pLock2, "Lock(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 128), bEmu ? extUnlock2 : extUnlockDir2, (void **)&pUnlock2, "Unlock(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC2, (void **)&pReleaseDC2, "ReleaseDC(S2)"); break; case 3: + SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS3, (void **)&pQueryInterfaceS3, "QueryInterface(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS3, (void **)&pReleaseS3, "Release(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface3, (void **)&pAddAttachedSurface3, "AddAttachedSurface(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast3, (void **)&pBltFast3, "BltFast(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt3, (void **)&pBlt3, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface3, (void **)&pDeleteAttachedSurface3, "DeleteAttachedSurface(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip3, (void **)&pFlip3, "Flip(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps3S, (void **)&pGetCaps3S, "GetCaps(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey3, (void **)&pGetColorKey3, "GetColorKey(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC3, (void **)&pGetDC3, "GetDC(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette3, (void **)&pGetPalette3, "GetPalette(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat3, (void **)&pGetPixelFormat3, "GetPixelFormat(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc3, (void **)&pGetSurfaceDesc3, "GetSurfaceDesc(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 100), bEmu ? extLock3 : extLockDir3, (void **)&pLock3, "Lock(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 128), bEmu ? extUnlock3 : extUnlockDir3, (void **)&pUnlock3, "Unlock(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC3, (void **)&pReleaseDC3, "ReleaseDC(S3)"); + // added in interface version 3 + SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc3, (void **)&pSetSurfaceDesc3, "SetSurfaceDesc(S3)"); break; case 4: + SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS4, (void **)&pQueryInterfaceS4, "QueryInterface(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS4, (void **)&pReleaseS4, "Release(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface4, (void **)&pAddAttachedSurface4, "AddAttachedSurface(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast4, (void **)&pBltFast4, "BltFast(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt4, (void **)&pBlt4, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface4, (void **)&pDeleteAttachedSurface4, "DeleteAttachedSurface(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip4, (void **)&pFlip4, "Flip(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps4S, (void **)&pGetCaps4S, "GetCaps(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey4, (void **)&pGetColorKey4, "GetColorKey(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC4, (void **)&pGetDC4, "GetDC(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette4, (void **)&pGetPalette4, "GetPalette(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat4, (void **)&pGetPixelFormat4, "GetPixelFormat(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc4, (void **)&pGetSurfaceDesc4, "GetSurfaceDesc(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 100), bEmu ? extLock4 : extLockDir4, (void **)&pLock4, "Lock(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 128), bEmu ? extUnlock4 : extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC4, (void **)&pReleaseDC4, "ReleaseDC(S4)"); + // added in interface version 3 + SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc4, (void **)&pSetSurfaceDesc4, "SetSurfaceDesc(S4)"); break; case 7: + SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS7, (void **)&pQueryInterfaceS7, "QueryInterface(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS7, (void **)&pReleaseS7, "Release(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface7, (void **)&pAddAttachedSurface7, "AddAttachedSurface(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast7, (void **)&pBltFast7, "BltFast(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt7, (void **)&pBlt7, "Blt(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface7, (void **)&pDeleteAttachedSurface7, "DeleteAttachedSurface(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip7, (void **)&pFlip7, "Flip(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps7S, (void **)&pGetCaps7S, "GetCaps(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey7, (void **)&pGetColorKey7, "GetColorKey(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC7, (void **)&pGetDC7, "GetDC(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette7, (void **)&pGetPalette7, "GetPalette(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat7, (void **)&pGetPixelFormat7, "GetPixelFormat(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc7, (void **)&pGetSurfaceDesc7, "GetSurfaceDesc(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 100), bEmu ? extLock7 : extLockDir7, (void **)&pLock7, "Lock(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 128), bEmu ? extUnlock7 : extUnlockDir7, (void **)&pUnlock7, "Unlock(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC7, (void **)&pReleaseDC7, "ReleaseDC(S7)"); + // added in interface version 3 + SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc7, (void **)&pSetSurfaceDesc7, "SetSurfaceDesc(S7)"); break; } - // IDirectDrawSurface::GetColorKey - SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey, (void **)&pGetColorKey, "GetColorKey(S)"); - // IDirectDrawSurface::GetPalette - SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette, (void **)&pGetPalette, "GetPalette(S)"); - // IDirectDrawSurface::GetPixelFormat - SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat, (void **)&pGetPixelFormat, "GetPixelFormat(S)"); - // IDirectDrawSurface::GetSurfaceDesc - if (dxversion < 4) { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc1, (void **)&pGetSurfaceDesc1, "GetSurfaceDesc(S1)"); - } - if((dxversion >= 4) && (dxversion < 7)) { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc2, (void **)&pGetSurfaceDesc4, "GetSurfaceDesc(S4)"); - } - if(dxversion == 7) { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc7, (void **)&pGetSurfaceDesc7, "GetSurfaceDesc(S7)"); - } - // IDirectDrawSurface::SetClipper + + if (!isPrim) return; + SetHook((void *)(**(DWORD **)lplpdds + 112), extSetClipper, (void **)&pSetClipper, "SetClipper(S)"); // IDirectDrawSurface::SetColorKey SetHook((void *)(**(DWORD **)lplpdds + 116), extSetColorKey, (void **)&pSetColorKey, "SetColorKey(S)"); - // IDirectDrawSurface::SetPalette - SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette, (void **)&pSetPalette, "SetPalette(S)"); - // IDirectDrawSurface::GetDC - SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC, (void **)&pGetDC, "GetDC(S)"); - // IDirectDrawSurface::ReleaseDC - SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC, (void **)&pReleaseDC, "ReleaseDC(S)"); - if (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLock, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock4, (void **)&pUnlock4, "Unlock(S4)"); - } - else { - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLockDir, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); - } -} - -static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) -{ - OutTraceDW("Hooking surface as generic dds=%x dxversion=%d thread_id=%x\n", - *lplpdds, dxversion, GetCurrentThreadId()); - - // IDirectDrawSurface::QueryInterface - SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS, (void **)&pQueryInterfaceS, "QueryInterface(S)"); - // IDirectDrawSurface::Release - SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS, (void **)&pReleaseS, "Release(S)"); - // IDirectDrawSurface::AddAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface, (void **)&pAddAttachedSurface, "AddAttachedSurface(S)"); - // IDirectDrawSurface::Flip - SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip, (void **)&pFlip, "Flip(S)"); - // IDirectDrawSurface::Blt - SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt, (void **)&pBlt, "Blt(S)"); - // IDirectDrawSurface::BltFast - SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); - // IDirectDrawSurface::DeleteAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)"); - // IDirectDrawSurface::GetAttachedSurface switch(dxversion) { case 1: - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); - break; - } - // IDirectDrawSurface::GetCaps - switch(dxversion) { - case 1: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps1S, (void **)&pGetCaps1S, "GetCaps(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette1, (void **)&pSetPalette1, "SetPalette(S1)"); break; case 2: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps2S, (void **)&pGetCaps2S, "GetCaps(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette2, (void **)&pSetPalette2, "SetPalette(S2)"); break; case 3: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps3S, (void **)&pGetCaps3S, "GetCaps(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette3, (void **)&pSetPalette3, "SetPalette(S3)"); break; case 4: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps4S, (void **)&pGetCaps4S, "GetCaps(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette4, (void **)&pSetPalette4, "SetPalette(S4)"); break; case 7: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps7S, (void **)&pGetCaps7S, "GetCaps(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette7, (void **)&pSetPalette7, "SetPalette(S7)"); break; } - // IDirectDrawSurface::GetDC - SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC, (void **)&pGetDC, "GetDC(S)"); // IDirectDrawSurface::GetSurfaceDesc - // IDirectDrawSurface::GetSurfaceDesc - if (dxversion < 4) { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc1, (void **)&pGetSurfaceDesc1, "GetSurfaceDesc(S1)"); - } - else { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc2, (void **)&pGetSurfaceDesc4, "GetSurfaceDesc(S4)"); - } - // IDirectDrawSurface::ReleaseDC - SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC, (void **)&pReleaseDC, "ReleaseDC(S)"); - - if (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLock, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock4, (void **)&pUnlock4, "Unlock(S4)"); - } - else { - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLockDir, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); - } - if (dxversion == 7) - SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc, (void **)&pSetSurfaceDesc, "SetSurfaceDesc(S3)"); - } + static void HookGammaControl(LPVOID *obp) { // IDirectDrawGammaControl::GetGammaRamp @@ -1386,6 +1348,21 @@ static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) char token[20+1]; DWORD val; OutTraceDW("MaskCaps\n"); + if(IsDebug){ + char CapsBuf[3*sizeof(DDCAPS_DX7)+20]; + int i; + unsigned char *p; + if(c1){ + p=(unsigned char *)c1; + for(i=0; i=4) sprintf(sInfo, " dwRefresh=%i dwFlags=%x", dwrefreshrate, dwflags); OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i%s\n", - version, dwwidth, dwheight, dwbpp, sInfo); + dxversion, dwwidth, dwheight, dwbpp, sInfo); } // binkplayer fix @@ -1950,7 +1939,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); SetPixFmt(&ddsd); - SetBltTransformations(); + SetBltTransformations(dxversion); if(dxw.Windowize) { OutTraceDW("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); SetVSyncDelays(lpdd); @@ -1968,7 +1957,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_REFRESHRATE; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - switch(version){ + switch(dxversion){ default: case 1: res=(*pGetDisplayMode1)(lpdd, (LPDDSURFACEDESC)&ddsd); break; case 2: res=(*pGetDisplayMode2)(lpdd, (LPDDSURFACEDESC)&ddsd); break; @@ -1991,7 +1980,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, dwbpp = ddsd.ddpfPixelFormat.dwRGBBitCount; } - switch(version){ + switch(dxversion){ default: case 1: res=(*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); break; case 2: res=(*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; @@ -2009,24 +1998,13 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, } HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp) -{ - return extSetDisplayMode(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); -} - +{ return extSetDisplayMode(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); } HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) -{ - return extSetDisplayMode(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); -} - +{ return extSetDisplayMode(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) -{ - return extSetDisplayMode(4, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); -} - +{ return extSetDisplayMode(4, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) -{ - return extSetDisplayMode(7, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); -} +{ return extSetDisplayMode(7, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags);} HRESULT WINAPI extGetDisplayMode(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { @@ -2107,7 +2085,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS OutTraceDW("InitDDScreenParameters: Actual size=(%dx%d)%s\n", ddsd.dwWidth, ddsd.dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); dxw.ActualPixelFormat=ddsd.ddpfPixelFormat; if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; - SetBltTransformations(); + SetBltTransformations(dxversion); if(dxw.Windowize){ if (dwflags & DDSCL_FULLSCREEN){ @@ -2180,24 +2158,13 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS } HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) -{ - return extSetCooperativeLevel(1, pSetCooperativeLevel1, lpdd, hwnd, dwflags); -} - +{ return extSetCooperativeLevel(1, pSetCooperativeLevel1, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) -{ - return extSetCooperativeLevel(2, pSetCooperativeLevel2, lpdd, hwnd, dwflags); -} - +{ return extSetCooperativeLevel(2, pSetCooperativeLevel2, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) -{ - return extSetCooperativeLevel(4, pSetCooperativeLevel4, lpdd, hwnd, dwflags); -} - +{ return extSetCooperativeLevel(4, pSetCooperativeLevel4, lpdd, hwnd, dwflags); } HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) -{ - return extSetCooperativeLevel(7, pSetCooperativeLevel7, lpdd, hwnd, dwflags); -} +{ return extSetCooperativeLevel(7, pSetCooperativeLevel7, lpdd, hwnd, dwflags); } static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) { @@ -2229,6 +2196,11 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) return; } + if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory + lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER; + return; + } + // this is valid just in case the above block eliminated TEXTURE surfaces.... if (lpddsd->dwFlags & DDSD_PIXELFORMAT){ // pixel format defined if (lpddsd->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) lpddsd->ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; // to allow for pixel format conversion (Quest for Glory 5 - GOG version) @@ -2239,10 +2211,7 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) return; } - if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory - lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER; - return; - } + // 3DDEVICE no TEXTURE: enforce PIXELFORMAT // v2.02.90: added for "Zoo Tycoon" textures @@ -2308,7 +2277,7 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa else { // in non-Windowized mode, the primary surface must be released and rebuilt with the proper properties res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); - if (lpDDSEmu_Prim) while((*pReleaseS)(lpDDSEmu_Prim)); + if (lpDDSEmu_Prim) while((*pReleaseSMethod())(lpDDSEmu_Prim)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); } } @@ -2319,7 +2288,7 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa } OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); - InitDSScreenParameters(lpDDSEmu_Prim); + InitDSScreenParameters(dxversion, lpDDSEmu_Prim); dxwss.PopSurface(lpDDSEmu_Prim); // 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. @@ -2392,30 +2361,22 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } + iBakBufferVersion=dxversion; // v2.03.01 OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurfacePrim(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, TRUE); // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - iBakBufferVersion=dxversion; // v2.03.01 // build a default System palette and apply it to primary surface if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ - CreatePalette_Type pCreatePalette; - switch(dxversion){ - default: - case 1: pCreatePalette = pCreatePalette1; break; - case 2: pCreatePalette = pCreatePalette2; break; - case 4: pCreatePalette = pCreatePalette4; break; - case 7: pCreatePalette = pCreatePalette7; break; - } - res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &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__); } // this must be done after hooking - who knows why? - res=(*pSetPalette)(*lplpdds, lpDDP); + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); } @@ -2480,30 +2441,22 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); return res; } + iBakBufferVersion=dxversion; // v2.03.01 OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurfacePrim(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, TRUE); // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - iBakBufferVersion=dxversion; // v2.03.01 // build a default System palette and apply it to primary surface if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ - CreatePalette_Type pCreatePalette; - switch(dxversion){ - default: - case 1: pCreatePalette = pCreatePalette1; break; - case 2: pCreatePalette = pCreatePalette2; break; - case 4: pCreatePalette = pCreatePalette4; break; - case 7: pCreatePalette = pCreatePalette7; break; - } - res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &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__); } // this must be done after hooking - who knows why? - res=(*pSetPalette)(*lplpdds, lpDDP); + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); } @@ -2554,7 +2507,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - while ((*pReleaseS)(lpPrim)); + while ((*pReleaseSMethod())(lpPrim)); res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); } /* fall through */ @@ -2589,7 +2542,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } iBakBufferVersion=dxversion; // v2.03.37 - HookDDSurfacePrim(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, TRUE); if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); return DD_OK; @@ -2625,25 +2578,17 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ - CreatePalette_Type pCreatePalette; - switch(dxversion){ - default: - case 1: pCreatePalette = pCreatePalette1; break; - case 2: pCreatePalette = pCreatePalette2; break; - case 4: pCreatePalette = pCreatePalette4; break; - case 7: pCreatePalette = pCreatePalette7; break; - } - res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &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__); } // this must be done after hooking - who knows why? - res=(*pSetPalette)(*lplpdds, lpDDP); + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); } @@ -2692,25 +2637,17 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && (dxw.dwFlags6 & SYNCPALETTE)){ if(lpDDP == NULL){ - CreatePalette_Type pCreatePalette; - switch(dxversion){ - default: - case 1: pCreatePalette = pCreatePalette1; break; - case 2: pCreatePalette = pCreatePalette2; break; - case 4: pCreatePalette = pCreatePalette4; break; - case 7: pCreatePalette = pCreatePalette7; break; - } - res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &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__); } // this must be done after hooking - who knows why? - res=(*pSetPalette)(*lplpdds, lpDDP); + res=(*pSetPaletteMethod(dxversion))(*lplpdds, lpDDP); if(res) { OutTraceE("CreateSurface: SetPalette ERROR err=%x at %d\n", res, __LINE__); } @@ -2733,16 +2670,11 @@ static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type p GetAttachedSurface_Type pGetAttachedSurface; DDSCAPS2 caps; switch(dxversion){ - default: - case 1: - case 2: - pGetAttachedSurface = pGetAttachedSurface1; break; - case 3: - pGetAttachedSurface = pGetAttachedSurface3; break; - case 4: - pGetAttachedSurface = pGetAttachedSurface4; break; - case 7: - pGetAttachedSurface = pGetAttachedSurface7; break; + case 1: pGetAttachedSurface = pGetAttachedSurface1; break; + case 2: pGetAttachedSurface = pGetAttachedSurface2; break; + case 3: pGetAttachedSurface = pGetAttachedSurface3; break; + case 4: pGetAttachedSurface = pGetAttachedSurface4; break; + case 7: pGetAttachedSurface = pGetAttachedSurface7; break; } memset(&caps, 0, sizeof(caps)); caps.dwCaps = DDSCAPS_BACKBUFFER; @@ -2755,7 +2687,7 @@ static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type p OutTraceDW("CreateSurface: retrieved BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 return DD_OK; @@ -2801,7 +2733,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS memset(&prim, 0, sizeof(DDSURFACEDESC2)); prim.dwSize = (dxversion >= 4) ? sizeof(DDSURFACEDESC2) : sizeof(DDSURFACEDESC); res=lpPrim->GetSurfaceDesc((DDSURFACEDESC *)&prim); - (*pReleaseS)(lpPrim); + (*pReleaseSMethod())(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); @@ -2823,7 +2755,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + HookDDSurface(lplpdds, dxversion, FALSE); // added !!! iBakBufferVersion=dxversion; // v2.02.31 return DD_OK; @@ -2871,7 +2803,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. // fixes "Virtua Fighter PC" palette bug if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ - res=(*pSetPalette)(*lplpdds, lpDDP); + 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__); else { @@ -2881,7 +2813,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } // diagnostic hooks .... - HookDDSurfaceGeneric(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, FALSE); return DD_OK; } @@ -2924,7 +2856,7 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. // fixes "Virtua Fighter PC" palette bug if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ - res=(*pSetPalette)(*lplpdds, lpDDP); + 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__); else { @@ -2934,7 +2866,7 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea } // diagnostic hooks .... - HookDDSurfaceGeneric(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, FALSE); return DD_OK; } @@ -2965,7 +2897,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); // hooks .... - HookDDSurfaceGeneric(lplpdds, dxversion); + HookDDSurface(lplpdds, dxversion, FALSE); return DD_OK; @@ -3094,7 +3026,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if(res) return res; lpDDSPrim = *lplpdds; dxwss.PushPrimarySurface(lpDDSPrim, dxversion); - RegisterPixelFormat(lpDDSPrim); + RegisterPixelFormat(dxversion, lpDDSPrim); if (BBCount){ // build emulated backbuffer surface @@ -3156,13 +3088,10 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(1, (CreateSurface_Type)pCreateSurface1, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } - HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(2, (CreateSurface_Type)pCreateSurface2, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } - HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(4, (CreateSurface_Type)pCreateSurface4, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } - HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { return extCreateSurface(7, (CreateSurface_Type)pCreateSurface7, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); } @@ -3241,13 +3170,13 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet // arguable utility .... // commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface? // would that be necessary on some game? - if(EMULATEZBUFFERATTACH){ - if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ - *lplpddas = lpDDZBuffer; - OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds); - return DD_OK; - } - } + //if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS){ + //if (lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ + // *lplpddas = lpDDZBuffer; + // OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds); + // return DD_OK; + //} + //} OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); } else { @@ -3259,24 +3188,15 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet } HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(1, pGetAttachedSurface1, lpdds, lpddsc, lplpddas); -} - +{ return extGetAttachedSurface(1, pGetAttachedSurface1, lpdds, lpddsc, lplpddas); } +HRESULT WINAPI extGetAttachedSurface2(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) +{ return extGetAttachedSurface(2, pGetAttachedSurface2, lpdds, lpddsc, lplpddas); } HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(3, pGetAttachedSurface3, lpdds, lpddsc, lplpddas); -} - +{ return extGetAttachedSurface(3, pGetAttachedSurface3, lpdds, lpddsc, lplpddas); } HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(4, pGetAttachedSurface4, lpdds, lpddsc, lplpddas); -} - +{ return extGetAttachedSurface(4, pGetAttachedSurface4, lpdds, lpddsc, lplpddas); } HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(7, pGetAttachedSurface7, lpdds, lpddsc, lplpddas); -} +{ return extGetAttachedSurface(7, pGetAttachedSurface7, lpdds, lpddsc, lplpddas); } void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line) { @@ -3314,12 +3234,12 @@ void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line) return; } -HRESULT WINAPI PrimaryBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { return (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0); } -HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryFastBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { HRESULT res; RECT client; @@ -3336,12 +3256,20 @@ HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDI res = (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0); } else { + BltFast_Type pBltFast; + switch(dxversion){ + case 1: pBltFast=pBltFast1; break; + case 2: pBltFast=pBltFast2; break; + case 3: pBltFast=pBltFast3; break; + case 4: pBltFast=pBltFast4; break; + case 7: pBltFast=pBltFast7; break; + } res= (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT); } return res; } -HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { HRESULT res; DDSURFACEDESC2 ddsd; @@ -3350,15 +3278,16 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L LPDIRECTDRAWSURFACE lpddsBak; DDSCAPS caps; CreateSurface1_Type pCreateSurface; + BltFast_Type pBltFast; int dwSize; switch(iBakBufferVersion){ default: - case 1: pCreateSurface=pCreateSurface1; dwSize = sizeof(DDSURFACEDESC); break; - case 2: pCreateSurface=(CreateSurface1_Type)pCreateSurface2; dwSize = sizeof(DDSURFACEDESC); break; - case 3: pCreateSurface=(CreateSurface1_Type)pCreateSurface3; dwSize = sizeof(DDSURFACEDESC); break; - case 4: pCreateSurface=(CreateSurface1_Type)pCreateSurface4; dwSize = sizeof(DDSURFACEDESC2); break; - case 7: pCreateSurface=(CreateSurface1_Type)pCreateSurface7; dwSize = sizeof(DDSURFACEDESC2); break; + case 1: pBltFast=pBltFast1; pCreateSurface=pCreateSurface1; dwSize = sizeof(DDSURFACEDESC); break; + case 2: pBltFast=pBltFast2; pCreateSurface=(CreateSurface1_Type)pCreateSurface2; dwSize = sizeof(DDSURFACEDESC); break; + case 3: pBltFast=pBltFast3; pCreateSurface=(CreateSurface1_Type)pCreateSurface3; dwSize = sizeof(DDSURFACEDESC); break; + case 4: pBltFast=pBltFast4; pCreateSurface=(CreateSurface1_Type)pCreateSurface4; dwSize = sizeof(DDSURFACEDESC2); break; + case 7: pBltFast=pBltFast7; pCreateSurface=(CreateSurface1_Type)pCreateSurface7; dwSize = sizeof(DDSURFACEDESC2); break; } caps.dwCaps = DDSCAPS_BACKBUFFER; memset(&ddsd, 0, sizeof(ddsd)); @@ -3405,7 +3334,7 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); } } - (*pReleaseS)(lpddsTmp); + (*pReleaseSMethod())(lpddsTmp); return res; } @@ -3434,7 +3363,7 @@ void *LoadFilter(char *apiname) return (*pGetProcAddress)(filterlib, apiname); } -HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { HRESULT res; typedef void (WINAPI *Resize_HQ_Type)( unsigned char*, RECT *, int, unsigned char*, RECT *, int); @@ -3451,15 +3380,16 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LONG dwWidth, dwHeight; int SrcPitch, DestPitch; CreateSurface1_Type pCreateSurface; + BltFast_Type pBltFast; int dwSize; switch(iBakBufferVersion){ default: - case 1: pCreateSurface=pCreateSurface1; dwSize = sizeof(DDSURFACEDESC); break; - case 2: pCreateSurface=(CreateSurface1_Type)pCreateSurface2; dwSize = sizeof(DDSURFACEDESC); break; - case 3: pCreateSurface=(CreateSurface1_Type)pCreateSurface3; dwSize = sizeof(DDSURFACEDESC); break; - case 4: pCreateSurface=(CreateSurface1_Type)pCreateSurface4; dwSize = sizeof(DDSURFACEDESC2); break; - case 7: pCreateSurface=(CreateSurface1_Type)pCreateSurface7; dwSize = sizeof(DDSURFACEDESC2); break; + case 1: pBltFast=pBltFast1; pCreateSurface=pCreateSurface1; dwSize = sizeof(DDSURFACEDESC); break; + case 2: pBltFast=pBltFast2; pCreateSurface=(CreateSurface1_Type)pCreateSurface2; dwSize = sizeof(DDSURFACEDESC); break; + case 3: pBltFast=pBltFast3; pCreateSurface=(CreateSurface1_Type)pCreateSurface3; dwSize = sizeof(DDSURFACEDESC); break; + case 4: pBltFast=pBltFast4; pCreateSurface=(CreateSurface1_Type)pCreateSurface4; dwSize = sizeof(DDSURFACEDESC2); break; + case 7: pBltFast=pBltFast7; pCreateSurface=(CreateSurface1_Type)pCreateSurface7; dwSize = sizeof(DDSURFACEDESC2); break; } caps.dwCaps = DDSCAPS_BACKBUFFER; memset(&ddsd, 0, sizeof(DDSURFACEDESC)); @@ -3497,7 +3427,7 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, memset(&ddsd,0,dwSize); ddsd.dwSize = dwSize; ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0); + res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0); if(res) { OutTraceE("PrimaryBilinearBlt: Lock ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return DD_OK; @@ -3507,7 +3437,7 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, memset(&ddsd,0,dwSize); ddsd.dwSize = dwSize; ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - res=(*pLock)(lpddsTmp, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0); + res=(*pLockMethod())(lpddsTmp, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0); if(res) { OutTraceE("PrimaryBilinearBlt: Lock ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return DD_OK; @@ -3553,8 +3483,8 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, (*pResize_HQ)(bSourceBuf, lpsrcrect, SrcPitch, bDestBuf, lpdestrect, DestPitch); // fast-blit to primary - (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); - (*pUnlockMethod(lpddsTmp))(lpddsTmp, NULL); + (*pUnlockMethod())(lpddssrc, NULL); + (*pUnlockMethod())(lpddsTmp, NULL); if(dxw.dwFlags3 & FORCECLIPPER) { res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); if(res) OutTraceE("PrimaryBilinearBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -3563,26 +3493,34 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); if(res) OutTraceE("PrimaryBilinearBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); } - (*pReleaseS)(lpddsTmp); - if(lpddsCopy) (*pReleaseS)(lpddsCopy); + (*pReleaseSMethod())(lpddsTmp); + if(lpddsCopy) (*pReleaseSMethod())(lpddsCopy); return res; } -HRESULT WINAPI PrimaryNoBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +HRESULT WINAPI PrimaryNoBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { return DD_OK; } -typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); +typedef HRESULT (WINAPI *ColorConversion_Type)(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI ColorConversionEmulated(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) +HRESULT WINAPI ColorConversionEmulated(int dxversion, LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) { HRESULT res; - res=(*pEmuBlt)(lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); + Blt_Type pBlt; + switch(dxversion){ + case 1: pBlt=pBlt1; break; + case 2: pBlt=pBlt2; break; + case 3: pBlt=pBlt3; break; + case 4: pBlt=pBlt4; break; + case 7: pBlt=pBlt7; break; + } + res=(*pEmuBlt)(dxversion, pBlt, lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); if(res==DDERR_SURFACEBUSY){ - (*pUnlockMethod(lpdds))(lpdds, NULL); - (*pUnlockMethod(lpDDSEmu_Back))(lpDDSEmu_Back, NULL); - res=(*pEmuBlt)(lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); + (*pUnlockMethod())(lpdds, NULL); + (*pUnlockMethod())(lpDDSEmu_Back, NULL); + res=(*pEmuBlt)(dxversion, pBlt, lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); } if(res) { BlitError(res, &emurect, &emurect, __LINE__); @@ -3592,10 +3530,12 @@ HRESULT WINAPI ColorConversionEmulated(LPDIRECTDRAWSURFACE lpdds, RECT emurect, return res; } -HRESULT WINAPI ColorConversionGDI(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) +HRESULT WINAPI ColorConversionGDI(int version, LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) { // GDICOLORCONV: use GDI capabilities to convert color depth by BitBlt-ting between different hdc HRESULT res; + GetDC_Type pGetDC = pGetDCMethod(); + ReleaseDC_Type pReleaseDC = pReleaseDCMethod(); do { HDC hdc_source, hdc_dest; res=(*pGetDC)(lpdds, &hdc_source); @@ -3626,13 +3566,13 @@ HRESULT WINAPI ColorConversionGDI(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIR return res; } -HRESULT WINAPI ColorConversionDDRAW(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) +HRESULT WINAPI ColorConversionDDRAW(int dxversion, LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource) { *lpddssource = lpdds; return DD_OK; } -HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) { BOOL IsPrim; HRESULT res; @@ -3641,8 +3581,17 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE lpDDSBack; IsPrim=dxwss.IsAPrimarySurface(lpdds); - OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", - lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); + OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s) version=%d\n", + lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags), dxversion); + + Blt_Type pBlt; + switch (dxversion){ + case 1: pBlt = pBlt1; break; + case 2: pBlt = pBlt2; break; + case 3: pBlt = pBlt3; break; + case 4: pBlt = pBlt4; break; + case 7: pBlt = pBlt7; break; + } if (!IsPrim){ if(lpddssrc){ @@ -3653,7 +3602,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DDSCAPS ddsc; DDSURFACEDESC2 sd; - sd.dwSize=Set_dwSize_From_Surface(lpdds); + sd.dwSize=Set_dwSize_From_Surface(); res=lpdds->GetSurfaceDesc((DDSURFACEDESC *)&sd); if (res) OutTraceDW("Flip: GetSurfaceDesc res=%x at %d\n",res, __LINE__); @@ -3665,7 +3614,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, OutTraceE("Flip: GetAttachedSurface ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } - res=sBlt("Flip", lpdds, NULL, lpddsAttached, NULL, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpddsAttached, NULL, DDBLT_WAIT, 0, TRUE); if(res){ OutTraceE("Flip: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; @@ -3686,10 +3635,10 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, HRESULT res2; // create a temporary working surface memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = SurfaceDescrSize(lpdds); + ddsd.dwSize = (dxversion <4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); // v2.03.60 insidious bug fix !!! // v2.02.80: the BackBuffer may not exist? see "HellCopter" if(lpDDSBack){ - (*pGetSurfaceDescMethod(lpdds))((LPDIRECTDRAWSURFACE2)lpDDSBack, &ddsd); + (*pGetSurfaceDescMethod())((LPDIRECTDRAWSURFACE2)lpDDSBack, &ddsd); ddsd.dwFlags &= ~DDSD_PITCH; } else{ @@ -3698,7 +3647,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.dwWidth = dxw.GetScreenWidth(); } - res2=(*pCreateSurfaceMethod(lpdds))(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); + res2=(*pCreateSurfaceMethod())(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); if(res2) { OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); OutTraceE("Size=%d lpPrimaryDD=%x lpDDSBack=%x %s\n", @@ -3727,7 +3676,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, if(lpddssrc){ //res=lpdds->Blt(0, lpddssrc, 0, DDBLT_WAIT, 0); - res=sBlt("Flip", lpdds, NULL, lpddssrc, NULL, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpddssrc, NULL, DDBLT_WAIT, 0, TRUE); } else{ if(!lpDDSBack){ @@ -3739,10 +3688,10 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, NullArea.left=NullArea.top=0; NullArea.bottom=dxw.GetScreenHeight(); NullArea.right=dxw.GetScreenWidth(); - res=sBlt("Flip", lpdds, NULL, lpDDSBack, &NullArea, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, &NullArea, DDBLT_WAIT, 0, TRUE); } else - res=sBlt("Flip", lpdds, NULL, lpDDSBack, NULL, DDBLT_WAIT, 0, TRUE); + res=sBlt(dxversion, pBlt, "Flip", lpdds, NULL, lpDDSBack, NULL, DDBLT_WAIT, 0, TRUE); lpddssrc = lpDDSBack; } @@ -3752,14 +3701,25 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, // restore flipped backbuffer and delete temporary surface res2= (*pBlt)(lpddssrc, NULL, lpddsTmp, NULL, DDBLT_WAIT, NULL); if(res2) OutTraceE("Blt: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); - (*pReleaseS)(lpddsTmp); + (*pReleaseSMethod())(lpddsTmp); } if(res) OutTraceE("Flip: Blt ERROR %x(%s)\n", res, ExplainDDError(res)); return res; } -HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, +HRESULT WINAPI extFlip1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +{ return extFlip(1, pFlip1, lpdds, lpddssrc, dwflags); } +HRESULT WINAPI extFlip2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +{ return extFlip(2, pFlip2, lpdds, lpddssrc, dwflags); } +HRESULT WINAPI extFlip3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +{ return extFlip(3, pFlip3, lpdds, lpddssrc, dwflags); } +HRESULT WINAPI extFlip4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +{ return extFlip(4, pFlip4, lpdds, lpddssrc, dwflags); } +HRESULT WINAPI extFlip7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) +{ return extFlip(7, pFlip7, lpdds, lpddssrc, dwflags); } + +HRESULT WINAPI extBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) { if ((dxw.dwFlags2 & FULLRECTBLT) && dxwss.IsAPrimarySurface(lpdds)){ @@ -3767,10 +3727,21 @@ HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, lpdestrect=NULL; } - return sBlt("Blt", lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, FALSE); + return sBlt(dxversion, pBlt, "Blt", lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, FALSE); } -HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, +HRESULT WINAPI extBlt1(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) +{ return extBlt(1, pBlt1, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } +HRESULT WINAPI extBlt2(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) +{ return extBlt(2, pBlt2, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } +HRESULT WINAPI extBlt3(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) +{ return extBlt(3, pBlt3, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } +HRESULT WINAPI extBlt4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) +{ return extBlt(4, pBlt4, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } +HRESULT WINAPI extBlt7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) +{ return extBlt(7, pBlt7, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } + +HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) { // BltFast is supported just on screen surfaces, so it has to be replaced @@ -3810,7 +3781,7 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, //if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_COLORFILL; if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){ - return sBlt("BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE); + return sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE); } destrect.left = dwx; @@ -3820,14 +3791,14 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, destrect.bottom = destrect.top + lpsrcrect->bottom - lpsrcrect->top; // avoid altering pointed values.... srcrect=*lpsrcrect; - ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, &srcrect, flags, NULL, FALSE); + ret=sBlt(dxversion, pBlt, "BltFast", lpdds, &destrect, lpddssrc, &srcrect, flags, NULL, FALSE); } else{ // does it EVER goes through here? NULL is not a valid rect value for BltFast call.... // yes, forced in FULLRECTBLT mode! // yes, when BltFast on DDBLTFAST_SRCCOLORKEY!! (Pax Corpus) if(lpddssrc){ - ddsd.dwSize=Set_dwSize_From_Surface(lpddssrc); + ddsd.dwSize=Set_dwSize_From_Surface(); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; ret=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); if (ret){ @@ -3836,7 +3807,7 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, } destrect.right = destrect.left + ddsd.dwWidth; destrect.bottom = destrect.top + ddsd.dwHeight; - ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, NULL, flags, NULL, FALSE); + ret=sBlt(dxversion, pBlt, "BltFast", lpdds, &destrect, lpddssrc, NULL, flags, NULL, FALSE); } else{ //ret=sBlt("BltFast", lpdds, NULL, lpddssrc, NULL, flags, NULL, FALSE); @@ -3847,7 +3818,18 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, return ret; } -HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +HRESULT WINAPI extBltFast1(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) +{ return extBltFast(1, pBlt1, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +HRESULT WINAPI extBltFast2(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) +{ return extBltFast(2, pBlt2, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +HRESULT WINAPI extBltFast3(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) +{ return extBltFast(3, pBlt3, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +HRESULT WINAPI extBltFast4(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) +{ return extBltFast(4, pBlt4, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +HRESULT WINAPI extBltFast7(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) +{ return extBltFast(7, pBlt7, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } + +HRESULT WINAPI extWaitForVerticalBlank(WaitForVerticalBlank_Type pWaitForVerticalBlank, LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { if(dxw.dwFlags1 & SAVELOAD){ dxw.VSyncWait(); @@ -3856,6 +3838,15 @@ HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); } +HRESULT WINAPI extWaitForVerticalBlank1(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +{ return extWaitForVerticalBlank(pWaitForVerticalBlank1, lpdd, dwflags, hevent); } +HRESULT WINAPI extWaitForVerticalBlank2(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +{ return extWaitForVerticalBlank(pWaitForVerticalBlank2, lpdd, dwflags, hevent); } +HRESULT WINAPI extWaitForVerticalBlank4(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +{ return extWaitForVerticalBlank(pWaitForVerticalBlank4, lpdd, dwflags, hevent); } +HRESULT WINAPI extWaitForVerticalBlank7(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) +{ return extWaitForVerticalBlank(pWaitForVerticalBlank7, lpdd, dwflags, hevent); } + #define DDPCAPS_INITIALIZE_LEGACY 0x00000008l HRESULT WINAPI extCreatePalette(int version, CreatePalette_Type pCreatePalette, @@ -3880,17 +3871,14 @@ HRESULT WINAPI extCreatePalette(int version, CreatePalette_Type pCreatePalette, HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(1, (CreatePalette_Type)pCreatePalette1, lpdd, dwflags, lpddpa, lplpddp, pu); } - HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(2, (CreatePalette_Type)pCreatePalette2, lpdd, dwflags, lpddpa, lplpddp, pu); } - HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(4, (CreatePalette_Type)pCreatePalette4, lpdd, dwflags, lpddpa, lplpddp, pu); } - HRESULT WINAPI extCreatePalette7(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) { return extCreatePalette(7, (CreatePalette_Type)pCreatePalette7, lpdd, dwflags, lpddpa, lplpddp, pu); } -HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +HRESULT WINAPI extGetPalette(GetPalette_Type pGetPalette, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) { HRESULT res; BOOL isPrim, isBack; @@ -3916,7 +3904,18 @@ HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lpl return res; } -HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +HRESULT WINAPI extGetPalette1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +{ return extGetPalette(pGetPalette1, lpdds, lplpddp); } +HRESULT WINAPI extGetPalette2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +{ return extGetPalette(pGetPalette2, lpdds, lplpddp); } +HRESULT WINAPI extGetPalette3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +{ return extGetPalette(pGetPalette3, lpdds, lplpddp); } +HRESULT WINAPI extGetPalette4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +{ return extGetPalette(pGetPalette4, lpdds, lplpddp); } +HRESULT WINAPI extGetPalette7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) +{ return extGetPalette(pGetPalette7, lpdds, lplpddp); } + +HRESULT WINAPI extSetPalette(SetPalette_Type pSetPalette, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) { PALETTEENTRY *lpentries; BOOL isPrim; @@ -3956,6 +3955,17 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd return res; } +HRESULT WINAPI extSetPalette1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +HRESULT WINAPI extSetPalette2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +HRESULT WINAPI extSetPalette3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +HRESULT WINAPI extSetPalette4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +{ return extSetPalette(pSetPalette1, lpdds, lpddp); } +HRESULT WINAPI extSetPalette7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) +{ return extSetPalette(pSetPalette1, lpdds, lpddp); } + HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dwstart, DWORD dwcount, LPPALETTEENTRY lpentries) { HRESULT res; @@ -4036,7 +4046,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd DDSURFACEDESC SaveSurfaceDesc; LPDIRECTDRAWSURFACE SaveSurface = NULL; -HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +HRESULT WINAPI extLock(Lock_Type pLock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) { HRESULT res; @@ -4053,7 +4063,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); if(res==DDERR_SURFACEBUSY){ // v70: fix for "Ancient Evil" - (*pUnlockMethod(lpdds))(lpdds, NULL); + (*pUnlockMethod())(lpdds, NULL); res = (*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); OutTraceDW("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); } @@ -4063,10 +4073,15 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC OutTraceDW("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); } if(res) OutTraceE("Lock ERROR: ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - OutTraceB("Lock: lPitch=%d lpSurface=%x %s\n", - lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__)); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; + OutTraceB("Lock: lPitch=%d lpSurface=%x ZBufferBitDepth=%d %s\n", + lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, lpDDSurfaceDesc->dwZBufferBitDepth, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__)); + // v2.03.60: necessary for "Mech Commander 2" + if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS) + lpDDSurfaceDesc->dwZBufferBitDepth = dxw.VirtualPixelFormat.dwRGBBitCount; + + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; + if((dxw.dwFlags6 & FIXPITCH) || (dxw.dwFlags3 & MARKLOCK)){ SaveSurfaceDesc = *lpDDSurfaceDesc; SaveSurface = lpdds; @@ -4075,14 +4090,31 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC return res; } +HRESULT WINAPI extLock1(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLock(pLock1, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + +HRESULT WINAPI extLock2(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLock(pLock2, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + +HRESULT WINAPI extLock3(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLock(pLock3, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + +HRESULT WINAPI extLock4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLock(pLock4, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + +HRESULT WINAPI extLock7(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLock(pLock7, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + + LPDIRECTDRAWSURFACE2 lpDDSBuffer = NULL; -HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) { HRESULT res, res2; static RECT client; POINT upleft={0,0}; LPDIRECTDRAWSURFACE lpDDSPrim; + Blt_Type pBlt; // this hooker operates on // Beware!!! for strange reason, the function gets hooked to ANY surface, also non primary ones!!! @@ -4097,6 +4129,14 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } + switch(dxversion){ + case 1: pBlt=pBlt1; break; + case 2: pBlt=pBlt2; break; + case 3: pBlt=pBlt3; break; + case 4: pBlt=pBlt4; break; + case 7: pBlt=pBlt7; break; + } + // V2.02.43: Empire Earth does some test Lock operations apparently before the primary surface is created if(lpPrimaryDD){ lpDDSPrim=0; @@ -4104,13 +4144,12 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED if(res2) OutTraceE("Lock: GetGDISurface ERROR res=%x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); else - (*pReleaseS)(lpDDSPrim); + (*pReleaseSMethod())(lpDDSPrim); if(lpdds==lpDDSPrim){ if(dxw.dwFlags1 & LOCKEDSURFACE){ DDSURFACEDESC2 ddsd; DDBLTFX fx; memset(&ddsd, 0, sizeof(ddsd)); - //ddsd.dwSize=SurfaceDescrSize(lpdds); ddsd.dwSize=sizeof(DDSURFACEDESC); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; ddsd.dwWidth = dxw.GetScreenWidth(); @@ -4150,12 +4189,29 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); if(res) OutTraceE("Lock ERROR: ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - OutTraceB("Lock: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpDDSurfaceDesc, "[Locked]" , __LINE__)); + OutTraceB("Lock: lPitch=%d lpSurface=%x ZBufferBitDepth=%d %s\n", + lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, lpDDSurfaceDesc->dwZBufferBitDepth, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__)); + + // v2.03.60: necessary for "Mech Commander 2" + if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS) + lpDDSurfaceDesc->dwZBufferBitDepth = dxw.VirtualPixelFormat.dwRGBBitCount; + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } +HRESULT WINAPI extLockDir1(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLockDir(1, pLock1, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } +HRESULT WINAPI extLockDir2(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLockDir(2, pLock2, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } +HRESULT WINAPI extLockDir3(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLockDir(3, pLock3, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } +HRESULT WINAPI extLockDir4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLockDir(4, pLock4, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } +HRESULT WINAPI extLockDir7(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) +{ return extLockDir(7, pLock7, lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); } + #define MARK16COLOR 0x7C1F #define MARK32COLOR 0x00FF00FF @@ -4165,22 +4221,37 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC BOOL IsPrim; BOOL IsBack; RECT rect; + Blt_Type pBlt; IsPrim=dxwss.IsAPrimarySurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds); if(IsTraceDDRAW){ char sRect[81]; - if (dxversion == 4){ - if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); - else strcpy(sRect, "rect=(NULL)"); + switch(dxversion){ + case 1: + case 2: + case 3: + sprintf_s(sRect, 80, "lpvoid=%x", lprect); + break; + case 4: + case 7: + if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "rect=(NULL)"); + break; } - else - sprintf_s(sRect, 80, "lpvoid=%x", lprect); OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); } - if(dxversion == 4){ + switch(dxversion){ + case 1: pBlt=pBlt1; break; + case 2: pBlt=pBlt2; break; + case 3: pBlt=pBlt3; break; + case 4: pBlt=pBlt4; break; + case 7: pBlt=pBlt7; break; + } + + if(dxversion >= 4){ // make lprect point elsewhere, so that the original values are not altered if(lprect){ CleanRect(&lprect,__LINE__); @@ -4233,10 +4304,10 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC } } - res=(*pUnlock)(lpdds, lprect); + res=(*pUnlock)(lpdds, lprect); if (IsPrim && res==DD_OK) { - if(dxversion == 1) lprect=NULL; - res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); + 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__); @@ -4250,47 +4321,63 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC return res; } -HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - return extUnlock(4, pUnlock4, lpdds, lprect); -} - HRESULT WINAPI extUnlock1(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) -{ - return extUnlock(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); -} +{ return extUnlock(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); } + +HRESULT WINAPI extUnlock2(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) +{ return extUnlock(2, (Unlock4_Type)pUnlock2, lpdds, (LPRECT)lpvoid); } + +HRESULT WINAPI extUnlock3(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) +{ return extUnlock(3, (Unlock4_Type)pUnlock3, lpdds, (LPRECT)lpvoid); } + +HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) +{ return extUnlock(4, pUnlock4, lpdds, lprect); } + +HRESULT WINAPI extUnlock7(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) +{ return extUnlock(7, pUnlock7, lpdds, lprect); } HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) { HRESULT res; //RECT screen, rect; BOOL IsPrim; + BOOL IsBack; LPDIRECTDRAWSURFACE lpDDSPrim; GetGDISurface_Type pGetGDISurface; + Blt_Type pBlt; IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); if(IsTraceDDRAW){ char sRect[81]; - if (dxversion == 4){ - if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); - else strcpy(sRect, "rect=(NULL)"); + switch(dxversion){ + case 1: + case 2: + case 3: + sprintf_s(sRect, 80, "lpvoid=%x", lprect); + break; + case 4: + case 7: + if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "rect=(NULL)"); + break; } - else - sprintf_s(sRect, 80, "lpvoid=%x", lprect); - OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)":""), sRect); + OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); + } + + switch(dxversion){ + default: + case 1: pGetGDISurface = pGetGDISurface1; pBlt = pBlt1; break; + case 2: pGetGDISurface = pGetGDISurface2; pBlt = pBlt2; break; + case 3: pGetGDISurface = pGetGDISurface2; pBlt = pBlt3; break; + case 4: pGetGDISurface = pGetGDISurface4; pBlt = pBlt4; break; + case 7: pGetGDISurface = pGetGDISurface7; pBlt = pBlt7; break; } if(dxw.dwFlags1 & LOCKEDSURFACE){ - switch(dxversion){ - default: - case 1: pGetGDISurface = pGetGDISurface1; break; - case 2: pGetGDISurface = pGetGDISurface2; break; - case 4: pGetGDISurface = pGetGDISurface4; break; - case 7: pGetGDISurface = pGetGDISurface7; break; - } (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); if(lpdds==lpDDSPrim && lpDDSBuffer){ RECT client; @@ -4301,38 +4388,37 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR OffsetRect(lprect, upleft.x, upleft.y); res=(*pUnlock)((LPDIRECTDRAWSURFACE)lpDDSBuffer, lprect); (*pBlt)(lpdds, lprect, (LPDIRECTDRAWSURFACE)lpDDSBuffer, NULL, DDBLT_WAIT, 0); - (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSBuffer); + (*pReleaseSMethod())((LPDIRECTDRAWSURFACE)lpDDSBuffer); lpDDSBuffer = NULL; } - (*pReleaseS)(lpDDSPrim); // to leave a correct refcount + (*pReleaseSMethod())(lpDDSPrim); // to leave a correct refcount } 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("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); + if (IsPrim && res==DD_OK) sBlt(dxversion, pBlt, "Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } -HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - return extUnlockDir(4, pUnlock4, lpdds, lprect); -} - HRESULT WINAPI extUnlockDir1(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) -{ - return extUnlockDir(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); -} +{ return extUnlockDir(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); } +HRESULT WINAPI extUnlockDir2(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) +{ return extUnlockDir(2, (Unlock4_Type)pUnlock2, lpdds, (LPRECT)lpvoid); } +HRESULT WINAPI extUnlockDir3(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) +{ return extUnlockDir(3, (Unlock4_Type)pUnlock3, lpdds, (LPRECT)lpvoid); } +HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) +{ return extUnlockDir(4, pUnlock4, lpdds, lprect); } +HRESULT WINAPI extUnlockDir7(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) +{ return extUnlockDir(7, pUnlock7, lpdds, lprect); } /* to do: instead of calling GDI GetDC, try to map GetDC with Lock and ReleaseDC with Unlock, returning the surface memory ptr (???) as HDC and avoiding the consistency check performed by surface::GetDC (why should it bother if the screen is 32BPP and the surface is not??? */ -// to do: double extGetDC/ReleaseDC in Emu/Dir mode ? - -HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +HRESULT WINAPI extGetDC(int dxversion, GetDC_Type pGetDC, LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) { HRESULT res; BOOL IsPrim; @@ -4357,13 +4443,13 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) if(lpDDP==NULL){ // should link here to the GDI palette? See Hyperblade.... dxw.palNumEntries=256; - res=(*pCreatePalette1)(lpPrimaryDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL); + res=(*pCreatePaletteMethod(dxversion))(lpPrimaryDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL); if (res) { OutTraceE("GetDC: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } } - res=(*pSetPalette)(lpdds, lpDDP); + res=(*pSetPaletteMethod(dxversion))(lpdds, lpDDP); if (res) { OutTraceE("GetDC: SetPalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; @@ -4377,7 +4463,18 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) return res; } -HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +HRESULT WINAPI extGetDC1(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +{ return extGetDC(1, pGetDC1, lpdds, pHDC); } +HRESULT WINAPI extGetDC2(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +{ return extGetDC(2, pGetDC2, lpdds, pHDC); } +HRESULT WINAPI extGetDC3(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +{ return extGetDC(3, pGetDC3, lpdds, pHDC); } +HRESULT WINAPI extGetDC4(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +{ return extGetDC(4, pGetDC4, lpdds, pHDC); } +HRESULT WINAPI extGetDC7(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) +{ return extGetDC(7, pGetDC7, lpdds, pHDC); } + +HRESULT WINAPI extReleaseDC(int dxversion, ReleaseDC_Type pReleaseDC, LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) { HRESULT res; BOOL IsPrim; @@ -4385,14 +4482,37 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); res=(*pReleaseDC)(lpdds, hdc); - if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); + if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) {\ + Blt_Type pBlt; + GetGDISurface_Type pGetGDISurface; + switch(dxversion){ + default: + case 1: pGetGDISurface = pGetGDISurface1; pBlt = pBlt1; break; + case 2: pGetGDISurface = pGetGDISurface2; pBlt = pBlt2; break; + case 3: pGetGDISurface = pGetGDISurface2; pBlt = pBlt3; break; + case 4: pGetGDISurface = pGetGDISurface4; pBlt = pBlt4; break; + case 7: pGetGDISurface = pGetGDISurface7; pBlt = pBlt7; break; + } + sBlt(dxversion, pBlt, "ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); + } if (res) OutTraceE("ReleaseDC: ERROR res=%x(%s)\n", res, ExplainDDError(res)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } +HRESULT WINAPI extReleaseDC1(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +{ return extReleaseDC(1, pReleaseDC1, lpdds, hdc); } +HRESULT WINAPI extReleaseDC2(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +{ return extReleaseDC(2, pReleaseDC2, lpdds, hdc); } +HRESULT WINAPI extReleaseDC3(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +{ return extReleaseDC(3, pReleaseDC3, lpdds, hdc); } +HRESULT WINAPI extReleaseDC4(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +{ return extReleaseDC(4, pReleaseDC4, lpdds, hdc); } +HRESULT WINAPI extReleaseDC7(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) +{ return extReleaseDC(7, pReleaseDC7, lpdds, hdc); } -HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) + +HRESULT WINAPI extFlipToGDISurface(FlipToGDISurface_Type pFlipToGDISurface, LPDIRECTDRAW lpdd) { // HRESULT res; @@ -4407,6 +4527,15 @@ HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) return DD_OK; } +HRESULT WINAPI extFlipToGDISurface1(LPDIRECTDRAW lpdd) +{ return extFlipToGDISurface(pFlipToGDISurface1, lpdd); } +HRESULT WINAPI extFlipToGDISurface2(LPDIRECTDRAW lpdd) +{ return extFlipToGDISurface(pFlipToGDISurface2, lpdd); } +HRESULT WINAPI extFlipToGDISurface4(LPDIRECTDRAW lpdd) +{ return extFlipToGDISurface(pFlipToGDISurface4, lpdd); } +HRESULT WINAPI extFlipToGDISurface7(LPDIRECTDRAW lpdd) +{ return extFlipToGDISurface(pFlipToGDISurface7, lpdd); } + HRESULT WINAPI extGetGDISurface(GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { int res; @@ -4455,7 +4584,9 @@ HRESULT WINAPI EnumModesCallbackDumper(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l OutTrace("\tdwRefreshRate=%d\n", lpDDSurfaceDesc->dwRefreshRate); OutTrace("\tlpSurface=%x\n", lpDDSurfaceDesc->lpSurface); OutTrace("\tCaps=%x(%s)\n", lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); - OutTrace("\tddpfPixelFormat %s\n", DumpPixelFormat((LPDDSURFACEDESC2)lpDDSurfaceDesc)); + //if ((NewContext_Type *)lpContext->dxversion >= 4) { + // OutTrace("\tddpfPixelFormat %s\n", DumpPixelFormat((LPDDSURFACEDESC2)lpDDSurfaceDesc)); + //} #ifdef FULLHEXDUMP OutTrace("DDSurfaceDesc="); @@ -4471,6 +4602,7 @@ typedef struct { EnumModesCallback_Type lpCallback; DWORD dwWidth; DWORD dwHeight; + int dxversion; } NewContext_Type; static BOOL CheckResolutionLimit(LPDDSURFACEDESC lpDDSurfaceDesc) @@ -4547,20 +4679,21 @@ HRESULT WINAPI myEnumModesFilterNative(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l return res; } -HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) +HRESULT WINAPI extEnumDisplayModes(int dxversion, EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) { HRESULT res; SupportedRes_Type *SupportedRes; NewContext_Type NewContext; - OutTraceDDRAW("EnumDisplayModes(D): lpdd=%x flags=%x lpddsd=%x callback=%x\n", lpdd, dwflags, lpddsd, cb); + OutTraceDDRAW("EnumDisplayModes(D%d): lpdd=%x flags=%x lpddsd=%x callback=%x\n", dxversion, lpdd, dwflags, lpddsd, cb); if(lpddsd) OutTraceDDRAW("EnumDisplayModes(D): %s\n", LogSurfaceAttributes(lpddsd, "EnumDisplayModes", __LINE__)); if(dxw.dwFlags4 & NATIVERES){ NewContext.dwWidth = 0; NewContext.dwHeight = 0; - NewContext.lpContext=lpContext; - NewContext.lpCallback=cb; + NewContext.lpContext = lpContext; + NewContext.lpCallback = cb; + NewContext.dxversion = dxversion; res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, &NewContext, myEnumModesFilterNative); if(res) OutTraceE("EnumDisplayModes(D): ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; @@ -4579,7 +4712,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD EmuDesc.dwRefreshRate = 0; EmuDesc.ddpfPixelFormat.dwFlags = DDPF_RGB; if (lpddsd) dwSize=lpddsd->dwSize; // sizeof either DDSURFACEDESC or DDSURFACEDESC2 !!! - else dwSize=SurfaceDescrSizeD(lpdd); + else dwSize= (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); memset(&EmuDesc, 0, dwSize); EmuDesc.dwSize=dwSize; EmuDesc.dwFlags=DDSD_PIXELFORMAT|DDSD_REFRESHRATE|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH; @@ -4628,27 +4761,15 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD } HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) -{ - return extEnumDisplayModes(pEnumDisplayModes1, lpdd, dwflags, lpddsd, lpContext, cb); -} - +{ return extEnumDisplayModes(1, pEnumDisplayModes1, lpdd, dwflags, lpddsd, lpContext, cb); } +HRESULT WINAPI extEnumDisplayModes2(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) +{ return extEnumDisplayModes(2, pEnumDisplayModes2, lpdd, dwflags, lpddsd, lpContext, cb); } HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC2 lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK2 cb) -{ - return extEnumDisplayModes((EnumDisplayModes1_Type)pEnumDisplayModes4, lpdd, dwflags, (LPDDSURFACEDESC)lpddsd, lpContext, (LPDDENUMMODESCALLBACK)cb); -} +{ return extEnumDisplayModes(4, (EnumDisplayModes1_Type)pEnumDisplayModes4, lpdd, dwflags, (LPDDSURFACEDESC)lpddsd, lpContext, (LPDDENUMMODESCALLBACK)cb); } +HRESULT WINAPI extEnumDisplayModes7(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC2 lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK2 cb) +{ return extEnumDisplayModes(7, (EnumDisplayModes1_Type)pEnumDisplayModes7, lpdd, dwflags, (LPDDSURFACEDESC)lpddsd, lpContext, (LPDDENUMMODESCALLBACK)cb); } -HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE s, LPDIRECTDRAWSURFACE *sp) -{ - int res; - res=(*pDuplicateSurface)(lpdd, s, sp); - if (res) - OutTraceE("DuplicateSurface: ERROR dds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); - else - OutTraceDDRAW("DuplicateSurface: dds=%x pdds=%x\n", s, *sp); - return res; -} - -HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +HRESULT WINAPI extGetPixelFormat(GetPixelFormat_Type pGetPixelFormat, LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) { DWORD res; BOOL IsPrim; @@ -4682,7 +4803,18 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) return res; } -HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW lpdd) +HRESULT WINAPI extGetPixelFormat1(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +{ return extGetPixelFormat(pGetPixelFormat1, lpdds, p); } +HRESULT WINAPI extGetPixelFormat2(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +{ return extGetPixelFormat(pGetPixelFormat2, lpdds, p); } +HRESULT WINAPI extGetPixelFormat3(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +{ return extGetPixelFormat(pGetPixelFormat3, lpdds, p); } +HRESULT WINAPI extGetPixelFormat4(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +{ return extGetPixelFormat(pGetPixelFormat4, lpdds, p); } +HRESULT WINAPI extGetPixelFormat7(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) +{ return extGetPixelFormat(pGetPixelFormat7, lpdds, p); } + +HRESULT WINAPI extTestCooperativeLevel(TestCooperativeLevel_Type pTestCooperativeLevel, LPDIRECTDRAW lpdd) { HRESULT res; res=(*pTestCooperativeLevel)(lpdd); @@ -4695,7 +4827,12 @@ HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW lpdd) return res; } -HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) +HRESULT WINAPI extTestCooperativeLevel4(LPDIRECTDRAW lpdd) +{ return extTestCooperativeLevel(pTestCooperativeLevel4, lpdd); } +HRESULT WINAPI extTestCooperativeLevel7(LPDIRECTDRAW lpdd) +{ return extTestCooperativeLevel(pTestCooperativeLevel7, lpdd); } + +HRESULT WINAPI extReleaseS(ReleaseS_Type pReleaseS, LPDIRECTDRAWSURFACE lpdds) { HRESULT res; BOOL IsPrim; @@ -4739,6 +4876,17 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) return res; } +HRESULT WINAPI extReleaseS1(LPDIRECTDRAWSURFACE lpdds) +{ return extReleaseS(pReleaseS1, lpdds); } +HRESULT WINAPI extReleaseS2(LPDIRECTDRAWSURFACE lpdds) +{ return extReleaseS(pReleaseS2, lpdds); } +HRESULT WINAPI extReleaseS3(LPDIRECTDRAWSURFACE lpdds) +{ return extReleaseS(pReleaseS3, lpdds); } +HRESULT WINAPI extReleaseS4(LPDIRECTDRAWSURFACE lpdds) +{ return extReleaseS(pReleaseS4, lpdds); } +HRESULT WINAPI extReleaseS7(LPDIRECTDRAWSURFACE lpdds) +{ return extReleaseS(pReleaseS7, lpdds); } + HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) { HRESULT res; @@ -4758,7 +4906,7 @@ HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK return res; } -HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +HRESULT WINAPI extGetColorKey(GetColorKey_Type pGetColorKey, LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) { HRESULT res; BOOL IsPrim; @@ -4774,6 +4922,17 @@ HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK return res; } +HRESULT WINAPI extGetColorKey1(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +{ return extGetColorKey(pGetColorKey1, lpdds, flags, lpDDColorKey); } +HRESULT WINAPI extGetColorKey2(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +{ return extGetColorKey(pGetColorKey2, lpdds, flags, lpDDColorKey); } +HRESULT WINAPI extGetColorKey3(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +{ return extGetColorKey(pGetColorKey3, lpdds, flags, lpDDColorKey); } +HRESULT WINAPI extGetColorKey4(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +{ return extGetColorKey(pGetColorKey4, lpdds, flags, lpDDColorKey); } +HRESULT WINAPI extGetColorKey7(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) +{ return extGetColorKey(pGetColorKey7, lpdds, flags, lpDDColorKey); } + HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) { HRESULT res; @@ -4795,7 +4954,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte if (res) OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(lpDDSBack = dxwss.GetBackBufferSurface()){ - ddsd.dwSize=Set_dwSize_From_Surface(lpDDSBack); + ddsd.dwSize=Set_dwSize_From_Surface(); res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); if(res){ OutTraceE("EnumAttachedSurfaces: GetSurfaceDesc ERROR %x(%s)\n", @@ -4805,7 +4964,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte res=(lpEnumSurfacesCallback)(lpDDSBack, (LPDDSURFACEDESC)&ddsd, lpContext); OutTraceDW("EnumSurfacesCallback: on DDSBack res=%x(%s)\n", res, ExplainDDError(res)); } - res=0; // for Black Dahlia + res=DD_OK; // for Black Dahlia } else { res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); @@ -4815,7 +4974,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte return res; } -HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +HRESULT WINAPI extAddAttachedSurface(AddAttachedSurface_Type pAddAttachedSurface, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) { HRESULT res; BOOL IsPrim, IsBack; @@ -4836,7 +4995,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF HRESULT sdres; DDSURFACEDESC2 sd; if (res) OutTraceE("AddAttachedSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - sd.dwSize=Set_dwSize_From_Surface(lpddsadd); + sd.dwSize=Set_dwSize_From_Surface(); sdres=lpddsadd->GetSurfaceDesc((DDSURFACEDESC *)&sd); if (sdres) OutTraceE("AddAttachedSurface: GetSurfaceDesc ERROR res=%x at %d\n", sdres, __LINE__); @@ -4852,7 +5011,8 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF if (pAddRefS) (*pAddRefS)(lpdds); res=DD_OK; } - else if (IsBack) { + //else if (IsBack) { + else { // v2.02.13: emulate ZBUFFER attach to backbuffer: do nothing and return OK // this trick makes at least "Nocturne" work also in emulated mode when hardware acceleration // is set in the game "Options" menu. @@ -4868,7 +5028,18 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF return res; } -HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +HRESULT WINAPI extAddAttachedSurface1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +{ return extAddAttachedSurface(pAddAttachedSurface1, lpdds, lpddsadd); } +HRESULT WINAPI extAddAttachedSurface2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +{ return extAddAttachedSurface(pAddAttachedSurface2, lpdds, lpddsadd); } +HRESULT WINAPI extAddAttachedSurface3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +{ return extAddAttachedSurface(pAddAttachedSurface3, lpdds, lpddsadd); } +HRESULT WINAPI extAddAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +{ return extAddAttachedSurface(pAddAttachedSurface4, lpdds, lpddsadd); } +HRESULT WINAPI extAddAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) +{ return extAddAttachedSurface(pAddAttachedSurface7, lpdds, lpddsadd); } + +HRESULT WINAPI extDeleteAttachedSurface(DeleteAttachedSurface_Type pDeleteAttachedSurface, LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) { HRESULT res; OutTraceDDRAW("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); @@ -4882,6 +5053,17 @@ HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflag return res; } +HRESULT WINAPI extDeleteAttachedSurface1(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +{ return extDeleteAttachedSurface(pDeleteAttachedSurface1, lpdds, dwflags, lpddsdel); } +HRESULT WINAPI extDeleteAttachedSurface2(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +{ return extDeleteAttachedSurface(pDeleteAttachedSurface2, lpdds, dwflags, lpddsdel); } +HRESULT WINAPI extDeleteAttachedSurface3(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +{ return extDeleteAttachedSurface(pDeleteAttachedSurface3, lpdds, dwflags, lpddsdel); } +HRESULT WINAPI extDeleteAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +{ return extDeleteAttachedSurface(pDeleteAttachedSurface4, lpdds, dwflags, lpddsdel); } +HRESULT WINAPI extDeleteAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) +{ return extDeleteAttachedSurface(pDeleteAttachedSurface7, lpdds, dwflags, lpddsdel); } + HRESULT WINAPI cbDump(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) { OutTraceDW("EnumDisplayModes: CALLBACK lpdds=%x Context=%x Caps=%x(%s)\n", @@ -5020,7 +5202,7 @@ ULONG WINAPI extReleaseD4(LPDIRECTDRAW lpdd) ULONG WINAPI extReleaseD7(LPDIRECTDRAW lpdd) { return extReleaseD(7, pReleaseD7, lpdd); } -HRESULT WINAPI extCreateClipper(LPDIRECTDRAW lpdd, DWORD dwflags, +HRESULT WINAPI extCreateClipper(CreateClipper_Type pCreateClipper, LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { HRESULT res; @@ -5030,10 +5212,19 @@ HRESULT WINAPI extCreateClipper(LPDIRECTDRAW lpdd, DWORD dwflags, OutTraceE("CreateClipper: ERROR res=%x(%s)\n", lpdd, res, ExplainDDError(res)); return res; } - HookDDClipper(lplpDDClipper); + HookDDClipper(lplpDDClipper); // there is a single Clipper intrface! return res; } +HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) +{ return extCreateClipper(pCreateClipper1, lpdd, dwflags, lplpDDClipper, pUnkOuter); } +HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) +{ return extCreateClipper(pCreateClipper2, lpdd, dwflags, lplpDDClipper, pUnkOuter); } +HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) +{ return extCreateClipper(pCreateClipper4, lpdd, dwflags, lplpDDClipper, pUnkOuter); } +HRESULT WINAPI extCreateClipper7(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) +{ return extCreateClipper(pCreateClipper7, lpdd, dwflags, lplpDDClipper, pUnkOuter); } + HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER lpddClip) { ULONG ref; @@ -5106,7 +5297,7 @@ HRESULT WINAPI extSetHWnd(LPDIRECTDRAWCLIPPER lpddClip, DWORD w, HWND hwnd) return res; } -HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) +HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) { HRESULT res; BOOL IsPrim, IsBack, IsFixed; @@ -5184,67 +5375,15 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR // you shouldn't reset the value HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, lpdds, lpddsd); - //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); - if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - break; - } - OutTraceDW("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} - -HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC2); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - } - OutTraceDW("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} - +{ return extGetSurfaceDesc(1, pGetSurfaceDesc1, lpdds, lpddsd); } +HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) +{ return extGetSurfaceDesc(2, pGetSurfaceDesc2, lpdds, lpddsd); } +HRESULT WINAPI extGetSurfaceDesc3(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) +{ return extGetSurfaceDesc(3, pGetSurfaceDesc3, lpdds, lpddsd); } +HRESULT WINAPI extGetSurfaceDesc4(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd) +{ return extGetSurfaceDesc(4, (GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); } HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC2); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc7) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc7, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - } - OutTraceDW("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} +{ return extGetSurfaceDesc(7, (GetSurfaceDesc_Type)pGetSurfaceDesc7, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); } HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) { @@ -5267,7 +5406,34 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) return ref; } -BOOL FAR PASCAL DDEnumerateCallbackFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext) +BOOL FAR PASCAL DDEnumerateCallbackFilterW(GUID FAR *lpGuid, LPWSTR lpDriverDescription, LPWSTR lpDriverName, LPVOID lpContext) +{ + BOOL res; + typedef struct {LPDDENUMCALLBACKW lpCallback; LPVOID lpContext;} Context_Type; + Context_Type *p=(Context_Type *)lpContext; + OutTraceDW("DDEnumerateCallback: guid=%x DriverDescription=\"%ls\" DriverName=\"%ls\" Context=%x\n", + lpGuid, lpDriverDescription, lpDriverName, p->lpContext); + if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext); + if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; + OutTraceDW("DDEnumerateCallback: res=%x(%s)\n", res, res?"continue":"break"); + return res; +} + +BOOL FAR PASCAL DDEnumerateCallbackExFilterW(GUID FAR *lpGuid, LPWSTR lpDriverDescription, LPWSTR lpDriverName, LPVOID lpContext, HMONITOR hm) +{ + BOOL res; + typedef struct {LPDDENUMCALLBACKEXW lpCallback; LPVOID lpContext;} Context_Type; + Context_Type *p=(Context_Type *)lpContext; + OutTraceDW("DDEnumerateCallbackEx: guid=%x DriverDescription=\"%ls\" DriverName=\"%ls\" Context=%x hm=%x\n", + lpGuid, lpDriverDescription, lpDriverName, lpContext, hm); + res=TRUE; + if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext, hm); + if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; + OutTraceDW("DDEnumerateCallbackEx: res=%x(%s)\n", res, res?"continue":"break"); + return res; +} + +BOOL FAR PASCAL DDEnumerateCallbackFilterA(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext) { BOOL res; typedef struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} Context_Type; @@ -5280,7 +5446,7 @@ BOOL FAR PASCAL DDEnumerateCallbackFilter(GUID FAR *lpGuid, LPSTR lpDriverDescri return res; } -BOOL FAR PASCAL DDEnumerateCallbackExFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) +BOOL FAR PASCAL DDEnumerateCallbackExFilterA(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) { BOOL res; typedef struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} Context_Type; @@ -5294,35 +5460,70 @@ BOOL FAR PASCAL DDEnumerateCallbackExFilter(GUID FAR *lpGuid, LPSTR lpDriverDesc return res; } -HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) +HRESULT WINAPI extDirectDrawEnumerateA(LPDDENUMCALLBACKA lpCallback, LPVOID lpContext) { HRESULT ret; OutTraceDDRAW("DirectDrawEnumerate: lpCallback=%x lpContext=%x\n", lpCallback, lpContext); if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ - struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} myContext; + struct {LPDDENUMCALLBACKA lpCallback; LPVOID lpContext;} myContext; myContext.lpCallback=lpCallback; myContext.lpContext=lpContext; - ret=(*pDirectDrawEnumerate)(DDEnumerateCallbackFilter, (LPVOID)&myContext); + ret=(*pDirectDrawEnumerateA)(DDEnumerateCallbackFilterA, (LPVOID)&myContext); } else - ret=(*pDirectDrawEnumerate)(lpCallback, lpContext); + ret=(*pDirectDrawEnumerateA)(lpCallback, lpContext); if(ret) OutTraceE("DirectDrawEnumerate: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); return ret; } -HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags) +HRESULT WINAPI extDirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) +{ + HRESULT ret; + OutTraceDDRAW("DirectDrawEnumerate: lpCallback=%x lpContext=%x\n", lpCallback, lpContext); + if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ + struct {LPDDENUMCALLBACKW lpCallback; LPVOID lpContext;} myContext; + myContext.lpCallback=lpCallback; + myContext.lpContext=lpContext; + ret=(*pDirectDrawEnumerateW)(DDEnumerateCallbackFilterW, (LPVOID)&myContext); + } + else + ret=(*pDirectDrawEnumerateW)(lpCallback, lpContext); + if(ret) OutTraceE("DirectDrawEnumerate: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); + return ret; +} + +HRESULT WINAPI extDirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) { HRESULT ret; OutTraceDDRAW("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", lpCallback, lpContext, dwFlags, ExplainDDEnumerateFlags(dwFlags)); if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ - struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} myContext; + struct {LPDDENUMCALLBACKEXA lpCallback; LPVOID lpContext;} myContext; myContext.lpCallback=lpCallback; myContext.lpContext=lpContext; - ret=(*pDirectDrawEnumerateEx)(DDEnumerateCallbackExFilter, (LPVOID)&myContext, dwFlags); + ret=(*pDirectDrawEnumerateExA)(DDEnumerateCallbackExFilterA, (LPVOID)&myContext, dwFlags); } else{ - ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags); + ret=(*pDirectDrawEnumerateExA)(lpCallback, lpContext, dwFlags); + } + if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); + if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=DD_OK; + return ret; +} + +HRESULT WINAPI extDirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) +{ + HRESULT ret; + OutTraceDDRAW("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", + lpCallback, lpContext, dwFlags, ExplainDDEnumerateFlags(dwFlags)); + if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ + struct {LPDDENUMCALLBACKEXW lpCallback; LPVOID lpContext;} myContext; + myContext.lpCallback=lpCallback; + myContext.lpContext=lpContext; + ret=(*pDirectDrawEnumerateExW)(DDEnumerateCallbackExFilterW, (LPVOID)&myContext, dwFlags); + } + else{ + ret=(*pDirectDrawEnumerateExW)(lpCallback, lpContext, dwFlags); } if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=DD_OK; @@ -5371,7 +5572,7 @@ HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG return ret; } -HRESULT WINAPI extGetAvailableVidMem(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree, GetAvailableVidMem_Type pGetAvailableVidMem) +HRESULT WINAPI extGetAvailableVidMem(GetAvailableVidMem_Type pGetAvailableVidMem, LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) { HRESULT res; //const DWORD dwMaxMem = 0x7FFFF000; @@ -5428,16 +5629,14 @@ HRESULT WINAPI extGetAvailableVidMem(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPD } HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) -{ - return extGetAvailableVidMem(lpdd, lpDDSCaps, lpdwTotal, lpdwFree, pGetAvailableVidMem2); -} - +{ return extGetAvailableVidMem(pGetAvailableVidMem2, lpdd, lpDDSCaps, lpdwTotal, lpdwFree); } HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) -{ - return extGetAvailableVidMem(lpdd, lpDDSCaps, lpdwTotal, lpdwFree, pGetAvailableVidMem4); -} +{ return extGetAvailableVidMem(pGetAvailableVidMem4, lpdd, lpDDSCaps, lpdwTotal, lpdwFree); } +HRESULT WINAPI extGetAvailableVidMem7(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) +{ return extGetAvailableVidMem(pGetAvailableVidMem7, lpdd, lpDDSCaps, lpdwTotal, lpdwFree); } -HRESULT WINAPI extSetSurfaceDesc(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDDsd2, DWORD dwFlags) + +HRESULT WINAPI extSetSurfaceDesc(SetSurfaceDesc_Type pSetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDDsd2, DWORD dwFlags) { HRESULT res; OutTrace("SetSurfaceDesc: REACHED\n"); @@ -5446,6 +5645,13 @@ HRESULT WINAPI extSetSurfaceDesc(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDD return res; } +HRESULT WINAPI extSetSurfaceDesc3(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDDsd2, DWORD dwFlags) +{ return extSetSurfaceDesc(pSetSurfaceDesc3, lpdds, lpDDsd2, dwFlags); } +HRESULT WINAPI extSetSurfaceDesc4(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDDsd2, DWORD dwFlags) +{ return extSetSurfaceDesc(pSetSurfaceDesc4, lpdds, lpDDsd2, dwFlags); } +HRESULT WINAPI extSetSurfaceDesc7(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDDsd2, DWORD dwFlags) +{ return extSetSurfaceDesc(pSetSurfaceDesc7, lpdds, lpDDsd2, dwFlags); } + HRESULT WINAPI extDirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) { HRESULT res; diff --git a/dll/ddshot.cpp b/dll/ddshot.cpp index 855aba5..0f80801 100644 --- a/dll/ddshot.cpp +++ b/dll/ddshot.cpp @@ -12,9 +12,9 @@ typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); -extern Lock_Type pLock; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); -extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); +extern Lock_Type pLockMethod(); +extern Unlock4_Type pUnlockMethod(); +extern int Set_dwSize_From_Surface(); void DDrawScreenShot() { @@ -47,9 +47,9 @@ void DDrawScreenShot() if(!s) return; memset(&ddsd,0,sizeof(DDSURFACEDESC2)); - ddsd.dwSize = Set_dwSize_From_Surface(s); + ddsd.dwSize = Set_dwSize_From_Surface(); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("ScreenShot: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } @@ -126,6 +126,6 @@ void DDrawScreenShot() fclose(hf); break; } - res=(*pUnlockMethod(s))(s, NULL); + res=(*pUnlockMethod())(s, NULL); if (res) OutTraceE("ScreenShot: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index 351886c..d42e674 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -15,9 +15,9 @@ typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); -extern Lock_Type pLock; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); -extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); +extern Lock_Type pLockMethod(); +extern Unlock4_Type pUnlockMethod(); +extern int Set_dwSize_From_Surface(); #define GRIDSIZE 16 @@ -109,9 +109,9 @@ void TextureHighlight(LPDIRECTDRAWSURFACE s) int x, y, w, h; HRESULT res; memset(&ddsd,0,sizeof(DDSURFACEDESC2)); - ddsd.dwSize = Set_dwSize_From_Surface(s); + ddsd.dwSize = Set_dwSize_From_Surface(); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("TextureHigh: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } @@ -171,7 +171,7 @@ void TextureHighlight(LPDIRECTDRAWSURFACE s) break; } } - res=(*pUnlockMethod(s))(s, NULL); + res=(*pUnlockMethod())(s, NULL); if (res) OutTraceE("TextureHigh: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } @@ -198,9 +198,9 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) } memset(&ddsd,0,sizeof(DDSURFACEDESC2)); - ddsd.dwSize = Set_dwSize_From_Surface(s); + ddsd.dwSize = Set_dwSize_From_Surface(); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("TextureDump: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } @@ -294,7 +294,7 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) fclose(hf); break; } - res=(*pUnlockMethod(s))(s, NULL); + res=(*pUnlockMethod())(s, NULL); if (res) OutTraceE("TextureDump: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } @@ -305,9 +305,9 @@ static void TextureHack(LPDIRECTDRAWSURFACE s) HRESULT res; memset(&ddsd,0,sizeof(DDSURFACEDESC2)); - ddsd.dwSize = Set_dwSize_From_Surface(s); + ddsd.dwSize = Set_dwSize_From_Surface(); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("TextureHack: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } @@ -382,7 +382,7 @@ static void TextureHack(LPDIRECTDRAWSURFACE s) fclose(hf); break; } - res=(*pUnlockMethod(s))(s, NULL); + res=(*pUnlockMethod())(s, NULL); if (res) OutTraceE("TextureHack: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index 64f5595..3c61be2 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -11,8 +11,8 @@ typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); -extern Lock_Type pLock; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); +extern Lock_Type pLockMethod(); +extern Unlock4_Type pUnlockMethod(); extern DWORD PaletteEntries[256]; extern DWORD *Palette16BPP; @@ -134,7 +134,7 @@ static void SetPalette16BPP() } } -static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_8_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -148,27 +148,27 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt8_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -198,14 +198,14 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI BilinearBlt_8_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -224,27 +224,27 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l lpdestrect->bottom <<= 1; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("BilBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("BilBlt8_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("BilBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -297,14 +297,14 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, 2*w, 2*h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("BilBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("BilBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_16_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -318,27 +318,27 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt16_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -371,14 +371,14 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI Deinterlace_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI Deinterlace_16_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -392,27 +392,27 @@ static HRESULT WINAPI Deinterlace_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt16_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -472,14 +472,14 @@ static HRESULT WINAPI Deinterlace_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI BilinearBlt_16_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -498,27 +498,27 @@ static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect->bottom <<= 1; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("BilBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("BilBlt16_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("BilBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -573,14 +573,14 @@ static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, 2*w, 2*h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("BilBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("BilBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_24_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -594,27 +594,27 @@ static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt24_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt24_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt24_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -647,9 +647,9 @@ static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt24_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt24_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } @@ -657,7 +657,7 @@ static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes // note: better avoid direct blitting in case of identical color depth (e.g. EmuBlt_32_to_32, EmuBlt_16_to_16) // because it does not work between complex surfaces when DDSDCAPS_SYSTEMMEMORY is not omogeneous! -static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_32_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { DWORD x, y, w, h; @@ -671,27 +671,27 @@ static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt32_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return res; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -721,14 +721,14 @@ static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst,lpdestrect); + res=(*pUnlockMethod())(lpddsdst,lpdestrect); if (res) OutTraceE("EmuBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_8_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -742,27 +742,27 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt8_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -792,14 +792,14 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI BilinearBlt_8_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -820,9 +820,9 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l lpdestrect->bottom <<= 1; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("BilBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -830,19 +830,19 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l Melt16 = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0) ? Melt16_555 : Melt16_565; memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("BilBlt8_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("BilBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -894,14 +894,14 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, 2*w, 2*h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("BilBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("BilBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_16_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { #if 0 @@ -919,27 +919,27 @@ static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt16_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -999,14 +999,14 @@ static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI BilinearBlt_16_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -1027,9 +1027,9 @@ static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect->bottom <<= 1; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("BilBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -1037,19 +1037,19 @@ static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT Melt16 = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0) ? Melt16_555 : Melt16_565; memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("BilBlt16_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("BilBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -1102,15 +1102,15 @@ static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT if(dxw.dwFlags3 & MARKBLIT) MarkRect16((SHORT *)dest0, 2*w, 2*h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("BilBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("BilBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_24_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -1124,27 +1124,27 @@ static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt24_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt24_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt24_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -1174,14 +1174,14 @@ static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt24_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt24_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_32_to_16(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -1195,27 +1195,27 @@ static HRESULT WINAPI EmuBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes h = lpdestrect->bottom - lpdestrect->top; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("EmuBlt32_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("EmuBlt32_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("EmuBlt32_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return 0; } @@ -1245,14 +1245,14 @@ static HRESULT WINAPI EmuBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt32_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("EmuBlt32_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI BilinearBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI BilinearBlt_32_to_32(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; @@ -1271,27 +1271,27 @@ static HRESULT WINAPI BilinearBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect->bottom <<= 1; memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); - ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwSize = Set_dwSize_From_Surface(); ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; - if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod())(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("BilBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); - ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwSize = Set_dwSize_From_Surface(); ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if (lpsurface) { // already locked, just get info .... if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { OutTraceE("BilBlt32_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + (*pUnlockMethod())(lpddsdst, lpdestrect); + (*pUnlockMethod())(lpddssrc, lpsrcrect); return 0; } } else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); + if(res=(*pLockMethod())(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod())(lpddsdst,0); OutTraceE("BilBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } @@ -1347,14 +1347,14 @@ static HRESULT WINAPI BilinearBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, 2*w, 2*h, destpitch); - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + res=(*pUnlockMethod())(lpddsdst, lpdestrect); if (res) OutTraceE("BilBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + res=(*pUnlockMethod())(lpddssrc, lpsrcrect); if (res) OutTraceE("BilBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); return res; } -static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, +static HRESULT WINAPI EmuBlt_Null(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { char *sMsg="EmuBlt: undefined color depth\n"; @@ -1367,7 +1367,7 @@ static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrec // exported methods //--------------------------------------------------------------------------------------------// -void SetBltTransformations() +void SetBltTransformations(int dxversion) { pPrimaryBlt = PrimaryBlt; if(dxw.dwFlags5 & AEROBOOST) pPrimaryBlt = PrimaryStretchBlt; @@ -1376,9 +1376,9 @@ void SetBltTransformations() if(dxw.dwFlags5 & CENTERTOWIN) pPrimaryBlt = PrimaryFastBlt; if(dxw.dwFlags5 & NOBLT) pPrimaryBlt = PrimaryNoBlt; // debug opt - extern HRESULT WINAPI ColorConversionDDRAW(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); - extern HRESULT WINAPI ColorConversionGDI(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); - extern HRESULT WINAPI ColorConversionEmulated(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); + extern HRESULT WINAPI ColorConversionDDRAW(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); + extern HRESULT WINAPI ColorConversionGDI(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); + extern HRESULT WINAPI ColorConversionEmulated(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); pColorConversion = ColorConversionDDRAW; // default for no emulation mode if(dxw.dwFlags1 & EMULATESURFACE) { pColorConversion = ColorConversionEmulated; // default for emulation mode diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 5bac7aa..a2734bc 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -42,7 +42,7 @@ Preparedisasm_Type pPreparedisasm; Finishdisasm_Type pFinishdisasm; Disasm_Type pDisasm; -extern void InitScreenParameters(); +extern void InitScreenParameters(int); extern void *HotPatch(void *, const char *, void *); extern void *IATPatch(HMODULE, char *, void *, const char *, void *); extern void *IATPatchEx(HMODULE, DWORD, char *, void *, const char *, void *); @@ -1382,7 +1382,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(hMouseHook==NULL) OutTraceE("SetWindowsHookEx WH_GETMESSAGE failed: error=%d\n", GetLastError()); } - InitScreenParameters(); + InitScreenParameters(0); // still unknown if(hwnd) HookWindowProc(hwnd); // in fullscreen mode, messages seem to reach and get processed by the parent window if((!dxw.Windowize) && hwnd) HookWindowProc(dxw.hParentWnd); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 6c1b6d5..fecc483 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -9,8 +9,8 @@ #include "resource.h" #include "hddraw.h" #include "d3d9.h" -extern GetDC_Type pGetDC; -extern ReleaseDC_Type pReleaseDC; +extern GetDC_Type pGetDCMethod(); +extern ReleaseDC_Type pReleaseDC1; extern HandleDDThreadLock_Type pReleaseDDThreadLock; /* ------------------------------------------------------------------ */ @@ -963,7 +963,7 @@ void dxwCore::ScreenRefresh(void) #define DXWREFRESHINTERVAL 20 LPDIRECTDRAWSURFACE lpDDSPrim; - extern HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx); + extern HRESULT WINAPI extBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); static int t = -1; if (t == -1) @@ -975,7 +975,9 @@ void dxwCore::ScreenRefresh(void) // if not too early, refresh primary surface .... lpDDSPrim=dxwss.GetPrimarySurface(); - if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL); + extern Blt_Type pBltMethod(); + extern int lpddsHookedVersion(); + if (lpDDSPrim) extBlt(lpddsHookedVersion(), pBltMethod(), lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL); // v2.02.44 - used for what? Commenting out seems to fix the palette update glitches // and make the "Palette updates don't blit" option useless.... @@ -1309,13 +1311,13 @@ void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) { typedef HRESULT (WINAPI *GetDC_Type) (LPDIRECTDRAWSURFACE, HDC FAR *); typedef HRESULT (WINAPI *ReleaseDC_Type)(LPDIRECTDRAWSURFACE, HDC); - extern GetDC_Type pGetDC; - extern ReleaseDC_Type pReleaseDC; + extern GetDC_Type pGetDCMethod(); + extern ReleaseDC_Type pReleaseDCMethod(); if (MustShowOverlay) { HDC hdc; // the working dc int h, w; if(!lpdds) return; - if (FAILED((*pGetDC)(lpdds, &hdc))) return; + if (FAILED((*pGetDCMethod())(lpdds, &hdc))) return; w = this->GetScreenWidth(); h = this->GetScreenHeight(); if(this->dwFlags4 & BILINEAR2XFILTER) { @@ -1323,7 +1325,7 @@ void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) h <<=1; } this->ShowOverlay(hdc, w, h); - (*pReleaseDC)(lpdds, hdc); + (*pReleaseDCMethod())(lpdds, hdc); } } @@ -1674,6 +1676,7 @@ BOOL dxwCore::IsVirtual(HDC hdc) HDC dxwCore::AcquireSharedDC(HWND hwnd) { +#if 0 extern HDC hFlippedDC; LPDIRECTDRAWSURFACE lpDDSPrim; lpDDSPrim = dxwss.GetPrimarySurface(); @@ -1704,6 +1707,8 @@ HDC dxwCore::AcquireSharedDC(HWND hwnd) OutTraceDW("AcquireSharedDC: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", lpDDSPrim, hFlippedDC); return hFlippedDC; +#endif + return 0; } BOOL dxwCore::ReleaseSharedDC(HWND hwnd, HDC hDC) @@ -1713,7 +1718,7 @@ BOOL dxwCore::ReleaseSharedDC(HWND hwnd, HDC hDC) lpDDSPrim = dxwss.GetPrimarySurface(); if(!lpDDSPrim) return(TRUE); OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC); - ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC); + ret=(*pReleaseDC1)(dxwss.GetPrimarySurface(), hDC); if (!(hwnd == dxw.GethWnd())) { POINT father, child, offset; RECT rect; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 6ad431c..86db89f 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -366,6 +366,6 @@ typedef enum { GDIMODE_SHAREDDC }; -typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); +typedef HRESULT (WINAPI *ColorConversion_Type)(int, LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); extern ColorConversion_Type pColorConversion; extern void ToggleAcquiredDevices(BOOL); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 54db3fb..2286afd 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.59" +#define VERSION "2.03.60" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 57f1b563458b9ccf17a1dd33b7cc07b1373bce11..02b4b22dd059e89e237531af39e29c095782b4e2 100644 GIT binary patch delta 99391 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 + + diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 04755e2..b8b187f 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -332,11 +332,11 @@ FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule) //-------------------------------------------------------------------------------------------- extern DWORD PaletteEntries[256]; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); -extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); +extern Unlock4_Type pUnlockMethod(); +extern HRESULT WINAPI sBlt(int, Blt_Type, char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); extern GetDC_Type pGetDC; -extern ReleaseDC_Type pReleaseDC; +extern ReleaseDC_Type pReleaseDC1; //-------------------------------------------------------------------------------------------- // @@ -688,11 +688,13 @@ HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); } else{ + extern GetDC_Type pGetDCMethod(); + extern ReleaseDC_Type pReleaseDCMethod(); LPDIRECTDRAWSURFACE lpDDSPrim; lpDDSPrim = dxwss.GetPrimarySurface(); - (*pGetDC)(lpDDSPrim, &hdc); + (*pGetDCMethod())(lpDDSPrim, &hdc); ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); - (*pReleaseDC)(lpDDSPrim, hdc); + (*pReleaseDCMethod())(lpDDSPrim, hdc); } } else{ diff --git a/dll/gdiblt.cpp b/dll/gdiblt.cpp index 002be4b..77ee835 100644 --- a/dll/gdiblt.cpp +++ b/dll/gdiblt.cpp @@ -13,9 +13,9 @@ #include "dxhelper.h" #include "syslibs.h" -extern GetDC_Type pGetDC; -extern ReleaseDC_Type pReleaseDC; -extern Unlock1_Type pUnlock1; +extern GetDC_Type pGetDCMethod(); +extern ReleaseDC_Type pReleaseDCMethod(); +extern Unlock1_Type pUnlockMethod(); void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) { @@ -25,7 +25,7 @@ void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) BOOL ret; if(!s) return; // for surface color fill - res=(*pGetDC)(s, &shdc); + res=(*pGetDCMethod())(s, &shdc); if(res) { OutTrace("ddraw GetDC error lpdds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); return; @@ -54,9 +54,8 @@ void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) if(!ret) OutTrace("GDI StretchBlt error=%d\n", GetLastError()); } dxw.ShowOverlay(thdc); - res=(*pReleaseDC)(s, shdc); + res=(*pReleaseDCMethod())(s, shdc); if(res) OutTrace("ddraw ReleaseDC error lpdds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); ret=(*pGDIReleaseDC)(w, thdc); if(!ret) OutTrace("GDI ReleaseDC error=%d\n", GetLastError()); -} - +} \ No newline at end of file diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 9634d16..9da10a9 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -437,6 +437,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) SetHook((void *)(**(DWORD **)lplpdd + 0), extQueryInterfaceD3, (void **)&pQueryInterfaceD3, "QueryInterface(D3S)"); SetHook((void *)(**(DWORD **)lplpdd + 12), extEnumDevices7, (void **)&pEnumDevices7, "EnumDevices(7)"); SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateDevice7, (void **)&pCreateDevice7, "CreateDevice(D3D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 24), extEnumZBufferFormats, (void **)&pEnumZBufferFormats, "EnumZBufferFormats(D3D3)"); break; } } diff --git a/dll/hddraw.h b/dll/hddraw.h index 2958706..54e5a48 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -2,27 +2,16 @@ typedef HRESULT (WINAPI *DirectDrawCreate_Type)(GUID *, LPDIRECTDRAW *, IUnknown *); typedef HRESULT (WINAPI *DirectDrawCreateEx_Type)(GUID *, LPDIRECTDRAW *, REFIID, IUnknown *); -typedef HRESULT (WINAPI *DirectDrawEnumerate_Type)(LPDDENUMCALLBACK, LPVOID); -typedef HRESULT (WINAPI *DirectDrawEnumerateEx_Type)(LPDDENUMCALLBACKEX, LPVOID, DWORD); +typedef HRESULT (WINAPI *DirectDrawEnumerateA_Type)(LPDDENUMCALLBACKA, LPVOID); +typedef HRESULT (WINAPI *DirectDrawEnumerateExA_Type)(LPDDENUMCALLBACKEXA, LPVOID, DWORD); +typedef HRESULT (WINAPI *DirectDrawEnumerateW_Type)(LPDDENUMCALLBACKW, LPVOID); +typedef HRESULT (WINAPI *DirectDrawEnumerateExW_Type)(LPDDENUMCALLBACKEXW, LPVOID, DWORD); typedef HRESULT (WINAPI *DirectDrawCreateClipper_Type)(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown *); typedef void (WINAPI *HandleDDThreadLock_Type)(void); typedef HDC (WINAPI *GDIGetDC_Type)(HWND); typedef int (WINAPI *GDIReleaseDC_Type)(HWND, HDC); -typedef HRESULT (WINAPI *EmuBlt_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPVOID); -typedef HRESULT (WINAPI *RevBlt_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -typedef HRESULT (WINAPI *PrimaryBlt_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); - -extern EmuBlt_Type pEmuBlt; -extern RevBlt_Type pRevBlt; -extern void SetBltTransformations(); -extern HRESULT WINAPI PrimaryBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryNoBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); -extern HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); - // COM generic types typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID, LPVOID *); @@ -37,7 +26,6 @@ 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 *); 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); @@ -133,6 +121,18 @@ typedef HRESULT (WINAPI *GammaRamp_Type)(LPDIRECTDRAWSURFACE, DWORD, LPDDGAMMARA // extern procedures extern void HookTexture(LPVOID *, int); -extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); +extern int Set_dwSize_From_Surface(); +extern void SetBltTransformations(int); +extern HRESULT WINAPI PrimaryBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryNoBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryStretchBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryFastBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryBilinearBlt(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +typedef HRESULT (WINAPI *EmuBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPVOID); +typedef HRESULT (WINAPI *RevBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +typedef HRESULT (WINAPI *PrimaryBlt_Type)(int, Blt_Type, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); + +extern EmuBlt_Type pEmuBlt; +extern RevBlt_Type pRevBlt; diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 08f6bc9..5811449 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -15,8 +15,8 @@ BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE, PBOOL); LPVOID WINAPI extVirtualAlloc(LPVOID, SIZE_T, DWORD, DWORD); UINT WINAPI extWinExec(LPCSTR, UINT); -extern HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK, LPVOID); -extern HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX, LPVOID, DWORD); +extern HRESULT WINAPI extDirectDrawEnumerateA(LPDDENUMCALLBACK, LPVOID); +extern HRESULT WINAPI extDirectDrawEnumerateExA(LPDDENUMCALLBACKEX, LPVOID, DWORD); typedef LPVOID (WINAPI *VirtualAlloc_Type)(LPVOID, SIZE_T, DWORD, DWORD); typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, @@ -151,8 +151,8 @@ FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) return NULL; } -extern DirectDrawEnumerate_Type pDirectDrawEnumerate; -extern DirectDrawEnumerateEx_Type pDirectDrawEnumerateEx; +extern DirectDrawEnumerateA_Type pDirectDrawEnumerateA; +extern DirectDrawEnumerateExA_Type pDirectDrawEnumerateExA; extern void HookModule(HMODULE, int); int WINAPI extIsDebuggerPresent(void) @@ -666,26 +666,26 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) switch(idx){ case SYSLIBIDX_DIRECTDRAW: switch((DWORD)proc){ - case 0x0008: // DirectDrawCreate - pDirectDrawCreate=(DirectDrawCreate_Type)(*pGetProcAddress)(hModule, proc); - OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirectDrawCreate); - return (FARPROC)extDirectDrawCreate; - break; - case 0x000A: // DirectDrawCreateEx - pDirectDrawCreateEx=(DirectDrawCreateEx_Type)(*pGetProcAddress)(hModule, proc); - OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirectDrawCreateEx); - return (FARPROC)extDirectDrawCreateEx; - break; - case 0x000B: // DirectDrawEnumerateA - pDirectDrawEnumerate=(DirectDrawEnumerate_Type)(*pGetProcAddress)(hModule, proc); - OutTraceP("GetProcAddress: hooking proc=%s at addr=%x\n", proc, pDirectDrawEnumerate); - return (FARPROC)extDirectDrawEnumerate; - break; - case 0x000C: // DirectDrawEnumerateExA - pDirectDrawEnumerateEx=(DirectDrawEnumerateEx_Type)(*pGetProcAddress)(hModule, proc); - OutTraceP("GetProcAddress: hooking proc=%s at addr=%x\n", proc, pDirectDrawEnumerateEx); - return (FARPROC)extDirectDrawEnumerateEx; - break; + case 0x0008: // DirectDrawCreate + pDirectDrawCreate=(DirectDrawCreate_Type)(*pGetProcAddress)(hModule, proc); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirectDrawCreate); + return (FARPROC)extDirectDrawCreate; + break; + case 0x000A: // DirectDrawCreateEx + pDirectDrawCreateEx=(DirectDrawCreateEx_Type)(*pGetProcAddress)(hModule, proc); + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pDirectDrawCreateEx); + return (FARPROC)extDirectDrawCreateEx; + break; + case 0x000B: // DirectDrawEnumerateA + pDirectDrawEnumerateA=(DirectDrawEnumerateA_Type)(*pGetProcAddress)(hModule, proc); + OutTraceP("GetProcAddress: hooking proc=%s at addr=%x\n", proc, pDirectDrawEnumerateA); + return (FARPROC)extDirectDrawEnumerateA; + break; + case 0x000C: // DirectDrawEnumerateExA + pDirectDrawEnumerateExA=(DirectDrawEnumerateExA_Type)(*pGetProcAddress)(hModule, proc); + OutTraceP("GetProcAddress: hooking proc=%s at addr=%x\n", proc, pDirectDrawEnumerateExA); + return (FARPROC)extDirectDrawEnumerateExA; + break; } break; case SYSLIBIDX_USER32: diff --git a/dll/mincaps.cpp b/dll/mincaps.cpp new file mode 100644 index 0000000..d3c6060 --- /dev/null +++ b/dll/mincaps.cpp @@ -0,0 +1,270 @@ +#define _CRT_SECURE_NO_WARNINGS +#define INITGUID + +#include +#include +#include "dxwnd.h" +#include "dxhook.h" +#include "ddrawi.h" +#include "dxwcore.hpp" +#include "stdio.h" +#include "hddraw.h" +#include "dxhelper.h" +#include "syslibs.h" + +#define VIRTUAL_CAPS_VIRTUALPC TRUE + +#if 0 +typedef struct _DDCAPS_DX7 +{ +/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure +/* 4*/ DWORD dwCaps; // driver specific capabilities +/* 8*/ DWORD dwCaps2; // more driver specific capabilites +/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface +/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites +/* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities +/* 18*/ DWORD dwPalCaps; // palette capabilities +/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities +/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 +/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 +/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 +/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 +/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 +/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 +/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 +/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory +/* 40*/ DWORD dwVidMemFree; // amount of free video memory +/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays +/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays +/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes +/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment +/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size +/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment +/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size +/* 60*/ DWORD dwAlignStrideAlign; // stride alignment +/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported +/* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 +/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* a0*/ DWORD dwReserved1; // reserved +/* a4*/ DWORD dwReserved2; // reserved +/* a8*/ DWORD dwReserved3; // reserved +/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts +/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts +/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts +/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts +/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts +/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts +/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts +/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts +/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts +/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts +/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts +/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts +/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports +/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used +/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts +/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts +/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts +/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts +/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts +/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts +// Members added for DX6 release +/*16c*/ DDSCAPS2 ddsCaps; // Surface Caps +} DDCAPS_DX7; +typedef DDCAPS_DX7 FAR* LPDDCAPS_DX7; +#endif + +void SetMinimalCaps(LPDDCAPS c1, LPDDCAPS c2) +{ +#ifdef VIRTUAL_CAPS_VMWARE + if(c1){ + int dwSize = c1->dwSize; + //memset(&c1, 0, dwSize); + c1->dwSize = dwSize; + c1->dwCaps = (DDCAPS_3D|DDCAPS_BLT|DDCAPS_BLTQUEUE|DDCAPS_OVERLAY|DDCAPS_OVERLAYFOURCC|DDCAPS_OVERLAYSTRETCH|DDCAPS_COLORKEY|DDCAPS_BLTDEPTHFILL|DDCAPS_CANBLTSYSMEM); + c1->dwCaps2 = (DDCAPS2_WIDESURFACES|DDCAPS2_CANRENDERWINDOWED|DDCAPS2_FLIPNOVSYNC); + c1->dwCKeyCaps = (DDCKEYCAPS_DESTOVERLAY); + c1->dwFXCaps = (DDFXCAPS_OVERLAYSHRINKX|DDFXCAPS_OVERLAYSHRINKY|DDFXCAPS_OVERLAYSTRETCHX|DDFXCAPS_OVERLAYSTRETCHY); + c1->dwZBufferBitDepths = 0x600; + c1->dwMaxVisibleOverlays = 0x20; + for(int j=0; jdwRops[j]=0; + c1->dwRops[6] = 0x100; + if(dwSize >= (int)(0x16C)) { + c1->ddsCaps.dwCaps = 0x42727A; + c1->ddsCaps.dwCaps2 = 0x200200; + } + // c1->dwNumFourCCCodes - untouched (03 in VmWare) + } + if(c2){ + int dwSize = c2->dwSize; + //memset(&c2, 0, dwSize); + c2->dwSize = dwSize; + c2->dwCaps = (DDCAPS_3D|DDCAPS_BLT|DDCAPS_BLTSTRETCH|DDCAPS_PALETTE|DDCAPS_COLORKEY|DDCAPS_ALPHA|DDCAPS_BLTCOLORFILL|DDCAPS_BLTDEPTHFILL|DDCAPS_CANCLIP|DDCAPS_CANCLIPSTRETCHED|DDCAPS_CANBLTSYSMEM); + c2->dwCaps2 = (DDCAPS2_CERTIFIED); + c2->dwCKeyCaps =(DDCKEYCAPS_SRCBLT); + c2->dwPalCaps = 0x347; // ??? + c2->dwFXCaps = (DDFXCAPS_BLTARITHSTRETCHY|DDFXCAPS_BLTMIRRORLEFTRIGHT|DDFXCAPS_BLTMIRRORUPDOWN|DDFXCAPS_BLTSHRINKX|DDFXCAPS_BLTSHRINKXN|DDFXCAPS_BLTSHRINKY|DDFXCAPS_BLTSHRINKYN|DDFXCAPS_BLTSTRETCHX|DDFXCAPS_BLTSTRETCHXN|DDFXCAPS_BLTSTRETCHY|DDFXCAPS_BLTSTRETCHYN|DDFXCAPS_BLTALPHA|DDFXCAPS_BLTFILTER|DDFXCAPS_BLTARITHSTRETCHY); + for(int j=0; jdwRops[j]=0; + c2->dwRops[0] = 0x1; + c2->dwRops[6] = 0x100; + c2->dwRops[7] = 0x8000000; + c2->ddsOldCaps.dwCaps = 0x421350; + // VMWare specific? + c2->dwSVBCaps = 0xF4C08241; + c2->dwSVBCKeyCaps = 0x200; + c2->dwSVBFXCaps = 0x3FCE3 ; + for(int j=0; jdwSVBRops[j]=0; + c2->dwSVBRops[0] = 0x1; + c2->dwSVBRops[6] = 0x100; + c2->dwSVBRops[7] = 0x8000000; + c2->dwVSBCaps = 0xF4C08241; + c2->dwVSBCKeyCaps = 0x200; + c2->dwVSBFXCaps = 0x3FCE3; + for(int j=0; jdwVSBRops[j]=0; + c2->dwVSBRops[0] = 0x1; + c2->dwVSBRops[6] = 0x100; + c2->dwVSBRops[7] = 0x8000000; + c2->dwSSBCaps = 0xF4C08241; + c2->dwSSBFXCaps = 0x3FCE3; + for(int j=0; jdwSSBRops[j]=0; + c2->dwSSBRops[0] = 1; + c2->dwSSBRops[6] = 0x100; + c2->dwSSBRops[7] = 0x8000000; + if(dwSize > (int)0x16C) { + c2->ddsCaps.dwCaps = 0x421350; + c2->ddsCaps.dwCaps2 = 0x200; + } + } +#endif +#ifdef VIRTUAL_CAPS_VIRTUALPC +/* +CapsDump(c1:HW)= +------- 00 -------- 04 -------- 08 -------- 0c -------- +0x0000: 7C,01,00,00,C1,68,40,90,00,10,48,00,10,00,00,00, +0x0010: 00,00,A8,02,00,00,00,00,00,00,00,00,00,00,00,00, +0x0020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0030: 00,00,00,00,00,00,00,00,00,06,00,00,C0,21,55,00, +0x0040: C0,21,55,00,20,00,00,00,00,00,00,00,00,00,00,00, +0x0050: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0060: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0070: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, +0x0080: 00,00,00,00,50,02,00,00,00,00,00,00,00,00,00,00, +0x0090: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00a0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00b0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00c0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00d0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00e0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00f0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0100: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0110: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0120: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0130: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0140: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0150: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0160: 00,00,00,00,00,00,00,00,00,00,00,00,7A,72,42,00, +0x0170: 00,02,20,00,00,00,00,00,00,00,00,00, +CapsDump(c2:SW)= +------- 00 -------- 04 -------- 08 -------- 0c -------- +0x0000: 7C,01,00,00,41,82,C0,F4,01,00,00,00,00,02,00,00, +0x0010: E1,FC,03,00,00,00,00,00,47,03,00,00,00,00,00,00, +0x0020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0030: 00,00,00,00,00,00,00,00,00,04,00,00,00,00,00,00, +0x0040: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0050: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0060: 00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00, +0x0070: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, +0x0080: 00,00,00,08,50,13,42,00,00,00,00,00,00,00,00,00, +0x0090: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00a0: 00,00,00,00,00,00,00,00,00,00,00,00,41,82,C0,F4, +0x00b0: 00,02,00,00,E3,FC,03,00,01,00,00,00,00,00,00,00, +0x00c0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x00d0: 00,01,00,00,00,00,00,08,41,82,C0,F4,00,02,00,00, +0x00e0: E3,FC,03,00,01,00,00,00,00,00,00,00,00,00,00,00, +0x00f0: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, +0x0100: 00,00,00,08,41,82,C0,F4,00,02,00,00,E3,FC,03,00, +0x0110: 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0120: 00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,08, +0x0130: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0140: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0150: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +0x0160: 00,00,00,00,00,00,00,00,00,00,00,00,50,13,42,00, +0x0170: 00,02,00,00,00,00,00,00,00,00,00,00, +*/ + if(c1){ + DWORD dwSize = c1->dwSize; + DWORD dwVidMemTotal = c1->dwVidMemTotal; + DWORD dwVidMemFree = c1->dwVidMemFree; + memset((void *)c1, 0, dwSize); + c1->dwSize = dwSize; + c1->dwCaps = 0x904068c1; + c1->dwCaps2 = 0x481000; + c1->dwCKeyCaps = 0x1; + c1->dwFXCaps = 0x2a80000; + c1->dwZBufferBitDepths = 0x600; + c1->dwVidMemTotal = dwVidMemTotal; + c1->dwVidMemFree = dwVidMemFree; + c1->dwMaxVisibleOverlays = 0x20; + //for(int j=0; jdwRops[j]=0; + c1->dwRops[6] = 0x100; + c1->ddsOldCaps.dwCaps = 0x250; + if(dwSize >= (int)(0x16C)) { + c1->ddsCaps.dwCaps = 0x42727A; + c1->ddsCaps.dwCaps2 = 0x200200; + } + } + if(c2){ + int dwSize = c2->dwSize; + DWORD dwVidMemTotal = c2->dwVidMemTotal; + DWORD dwVidMemFree = c2->dwVidMemFree; + memset((void *)c2, 0, dwSize); + c2->dwSize = dwSize; + c2->dwCaps = 0xf4c08241; + c2->dwCaps2 = 0x1; + c2->dwCKeyCaps = 0x200; + c2->dwFXCaps = 0x3fce1; + c2->dwPalCaps = 0x347; + c2->dwVidMemTotal = dwVidMemTotal; + c2->dwVidMemFree = dwVidMemFree; + if(dwSize > (int)0xac){ + //for(int j=0; jdwRops[j]=0; + c2->dwRops[0] = 0x1; + c1->dwRops[6] = 0x100; + c2->dwRops[7] = 0x8000000; + c2->ddsOldCaps.dwCaps = 0x421350; + c2->dwSVBCaps = 0xF4C08241; + c2->dwSVBCKeyCaps = 0x200; + c2->dwSVBFXCaps = 0x3FCE3; + //for(int j=0; jdwSVBRops[j]=0; + c2->dwSVBRops[0] = 0x1; + c2->dwSVBRops[6] = 0x100; + c2->dwSVBRops[7] = 0x8000000; + c2->dwVSBCaps = 0xF4C08241; + c2->dwVSBCKeyCaps = 0x200; + c2->dwVSBFXCaps = 0x3FCE3; + //for(int j=0; jdwVSBRops[j]=0; + c2->dwVSBRops[0] = 0x1; + c2->dwVSBRops[6] = 0x100; + c2->dwVSBRops[7] = 0x8000000; + c2->dwSSBCaps = 0xF4C08241; + c2->dwSSBCKeyCaps = 0x200; + c2->dwSSBFXCaps = 0x3FCE3; + } + if(dwSize > (int)0x13c) { + //for(int j=0; jdwSSBRops[j]=0; + c2->dwSSBRops[0] = 1; + c2->dwSSBRops[6] = 0x100; + c2->dwSSBRops[7] = 0x8000000; + } + if(dwSize > (int)0x16C) { + c2->ddsCaps.dwCaps = 0x421350; + c2->ddsCaps.dwCaps2 = 0x200; + } + } +#endif +} diff --git a/dll/shareddc.cpp b/dll/shareddc.cpp index d2e91a7..606a3cd 100644 --- a/dll/shareddc.cpp +++ b/dll/shareddc.cpp @@ -18,10 +18,9 @@ #define _Warn(s) #endif - -extern ReleaseDC_Type pReleaseDC; extern HandleDDThreadLock_Type pReleaseDDThreadLock; -extern GetDC_Type pGetDC; +extern GetDC_Type pGetDCMethod(); +extern ReleaseDC_Type pReleaseDCMethod(); /*---------------------------------------------------------------------------------+ | | @@ -56,8 +55,6 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) { HRESULT res; extern HandleDDThreadLock_Type pReleaseDDThreadLock; - extern GetDC_Type pGetDC; - extern ReleaseDC_Type pReleaseDC; extern void *lpD3DActiveDevice; OutTraceB("dxwSDC::GetPrimaryDC: hdc=%x\n", hdc); @@ -67,12 +64,12 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) lpDDSPrimary = dxwss.GetPrimarySurface(); if (lpDDSPrimary) { if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); - res=((*pGetDC)(lpDDSPrimary, &PrimaryDC)); + res=((*pGetDCMethod())(lpDDSPrimary, &PrimaryDC)); while((PrimaryDC == NULL) && lpDDSPrimary) { OutTraceB("dxwSDC::GetPrimaryDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrimary); dxwss.UnrefSurface(lpDDSPrimary); lpDDSPrimary = dxwss.GetPrimarySurface(); - if (lpDDSPrimary) (*pGetDC)(lpDDSPrimary, &PrimaryDC); + if (lpDDSPrimary) (*pGetDCMethod())(lpDDSPrimary, &PrimaryDC); } if (!PrimaryDC) { _Warn("No primary DC"); @@ -219,7 +216,6 @@ HDC dxwSDC::GetHdc(void) BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int nDestWidth, int nDestHeight) { - extern ReleaseDC_Type pReleaseDC; extern Unlock1_Type pUnlock1; BOOL ret; HRESULT res; @@ -250,7 +246,7 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int if(!ret || (ret==GDI_ERROR)) { OutTraceE("dxwSDC::PutPrimaryDC: BitBlt ERROR ret=%x err=%d\n", ret, GetLastError()); } - res=(*pReleaseDC)(lpDDSPrimary, PrimaryDC); + res=(*pReleaseDCMethod())(lpDDSPrimary, PrimaryDC); if(res){ OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR res=%x\n", res); } @@ -284,7 +280,7 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int else { switch(VirtualSurfaceType){ case VIRTUAL_ON_DDRAW: - res=(*pReleaseDC)(lpDDSPrimary, PrimaryDC); + res=(*pReleaseDCMethod())(lpDDSPrimary, PrimaryDC); if(res){ OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR res=%x\n", res); } diff --git a/dll/user32.cpp b/dll/user32.cpp index 316794c..7b01ab2 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -108,10 +108,10 @@ static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, "UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, //{HOOK_IAT_CANDIDATE, 0, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement}, //{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement}, - {HOOK_HOT_CANDIDATE, 0, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA}, - {HOOK_HOT_CANDIDATE, 0, "ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA}, - {HOOK_HOT_CANDIDATE, 0, "ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor - {HOOK_HOT_CANDIDATE, 0, "ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW}, + {HOOK_HOT_CANDIDATE, 0x25, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA}, + {HOOK_HOT_CANDIDATE, 0x26, "ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA}, + {HOOK_HOT_CANDIDATE, 0x28, "ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor + {HOOK_HOT_CANDIDATE, 0x27, "ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW}, {HOOK_HOT_CANDIDATE, 0, "GetMonitorInfoA", (FARPROC)GetMonitorInfoA, (FARPROC *)&pGetMonitorInfoA, (FARPROC)extGetMonitorInfoA}, {HOOK_HOT_CANDIDATE, 0, "GetMonitorInfoW", (FARPROC)GetMonitorInfoW, (FARPROC *)&pGetMonitorInfoW, (FARPROC)extGetMonitorInfoW}, {HOOK_HOT_CANDIDATE, 0, "ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor}, @@ -359,9 +359,9 @@ RECT ClipRegion; int LastCurPosX, LastCurPosY; extern GetDC_Type pGetDC; -extern ReleaseDC_Type pReleaseDC; +extern ReleaseDC_Type pReleaseDC1; //extern void FixWindowFrame(HWND); -extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); +extern HRESULT WINAPI sBlt(int, Blt_Type, char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode, DWORD dwflags) { diff --git a/host/TabDebug.cpp b/host/TabDebug.cpp index d99d990..945cad2 100644 --- a/host/TabDebug.cpp +++ b/host/TabDebug.cpp @@ -47,6 +47,8 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_HOTPATCHALWAYS, cTarget->m_HotPatchAlways); DDX_Check(pDX, IDC_FREEZEINJECTEDSON, cTarget->m_FreezeInjectedSon); DDX_Check(pDX, IDC_STRESSRESOURCES, cTarget->m_StressResources); + DDX_Check(pDX, IDC_FULLRECTBLT, cTarget->m_FullRectBlt); + DDX_Check(pDX, IDC_CENTERTOWIN, cTarget->m_CenterToWin); // DDX_Check(pDX, IDC_NOSYSTEMMEMORY, cTarget->m_NoSystemMemory); } diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index 307c4a8..fbe3e0c 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -33,8 +33,6 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOPOWER2FIX, cTarget->m_NoPower2Fix); DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); - DDX_Check(pDX, IDC_FORCESHEL, cTarget->m_ForcesHEL); - DDX_Check(pDX, IDC_SETZBUFFERBITDEPTHS, cTarget->m_SetZBufferBitDepths); // Ddraw tweaks DDX_Check(pDX, IDC_NOSYSMEMPRIMARY, cTarget->m_NoSysMemPrimary); @@ -43,8 +41,9 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_POWER2WIDTH, cTarget->m_Power2Width); DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); - DDX_Check(pDX, IDC_FULLRECTBLT, cTarget->m_FullRectBlt); - DDX_Check(pDX, IDC_CENTERTOWIN, cTarget->m_CenterToWin); + DDX_Check(pDX, IDC_FORCESHEL, cTarget->m_ForcesHEL); + DDX_Check(pDX, IDC_MINIMALCAPS, cTarget->m_MinimalCaps); + DDX_Check(pDX, IDC_SETZBUFFERBITDEPTHS, cTarget->m_SetZBufferBitDepths); DDX_Check(pDX, IDC_DEINTERLACE, cTarget->m_Deinterlace); DDX_Check(pDX, IDC_LIMITDDRAW, cTarget->m_LimitDdraw); DDX_CBIndex(pDX, IDC_DDWAWLIMITCOMBO, cTarget->m_MaxDdrawInterface); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index af883d7..7cf90e4 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -67,6 +67,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoImagehlp = FALSE; m_ReplacePrivOps = FALSE; m_ForcesHEL = FALSE; + m_MinimalCaps = FALSE; m_SetZBufferBitDepths = FALSE; m_ForcesSwapEffect = FALSE; m_ColorFix = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index f0c3c5d..f1fe685 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -206,6 +206,7 @@ public: BOOL m_DisableDisableAltTab; BOOL m_NoImagehlp; BOOL m_ForcesHEL; + BOOL m_MinimalCaps; BOOL m_SetZBufferBitDepths; BOOL m_ForcesSwapEffect; BOOL m_ColorFix; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 7ec552da0230139d87fdeedc9eedd232d269d858..889b458646e31a28111b39f042e7183142b3289f 100644 GIT binary patch delta 10741 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 KiS4*Y(*7^(`^E79 delta 10853 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 diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index d5205e974c8377a619df4475a8dbc5171bb29632..b20a23d1a40fc7b52e497535cf67f44be0771769 100644 GIT binary patch delta 222 zcmezJfo;Jjwhb~&ldrHW*}RX*Z}wz?zbuR-H;8C;VCqF6Q`T3yD- zY{FnP*?Mg@kT#sWa&774I8Khq3BQ#lEBxay%w@=A$OGbBhD3%O1_g#>AYH&v%%H@e z!{Eu_!r;sh&)^GW`2n#ngCm2_j3+NF(A;dZ?qAnrzE-Wtcj~w%E3N8cG@HD3)m3&2pateY2Q4g6+#X=b QXi+!WLx0J1tsRVB00)Ll6#xJL delta 157 zcmZ4RiS5e=whb~&)19_4F4}y6$!|8hF@p|+1%uJ#`i0h$19~|o`>n~Ep2EXe!wZtI zWH14eh75+27w!<9ysunov){ZKT$AtBaZN9>VC-Tvnf}*;@hZC+P?0%M5o4+O<`*j} z7=eZwfQ+5|agyZZhE;ydMhupdFRm(`{LEKwv%}hdU6VP!if#X8$!JjrcFFW>I~ctH D@r5~j diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index f744f16c503fb045710d8487458fcc1b4f128f73..9dc2637fd92038eaa88b9d475fe32a534274100a 100644 GIT binary patch delta 5118 zcmds*dr;KZ6~}*P*@Xo(0xql|F3ZYGqXYyI#o(eOLE?j`Rja`AhFCQ=l8hSDMPnzE zIBA62aPu&h7$=j)Oo~|@l1WF&%i25|NKMj7jS{s)!Kg{w_-KTF&vFp*m`0QSgKuH*M$6O|*e^qo(EEEcBQErv?h45ag+ z5#QqxNZ;tYcEhbEH77LPS0A2c;Rf`+5=vHoib@Jyg$yWf+->Bm{-|HlXw}tf^F3kr zm`u0E`L0H9B1>O?f4`wNj`dQZx-xdRs)-F(Cu2)hdt8>!J+8r|N@Ancqt0Y1Re1+j zs$yq?dg|2})#0p*pHMZUIDf;kwN=IUPVuB=c(T$w71j0S#dUYBuTRZNt4LQ{Vq*d( zRn73Z;~x)=yJGV91>G^SpN_V0%)z56q8~669Z7~ z+iliwU<3j9j%`03YVl-ddDg3To%8bJ?V;M_A*X-nodskM!WOH^N9J%d z7-qlEwP)7|i@%eqy)|d|z5wT9RA_=yAv0uw0-?A7!{Dh=&iyZ{Z6A$kTo>DPAa=x4 zcr+L4fKro#wxP!ZZ}i$clwYb(}F#>#3;uEpamJucm`kWy4pmqR`O!BhN_1YSVLdko*Ej+X+0dGT2ND*b4Vbtjhb176qqqepCv zJCXPh`ZIKr9~6C*Z94_yH1s#98wy9?)XtBdx7>+|sMg^zbfaY~xI=CHxG<2)Kx_Rp z&m8%W&f&j#=zbf}7Pg4*>-BKOhq5OS{eUHRm8lVuIc|J$~E~6QC5@Ick7j?7bdsZ06VZ08T7ygZ5`SwV@ z3&Yq&VK$55_3s2H3Ps8*JpnQA4rUXD%@XDUa|l(?gzXZR0QMVUZNkQ( zed85@y#l#&-@+b?xKEfH_BqKH6*$mA2bdi;hh$+qGbzHdh4J(0!e$6d2Fqc_^FLc) z66`q)5ekKIuWuK&Xc${8Y}qijTv)L%UWyW7n}_AQU)WB>UY_b$=xKq6B_mJuAB1%a zbAo*#EF@@P7I?&=usKW;77u%}um!@#gDn)cUKq-Hje3EP3FL;Gg*_{bE8HV&zpzBG z1Hw9lrGj+|i?j}Okn=^s=8!3j>znFlw_qIv@>I{1jCsPi*RzEc2;&aU6}EhU`MjS~ zkm|DA)Iocg+8djs-sp`|U1yxZOOV+F*)7SwPzsjKJasyEH)fdxpO3{soEoXf9!@HH%91!SmE zJ&A)SR-h_6e^HyOe&k-`vo6luH>)p3wM??<))D*xzCE z*1If>?}e*S81ye;T(%$b-&{y=nxBt^cwR$7kLMKg6+C57o7b!4UK+Uuf~`mG#F)uk>5`D|f{_a;SZ0 z6FHfwTc?m!%}Fb!K%G}giF(Hpnu67J=^Yi6pd0E?A>SylQQ?H<8nUUrt|%3jZl*MK z;`mCG_2*4e=TFpOy~fbI;Y;X3!$UV!;(v4fF3_*%pd+m%G(xp>HK>!vU81*pW(Os7BG z>vpK7^A2sQB$sZ_!NlzDYkw|;Eb8kXhyFH)Ty5@A)Ii?RvI4z`u?T*b;GD2gvQl=W z!}uXWq%d|{ql7tx@$)!g6NK@xJP9^$x3pnw3T(Kzdi;FywjB&7Q<%3(9>*i=MA#f^ zg}GqYiG4p}-Yo2^Ofx)ibE=Jc>@6M&7vs6$UCze?cbyq`cQV9*y&Yx~Am$tj_^@Mm zBgD=Y2ln5YapNTrhjNG+hYBbKdIDm`F8h-Zhush}er@(Z9DWBeV=cu`I^t!BIh|>^ z4WktXhqndt9dQcwG{mQcappV|{3yh;5py~RI!w(TZ03#viqfgG@WZc5+tTqgag-O2 zjW;B(2lkt=Ij|$l<@scG!sbvZtQ2;Yuufq~U>^$mt1vEeOxST@POuZgP6f!!@={VaHkl|%7oPj}SHh6$WHnv--Ud?0A8^qXUESG9ey?nAeXlhS9M3yp9^iX28bCjCsS@ zQrJA5CBk_2J+R{tmknd9U>Aa|4aWB2Mx2lV$YHBwoCx~?VGjx8PCP8^kT5R)N7yS6 zzaz{EyIt~qCX6@YabYKg-Bbm5O5hiR5bTVwbHmt|!oCv59sF9@H^O-4E(x0*B4>&E z{6w6dT}LzYJLMG7)DxmwU$E-UGwGz->RzIMolC3R94jc5zW4EG|KZ7hCqBum+q`bt z5~RLPap_hMnb~nzp&H(=q1*I64=uFRp%XE>q=4?=dqD3fqZplEfXjYPTI~Pkm&{P- z&qk>C)`zIBUNc{dKXQFqrlZ+Ks@!)|Tj~O8qS2K&IWzFFIP{S?UsDxsDSTU5+o*{8 zN%!AD@qBAVX?Fo`({>lS`hR=>X7eD;>~PrH8kW<0rthuy^~)FE`7|_FDZ0o_5&HRA zbeM|NmV{|~T?sj;N_XB&CCc%NmGYH44PHnw<-#u;@*J+$*Z4v*_QJKDE8)AqVOhpI zCU?m3(e6?*`(1{0_l2p{o>cX4MuZNTOW&xDB&)WTQO%&snxMnVDQs|CW&H;~lNRZ5 z<+S|=ZsgDhHx=prQu;ARb8jRq9vD&u+!wqw4k}Yyw%w+VJP@NhDlmuULRzb_&1@J) zX9X=&?!7h5RdBghtGt%QdUGYblJ=~%$cY_S%g#?W`$D!Lem8D_$9!n~?Udp7=!&Xo zrfR=;o@Ejq-HYOPHP^xclz#xgo!%Egc|2_cJ>`F}&_XUb=wLW*4krIuJ%t1@fRzX1;O2#5dx delta 2895 zcmb_e4Nz3q6~1Tpy=7M@KigGSSe7TSh!J-dT#+aPyMl>}5z$a3^0y1iKMJm!21qBY zq>a;Po8U2XZGH%$rsE`;4CKXb(l~~;+S;@cnlUxwWG3n`4r)T|OeW15WP9F%ZJcQ` zWTyAcH}Agl?s@0jbG~!#3w$I7&Wj@*f~M;)dA~aIr0f%Zsg6JTP(w%jk(m1*@5@;G z2Xjm@ZqwS(p}mTdq`}GSdMwmwq8V#ve&%8ItXkfx>k-!^Gsf}=%6R`(yZ-ap>97I- z#&jf0C9M6%J4J4mZ^z!J!aoW*vOmElDh7B(Gi2h#k_@uoW1XyxQ~<+Eeg=9Rm@?q| zQZ(*7kc1Pa1bIAhg-SJOl5Z{T1u<8}*hkot+y`+ON*<;K@px=16Q476%8rzP3Kym1 z;U^;w8}&o^2Y}!qwx%1FV@vJ`aN$P9gBWu zJETD_|A7luVSKYzP?n*oISY3b-jwYxABxshw{-6FTRYoxaoK@;V%FFrsu7_a9s#v9 zOByP&W+ey&k)R=@su|PL9i=y4)7fc~K!Vu;&&tCmOfia*i)6|jvrb5T56(aQi0(TG zI|-G9hX}g}RfK9n4WX7$M{pB7gnB{)!Aoc)G!dE!EreD=8=;-hLD)^$L+B)Q5%v-l zHM03+8bCKXPg;0|0}R~k22J8>wu*JIR<@hqXI{E|#L!33`A#}sdHf04aVh}Nb+^*+ znDDK7FrF-YVEn*`(zt}Deqq3i_f;-d5jXD8LroJ8xhLTMuYQ;)(i6ou%-A|s%}Q7| z+sXDYFT&^+x$MlB0#G(qWA}TN175o<{Pm<7{CE5Et&Z&fJXQDE$l2uz6#)mXrSp** z$inhjGaes*P6LY7R-TXqD>YFRE<4~YXNEjD@uXUJke&}ILC2i)>;J<{^q)UF;5A_R zhxy9w`45ldX~8BY(?U1){G$|$qjNMB^i&dsy%#dje8HlK#CK_nwb*l^R0GZA%kGFx z@#o6-<QqwS9h)&^a|2nupSj5L+z?qlZRfjJP;C|LdAOsaa9)S8;;6a& zE6FIKxiU)UWhpe@JTI$KWSA4mft7r;6)Y%SFQ9F8@M9jx$FG)~(Qu;zg-|{B*TFh0 z4C(Q2`xbG>77*Yk2wx;0{`9n{B(`lXu^TDK{S0q?>e8?lveP&h`%NV7#gNm2gP&P6 z;HEcCkvF>A%H|Z{Q`aot4CYPnEsS@3zZO!s!35dp)=JQ}FfD{*i+M~E7-+XGICZlU zIG(G)ZZ zkRfn~4#s{H3qX#V`EV_mPYi-p1+$}`)$m&Z90L4!ffk(aEatCi!H82m**G+9!>g9~ zIEo?_^_}vz28(p?dl5I>()0L6V(iB^V)4pM65rki=3s3c)C1qp2)P*R)2i>K1QgX5 z2OS9zh>w1lT2cd}R>#arOT(^51$2CE!;x3Cu#{M=NMg{sQi3R|0}EaXmN);DA7ss8BA6bk}ot zBMAJg3rxJfnZECKLAJ8c6sgVLCddj}-Jk`CH1oaqw5FzYQ)ItJAdS8 zaAGu;4|zbq{&2p+27|(L(DIi&P=k(1FE=+p21Ykkz5FR>AxN4U?; z9*|%a?`wu_P>Rmnd$G4(Pi*Wgf-Q77(!nvR7oB8-YJaFxsWJX#3)PZBQeNFg45rem rr9TQfp|R|YkvrOHR|-4IX6*c28~trC^juF-nrAjYw}}+KGhqJ)hf0}3 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index ef7d000..c6af53e 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -324,6 +324,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_DisableDisableAltTab) t->flags7 |= DISABLEDISABLEALTTAB; if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; + if(dlg->m_MinimalCaps) t->flags3 |= MINIMALCAPS; if(dlg->m_SetZBufferBitDepths) t->flags6 |= SETZBUFFERBITDEPTHS; if(dlg->m_ForcesSwapEffect) t->flags6 |= FORCESWAPEFFECT; if(dlg->m_ColorFix) t->flags3 |= COLORFIX; @@ -558,6 +559,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DisableDisableAltTab = t->flags7 & DISABLEDISABLEALTTAB ? 1 : 0; dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; + dlg->m_MinimalCaps = t->flags3 & MINIMALCAPS ? 1 : 0; dlg->m_SetZBufferBitDepths = t->flags6 & SETZBUFFERBITDEPTHS ? 1 : 0; dlg->m_ForcesSwapEffect = t->flags6 & FORCESWAPEFFECT ? 1 : 0; dlg->m_ColorFix = t->flags3 & COLORFIX ? 1 : 0; diff --git a/host/host.aps b/host/host.aps index 99d099a12ca7198fa27623691e2dfa84d9f03b4a..9093099c47747cf6329b22de8cbe592d115181fa 100644 GIT binary patch delta 53 zcmbR6nP~zLDKP3zR5X(@Gl)-0ElG^Y$S*F@Gc!msgs_T|85kHg7FVug)ZP4c-C`~P D`1BJX delta 53 zcmbR6nP~zLDKHvLR5X(@wTw?nElG^Y$S*F@%gE2qE=f#+aEg*Q7FVugG}!!h-C`~P D9Iq7} diff --git a/host/resource b/host/resource index d909a8aa5de810608f4fdc6e1d07194e476a8ab1..85860337cc9de1bb3bd809b70b9f489526e4672d 100644 GIT binary patch delta 52 zcmX@HjcLhtrVUMwg1!u%41PfD%izf1!{E%|IC-Lk`s6rAw#g~e#U>l@aZH{k$+o$} H@jxU1og)wG delta 14 WcmZ3oo$16jrVUMwo9{Uuiv$2RVh2J1