1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_06_src

Former-commit-id: ddafa6e48cf7d7c9e019e16ce37080d600443ce1
This commit is contained in:
gho tik 2014-12-28 11:40:12 -05:00 committed by Refael ACkermann
parent 70a45d06e0
commit 568699f87b
45 changed files with 512 additions and 96 deletions

Binary file not shown.

View File

@ -163,6 +163,9 @@
#define TEXTUREDUMP 0x00004000 // dump textures to file system as bmp files
#define TEXTUREHACK 0x00008000 // load (replace) hacked textures from file system (bmp files)
#define TEXTURETRANSP 0x00010000 // transparent textures (unimplemented)
#define NORMALIZEPERFCOUNT 0x00020000 // Normalize Performance Counter to a Performance Frequency of 1MHz
#define HYBRIDMODE 0x00040000 // ?????
#define GDICOLORCONV 0x00080000 // do color conversion using GDI
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7bebe395edfd439cfe09e4875e481f37506e0a980a3c589958dd9781c7dc4e65
size 105472

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0612ced9b9f9b7805a31213cba47f847cc10eb0d6a95e2d47adff97484edf5f5
size 89600

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ceacbf8f568d53efcb0982da28698e26923abb941312acaa6d6d0a743a91870b
size 112128

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f2673e4533d1eeb79eb96ba29f360d844b64b06cdf3000271441a9f6b026d7e5
size 114176

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dbfe732ec7cba24e2a540fa0a0275293d8f65b1922afeb0a190e5c7c5678e53f
size 535552
oid sha256:dbb593dd74acbc13c129c32d28ba3808deabc13a62e2163696e371d06a5cdee5
size 537600

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef09812ea8000eca947a595d2c89257576af411f35834a2aecec9256e1c3a385
oid sha256:8fb3df5a4f77d45fa4e102e1b37ab739fdee0eefc74edd8f3574f58c43166ee2
size 532992

View File

@ -1,9 +1,9 @@
[window]
posx=1486
posy=523
posx=50
posy=50
sizx=320
sizy=200
lang=automatic
lang=default
[texture]
MinTexX=16
MaxTexX=0

View File

@ -9,7 +9,7 @@ coord0=0
flag0=679477792
flagg0=1207959552
flagh0=20
flagi0=201326596
flagi0=205520900
tflag0=0
initx0=0
inity0=0
@ -25,3 +25,4 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
flagj0=128

View File

@ -5,10 +5,10 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=671090722
flag0=673187874
flagg0=1207959552
flagh0=32788
flagi0=0
flagi0=4194304
tflag0=3
initx0=0
inity0=0
@ -22,3 +22,7 @@ sizx0=800
sizy0=600
maxfps0=0
initts0=0
launchpath0=
flagj0=128
winver0=0
maxres0=0

View File

@ -7,11 +7,11 @@ opengllib0=
ver0=0
coord0=0
flag0=134217762
flagg0=1476395024
flagh0=4116
flagi0=-2011168764
flagg0=1476395008
flagh0=20
flagi0=138412036
flagj0=4224
tflag0=6402
tflag0=0
initx0=0
inity0=0
minx0=0

View File

@ -0,0 +1,28 @@
[target]
title0=Cyber Gladiators (3dfx)
path0=D:\Games\Cyber Gladiators\cyber.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=671088802
flagg0=1744896000
flagh0=20
flagi0=-2009071612
flagj0=4224
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

View File

@ -0,0 +1,28 @@
[target]
title0=Hexplore
path0=D:\Games\Hexplore\hexplore.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=134234146
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
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

View File

@ -0,0 +1,28 @@
[target]
title0=Hoyle Casino Empire (fullscreen)
path0=D:\Games\Hoyle Casino Empire\CasinoEmpire.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=134217762
flagg0=1073741824
flagh0=20
flagi0=138412036
flagj0=4224
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

View File

@ -0,0 +1,28 @@
[target]
title0=Hoyle Casino Empire
path0=D:\Games\Hoyle Casino Empire\CasinoEmpire.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=134217762
flagg0=1242562560
flagh0=20
flagi0=138413060
flagj0=4224
tflag0=6151
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

