mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_02_98_src
Former-commit-id: 3326bef534445098448e95fb4284e63e33a11192
This commit is contained in:
parent
bde179852c
commit
a41301f863
@ -157,6 +157,7 @@
|
||||
#define QUARTERBLT 0x00000100 // Consider a screen update (to count or limit FPS) only blt operations bigger than a quarter of the whole primary surface
|
||||
#define NOIMAGEHLP 0x00000200 // Interceptd Imagehlp.dll unsupported calls (used by "the 5th element")
|
||||
#define BILINEARFILTER 0x00000400 // experimental bilinear filtering
|
||||
#define REPLACEPRIVOPS 0x00000800 // replace privileged opcodes, such as IN (Ubik)
|
||||
|
||||
// logging Tflags DWORD:
|
||||
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:441255a55dfe46ee221c48c22ab6f091ee7d0c851e900abe2d866e2837580db1
|
||||
oid sha256:3c96c942826339906499d13f0a0b4bfe56365ca9bb956d61968865eea475e83d
|
||||
size 132608
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aff84e4a82ca05d2e25f680d370216a871fa466b01525e1aa60d66e895fcdead
|
||||
oid sha256:4afa46ffdb77508826da9be40dfb13fbbe6fddfb268c477d8189fba258280b58
|
||||
size 139264
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:31953821448e01fefdb6409799a8dac114cf7ef92cfa4f5b009559403e20a7b9
|
||||
size 141312
|
||||
oid sha256:15292e556b28f6c70341556e7e982256f6913f907f8cb970b9bbad6ea9e900fd
|
||||
size 141824
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5440c78286a678a28b71b54f938b0ff377b7811d6601f3d5b00aaffc39d7811a
|
||||
size 531968
|
||||
oid sha256:66fc7e3018d4d23c86d3c1c2bd2059713c55356b6c547891c0b05a3ec37bbbbf
|
||||
size 532992
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:155274eb76f293c76375ddbf6fb233076d82307a6afd440a11417e3673ece4ad
|
||||
size 559104
|
||||
oid sha256:398e28489fc7d5eff0a809c8248039a3cd69ac3cee7e64f9931092bbec27416a
|
||||
size 559616
|
||||
|
28
build/exports/Area 51.dxw
Normal file
28
build/exports/Area 51.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Area 51
|
||||
path0=D:\Games\Area 51\area51.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217763
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=8320
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
28
build/exports/Black Thorn (emulated).dxw
Normal file
28
build/exports/Black Thorn (emulated).dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Black Thorn
|
||||
path0=D:\Games\Black Thorn\BlackThorn.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=671105062
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4325380
|
||||
flagj0=128
|
||||
tflag0=6210
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -5,10 +5,10 @@ module0=
|
||||
opengllib0=
|
||||
ver0=7
|
||||
coord0=0
|
||||
flag0=155205668
|
||||
flag0=140525606
|
||||
flagg0=1207959568
|
||||
flagh0=20
|
||||
flagi0=292
|
||||
flagi0=4194596
|
||||
tflag0=258
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -22,3 +22,7 @@ sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
winver0=0
|
||||
maxres0=0
|
||||
|
@ -5,10 +5,10 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136315424
|
||||
flag0=134218272
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
flagi0=4194308
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
@ -5,11 +5,11 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314915
|
||||
flag0=134217763
|
||||
flagg0=1476395008
|
||||
flagh0=65556
|
||||
flagi0=4
|
||||
tflag0=2049
|
||||
flagi0=4194308
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
28
build/exports/Deadlock II.dxw
Normal file
28
build/exports/Deadlock II.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Deadlock II
|
||||
path0=D:\Games\deadlock2\DEADLOCK.EXE
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=7
|
||||
coord0=0
|
||||
flag0=-2013265886
|
||||
flagg0=1209008128
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=128
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
28
build/exports/Die Hard Nakatomi Plaza.dxw
Normal file
28
build/exports/Die Hard Nakatomi Plaza.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Die Hard Nakatomi Plaza
|
||||
path0=D:\Games\die hard nakatomi plaza\Lithtech.exe
|
||||
launchpath0=D:\Games\die hard nakatomi plaza\Nakatomi.exe
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=671096866
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=8328
|
||||
tflag0=6403
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -5,11 +5,11 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=16418
|
||||
flagg0=708837376
|
||||
flag0=134234146
|
||||
flagg0=1782579200
|
||||
flagh0=20
|
||||
flagi0=4194304
|
||||
tflag0=263
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -25,3 +25,4 @@ initts0=0
|
||||
launchpath0=
|
||||
winver0=0
|
||||
maxres0=0
|
||||
flagj0=128
|
||||
|
@ -5,10 +5,10 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=151011364
|
||||
flag0=134234150
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
flagi0=4194436
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
28
build/exports/Force 21.dxw
Normal file
28
build/exports/Force 21.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Force 21
|
||||
path0=D:\Games\Force 21\Force21.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136331298
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=8320
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -5,11 +5,11 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314914
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=-2147483628
|
||||
flagi0=4
|
||||
tflag0=6227
|
||||
flagi0=4194308
|
||||
tflag0=64
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
28
build/exports/Icewind Dale II.dxw
Normal file
28
build/exports/Icewind Dale II.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Icewind Dale II
|
||||
path0=D:\Games\DnDMC\Icewind Dale II\IWD2.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138543108
|
||||
flagj0=8320
|
||||
tflag0=129
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
28
build/exports/Icewind Dale.dxw
Normal file
28
build/exports/Icewind Dale.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Icewind Dale
|
||||
path0=D:\Games\DnDMC\Icewind Dale\IDMain.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138543108
|
||||
flagj0=8320
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -5,10 +5,10 @@ module0=
|
||||
opengllib0=
|
||||
ver0=7
|
||||
coord0=0
|
||||
flag0=150994976
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
flagi0=4194308
|
||||
tflag0=1024
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
@ -5,11 +5,11 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=404766753
|
||||
flag0=402669603
|
||||
flagg0=1207959552
|
||||
flagh0=6291540
|
||||
flagi0=0
|
||||
tflag0=6419
|
||||
flagh0=6291476
|
||||
flagi0=4194304
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -22,3 +22,7 @@ sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
winver0=0
|
||||
maxres0=0
|
||||
|
28
build/exports/Panzer General 3 Scorched Earth.dxw
Normal file
28
build/exports/Panzer General 3 Scorched Earth.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Panzer General 3 Scorched Earth
|
||||
path0=D:\Games\Panzer_General_3\PG3.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=671088674
|
||||
flagg0=1207975936
|
||||
flagh0=2097172
|
||||
flagi0=138412036
|
||||
flagj0=8328
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -6,7 +6,7 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-1468006112
|
||||
flag0=-1468006366
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
@ -25,3 +25,4 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
flagj0=128
|
||||
|
28
build/exports/Risk II (Hasbro).dxw
Normal file
28
build/exports/Risk II (Hasbro).dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=Risk II (Hasbro)
|
||||
path0=D:\Games\Risk 2\RISKII.EXE
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=128
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -8,7 +8,7 @@ coord0=0
|
||||
flag0=-1476394974
|
||||
flagg0=1207959618
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
flagi0=4194308
|
||||
tflag0=64
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -24,3 +24,5 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
launchpath0=
|
||||
flagj0=128
|
||||
|
@ -6,7 +6,7 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=150994976
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
@ -25,3 +25,4 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
flagj0=128
|
||||
|
@ -1,5 +1,5 @@
|
||||
[window]
|
||||
posx=1182
|
||||
posy=638
|
||||
sizx=320
|
||||
sizy=200
|
||||
posx=1122
|
||||
posy=297
|
||||
sizx=365
|
||||
sizy=298
|
||||
|
28
build/exports/eXpendable.dxw
Normal file
28
build/exports/eXpendable.dxw
Normal file
@ -0,0 +1,28 @@
|
||||
[target]
|
||||
title0=eXpendable
|
||||
path0=D:\Games\eXpendable\go.exe
|
||||
launchpath0=D:\Games\eXpendable\Expendable.exe
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217762
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=134217732
|
||||
flagj0=8320
|
||||
tflag0=129
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
@ -636,3 +636,10 @@ fix: revised FPS control to assure more stable fps when a FPS limit delay is set
|
||||
v2.02.97
|
||||
fix: mouse black trails in "Deadlock II"
|
||||
fix: missing default value for filter mode
|
||||
|
||||
v2.02.98
|
||||
fix: better ddraw surface handling - now "Darkened Skye" runs in emulated surface mode with perfect colors
|
||||
fix: fixed RDTSC opcode search loop - fixed time stretching for "Ubik"
|
||||
add: added "Peplace privileged opcodes" flag - makes unpatched "Ubik" run
|
||||
fix: revised ddsurface capabilities policy to allow D3D1-7 games to run in emulated mode and bilinear filtering
|
||||
|
||||
|
456
dll/ddraw.cpp
456
dll/ddraw.cpp
@ -435,8 +435,10 @@ static void LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line)
|
||||
if (lpddsd->dwFlags & DDSD_ALPHABITDEPTH) OutTrace(" AlphaBitDepth=%d", lpddsd->dwAlphaBitDepth);
|
||||
if (lpddsd->dwFlags & DDSD_REFRESHRATE) OutTrace(" RefreshRate=%d", lpddsd->dwRefreshRate);
|
||||
if (lpddsd->dwFlags & DDSD_LINEARSIZE) OutTrace(" LinearSize=%d", lpddsd->dwLinearSize);
|
||||
//if (lpddsd->dwFlags & DDSD_TEXTURESTAGE) OutTrace(" TextureStage=%x", lpddsd->dwTextureStage);
|
||||
//if (lpddsd->dwFlags & DDSD_FVF) OutTrace(" FVF=%x", lpddsd->dwFVF);
|
||||
if (lpddsd->dwSize == sizeof(DDSURFACEDESC2)){
|
||||
if (lpddsd->dwFlags & DDSD_TEXTURESTAGE) OutTrace(" TextureStage=%x", ((LPDDSURFACEDESC2)lpddsd)->dwTextureStage);
|
||||
if (lpddsd->dwFlags & DDSD_FVF) OutTrace(" FVF=%x", ((LPDDSURFACEDESC2)lpddsd)->dwFVF);
|
||||
}
|
||||
|
||||
OutTrace("\n");
|
||||
}
|
||||
@ -2050,339 +2052,54 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
|
||||
|
||||
return res;
|
||||
}
|
||||
#ifdef DXWND_ANALYTICMODE
|
||||
#define FIX_FLAGSMASK (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_ZBUFFERBITDEPTH|DDSD_TEXTURESTAGE)
|
||||
|
||||
void FixSurfaceCapsAnalytic(LPDDSURFACEDESC2 lpddsd, int dxversion)
|
||||
{
|
||||
switch (lpddsd->dwFlags & FIX_FLAGSMASK){
|
||||
//case 0:
|
||||
// switch (lpddsd->ddsCaps.dwCaps){
|
||||
// case 0:
|
||||
// // Star Force Deluxe
|
||||
// lpddsd->dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
|
||||
// lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
|
||||
// lpddsd->dwHeight = dxw.GetScreenHeight();
|
||||
// lpddsd->dwWidth = dxw.GetScreenWidth();
|
||||
// GetPixFmt(lpddsd);
|
||||
// return;
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE:
|
||||
// Ancient Evil:
|
||||
// dwFlags: DDSD_CAPS+HEIGHT+WIDTH+PIXELFORMAT+TEXTURESTAGE
|
||||
// dwCaps1: DDSCAPS_OFFSCREENPLAIN+SYSTEMMEMORY+TEXTURE
|
||||
// dwCaps2: DDSCAPS2_TEXTUREMANAGE
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_ZBUFFERBITDEPTH:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_ZBUFFER:
|
||||
// Dungeon Keeper II
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER:
|
||||
// "Star Wars Shadows of the Empire" through d3d
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_WIDTH:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_SYSTEMMEMORY:
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY:
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_RESERVED2:
|
||||
// Martian Gothic
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_RESERVED2:
|
||||
// Martian Gothic
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_WRITEONLY|DDSCAPS_RESERVED2:
|
||||
// Empire Earth
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_BACKBUFFER|DDSCAPS_SYSTEMMEMORY:
|
||||
// Vangers
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY;
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_VIDEOMEMORY:
|
||||
// Bunnies must die
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY; // NOT WORKING
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY:
|
||||
// Alien Nations, Heroes of Might & Magic IV --- troublesome!!!!
|
||||
lpddsd->dwFlags = (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT);
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY:
|
||||
// Cave Story, HoMM3
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY:
|
||||
// Magic & Mayhem
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN:
|
||||
// Cave Story, Magic & Mayhem
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE:
|
||||
// Nightmare Ned
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE:
|
||||
// Actua Soccer 3
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_3DDEVICE:
|
||||
// Actua Soccer 3
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY:
|
||||
// Nightmare Ned, The Sims ???
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY:
|
||||
// Airline Tycoon Evolution
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_COMPLEX|DDSCAPS_SYSTEMMEMORY|DDSCAPS_TEXTURE|DDSCAPS_MIPMAP: // Powerslide
|
||||
case DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_TEXTURE|DDSCAPS_MIPMAP: // Powerslide
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_TEXTURE|DDSCAPS_3DDEVICE:
|
||||
case DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM:
|
||||
case DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM:
|
||||
case DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY:
|
||||
// Zoo Tycoon
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM:
|
||||
// Empire Earth
|
||||
// tbd
|
||||
// try
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY);
|
||||
// eotry
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN:
|
||||
// Submarine titans (8BPP)
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY:
|
||||
// Duckman, HoM&M4, Beavis & Butthead do U.
|
||||
// unsetting the Pixel Format may cause the backbuffer to be created with DDPF_ALPHAPIXELS flag on
|
||||
// and some generic surface with DDPF_ALPHAPIXELS off, so that blitting is unsupported.
|
||||
// But it seems impossible to get HOMM4 to cope with Beavis & Butthead!!!
|
||||
if(!(dxw.dwFlags3 & NOPIXELFORMAT)) GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY:
|
||||
// Dungeon Keeper II GOG release (intro screen): doesn't like calling GetPixFmt!!!
|
||||
// it requests a DDPF_FOURCC surface with fourcc="YYYY" that should not be overridden?
|
||||
//
|
||||
// need not to be configurable until we get a different case.
|
||||
// it works both on VIDEOMEMORY or SYSTEMMEMORY. The latter should be more stable.
|
||||
// v2.02.41: don't alter FOURCC pixel formats
|
||||
if(lpddsd->ddpfPixelFormat.dwFlags & DDPF_FOURCC) return;
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM:
|
||||
// Empire Earth
|
||||
// Zoo Tycoon: better leave as it is....
|
||||
// lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); ????
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_COMPLEX|DDSCAPS_TEXTURE|DDSCAPS_MIPMAP:
|
||||
// Empire Earth: flags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_MIPMAPCOUNT
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER:
|
||||
// the Sims
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_TEXTURE:
|
||||
// Wargames Direct3D hw acceleration
|
||||
// Star Wars Shadows of the Empire in RGB HEL mode
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_TEXTURE:
|
||||
// Empire Earth
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_ZBUFFER:
|
||||
// Martian Gothic
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); // working ????
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM|DDSCAPS_ZBUFFER:
|
||||
// Rayman 2
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); // working ????
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE:
|
||||
// Premier Manager 98
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY: // NOT WORKING
|
||||
// Bunnies must die (not the horny ones!)
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_OVERLAY|DDSCAPS_SYSTEMMEMORY;
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_SYSTEMMEMORY:
|
||||
// Star Force Deluxe
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
|
||||
// GetPixFmt(lpddsd);
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY|DDSCAPS_ALLOCONLOAD:
|
||||
// Star Wars Shadows of the Empire
|
||||
// seems to work both with/without GetPixFmt, but doesn't like DDSCAPS_SYSTEMMEMORY textures.
|
||||
// Setting GetPixFmt makes bad alpha transparencies!
|
||||
// DDSCAPS_VIDEOMEMORY doesn't work with HEL only! Better switch to DDSCAPS_SYSTEMMEMORY.
|
||||
if (dxw.dwFlags3 & FORCESHEL) lpddsd->ddsCaps.dwCaps = (DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_ALLOCONLOAD);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_PIXELFORMAT:
|
||||
switch (lpddsd->ddsCaps.dwCaps){
|
||||
case DDSCAPS_SYSTEMMEMORY:
|
||||
// Wargames
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
|
||||
GetPixFmt(lpddsd);
|
||||
//lpddsd->dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH; // turn DDSD_PIXELFORMAT off
|
||||
return;
|
||||
break;
|
||||
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY:
|
||||
// A10 Cuba
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; // DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY working as well...
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if(dxw.dwFlags3 & SURFACEWARN){
|
||||
char sMsg[512];
|
||||
sprintf(sMsg, "Flags=%x(%s) Caps=%x(%s)", lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps));
|
||||
MessageBox(0, sMsg, "FixSurfaceCaps unmanaged setting", MB_OK | MB_ICONEXCLAMATION);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion)
|
||||
{
|
||||
// To do: fix Dungeon Keeper II
|
||||
|
||||
// rules of thumb:
|
||||
// 1) always get rid of DDSCAPS_VIDEOMEMORY & DDSCAPS_LOCALVIDMEM caps
|
||||
// 2) always add DDSCAPS_SYSTEMMEMORY caps
|
||||
// 3) DDSCAPS_SYSTEMMEMORY is supported from dxversion 4
|
||||
// 4) if DDSD_CAPS is not set, ignore caps
|
||||
// 5) ignore DDSD_CKSRCBLT, ....
|
||||
// 6) setting a different pixel format in memory requires DDSCAPS_OFFSCREENPLAIN capability
|
||||
// 7) DDSD_TEXTURESTAGE surfaces may need to adjust pixel format (....???)
|
||||
// 8) Generic surfaces are mapped to SYSTEMMEMORY and set to primary surface PixelFormat
|
||||
// 9) When pixelformat is unspecified, be sure to pick the right one (with or without alphapixels?)
|
||||
// 10) Don't alter surfaces with a color depth different from primary surface (Lords of Magic Special Edition)
|
||||
// 1) textures should be left untouched (switching to SYSTEMMEMORY when forcing HEL may even fail!)
|
||||
// 2) if a pixel format is specified, if DDSCAPS_SYSTEMMEMORY add DDSCAPS_OFFSCREENPLAY (if pixel formats are different?), otherwise do not touch anything.
|
||||
// 3) if the surface is used as a buffer (DDSD_WIDTH set, DDSD_HEIGHT unset) do not touch anything.
|
||||
// 4) zbuffer surfaces (DDSCAPS_ZBUFFER set) must have DDSCAPS_SYSTEMMEMORY
|
||||
// 5) DDSCAPS_3DDEVICE surfaces should have a defined pixel format
|
||||
// 6) in all remaining cases, adjust the pixel format and ensure you have DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN
|
||||
|
||||
if(!(lpddsd->dwFlags & DDSD_CAPS)) lpddsd->ddsCaps.dwCaps = 0;
|
||||
|
||||
OutTraceDW("FixSurfaceCaps: Flags=%x(%s) Caps=%x(%s)\n",
|
||||
lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps));
|
||||
|
||||
#ifdef DXWND_ANALYTICMODE
|
||||
if(dxw.dwFlags3 & ANALYTICMODE) return FixSurfaceCapsAnalytic(lpddsd, dxversion);
|
||||
#endif
|
||||
|
||||
if((lpddsd->dwFlags & (DDSD_WIDTH|DDSD_HEIGHT)) == DDSD_WIDTH) {
|
||||
// buffer surface - no changes
|
||||
return;
|
||||
}
|
||||
if((lpddsd->dwFlags & (DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE)) == (DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE)){
|
||||
// textures, set proper color depth and make no further changes
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
}
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER);
|
||||
return;
|
||||
}
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) &&
|
||||
(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) &&
|
||||
!(lpddsd->ddsCaps.dwCaps & DDSCAPS_TEXTURE)) // v2.02.90: added for "Zoo Tycoon" textures
|
||||
{ // 3DDEVICE no TEXTURE: enforce PIXELFORMAT on MEMORY
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE);
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
}
|
||||
// DDSCAPS_TEXTURE surfaces must be left untouched, unless you set FORCESHEL: in this case switch VIDEOMEMORY to SYSTEMMEMORY
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_TEXTURE)){
|
||||
if (dxw.dwFlags3 & FORCESHEL) {
|
||||
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
|
||||
lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
|
||||
}
|
||||
// no further changes...
|
||||
return;
|
||||
}
|
||||
|
||||
if(lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH){
|
||||
lpddsd->dwFlags &= ~DDSD_PIXELFORMAT;
|
||||
// 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)
|
||||
return;
|
||||
}
|
||||
|
||||
// v2.02.41: don't alter FOURCC pixel formats
|
||||
if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && (lpddsd->ddpfPixelFormat.dwFlags & DDPF_FOURCC)) return;
|
||||
if ((lpddsd->dwFlags & (DDSD_WIDTH|DDSD_HEIGHT)) == DDSD_WIDTH) { // buffer surface
|
||||
return;
|
||||
}
|
||||
|
||||
// v2.02.50: don't alter surfaces with different color depth
|
||||
if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && (lpddsd->ddpfPixelFormat.dwRGBBitCount != dxw.VirtualPixelFormat.dwRGBBitCount)) return;
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER);
|
||||
return;
|
||||
}
|
||||
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) &&
|
||||
(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) // v2.02.90: added for "Zoo Tycoon" textures
|
||||
{ // 3DDEVICE no TEXTURE: enforce PIXELFORMAT on MEMORY
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE);
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
}
|
||||
|
||||
// default case: adjust pixel format
|
||||
OutTraceB("FixSurfaceCaps: suppress DDSCAPS_VIDEOMEMORY case\n");
|
||||
@ -2406,6 +2123,9 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
|
||||
DDSURFACEDESC2 ddsd;
|
||||
HRESULT res;
|
||||
|
||||
// save primary surface type for later use
|
||||
bIs3DPrimarySurfaceDevice = (lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE);
|
||||
|
||||
// emulated primary surface
|
||||
memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize);
|
||||
|
||||
@ -2419,8 +2139,18 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
|
||||
ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE);
|
||||
ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT);
|
||||
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM);
|
||||
#if 0
|
||||
// DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces
|
||||
ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
#else
|
||||
// "problematic" situations:
|
||||
// New Your Racer (intro movies & 3D part) Caps=DDSCAPS_COMPLEX+OVERLAY Pixel.Flags=DDPF_FOURCC
|
||||
//ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
//if(lpddsd->ddsCaps.dwCaps & DDSCAPS_OVERLAY) ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY);
|
||||
//if(lpddsd->ddsCaps.dwCaps & DDSCAPS_OVERLAY) ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_OFFSCREENPLAIN);
|
||||
ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
//ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
|
||||
#endif
|
||||
// on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it....
|
||||
if(dxw.dwFlags5 & NOSYSTEMEMULATED) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
|
||||
ddsd.dwWidth = dxw.GetScreenWidth();
|
||||
@ -2488,7 +2218,12 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
|
||||
ClearSurfaceDesc((void *)&ddsd, dxversion);
|
||||
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
|
||||
// DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces
|
||||
// DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good...
|
||||
ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
// "problematic" situations that need no DDSCAPS_SYSTEMMEMORY:
|
||||
// Flying Heroes (caps=DDSCAPS_3DDEVICE)
|
||||
// Echelon (caps=DDSCAPS_COMPLEX+3DDEVICE)
|
||||
if(bIs3DPrimarySurfaceDevice) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
|
||||
// on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it....
|
||||
if(dxw.dwFlags5 & NOSYSTEMEMULATED) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
|
||||
ddsd.dwWidth = dxw.GetScreenWidth();
|
||||
@ -2520,17 +2255,15 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
|
||||
DDSURFACEDESC2 ddsd;
|
||||
HRESULT res;
|
||||
|
||||
bIs3DPrimarySurfaceDevice = (lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE);
|
||||
|
||||
// genuine primary surface
|
||||
memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize);
|
||||
ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT);
|
||||
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX);
|
||||
// v2.02.93: don't move primary / backbuf surfaces on systemmemory when 3DDEVICE is requested
|
||||
// this impact also on capabilities for temporary surfaces for AERO optimized handling
|
||||
bIs3DPrimarySurfaceDevice = FALSE;
|
||||
if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) {
|
||||
ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
|
||||
bIs3DPrimarySurfaceDevice = TRUE;
|
||||
}
|
||||
if(bIs3DPrimarySurfaceDevice) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
|
||||
|
||||
// create Primary surface
|
||||
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__);
|
||||
@ -3067,31 +2800,47 @@ HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDI
|
||||
HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect)
|
||||
{
|
||||
HRESULT res;
|
||||
DDSURFACEDESC ddsd;
|
||||
DDSURFACEDESC2 ddsd;
|
||||
RECT TmpRect;
|
||||
LPDIRECTDRAWSURFACE lpddsTmp;
|
||||
LPDIRECTDRAWSURFACE lpddsBak;
|
||||
DDSCAPS caps;
|
||||
CreateSurface1_Type pCreateSurface;
|
||||
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;
|
||||
}
|
||||
caps.dwCaps = DDSCAPS_BACKBUFFER;
|
||||
memset(&ddsd, 0, sizeof(ddsd));
|
||||
ddsd.dwSize = sizeof(ddsd);
|
||||
ddsd.dwSize = dwSize;
|
||||
if(lpddssrc==NULL){
|
||||
// blit from backbuffer
|
||||
lpdds->GetAttachedSurface(&caps, &lpddsBak);
|
||||
if(lpddsBak) lpddsBak->GetSurfaceDesc(&ddsd);
|
||||
lpdds->GetAttachedSurface(&caps, &(LPDIRECTDRAWSURFACE)lpddsBak);
|
||||
lpddsBak->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
|
||||
}
|
||||
else{
|
||||
// blit from surface
|
||||
lpddssrc->GetSurfaceDesc(&ddsd);
|
||||
lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
|
||||
}
|
||||
TmpRect.left = TmpRect.top = 0;
|
||||
TmpRect.bottom = ddsd.dwHeight = lpdestrect->bottom - lpdestrect->top;
|
||||
TmpRect.right = ddsd.dwWidth = lpdestrect->right - lpdestrect->left;
|
||||
if((TmpRect.bottom==0) || (TmpRect.right==0)) return DD_OK; // avoid blitting to null areas (Fifa 2000 D3D)
|
||||
ddsd.dwFlags = (DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS);
|
||||
// capabilities must cope with primary / backbuffer surface capabilities to get speedy operations
|
||||
ddsd.ddsCaps.dwCaps = bIs3DPrimarySurfaceDevice ? DDSCAPS_OFFSCREENPLAIN : (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
res=(*pCreateSurface1)(lpPrimaryDD, &ddsd, &lpddsTmp, NULL);
|
||||
if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
res=(*pCreateSurface)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL);
|
||||
if(res) {
|
||||
OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
if(IsDebug) DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Gateway]" , __LINE__);
|
||||
return res;
|
||||
}
|
||||
// stretch-blit to target size on OFFSCREENPLAIN temp surface
|
||||
res= (*pBlt)(lpddsTmp, &TmpRect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0);
|
||||
if(res) OutTraceE("Blt: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
@ -3108,7 +2857,7 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
HRESULT res;
|
||||
extern void Resize_HQ_4ch( unsigned char*, RECT *, int, unsigned char*, RECT *, int);
|
||||
/* to be implemented .... */
|
||||
DDSURFACEDESC ddsd;
|
||||
DDSURFACEDESC2 ddsd;
|
||||
RECT TmpRect, SrcRect;
|
||||
LPDIRECTDRAWSURFACE lpddsTmp;
|
||||
LPDIRECTDRAWSURFACE lpddsBak;
|
||||
@ -3117,17 +2866,28 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
BYTE *bSourceBuf, *bDestBuf;
|
||||
LONG dwWidth, dwHeight;
|
||||
int SrcPitch, DestPitch;
|
||||
CreateSurface1_Type pCreateSurface;
|
||||
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;
|
||||
}
|
||||
caps.dwCaps = DDSCAPS_BACKBUFFER;
|
||||
memset(&ddsd, 0, sizeof(DDSURFACEDESC));
|
||||
ddsd.dwSize = sizeof(DDSURFACEDESC);
|
||||
ddsd.dwSize = dwSize;
|
||||
if(lpddssrc==NULL){
|
||||
// blit from backbuffer
|
||||
lpdds->GetAttachedSurface(&caps, &lpddsBak);
|
||||
if(lpddsBak) lpddsBak->GetSurfaceDesc(&ddsd);
|
||||
if(lpddsBak) lpddsBak->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
|
||||
}
|
||||
else{
|
||||
// blit from surface
|
||||
lpddssrc->GetSurfaceDesc(&ddsd);
|
||||
lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
|
||||
}
|
||||
|
||||
// assign source RECT values anyway....
|
||||
@ -3146,19 +2906,19 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
ddsd.dwFlags = (DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS);
|
||||
// capabilities must cope with primary / backbuffer surface capabilities to get speedy operations
|
||||
ddsd.ddsCaps.dwCaps = bIs3DPrimarySurfaceDevice ? DDSCAPS_OFFSCREENPLAIN : (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
|
||||
res=(*pCreateSurface1)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL);
|
||||
res=(*pCreateSurface)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL);
|
||||
if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
|
||||
// get informations
|
||||
memset(&ddsd,0,sizeof(DDSURFACEDESC));
|
||||
ddsd.dwSize = sizeof(DDSURFACEDESC);
|
||||
memset(&ddsd,0,dwSize);
|
||||
ddsd.dwSize = dwSize;
|
||||
ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
|
||||
res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0);
|
||||
if(res) OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
bSourceBuf = (BYTE *)ddsd.lpSurface;
|
||||
SrcPitch = ddsd.lPitch;
|
||||
memset(&ddsd,0,sizeof(DDSURFACEDESC));
|
||||
ddsd.dwSize = sizeof(DDSURFACEDESC);
|
||||
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);
|
||||
if(res) OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
@ -3171,10 +2931,8 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
bDestBuf, lpdestrect, DestPitch);
|
||||
|
||||
// fast-blit to primary
|
||||
if(lpddssrc==lpDDSEmu_Back) lpddssrc->Unlock(NULL); // this surface is unhooked!!!
|
||||
else (*pUnlock1)(lpddssrc, NULL);
|
||||
//(*pUnlock1)(lpddsTmp, NULL);
|
||||
lpddsTmp->Unlock(NULL); // this surface is unhooked!!!
|
||||
(*pUnlockMethod(lpddssrc))(lpddssrc, NULL);
|
||||
(*pUnlockMethod(lpddsTmp))(lpddsTmp, NULL);
|
||||
res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT);
|
||||
if(res) OutTraceE("BltFast: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
(*pReleaseS)(lpddsTmp);
|
||||
@ -3454,9 +3212,11 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
Dungeon Keeper II intro movies bug ....
|
||||
it seems that you can't blit from compressed or different surfaces in memory,
|
||||
while the operation COULD be supported to video. As a mater of fact, it DOES
|
||||
work on my PC.
|
||||
work on my PC. The error code is DDERR_UNSUPPORTED.
|
||||
v2.02.98 update....
|
||||
The same thing happens with New York Racer, but with DDERR_EXCEPTION error code.
|
||||
*/
|
||||
if(res==DDERR_UNSUPPORTED){
|
||||
if((res==DDERR_UNSUPPORTED) || (res==DDERR_EXCEPTION)){
|
||||
dxw.ShowOverlay(lpddssrc);
|
||||
if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__);
|
||||
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
|
||||
@ -4006,15 +3766,14 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC
|
||||
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);
|
||||
// v2.02.97: set dirty rect to syncronize with gdi operations. See "Deadlock II" problems...
|
||||
RECT dirty;
|
||||
if(lprect){
|
||||
dirty = *lprect;
|
||||
dxw.MapClient(&dirty);
|
||||
lprect = &dirty;
|
||||
if(dxversion == 1){
|
||||
res=sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE);
|
||||
if(IsPrim) (*pInvalidateRect)(dxw.GethWnd(), NULL, FALSE); // to fix "Deadlock II" mouse trails....
|
||||
}
|
||||
else {
|
||||
res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE);
|
||||
if(IsPrim) (*pInvalidateRect)(dxw.GethWnd(), lprect, FALSE);
|
||||
}
|
||||
(*pInvalidateRect)(dxw.GethWnd(), lprect, FALSE);
|
||||
}
|
||||
|
||||
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK;
|
||||
@ -4914,6 +4673,7 @@ HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 l
|
||||
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;
|
||||
|
@ -95,7 +95,7 @@ static char *Flag4Names[32]={
|
||||
static char *Flag5Names[32]={
|
||||
"DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "NOSYSTEMMEMORY",
|
||||
"NOBLT", "NOSYSTEMEMULATED", "DOFASTBLT", "AEROBOOST",
|
||||
"QUARTERBLT", "NOIMAGEHLP", "BILINEARFILTER", "",
|
||||
"QUARTERBLT", "NOIMAGEHLP", "BILINEARFILTER", "REPLACEPRIVOPS",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
@ -616,7 +616,7 @@ LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA
|
||||
t = (*pGetTickCount)();
|
||||
int tn = (*pGetTickCount)();
|
||||
|
||||
OutTraceW("DEBUG: DialogWinMsg [0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam);
|
||||
OutTraceW("DEBUG: DialogWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
// optimization: don't invalidate too often!
|
||||
// 200mSec seems a good compromise.
|
||||
@ -639,7 +639,7 @@ LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPAR
|
||||
static WINDOWPOS *wp;
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
OutTraceW("DEBUG: ChildWinMsg [0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam);
|
||||
OutTraceW("DEBUG: ChildWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
if(dxw.Windowize){
|
||||
switch(message){
|
||||
@ -1447,19 +1447,25 @@ static void ReplaceRDTSC()
|
||||
FreeLibrary(psapilib);
|
||||
|
||||
(*pPreparedisasm)();
|
||||
opcodes=(unsigned char *)GetModuleHandle(NULL);
|
||||
opcodes = (unsigned char *)mi.lpBaseOfDll;
|
||||
unsigned int offset = 0;
|
||||
BOOL cont = TRUE;
|
||||
OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize);
|
||||
while (TRUE) {
|
||||
int cmdlen;
|
||||
while (cont) {
|
||||
int cmdlen = 0;
|
||||
__try{
|
||||
cmdlen=(*pDisasm)(opcodes+offset,20,offset,&da,0,NULL,NULL);
|
||||
//OutTrace("offset=%x opcode=%x\n", offset, *(opcodes+offset));
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER){
|
||||
OutTrace("exception at offset=%x\n", offset);
|
||||
cont=FALSE;
|
||||
if(opcodes+offset < mi.EntryPoint) {
|
||||
offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll;
|
||||
OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
cont=FALSE;
|
||||
}
|
||||
if (cmdlen==0) break;
|
||||
// search for RDTSC opcode 0x0F31
|
||||
@ -1492,7 +1498,82 @@ static void ReplaceRDTSC()
|
||||
}
|
||||
}
|
||||
offset+=cmdlen;
|
||||
if((offset+0x10) > dwSegSize) break;
|
||||
if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case....
|
||||
}
|
||||
|
||||
return;
|
||||
(*pFinishdisasm)();
|
||||
FreeLibrary(disasmlib);
|
||||
}
|
||||
|
||||
static void ReplacePrivilegedOps()
|
||||
{
|
||||
typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
|
||||
HMODULE disasmlib;
|
||||
unsigned char *opcodes;
|
||||
t_disasm da;
|
||||
MODULEINFO mi;
|
||||
HMODULE psapilib;
|
||||
GetModuleInformation_Type pGetModuleInformation;
|
||||
DWORD dwSegSize;
|
||||
DWORD oldprot;
|
||||
|
||||
if (!(disasmlib=LoadDisasm())) return;
|
||||
|
||||
// getting segment size
|
||||
psapilib=(*pLoadLibraryA)("psapi.dll");
|
||||
if(!psapilib) {
|
||||
OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError());
|
||||
return;
|
||||
}
|
||||
pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation");
|
||||
(*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi));
|
||||
dwSegSize = mi.SizeOfImage;
|
||||
FreeLibrary(psapilib);
|
||||
|
||||
(*pPreparedisasm)();
|
||||
opcodes = (unsigned char *)mi.lpBaseOfDll;
|
||||
unsigned int offset = 0;
|
||||
BOOL cont = TRUE;
|
||||
OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize);
|
||||
while (cont) {
|
||||
int cmdlen = 0;
|
||||
__try{
|
||||
cmdlen=(*pDisasm)(opcodes+offset,20,offset,&da,0,NULL,NULL);
|
||||
//OutTrace("offset=%x opcode=%x\n", offset, *(opcodes+offset));
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER){
|
||||
OutTrace("exception at offset=%x\n", offset);
|
||||
if(opcodes+offset < mi.EntryPoint) {
|
||||
offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll;
|
||||
OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
cont=FALSE;
|
||||
}
|
||||
if (cmdlen==0) break;
|
||||
// search for IN opcode 0xEC (IN AL, DX)
|
||||
if(*(opcodes+offset) == 0xEC){
|
||||
OutTraceDW("DXWND: IN opcode found at addr=%x\n", (opcodes+offset));
|
||||
if(!VirtualProtect((LPVOID)(opcodes+offset), 8, PAGE_READWRITE, &oldprot)) {
|
||||
OutTrace("VirtualProtect ERROR: target=%x err=%d at %d\n", opcodes+offset, GetLastError(), __LINE__);
|
||||
return; // error condition
|
||||
}
|
||||
*(opcodes+offset) = 0x90; // __asm NOP
|
||||
if((*(opcodes+offset+1) == 0xA8) &&
|
||||
((*(opcodes+offset+3) == 0x75) || (*(opcodes+offset+3) == 0x74))) { // both JNZ and JZ
|
||||
OutTraceDW("DXWND: IN loop found at addr=%x\n", (opcodes+offset));
|
||||
memset((opcodes+offset+1), 0x90, 4); // Ubik I/O loop
|
||||
offset+=4;
|
||||
}
|
||||
if(!VirtualProtect((LPVOID)(opcodes+offset), 8, oldprot, &oldprot)){
|
||||
OutTrace("VirtualProtect ERROR; target=%x, err=%d at %d\n", opcodes+offset, GetLastError(), __LINE__);
|
||||
return; // error condition
|
||||
}
|
||||
}
|
||||
offset+=cmdlen;
|
||||
if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case....
|
||||
}
|
||||
|
||||
return;
|
||||
@ -1638,6 +1719,7 @@ void HookInit(TARGETMAP *target, HWND hwnd)
|
||||
|
||||
//if ((hwnd==0) && (dxw.dwFlags4 & INTERCEPTRDTSC)) ReplaceRDTSC();
|
||||
if (dxw.dwFlags4 & INTERCEPTRDTSC) ReplaceRDTSC();
|
||||
if (dxw.dwFlags5 & REPLACEPRIVOPS) ReplacePrivilegedOps();
|
||||
|
||||
if (dxw.dwTFlags & DXPROXED){
|
||||
HookDDProxy(base, dxw.dwTargetDDVersion);
|
||||
|
@ -24,7 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "dxwnd.h"
|
||||
#include "dxwcore.hpp"
|
||||
|
||||
#define VERSION "2.02.97"
|
||||
#define VERSION "2.02.98"
|
||||
#define DXWACTIVATESINGLETASK 1 // comment to allow multiple task activations
|
||||
|
||||
#define DDTHREADLOCK 1
|
||||
|
Binary file not shown.
@ -57,7 +57,7 @@ static HookEntry_Type Hooks[]={
|
||||
{HOOK_IAT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA},
|
||||
{HOOK_IAT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW},
|
||||
//{HOOK_HOT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow},
|
||||
//{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow},
|
||||
//{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)GetForegroundWindow, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow},
|
||||
//{HOOK_IAT_CANDIDATE, "GetWindowTextA", (FARPROC)GetWindowTextA, (FARPROC *)&pGetWindowTextA, (FARPROC)extGetWindowTextA},
|
||||
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
|
||||
};
|
||||
|
BIN
host/Resource.h
BIN
host/Resource.h
Binary file not shown.
@ -33,7 +33,6 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_HANDLEEXCEPTIONS, cTarget->m_HandleExceptions);
|
||||
DDX_Check(pDX, IDC_LIMITRESOURCES, cTarget->m_LimitResources);
|
||||
DDX_Check(pDX, IDC_SUPPRESSIME, cTarget->m_SuppressIME);
|
||||
DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt);
|
||||
DDX_Check(pDX, IDC_CDROMDRIVETYPE, cTarget->m_CDROMDriveType);
|
||||
DDX_Check(pDX, IDC_FONTBYPASS, cTarget->m_FontBypass);
|
||||
DDX_Check(pDX, IDC_BUFFEREDIOFIX, cTarget->m_BufferedIOFix);
|
||||
@ -44,6 +43,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_HIDECDROMEMPTY, cTarget->m_HideCDROMEmpty);
|
||||
DDX_Check(pDX, IDC_DIABLOTWEAK, cTarget->m_DiabloTweak);
|
||||
DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp);
|
||||
DDX_Check(pDX, IDC_REPLACEPRIVOPS, cTarget->m_ReplacePrivOps);
|
||||
|
||||
// 3D management
|
||||
DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures);
|
||||
@ -51,6 +51,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_DISABLEFOGGING, cTarget->m_DisableFogging);
|
||||
DDX_Check(pDX, IDC_CLEARTARGET, cTarget->m_ClearTarget);
|
||||
DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset);
|
||||
DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt);
|
||||
|
||||
// Registry management
|
||||
DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
|
||||
|
@ -27,9 +27,10 @@ void CTabInput::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
||||
// Cursor Visibility
|
||||
DDX_Radio(pDX, IDC_CURSORAUTOMATIC, cTarget->m_MouseVisibility);
|
||||
// Cursor Handling
|
||||
DDX_Check(pDX, IDC_MODIFYMOUSE, cTarget->m_ModifyMouse);
|
||||
DDX_Check(pDX, IDC_HIDEHWCURSOR, cTarget->m_HideHwCursor);
|
||||
DDX_Check(pDX, IDC_SHOWHWCURSOR, cTarget->m_ShowHwCursor);
|
||||
DDX_Check(pDX, IDC_ENABLECLIPPING, cTarget->m_EnableClipping);
|
||||
DDX_Check(pDX, IDC_CLIPCURSOR, cTarget->m_CursorClipping);
|
||||
DDX_Check(pDX, IDC_KEEPCURSORWITHIN, cTarget->m_KeepCursorWithin);
|
||||
|
@ -25,6 +25,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_DxEmulationMode = 4; // default: AUTOMATIC
|
||||
m_DxFilterMode = 0; // default: ddraw filtering
|
||||
m_DCEmulationMode = 0; // default: no emulation
|
||||
m_MouseVisibility = 0;
|
||||
m_HookDI = FALSE;
|
||||
m_ModifyMouse = TRUE; // default true !!
|
||||
m_OutProxyTrace = FALSE;
|
||||
@ -43,6 +44,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_AEROBoost = TRUE; // default true !!
|
||||
m_DiabloTweak = FALSE;
|
||||
m_NoImagehlp = FALSE;
|
||||
m_ReplacePrivOps = FALSE;
|
||||
m_DisableHAL = FALSE;
|
||||
m_ForcesHEL = FALSE;
|
||||
m_ColorFix = FALSE;
|
||||
@ -94,8 +96,6 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_DisableGammaRamp = FALSE;
|
||||
m_AutoRefresh = FALSE;
|
||||
m_FixWinFrame = FALSE;
|
||||
m_HideHwCursor = FALSE;
|
||||
m_ShowHwCursor = FALSE;
|
||||
m_EnableClipping = FALSE;
|
||||
m_CursorClipping = FALSE;
|
||||
m_VideoToSystemMem = FALSE;
|
||||
|
@ -29,6 +29,7 @@ public:
|
||||
int m_DxEmulationMode;
|
||||
int m_DxFilterMode;
|
||||
int m_DCEmulationMode;
|
||||
int m_MouseVisibility;
|
||||
BOOL m_HookDI;
|
||||
BOOL m_ModifyMouse;
|
||||
BOOL m_OutProxyTrace;
|
||||
@ -58,6 +59,7 @@ public:
|
||||
BOOL m_NoBanner;
|
||||
BOOL m_StartDebug;
|
||||
BOOL m_HookEnabled;
|
||||
BOOL m_ReplacePrivOps;
|
||||
CString m_FilePath;
|
||||
CString m_LaunchPath;
|
||||
CString m_Module;
|
||||
@ -71,8 +73,6 @@ public:
|
||||
BOOL m_DisableGammaRamp;
|
||||
BOOL m_AutoRefresh;
|
||||
BOOL m_FixWinFrame;
|
||||
BOOL m_HideHwCursor;
|
||||
BOOL m_ShowHwCursor;
|
||||
BOOL m_EnableClipping;
|
||||
BOOL m_CursorClipping;
|
||||
BOOL m_VideoToSystemMem;
|
||||
|
Binary file not shown.
@ -163,6 +163,11 @@ BOOL CDxwndhostApp::InitInstance()
|
||||
if(ResLib) AfxSetResourceHandle(ResLib);
|
||||
else MessageBoxEx(NULL, "Missing language \"IT\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
||||
break;
|
||||
case 0x19: // 419 - russian
|
||||
ResLib=LoadLibrary("Resources_RU.dll");
|
||||
if(ResLib) AfxSetResourceHandle(ResLib);
|
||||
else MessageBoxEx(NULL, "Missing language \"RU\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
||||
break;
|
||||
default:
|
||||
//char sBuf[81];
|
||||
//sprintf(sBuf, "Got Lang=%x(%x-%x)", LangId, LangId>>9, (LangId & 0x1FF));
|
||||
|
Binary file not shown.
Binary file not shown.
@ -491,7 +491,7 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="Resource.h"
|
||||
RelativePath=".\Resource.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
@ -628,10 +628,6 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath=".\resource"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
<Global
|
||||
|
@ -125,7 +125,6 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_PeekAllMessages) t->flags3 |= PEEKALLMESSAGES;
|
||||
if(dlg->m_NoWinPosChanges) t->flags5 |= NOWINPOSCHANGES;
|
||||
|
||||
t->flags &= ~EMULATEFLAGS;
|
||||
switch(dlg->m_DxEmulationMode){
|
||||
case 0: t->flags |= AUTOMATIC; break;
|
||||
case 1: break;
|
||||
@ -135,28 +134,31 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
break;
|
||||
}
|
||||
|
||||
t->flags4 &= ~BILINEAR2XFILTER;
|
||||
t->flags5 &= ~BILINEARFILTER;
|
||||
switch(dlg->m_DxFilterMode){
|
||||
case 0: break;
|
||||
case 1: t->flags4 |= BILINEAR2XFILTER; break;
|
||||
case 2: t->flags5 |= BILINEARFILTER; break;
|
||||
}
|
||||
|
||||
t->flags2 &= ~GDISTRETCHED;
|
||||
t->flags &= ~MAPGDITOPRIMARY;
|
||||
t->flags3 &= ~GDIEMULATEDC;
|
||||
switch(dlg->m_DCEmulationMode){
|
||||
case 0: break;
|
||||
case 1: t->flags2 |= GDISTRETCHED; break;
|
||||
case 2: t->flags3 |= GDIEMULATEDC; break;
|
||||
case 3: t->flags |= MAPGDITOPRIMARY; break;
|
||||
}
|
||||
|
||||
switch(dlg->m_ResTypes){
|
||||
case 0: t->flags4 |= SUPPORTSVGA; break;
|
||||
case 1: t->flags4 |= SUPPORTHDTV; break;
|
||||
case 2: t->flags4 |= NATIVERES; break;
|
||||
}
|
||||
|
||||
switch(dlg->m_MouseVisibility){
|
||||
case 0: break;
|
||||
case 1: t->flags |= HIDEHWCURSOR; break;
|
||||
case 2: t->flags2 |= SHOWHWCURSOR; break;
|
||||
}
|
||||
|
||||
if(dlg->m_HookDI) t->flags |= HOOKDI;
|
||||
if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE;
|
||||
if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE;
|
||||
@ -172,7 +174,6 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE;
|
||||
if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY;
|
||||
if(dlg->m_TraceHooks) t->tflags |= TRACEHOOKS;
|
||||
//if(dlg->m_HandleDC) t->flags |= HANDLEDC;
|
||||
if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS;
|
||||
if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES;
|
||||
if(dlg->m_CDROMDriveType) t->flags3 |= CDROMDRIVETYPE;
|
||||
@ -217,8 +218,6 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP;
|
||||
if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH;
|
||||
if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME;
|
||||
if(dlg->m_HideHwCursor) t->flags |= HIDEHWCURSOR;
|
||||
if(dlg->m_ShowHwCursor) t->flags2 |= SHOWHWCURSOR;
|
||||
if(dlg->m_EnableClipping) t->flags |= ENABLECLIPPING;
|
||||
if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR;
|
||||
if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY;
|
||||
@ -233,7 +232,6 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_NoSystemMemory) t->flags5 |= NOSYSTEMMEMORY;
|
||||
if(dlg->m_NoSystemEmulated) t->flags5 |= NOSYSTEMEMULATED;
|
||||
if(dlg->m_NoBlt) t->flags5 |= NOBLT;
|
||||
//if(dlg->m_BilinearBlt) t->flags5 |= BILINEARFILTER;
|
||||
if(dlg->m_FastBlt) t->flags5 |= DOFASTBLT;
|
||||
if(dlg->m_PreventMaximize) t->flags |= PREVENTMAXIMIZE;
|
||||
if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING;
|
||||
@ -285,6 +283,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_NoGDIBlt) t->flags3 |= NOGDIBLT;
|
||||
if(dlg->m_NoFillRect) t->flags4 |= NOFILLRECT;
|
||||
if(dlg->m_AnalyticMode) t->flags3 |= ANALYTICMODE;
|
||||
if(dlg->m_ReplacePrivOps) t->flags5 |= REPLACEPRIVOPS;
|
||||
t->initx = dlg->m_InitX;
|
||||
t->inity = dlg->m_InitY;
|
||||
t->minx = dlg->m_MinX;
|
||||
@ -345,6 +344,10 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(t->flags4 & SUPPORTHDTV) dlg->m_ResTypes = 1;
|
||||
if(t->flags4 & NATIVERES) dlg->m_ResTypes = 2;
|
||||
|
||||
dlg->m_MouseVisibility = 0;
|
||||
if(t->flags & HIDEHWCURSOR) dlg->m_MouseVisibility = 1;
|
||||
if(t->flags2 & SHOWHWCURSOR) dlg->m_MouseVisibility = 2;
|
||||
|
||||
dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0;
|
||||
dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0;
|
||||
dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0;
|
||||
@ -405,8 +408,6 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0;
|
||||
dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0;
|
||||
dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0;
|
||||
dlg->m_HideHwCursor = t->flags & HIDEHWCURSOR ? 1 : 0;
|
||||
dlg->m_ShowHwCursor = t->flags2 & SHOWHWCURSOR ? 1 : 0;
|
||||
dlg->m_EnableClipping = t->flags & ENABLECLIPPING ? 1 : 0;
|
||||
dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0;
|
||||
dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0;
|
||||
@ -421,7 +422,6 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_NoSystemMemory = t->flags5 & NOSYSTEMMEMORY ? 1 : 0;
|
||||
dlg->m_NoSystemEmulated = t->flags5 & NOSYSTEMEMULATED ? 1 : 0;
|
||||
dlg->m_NoBlt = t->flags5 & NOBLT ? 1 : 0;
|
||||
//dlg->m_BilinearBlt = t->flags5 & BILINEARFILTER ? 1 : 0;
|
||||
dlg->m_FastBlt = t->flags5 & DOFASTBLT ? 1 : 0;
|
||||
dlg->m_PreventMaximize = t->flags & PREVENTMAXIMIZE ? 1 : 0;
|
||||
dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0;
|
||||
@ -473,6 +473,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_NoGDIBlt = t->flags3 & NOGDIBLT ? 1 : 0;
|
||||
dlg->m_NoFillRect = t->flags4 & NOFILLRECT ? 1 : 0;
|
||||
dlg->m_AnalyticMode = t->flags3 & ANALYTICMODE ? 1 : 0;
|
||||
dlg->m_ReplacePrivOps = t->flags5 & REPLACEPRIVOPS ? 1 : 0;
|
||||
dlg->m_InitX = t->initx;
|
||||
dlg->m_InitY = t->inity;
|
||||
dlg->m_MinX = t->minx;
|
||||
|
BIN
host/host.aps
BIN
host/host.aps
Binary file not shown.
BIN
host/resource
BIN
host/resource
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -253,6 +253,10 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath=".\resource"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
Loading…
x
Reference in New Issue
Block a user