View File

@ -0,0 +1,28 @@
[target]
title0=M1 Tank Platoon 2
path0=D:\Games\M1 Tank Platoon 2\M1TP2.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=134238242
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
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=8
winver0=0
maxres0=-1

View File

@ -0,0 +1,28 @@
[target]
title0=Streets of Sim City
path0=D:\Games\Streets of Sim City\STREETS.EXE
launchpath0=
module0=
opengllib0=
ver0=1
coord0=0
flag0=671088674
flagg0=1224736768
flagh0=20
flagi0=138412036
flagj0=4224
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

View File

@ -0,0 +1,28 @@
[target]
title0=Taito Legends 2
path0=D:\Games\Taito Legends 2\Taito.exe
launchpath0=
module0=
opengllib0=
ver0=0
coord0=0
flag0=134217762
flagg0=1207959552
flagh0=20
flagi0=205520900
flagj0=4224
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

View File

@ -25,4 +25,4 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
flagj0=128
flagj0=4224

View File

@ -0,0 +1,28 @@
[target]
title0=Wizardry 8 (3DfX)
path0=D:\Games\Wizardry 8\Wiz8.exe
launchpath0=
module0=
opengllib0=
ver0=9
coord0=0
flag0=134217730
flagg0=1207959552
flagh0=20
flagi0=205520900
flagj0=4224
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

View File

@ -1,5 +1,5 @@
[window]
posx=1392
posy=53
sizx=320
sizy=841
posx=1189
posy=594
sizx=497
sizy=464

View File

@ -673,4 +673,11 @@ fix: changed surface capability policy so that "Risk II" works with identical su
v2.03.05
add: texture dump for d3d8 & d3d9. Note: highlight & hack yet to be implemented. d3d10 & d3d11 yet to be implemented. Texture types not complete.
fix: handling of d3d10 (Assassin's Creed)
fix: handling of d3d10 (Assassin's Creed)
v2.03.06
fix: do not try to set vsync delays on ddraw surface when not created yet
fix: catched several sporadic errors before they could crash the application
fix: GetAttachedSurface() now retrieves a backbuffer from the list, instead of referencing the last one - this fixes "Tomb Raider III" GOG release in non emulated mode.
add: "Normalize performance counter" flag to fix an improper use of QueryPerformanceCounter() made by "Cyber Gladiators"
add: "GDI Color conversion" debug flag

View File

@ -233,8 +233,6 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect)
break; // almost certainly, an empty black surface!
}
dxw.dwTFlags = (hash == 0xEC2EE7CE) ? 0xFFFFFFFF : 0x00000000;
// Create the .BMP file.
extern char *GetDxWndPath();
sprintf_s(pszFile, MAX_PATH, "%s\\texture.out\\texture.%03d.%03d.%s.%08X.bmp",

View File

@ -21,6 +21,7 @@ extern BOOL IsChangeDisplaySettingsHotPatched;
BOOL bDontReleaseBackBuffer = FALSE;
DWORD dwBackBufferCaps;
extern void TextureHandling(LPDIRECTDRAWSURFACE);
ColorConversion_Type pColorConversion = NULL;
// DirectDraw API
HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *);
@ -1516,10 +1517,7 @@ HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2)
c2=&swcaps;
res=(*pGetCapsD)(lpdd, NULL, c2);
}
//DWORD AlphaCaps;
//AlphaCaps=c1->dwFXAlphaCaps;
memcpy((void *)c1, (void *)c2, size);
//c1->dwFXAlphaCaps=AlphaCaps;
}
if(dxw.dwFlags3 & CAPMASK) MaskCapsD(c1, c2);
@ -2743,8 +2741,11 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
// AddAttachedSurface, or a primary complex surface creation otherwise....
if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth
if (lpDDSBack) {
*lplpddas = lpDDSBack;
// in "Tomb Raider III" GOG release, the primary surface is queryed and has no attached
// backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface.
LPDIRECTDRAWSURFACE lpddsback = dxw.GetBackBufferSurface();
if (lpddsback) {
*lplpddas = lpddsback;
OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas);
return DD_OK;
}
@ -2829,7 +2830,12 @@ HRESULT WINAPI PrimaryBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECT
HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect)
{
return (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT);
RECT client;
int iXOffset, iYOffset; // offsets to center surface area to window
(*pGetClientRect)(dxw.GethWnd(), &client);
iXOffset = (client.right - dxw.GetScreenWidth()) >> 1;
iYOffset = (client.bottom - dxw.GetScreenHeight()) >> 1;
return (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT);
}
HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect)
@ -2857,6 +2863,10 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L
if(lpddssrc==NULL){
// blit from backbuffer
lpdds->GetAttachedSurface(&caps, &(LPDIRECTDRAWSURFACE)lpddsBak);
if(lpddsBak == NULL) {
OutTraceE("PrimaryStretchBlt: skip - lpddsBak=%x at %d\n", lpddsBak, __LINE__);
return DD_OK; // fake a success ...
}
lpddsBak->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
}
else{
@ -2878,11 +2888,14 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L
}
// 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__);
// fast-blit to primary
res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT);
if(res) OutTraceE("Blt: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
if (res) BlitError(res, lpsrcrect, lpdestrect, __LINE__);
if(res) {
OutTraceE("Blt: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
}
else {
// fast-blit to primary
res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT);
if(res) OutTraceE("Blt: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
}
(*pReleaseS)(lpddsTmp);
return res;
}
@ -2976,14 +2989,20 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
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__);
if(res) {
OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return DD_OK;
}
bSourceBuf = (BYTE *)ddsd.lpSurface;
SrcPitch = ddsd.lPitch;
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__);
if(res) {
OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return DD_OK;
}
bDestBuf = (BYTE *)ddsd.lpSurface;
DestPitch = ddsd.lPitch;
@ -3039,6 +3058,66 @@ HRESULT WINAPI PrimaryNoBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRE
return DD_OK;
}
typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *);
HRESULT WINAPI ColorConversionEmulated(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource)
{
HRESULT res;
res=(*pEmuBlt)(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);
}
if(res) {
BlitError(res, &emurect, &emurect, __LINE__);
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0;
}
*lpddssource = lpDDSEmu_Back;
return res;
}
HRESULT WINAPI ColorConversionGDI(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource)
{
// GDICOLORCONV: use GDI capabilities to convert color depth by BitBlt-ting between different hdc
HRESULT res;
OutTrace("STEP: GDI Color Conversion\n");
do {
HDC hdc_source, hdc_dest;
res=(*pGetDC)(lpdds, &hdc_source);
if(res) {
OutTraceE("GetDC ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
break;
}
res=(*pGetDC)(lpDDSEmu_Back, &hdc_dest);
if(res) {
OutTraceE("GetDC ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
break;
}
if(!BitBlt(hdc_dest, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), hdc_source, 0, 0, SRCCOPY)){
OutTraceE("BitBlt ERROR: err=%d at %d\n", GetLastError(), __LINE__);
}
res=(*pReleaseDC)(lpdds, hdc_source);
if(res) {
OutTraceE("ReleaseDC ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
break;
}
res=(*pReleaseDC)(lpDDSEmu_Back, hdc_dest);
if(res) {
OutTraceE("ReleaseDC ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
break;
}
} while(FALSE);
*lpddssource = lpDDSEmu_Back;
return res;
}
HRESULT WINAPI ColorConversionDDRAW(LPDIRECTDRAWSURFACE lpdds, RECT emurect, LPDIRECTDRAWSURFACE *lpddssource)
{
*lpddssource = lpdds;
return DD_OK;
}
HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx, BOOL isFlipping)
{
@ -3332,23 +3411,10 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
}
LPDIRECTDRAWSURFACE lpDDSSource;
if(dxw.dwFlags1 & EMULATESURFACE){
res=(*pEmuBlt)(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);
}
if(res) {
BlitError(res, &emurect, &emurect, __LINE__);
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0;
return res;
}
lpDDSSource = lpDDSEmu_Back;
}
else{
lpDDSSource = lpdds;
if (res=(*pColorConversion)(lpdds, emurect, &lpDDSSource)) {
OutTraceE("sBlt ERROR: Color conversion failed res=%d(%s)\n", res, ExplainDDError(res));
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK;
return res;
}
dxw.ShowOverlay(lpDDSSource);
@ -4332,8 +4398,13 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds)
OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res);
if (res==0) { // common precondition
// erase surface from primary or backbuffer list
if(IsPrim || IsBack) dxw.MarkRegularSurface(lpdds);
// when releasing primary surface, erase clipping region
if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor();
// clear service surface pointers
if (dxw.dwFlags1 & EMULATESURFACE) {
if(lpdds==lpDDSEmu_Prim) {
OutTraceDW("Release(S): Clearing lpDDSEmu_Prim pointer\n");
@ -4875,7 +4946,7 @@ HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG
return ret;
}
HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr)
HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr)
{
HRESULT ret;
OutTraceDDRAW("SetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags);
@ -4891,7 +4962,7 @@ HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG
return ret;
}
HRESULT WINAPI extGetAvailableVidMem(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree, GetAvailableVidMem_Type pGetAvailableVidMem)
HRESULT WINAPI extGetAvailableVidMem(LPDIRECTDRAW lpdd, LPDDSCAPS lpDDSCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree, GetAvailableVidMem_Type pGetAvailableVidMem)
{
HRESULT res;
//const DWORD dwMaxMem = 0x7FFFF000;

View File

@ -1268,8 +1268,29 @@ static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrec
void SetBltTransformations()
{
OutTraceDW("SetBltTransformations: color transformation %d->%d\n",
dxw.VirtualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwRGBBitCount);
pPrimaryBlt = PrimaryBlt;
if(dxw.dwFlags5 & AEROBOOST) pPrimaryBlt = PrimaryStretchBlt;
if(dxw.dwFlags5 & BILINEARFILTER) pPrimaryBlt = PrimaryBilinearBlt;
if(dxw.dwFlags5 & DOFASTBLT) pPrimaryBlt = PrimaryFastBlt; // debug opt
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 *);
pColorConversion = ColorConversionDDRAW; // default for no emulation mode
if(dxw.dwFlags1 & EMULATESURFACE) {
pColorConversion = ColorConversionEmulated; // default for emulation mode
if(dxw.dwFlags5 & HYBRIDMODE) pColorConversion = ColorConversionDDRAW;
if(dxw.dwFlags5 & GDICOLORCONV) pColorConversion = ColorConversionGDI;
}
char *s = "???";
if(pColorConversion == ColorConversionDDRAW) s="DDRAW";
if(pColorConversion == ColorConversionGDI) s="GDI";
if(pColorConversion == ColorConversionEmulated) s="EMULATED";
OutTraceDW("SetBltTransformations: color conversion %s BPP %d->%d\n",
s, dxw.VirtualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwRGBBitCount);
if(pColorConversion != ColorConversionEmulated) return;
/* default (bad) setting */
pEmuBlt=EmuBlt_Null;
@ -1331,11 +1352,4 @@ void SetBltTransformations()
dxw.ActualPixelFormat.dwRGBBitCount);
break;
}
pPrimaryBlt = PrimaryBlt;
if(dxw.dwFlags5 & AEROBOOST) pPrimaryBlt = PrimaryStretchBlt;
if(dxw.dwFlags5 & BILINEARFILTER) pPrimaryBlt = PrimaryBilinearBlt;
if(dxw.dwFlags5 & DOFASTBLT) pPrimaryBlt = PrimaryFastBlt; // debug opt
if(dxw.dwFlags5 & NOBLT) pPrimaryBlt = PrimaryNoBlt; // debug opt
return;
}

View File

@ -794,7 +794,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
extern void SetVSyncDelays(LPDIRECTDRAW);
extern LPDIRECTDRAW lpPrimaryDD;
if(dxw.dwFlags4 & STRETCHTIMERS) dxw.RenewTimers();
SetVSyncDelays(lpPrimaryDD);
if(lpPrimaryDD) SetVSyncDelays(lpPrimaryDD);
LastTimeShift=dxw.TimeShift;
}
@ -1302,6 +1302,7 @@ void HookModule(HMODULE base, int dxversion)
(dxw.dwFlags4 & OVERRIDEREGISTRY) ||
(dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
//HookSmackW32(base);
}
#define USEWINNLSENABLE
@ -1576,6 +1577,18 @@ static void ReplacePrivilegedOps()
HWND hDesktopWindow = NULL;
#endif
// Message poller: its only purpose is to keep sending messages to the main window
// so that the message loop is kept running. It is a trick necessary to play
// smack videos with smackw32.dll and AUTOREFRESH mode set
DWORD WINAPI MessagePoller(LPVOID lpParameter)
{
#define DXWREFRESHINTERVAL 20
while(TRUE){
Sleep(DXWREFRESHINTERVAL);
SendMessage(dxw.GethWnd(), WM_NCHITTEST, 0, 0);
}
}
void HookInit(TARGETMAP *target, HWND hwnd)
{
HMODULE base;
@ -1604,6 +1617,13 @@ void HookInit(TARGETMAP *target, HWND hwnd)
SetDllDirectory(sSourcePath);
if(dxw.dwFlags1 & AUTOMATIC) dxw.dwFlags1 |= EMULATESURFACE; // if AUTOMATIC, try this first!
if(dxw.dwFlags5 & HYBRIDMODE) {
// special mode settings ....
dxw.dwFlags1 |= EMULATESURFACE;
dxw.dwFlags5 |= NOSYSTEMEMULATED;
dxw.dwFlags2 |= SETCOMPATIBILITY;
dxw.dwFlags5 &= ~(BILINEARFILTER | AEROBOOST);
}
if(hwnd){ // v2.02.32: skip this when in code injection mode.
// v2.1.75: is it correct to set hWnd here?
@ -1662,6 +1682,14 @@ void HookInit(TARGETMAP *target, HWND hwnd)
if (dxw.dwFlags4 & LIMITSCREENRES) OutTrace("HookInit: max resolution=%s\n", (dxw.MaxScreenRes<6)?Resolutions[dxw.MaxScreenRes]:"unknown");
}
{
// Beware: for some strange & mysterious reason, this call makes Warcraft II and other games
// work better, avoiding something that resembles a black palette (no blit errors, but the
// whole screen black!!) and an AERO rupture.
PIXELFORMATDESCRIPTOR pfd;
DescribePixelFormat(GetDC(GetDesktopWindow()), 1, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
}
if (hwnd && IsDebug){
DWORD dwStyle, dwExStyle;
char ClassName[81];
@ -1786,6 +1814,9 @@ void HookInit(TARGETMAP *target, HWND hwnd)
AdjustWindowPos(dxw.hParentWnd, target->sizx, target->sizy);
}
}
if (dxw.dwFlags1 & AUTOREFRESH)
CreateThread(NULL, 0, MessagePoller, NULL, 0, NULL);
}
LPCSTR ProcToString(LPCSTR proc)

View File

@ -11,6 +11,7 @@ extern void HookUser32(HMODULE);
extern void HookWinMM(HMODULE);
extern void HookAdvApi32(HMODULE);
extern void HookImagehlp(HMODULE);
extern void HookSmackW32(HMODULE);
extern void InitPosition(int, int, int, int, int, int);
//void InitWindowPos(int, int, int, int);

View File

@ -240,4 +240,7 @@ typedef enum {
DXVK_TIMETOGGLE,
DXVK_ALTF4,
DXVK_SIZE
};
};
typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *);
extern ColorConversion_Type pColorConversion;

Binary file not shown.

View File

@ -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.03.05"
#define VERSION "2.03.06"
#define DXWACTIVATESINGLETASK 1 // comment to allow multiple task activations
#define DDTHREADLOCK 1

Binary file not shown.

View File

@ -357,6 +357,13 @@ BOOL WINAPI extQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)
else{
LARGE_INTEGER CurrentInCount;
ret=(*pQueryPerformanceCounter)(&CurrentInCount);
if(dxw.dwFlags5 & NORMALIZEPERFCOUNT) {
LARGE_INTEGER PerfFrequency;
static LARGE_INTEGER StartCounter = {0LL};
if (StartCounter.QuadPart == 0LL) StartCounter.QuadPart = CurrentInCount.QuadPart;
(*pQueryPerformanceFrequency)(&PerfFrequency);
CurrentInCount.QuadPart = ((CurrentInCount.QuadPart - StartCounter.QuadPart) * 1000000LL) / PerfFrequency.QuadPart;
}
*lpPerformanceCount = dxw.StretchLargeCounter(CurrentInCount);
}
@ -374,8 +381,15 @@ BOOL WINAPI extQueryPerformanceFrequency(LARGE_INTEGER *lpPerformanceFrequency)
*lpPerformanceFrequency=myPerfFrequency;
ret = 0;
}
else
ret=(*pQueryPerformanceFrequency)(lpPerformanceFrequency);
else{
if(dxw.dwFlags5 & NORMALIZEPERFCOUNT){
lpPerformanceFrequency->QuadPart = 1000000LL;
ret = TRUE;
}
else{
ret = (*pQueryPerformanceFrequency)(lpPerformanceFrequency);
}
}
OutTraceDW("QueryPerformanceFrequency: ret=%x Frequency=%x-%x\n", ret, lpPerformanceFrequency->HighPart, lpPerformanceFrequency->LowPart);
return ret;
}
@ -726,6 +740,21 @@ BOOL WINAPI extCreateProcessA(
OutTraceDW("CreateProcess: SUPPRESS\n");
return TRUE;
}
#if 0
// useless: DxWnd should hook to two processes contemporarily ....
// problem: binkplay seems to detect the screen actual size
if(TRUE){
// get rid of /R option from binkplay argument line
if(!strncmp(lpCommandLine, "binkplay.exe ", strlen("binkplay.exe "))){
char *rCommand;
rCommand = strstr(lpCommandLine, "/R ");
if(rCommand) memset(rCommand, ' ', strlen("/R "));
OutTraceDW("CreateProcess: ApplicationName=\"%s\" CommandLine=\"%s\"\n", lpApplicationName, lpCommandLine);
}
}
#endif
//#define RELEASEHOOKTOSONPROCESS TRUE
// extern void UnhookProc();
// if(RELEASEHOOKTOSONPROCESS) UnhookProc();

View File

@ -22,17 +22,37 @@ SmackOpen_Type pSmackOpen = NULL;
SmackStruct * WINAPI extSmackOpen(HANDLE, UINT32, INT32);
static HookEntry_Type Hooks[]={
{HOOK_IAT_CANDIDATE, "_SmackOpen@12", (FARPROC)NULL, (FARPROC *)&pSmackOpen, (FARPROC)extSmackOpen},
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule)
{
if (!strcmp(proc,"_SmackOpen@12") && !pSmackOpen){
pSmackOpen=(SmackOpen_Type)(*pGetProcAddress)(hModule, proc);
OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pSmackOpen);
return (FARPROC)extSmackOpen;
}
FARPROC addr;
if (addr=RemapLibrary(proc, hModule, Hooks)) return addr;
// NULL -> keep the original call address
return NULL;
}
static char *libname = "smackw32.dll";
void HookSmackW32(HMODULE hModule)
{
HookLibrary(hModule, Hooks, libname);
return;
}
DWORD ThreadId = 0;
DWORD WINAPI DoScreenRefresh(LPVOID lpParameter)
{
while(TRUE){
Sleep(20);
dxw.ScreenRefresh();
}
}
SmackStruct * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 unknown)
{
SmackStruct *ret;
@ -43,8 +63,6 @@ SmackStruct * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 unknown)
if (ret) {
OutTraceDW("SmackOpen: version=%x screen=(%dx%d) frame_count=%d frame_number=%d\n",
ret->version, ret->width, ret->height, ret->frame_count, ret->frame_number);
//ret->width=800;
//ret->height=600;
}
return ret;
}

View File

@ -52,7 +52,20 @@ void CDesktopDialog::OnTimer(UINT_PTR nIDEvent)
PIXELFORMATDESCRIPTOR pfd;
int iPixelFormat;
// get the current pixel format index
// get the current pixel format index
#if 0
::DescribePixelFormat(hDC, 1, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
HMODULE ogl;
//ogl=LoadLibrary("opengl32");
ogl=LoadLibrary("gdi32");
typedef BOOL (WINAPI *wglGetPixelFormat_Type)(HDC);
wglGetPixelFormat_Type pwglGetPixelFormat;
//pwglGetPixelFormat = (wglGetPixelFormat_Type)GetProcAddress(ogl, "wglGetPixelFormat");
pwglGetPixelFormat = (wglGetPixelFormat_Type)GetProcAddress(ogl, "GetPixelFormat");
iPixelFormat = (*pwglGetPixelFormat)(hDC);
iPixelFormat = (*pwglGetPixelFormat)(NULL);
//iPixelFormat = ::GetPixelFormat(NULL);
#endif
iPixelFormat = ::GetPixelFormat(hDC);
if(!iPixelFormat) iPixelFormat=1; // why returns 0???
if(iPixelFormat){
@ -76,7 +89,6 @@ void CDesktopDialog::OnTimer(UINT_PTR nIDEvent)
sprintf_s(sMsg, 1024, "error %d", GetLastError());
}
this->SetDlgItemTextA(IDC_DESKTOPINFO, sMsg);
}

Binary file not shown.

View File

@ -34,6 +34,7 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_MARKBLIT, cTarget->m_MarkBlit);
DDX_Check(pDX, IDC_NOBLT, cTarget->m_NoBlt);
DDX_Check(pDX, IDC_FASTBLT, cTarget->m_FastBlt);
DDX_Check(pDX, IDC_GDICOLORCONV, cTarget->m_GDIColorConv);
DDX_Check(pDX, IDC_ANALYTICMODE, cTarget->m_AnalyticMode);
DDX_Check(pDX, IDC_SURFACEWARN, cTarget->m_SurfaceWarn);
DDX_Check(pDX, IDC_CAPMASK, cTarget->m_CapMask);

View File

@ -36,6 +36,7 @@ void CTabTiming::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_TIMESTRETCH, cTarget->m_TimeStretch);
DDX_Check(pDX, IDC_INTERCEPTRDTSC, cTarget->m_InterceptRDTSC);
DDX_Check(pDX, IDC_STRETCHTIMERS, cTarget->m_StretchTimers);
DDX_Check(pDX, IDC_NORMALIZEPERFCOUNT, cTarget->m_NormalizePerfCount);
DDX_Check(pDX, IDC_QUARTERBLT, cTarget->m_QuarterBlt);
DDX_Check(pDX, IDC_FINETIMING, cTarget->m_FineTiming);
DDX_Text(pDX, IDC_MAXFPS, cTarget->m_MaxFPS);

View File

@ -110,6 +110,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_NoBlt = FALSE;
m_BilinearBlt = FALSE;
m_FastBlt = FALSE;
m_GDIColorConv = FALSE;
m_PreventMaximize = FALSE;
m_ClientRemapping = TRUE; // default true !!
m_LockWinPos = FALSE;
@ -139,6 +140,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_ShowTimeStretch = FALSE;
m_TimeStretch = FALSE;
m_StretchTimers = FALSE;
m_NormalizePerfCount = FALSE;
m_QuarterBlt = FALSE;
m_FineTiming = FALSE;
m_ReleaseMouse = FALSE;

View File

@ -90,6 +90,7 @@ public:
BOOL m_NoBlt;
BOOL m_BilinearBlt;
BOOL m_FastBlt;
BOOL m_GDIColorConv;
BOOL m_PreventMaximize;
BOOL m_ClientRemapping;
BOOL m_LockWinPos;
@ -119,6 +120,7 @@ public:
BOOL m_ShowTimeStretch;
BOOL m_TimeStretch;
BOOL m_StretchTimers;
BOOL m_NormalizePerfCount;
BOOL m_QuarterBlt;
BOOL m_FineTiming;
BOOL m_ReleaseMouse;

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -131,6 +131,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
case 2: t->flags |= EMULATEBUFFER; break;
case 3: t->flags |= LOCKEDSURFACE; break;
case 4: t->flags |= EMULATESURFACE; break;
case 5: t->flags5 |= HYBRIDMODE; break;
break;
}
@ -238,6 +239,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_NoSystemEmulated) t->flags5 |= NOSYSTEMEMULATED;
if(dlg->m_NoBlt) t->flags5 |= NOBLT;
if(dlg->m_FastBlt) t->flags5 |= DOFASTBLT;
if(dlg->m_GDIColorConv) t->flags5 |= GDICOLORCONV;
if(dlg->m_PreventMaximize) t->flags |= PREVENTMAXIMIZE;
if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING;
if(dlg->m_LockWinPos) t->flags |= LOCKWINPOS;
@ -267,6 +269,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_ShowTimeStretch) t->flags4 |= SHOWTIMESTRETCH;
if(dlg->m_TimeStretch) t->flags2 |= TIMESTRETCH;
if(dlg->m_StretchTimers) t->flags4 |= STRETCHTIMERS;
if(dlg->m_NormalizePerfCount) t->flags5 |= NORMALIZEPERFCOUNT;
if(dlg->m_QuarterBlt) t->flags5 |= QUARTERBLT;
if(dlg->m_FineTiming) t->flags4 |= FINETIMING;
if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE;
@ -334,6 +337,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 2;
if(t->flags & LOCKEDSURFACE) dlg->m_DxEmulationMode = 3;
if(t->flags & EMULATESURFACE) dlg->m_DxEmulationMode = 4;
if(t->flags5 & HYBRIDMODE) dlg->m_DxEmulationMode = 5;
dlg->m_DxFilterMode = 0;
if(t->flags4 & BILINEAR2XFILTER) dlg->m_DxFilterMode = 1;
@ -431,6 +435,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_NoSystemEmulated = t->flags5 & NOSYSTEMEMULATED ? 1 : 0;
dlg->m_NoBlt = t->flags5 & NOBLT ? 1 : 0;
dlg->m_FastBlt = t->flags5 & DOFASTBLT ? 1 : 0;
dlg->m_GDIColorConv = t->flags5 & GDICOLORCONV ? 1 : 0;
dlg->m_PreventMaximize = t->flags & PREVENTMAXIMIZE ? 1 : 0;
dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0;
dlg->m_LockWinPos = t->flags & LOCKWINPOS ? 1 : 0;
@ -460,6 +465,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_ShowTimeStretch = t->flags4 & SHOWTIMESTRETCH ? 1 : 0;
dlg->m_TimeStretch = t->flags2 & TIMESTRETCH ? 1 : 0;
dlg->m_StretchTimers = t->flags4 & STRETCHTIMERS ? 1 : 0;
dlg->m_NormalizePerfCount = t->flags5 & NORMALIZEPERFCOUNT ? 1 : 0;
dlg->m_QuarterBlt = t->flags5 & QUARTERBLT ? 1 : 0;
dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0;
dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0;
@ -655,16 +661,16 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c
sprintf_s(key, sizeof(key), "coord%i", i);
TargetMap->coordinates = GetPrivateProfileInt("target", key, 0, InitPath);
// be sure just one of the emulation flags is set
sprintf_s(key, sizeof(key), "flag%i", i);
TargetMap->flags = GetPrivateProfileInt("target", key, 0, InitPath);
flags = TargetMap->flags;
TargetMap->flags &= ~EMULATEFLAGS;
do{
if(flags & EMULATESURFACE) {TargetMap->flags |= EMULATESURFACE; break;}
if(flags & EMULATEBUFFER) {TargetMap->flags |= EMULATEBUFFER; break;}
if(flags & LOCKEDSURFACE) {TargetMap->flags |= LOCKEDSURFACE; break;}
} while (0);
//// be sure just one of the emulation flags is set
//flags = TargetMap->flags;
//TargetMap->flags &= ~EMULATEFLAGS;
//do{
// if(flags & EMULATESURFACE) {TargetMap->flags |= EMULATESURFACE; break;}
// if(flags & EMULATEBUFFER) {TargetMap->flags |= EMULATEBUFFER; break;}
// if(flags & LOCKEDSURFACE) {TargetMap->flags |= LOCKEDSURFACE; break;}
//} while (0);
sprintf_s(key, sizeof(key), "flagg%i", i);
TargetMap->flags2 = GetPrivateProfileInt("target", key, 0, InitPath);

Binary file not shown.