mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_02_65_src
Former-commit-id: 80a015af2f1fbc6441330b08ad896bf4b3981927
This commit is contained in:
parent
d47c4cfab1
commit
60c8028a1d
@ -133,6 +133,7 @@
|
||||
#define NOFLIPEMULATION 0x00020000 // Compensate the effect of Flip-ping through Blt operations
|
||||
#define NOTEXTURES 0x00040000 // Disabled (whitened) textures
|
||||
#define RETURNNULLREF 0x00080000 // IDirectDraw::Release and IDDrawSurface::Release will always return 0 ref. counter
|
||||
#define FINETIMING 0x00100000 // Fine timeslider coarse, by 10% steps ranging from about :2 to x2
|
||||
|
||||
// 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:f848ba14637f8a11e413b5263df2c0eb3de7c1bba21f2db3602e9971c0f85804
|
||||
size 464896
|
||||
oid sha256:33ac0e7db3ed4efc6da6c4cc7f0988314aa96698631c5937ccb988ed50a82be3
|
||||
size 466432
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ad2a6e8e0b8119551bfb5352ba7c18e3c892b6dbae0a1e6d1be32b2d5bc9c094
|
||||
oid sha256:b1ab56aec078a3b4123d5d7fe8319b0c9baea51b7e987f61dfe5c61b47c1c56d
|
||||
size 535552
|
||||
|
26
build/exports/DeathSpank The Baconing.dxw
Normal file
26
build/exports/DeathSpank The Baconing.dxw
Normal file
@ -0,0 +1,26 @@
|
||||
[target]
|
||||
title0=DeathSpank: The Baconing
|
||||
path0=D:\Games\The Baconing\TheBaconing.exe
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=9
|
||||
coord0=0
|
||||
flag0=134218272
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
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
|
@ -1,15 +1,15 @@
|
||||
[target]
|
||||
title0=deadrising2otr.exe
|
||||
path0=C:\Program Files (x86)\Capcom\Dead Rising 2 Off The Record\deadrising2otr.exe
|
||||
title0=Fallout
|
||||
path0=D:\Games\Fallout\FALLOUTW.EXE
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
ver0=1
|
||||
coord0=0
|
||||
flag0=0
|
||||
flag0=134218272
|
||||
flagg0=134217728
|
||||
flagh0=16
|
||||
flagi0=0
|
||||
tflag0=3
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -22,3 +22,5 @@ sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
24
build/exports/JetMoto.dxw
Normal file
24
build/exports/JetMoto.dxw
Normal file
@ -0,0 +1,24 @@
|
||||
[target]
|
||||
title0=JetMoto
|
||||
path0=D:\Games\Jet_Moto\JETMOTO.EXE
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=671088674
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=0
|
||||
tflag0=64
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
@ -5,11 +5,11 @@ module0=
|
||||
opengllib0=
|
||||
ver0=1
|
||||
coord0=0
|
||||
flag0=134234656
|
||||
flag0=134234784
|
||||
flagg0=1208025344
|
||||
flagh0=20
|
||||
flagi0=12
|
||||
tflag0=5249
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
|
26
build/exports/WarWind.dxw
Normal file
26
build/exports/WarWind.dxw
Normal file
@ -0,0 +1,26 @@
|
||||
[target]
|
||||
title0=WarWind
|
||||
path0=D:\Games\WarWind\WW.EXE
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134234656
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
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,7 +5,7 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134217762
|
||||
flag0=134218400
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
@ -22,3 +22,5 @@ sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=0
|
||||
|
26
build/exports/Warwind 2.dxw
Normal file
26
build/exports/Warwind 2.dxw
Normal file
@ -0,0 +1,26 @@
|
||||
[target]
|
||||
title0=Warwind 2
|
||||
path0=D:\Games\Warwind 2\WARWIND2.EXE
|
||||
module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=134234656
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=4
|
||||
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
|
@ -1,5 +1,5 @@
|
||||
[window]
|
||||
posx=1007
|
||||
posy=65
|
||||
sizx=769
|
||||
sizy=832
|
||||
posx=1316
|
||||
posy=462
|
||||
sizx=320
|
||||
sizy=200
|
||||
|
@ -429,7 +429,7 @@ added DirectX "Return 0 ref counter" option as quick & dirty solution to many re
|
||||
fixed DirectDrawCreateEx failing to register the main ddraw session handle
|
||||
fixed palette problem in emulated mode: palette must be applied to backbuffer surface as well. Now "Duckman" and "Total Soccer 2000" show perfect colors.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
v2.02.65
|
||||
added "Fine time adjust" flag to finely set timeslider by 10% steps ranging from about :2 to x2
|
||||
fixed a bug in DWORD timers introduced in v2.02.60: now "Warcraft 2" timing works again
|
||||
revised logit to calculate delays to emulate VSync timing - now should be more accurate and depending on actual screen refresh rate
|
||||
|
@ -283,6 +283,32 @@ FARPROC Remap_ddraw_ProcAddress(LPCSTR proc, HMODULE hModule)
|
||||
// auxiliary (static) functions
|
||||
/* ------------------------------------------------------------------------------ */
|
||||
|
||||
DWORD gdwRefreshRate;
|
||||
#define MAXREFRESHDELAYCOUNT 20
|
||||
int iRefreshDelays[MAXREFRESHDELAYCOUNT]={16, 17};
|
||||
int iRefreshDelayCount=2;
|
||||
|
||||
void SetVSyncDelays(LPDIRECTDRAW lpdd)
|
||||
{
|
||||
DDSURFACEDESC ddsdRefreshRate;
|
||||
int Reminder;
|
||||
memset(&ddsdRefreshRate, 0, sizeof(ddsdRefreshRate));
|
||||
ddsdRefreshRate.dwSize = sizeof(ddsdRefreshRate);
|
||||
(*pGetDisplayMode)(lpdd, &ddsdRefreshRate);
|
||||
gdwRefreshRate = ddsdRefreshRate.dwRefreshRate;
|
||||
if(!gdwRefreshRate) return;
|
||||
iRefreshDelayCount=0;
|
||||
Reminder=0;
|
||||
do{
|
||||
iRefreshDelays[iRefreshDelayCount]=(1000+Reminder)/gdwRefreshRate;
|
||||
Reminder=(1000+Reminder)-(iRefreshDelays[iRefreshDelayCount]*gdwRefreshRate);
|
||||
iRefreshDelayCount++;
|
||||
} while(Reminder && (iRefreshDelayCount<MAXREFRESHDELAYCOUNT));
|
||||
OutTraceDW("Refresh rate=%d: delay=", gdwRefreshRate);
|
||||
for(int i=0; i<iRefreshDelayCount; i++) OutTraceDW("%d ", iRefreshDelays[i]);
|
||||
OutTraceDW("\n");
|
||||
}
|
||||
|
||||
static void Stopper(char *s, int line)
|
||||
{
|
||||
char sMsg[81];
|
||||
@ -1848,6 +1874,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd,
|
||||
OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n",
|
||||
ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, ddsd.dwWidth, ddsd.dwHeight);
|
||||
|
||||
SetVSyncDelays(lpdd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2671,6 +2698,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
|
||||
|
||||
// creation of the primary surface....
|
||||
if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){
|
||||
SetVSyncDelays(lpdd);
|
||||
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
|
||||
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
|
||||
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
|
||||
@ -3265,17 +3293,15 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc,
|
||||
if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0);
|
||||
|
||||
if(dxw.dwFlags4 & NOFLIPEMULATION){
|
||||
// create a temporary working surface
|
||||
memset(&ddsd, 0, sizeof(ddsd));
|
||||
ddsd.dwSize = SurfaceDescrSize(lpdds);
|
||||
//if(pGetSurfaceDesc1) (*pGetSurfaceDesc1)(lpDDSBack, (LPDDSURFACEDESC)&ddsd);
|
||||
(*pGetSurfaceDescMethod(lpdds))((LPDIRECTDRAWSURFACE2)lpDDSBack, &ddsd);
|
||||
ddsd.dwFlags &= ~DDSD_PITCH;
|
||||
//DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[temp]" , __LINE__);
|
||||
res=(*pCreateSurfaceMethod(lpdds))(lpPrimaryDD, &ddsd, &lpddsTmp, NULL);
|
||||
if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
OutTrace("DEBUG: copied surface size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight);
|
||||
//OutTrace("DEBUG: copied surface size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight);
|
||||
// copy front buffer
|
||||
|
||||
if(dxw.dwFlags1 & EMULATESURFACE){
|
||||
// in emulated mode, the primary surface is virtual and you can pick it all
|
||||
// needed for "Gruntz"
|
||||
@ -3316,7 +3342,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc,
|
||||
}
|
||||
|
||||
if(dxw.dwFlags4 & NOFLIPEMULATION){
|
||||
// restore flipped backbuffer
|
||||
// restore flipped backbuffer and delete temporary surface
|
||||
res= (*pBlt)(lpddssrc, NULL, lpddsTmp, NULL, DDBLT_WAIT, NULL);
|
||||
if(res) OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), __LINE__);
|
||||
(*pReleaseS)(lpddsTmp);
|
||||
@ -3417,9 +3443,8 @@ HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE
|
||||
tmp = (*pGetTickCount)();
|
||||
if((time - tmp) > 32) time = tmp;
|
||||
(*pSleep)(time - tmp);
|
||||
if(step) time += 16;
|
||||
else time += 17;
|
||||
step ^= 1;
|
||||
time += iRefreshDelays[step++];
|
||||
if(step >= iRefreshDelayCount) step=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3469,9 +3494,9 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd
|
||||
OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp);
|
||||
|
||||
res=(*pSetPalette)(lpdds, lpddp);
|
||||
res=DD_OK;
|
||||
if(res)OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
else OutTraceDDRAW("SetPalette: OK\n");
|
||||
res=DD_OK;
|
||||
|
||||
if((dxw.dwFlags1 & EMULATESURFACE) && isPrim){
|
||||
OutTraceDW("SetPalette: register PRIMARY palette lpDDP=%x\n", lpddp);
|
||||
@ -3485,12 +3510,13 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd
|
||||
}
|
||||
// Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ...
|
||||
if (lpDDSBack) {
|
||||
OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack);
|
||||
res=(*pSetPalette)(lpDDSBack, lpddp);
|
||||
if(res) OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
||||
}
|
||||
// add a reference to simulate what would happen in reality....
|
||||
lpdds->AddRef();
|
||||
res=0;
|
||||
res=DD_OK;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
@ -72,8 +72,8 @@ static char *Flag4Names[32]={
|
||||
"ZBUFFERCLEAN", "ZBUFFER0CLEAN", "ZBUFFERALWAYS", "DISABLEFOGGING",
|
||||
"NOPOWER2FIX", "NOPERFCOUNTER", "ADDPROXYLIBS", "INTERCEPTRDTSC",
|
||||
"LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP",
|
||||
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "",
|
||||
"", "", "", "",
|
||||
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF",
|
||||
"FINETIMING", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
};
|
||||
|
@ -7,6 +7,21 @@
|
||||
#include "dxhelper.h"
|
||||
#include "resource.h"
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
// Internal function pointers
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
typedef DWORD (*TimeShifter_Type)(DWORD, int);
|
||||
typedef LARGE_INTEGER (*TimeShifter64_Type)(LARGE_INTEGER, int);
|
||||
|
||||
TimeShifter_Type pTimeShifter;
|
||||
TimeShifter64_Type pTimeShifter64;
|
||||
|
||||
static DWORD TimeShifterFine(DWORD, int);
|
||||
static LARGE_INTEGER TimeShifter64Fine(LARGE_INTEGER, int);
|
||||
static DWORD TimeShifterCoarse(DWORD, int);
|
||||
static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER, int);
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
// Constructor, destructor, initialization....
|
||||
/* ------------------------------------------------------------------ */
|
||||
@ -75,6 +90,14 @@ void dxwCore::InitTarget(TARGETMAP *target)
|
||||
MaxScreenRes = target->MaxScreenRes;
|
||||
Coordinates = target->coordinates;
|
||||
MustShowOverlay=((dwFlags2 & SHOWFPSOVERLAY) || (dwFlags4 & SHOWTIMESTRETCH));
|
||||
if(dwFlags4 & FINETIMING){
|
||||
pTimeShifter = TimeShifterFine;
|
||||
pTimeShifter64 = TimeShifter64Fine;
|
||||
}
|
||||
else{
|
||||
pTimeShifter = TimeShifterCoarse;
|
||||
pTimeShifter64 = TimeShifter64Coarse;
|
||||
}
|
||||
}
|
||||
|
||||
void dxwCore::SetScreenSize(void)
|
||||
@ -616,6 +639,23 @@ void dxwCore::UnmapClient(int *nXDest, int *nYDest)
|
||||
if(h) *nYDest= *nYDest * (int)dwScreenHeight / h;
|
||||
}
|
||||
|
||||
void dxwCore::UnmapClient(LPRECT lpRect)
|
||||
{
|
||||
RECT client;
|
||||
int w, h;
|
||||
(*pGetClientRect)(hWnd, &client);
|
||||
w = client.right ? client.right : iSizX;
|
||||
h = client.bottom ? client.bottom : iSizY;
|
||||
if(w) {
|
||||
lpRect->left = (lpRect->left * (int)dwScreenWidth) / w;
|
||||
lpRect->right = (lpRect->right * (int)dwScreenWidth) / w;
|
||||
}
|
||||
if(h) {
|
||||
lpRect->top = (lpRect->top * (int)dwScreenHeight) / h;
|
||||
lpRect->bottom = (lpRect->bottom * (int)dwScreenHeight) / h;
|
||||
}
|
||||
}
|
||||
|
||||
void dxwCore::MapWindow(LPRECT rect)
|
||||
{
|
||||
RECT client;
|
||||
@ -746,7 +786,7 @@ void dxwCore::ScreenRefresh(void)
|
||||
if (tn-t < DXWREFRESHINTERVAL) return;
|
||||
t = tn;
|
||||
|
||||
// if not too early, refresh colors on primary surface ....
|
||||
// if not too early, refresh primary surface ....
|
||||
lpDDSPrim=dxw.GetPrimarySurface();
|
||||
if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL);
|
||||
|
||||
@ -841,8 +881,18 @@ BOOL dxwCore::HandleFPS()
|
||||
if(dwFlags2 & SKIPFPS) if(SkipFrameCount(dxw.MaxFPS)) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static float fMul[17]={2.14F, 1.95F, 1.77F, 1.61F, 1.46F, 1.33F, 1.21F, 1.10F, 1.00F, 0.91F, 0.83F, 0.75F, 0.68F, 0.62F, 0.56F, 0.51F, 0.46F};
|
||||
//static float fMul[17]={0.46F, 0.51F, 0.56F, 0.62F, 0.68F, 0.75F, 0.83F, 0.91F, 1.00F, 1.10F, 1.21F, 1.33F, 1.46F, 1.61F, 1.77F, 1.95F, 2.14F};
|
||||
|
||||
static DWORD TimeShifter(DWORD val, int shift)
|
||||
static DWORD TimeShifterFine(DWORD val, int shift)
|
||||
{
|
||||
float fVal;
|
||||
fVal = (float)val * fMul[shift+8];
|
||||
return (DWORD)fVal;
|
||||
}
|
||||
|
||||
static DWORD TimeShifterCoarse(DWORD val, int shift)
|
||||
{
|
||||
int exp, reminder;
|
||||
if (shift > 0) {
|
||||
@ -860,7 +910,16 @@ static DWORD TimeShifter(DWORD val, int shift)
|
||||
return val;
|
||||
}
|
||||
|
||||
static LARGE_INTEGER TimeShifter64(LARGE_INTEGER val, int shift)
|
||||
static LARGE_INTEGER TimeShifter64Fine(LARGE_INTEGER val, int shift)
|
||||
{
|
||||
float fVal;
|
||||
fVal = (float)val.LowPart * fMul[shift+8];
|
||||
val.HighPart = 0;
|
||||
val.LowPart = (DWORD)fVal;
|
||||
return val;
|
||||
}
|
||||
|
||||
static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER val, int shift)
|
||||
{
|
||||
int exp, reminder;
|
||||
if (shift > 0) {
|
||||
@ -884,7 +943,7 @@ DWORD dxwCore::GetTickCount(void)
|
||||
static DWORD dwLastRealTick=0;
|
||||
static DWORD dwLastFakeTick=0;
|
||||
DWORD dwNextRealTick;
|
||||
BOOL FirstTime = TRUE;
|
||||
static BOOL FirstTime = TRUE;
|
||||
|
||||
if(FirstTime){
|
||||
dwLastRealTick=(*pGetTickCount)();
|
||||
@ -894,7 +953,7 @@ DWORD dxwCore::GetTickCount(void)
|
||||
dwNextRealTick=(*pGetTickCount)();
|
||||
dwTick=(dwNextRealTick-dwLastRealTick);
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTick = TimeShifter(dwTick, TimeShift);
|
||||
dwTick = (*pTimeShifter)(dwTick, TimeShift);
|
||||
dwLastFakeTick += dwTick;
|
||||
dwLastRealTick = dwNextRealTick;
|
||||
return dwLastFakeTick;
|
||||
@ -903,14 +962,14 @@ DWORD dxwCore::GetTickCount(void)
|
||||
DWORD dxwCore::StretchTime(DWORD dwTimer)
|
||||
{
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTimer = TimeShifter(dwTimer, -TimeShift);
|
||||
dwTimer = (*pTimeShifter)(dwTimer, -TimeShift);
|
||||
return dwTimer;
|
||||
}
|
||||
|
||||
DWORD dxwCore::StretchCounter(DWORD dwTimer)
|
||||
{
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTimer = TimeShifter(dwTimer, TimeShift);
|
||||
dwTimer = (*pTimeShifter)(dwTimer, TimeShift);
|
||||
return dwTimer;
|
||||
}
|
||||
|
||||
@ -920,7 +979,7 @@ LARGE_INTEGER dxwCore::StretchCounter(LARGE_INTEGER dwTimer)
|
||||
LARGE_INTEGER ret;
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTimer.QuadPart += Reminder;
|
||||
ret = TimeShifter64(dwTimer, TimeShift);
|
||||
ret = (*pTimeShifter64)(dwTimer, TimeShift);
|
||||
Reminder = (ret.QuadPart==0) ? dwTimer.LowPart : 0;
|
||||
return ret;
|
||||
}
|
||||
@ -947,7 +1006,7 @@ void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
|
||||
dwCurrentTick=(*pGetTickCount)();
|
||||
dwTick=(dwCurrentTick-dwStartTick);
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTick = TimeShifter(dwTick, TimeShift);
|
||||
dwTick = (*pTimeShifter)(dwTick, TimeShift);
|
||||
// From MSDN: Contains a 64-bit value representing the number of
|
||||
// 100-nanosecond intervals since January 1, 1601 (UTC).
|
||||
// So, since 1mSec = 10.000 * 100nSec, you still have to multiply by 10.000.
|
||||
@ -982,7 +1041,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime)
|
||||
dwCurrentTick=(*pGetTickCount)();
|
||||
dwTick=(dwCurrentTick-dwStartTick);
|
||||
TimeShift=GetHookInfo()->TimeShift;
|
||||
dwTick = TimeShifter(dwTick, TimeShift);
|
||||
dwTick = (*pTimeShifter)(dwTick, TimeShift);
|
||||
// From MSDN: Contains a 64-bit value representing the number of
|
||||
// 100-nanosecond intervals since January 1, 1601 (UTC).
|
||||
// So, since 1mSec = 10.000 * 100nSec, you still have to multiply by 10.000.
|
||||
@ -1108,20 +1167,27 @@ void dxwCore::ShowTimeStretching(HDC xdc)
|
||||
SetTextColor(xdc,color);
|
||||
//SetBkMode(xdc, TRANSPARENT);
|
||||
SetBkMode(xdc, OPAQUE);
|
||||
sprintf_s(sBuf, 80, "Time %s", dxw.GetTSCaption());
|
||||
sprintf_s(sBuf, 80, "t%s", dxw.GetTSCaption());
|
||||
TextOut(xdc, x, y, sBuf, strlen(sBuf));
|
||||
}
|
||||
|
||||
char *dxwCore::GetTSCaption(int shift)
|
||||
{
|
||||
static char *sTSCaption[17]={
|
||||
static char *sTSCaptionCoarse[17]={
|
||||
"x16","x12","x8","x6",
|
||||
"x4","x3","x2","x1.5",
|
||||
"x1",
|
||||
":1.5",":2",":3",":4",
|
||||
":6",":8",":12",":16"};
|
||||
static char *sTSCaptionFine[17]={
|
||||
"x2.14","x1.95","x1.77","x1.61",
|
||||
"x1.46","x1.33","x1.21","x1.10",
|
||||
"x1.00",
|
||||
":1.10",":1.21",":1.33",":1.46",
|
||||
":1.61",":1.77",":1.95",":2.14"};
|
||||
if (shift<(-8) || shift>(+8)) return "???";
|
||||
return sTSCaption[shift+8];
|
||||
shift += 8;
|
||||
return (dxw.dwFlags4 & FINETIMING) ? sTSCaptionFine[shift] : sTSCaptionCoarse[shift];
|
||||
}
|
||||
|
||||
char *dxwCore::GetTSCaption(void)
|
||||
|
@ -58,6 +58,7 @@ public: // methods
|
||||
void MapClient(int *, int *);
|
||||
void UnmapClient(LPPOINT);
|
||||
void UnmapClient(int *, int *);
|
||||
void UnmapClient(LPRECT);
|
||||
void MapWindow(LPPOINT);
|
||||
void MapWindow(LPRECT);
|
||||
void MapWindow(int *, int *, int *, int *);
|
||||
|
@ -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.64"
|
||||
#define VERSION "2.02.65"
|
||||
|
||||
#define DDTHREADLOCK 1
|
||||
|
||||
|
Binary file not shown.
@ -924,6 +924,8 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
|
||||
(*pGetAdapterDisplayMode8)(lpd3d, 0, &mode);
|
||||
param[2] = mode.Format;
|
||||
OutTraceDW(" Current Format = 0x%x\n", mode.Format);
|
||||
OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
||||
OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
||||
|
||||
//param[0]=param[1]=0;
|
||||
|
||||
@ -1011,6 +1013,8 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp
|
||||
(*pGetAdapterDisplayMode9)(lpd3d, 0, &mode);
|
||||
param[2] = mode.Format;
|
||||
OutTraceDW(" Current Format = 0x%x\n", mode.Format);
|
||||
OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
||||
OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
||||
|
||||
//param[7] = 0; //hDeviceWindow
|
||||
param[7] = (DWORD)dxw.GethWnd(); //hDeviceWindow
|
||||
@ -1128,6 +1132,8 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3d, D3DPRESENT_PARAMETERS *
|
||||
(*pGetAdapterDisplayMode8)(lpd3d, 0, &mode);
|
||||
param[2] = mode.Format;
|
||||
OutTraceDW(" Current Format = 0x%x\n", mode.Format);
|
||||
OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
||||
OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
||||
|
||||
if(dwD3DVersion == 9){
|
||||
param[7] = 0; //hDeviceWindow
|
||||
|
@ -193,6 +193,7 @@ typedef HWND (WINAPI *GetActiveWindow_Type)(void);
|
||||
typedef BOOL (WINAPI *IsWindowVisible_Type)(HWND);
|
||||
typedef BOOL (WINAPI *SystemParametersInfo_Type)(UINT, UINT, PVOID, UINT);
|
||||
typedef BOOL (WINAPI *KillTimer_Type)(HWND, UINT_PTR);
|
||||
typedef BOOL (WINAPI *GetUpdateRect_Type)(HWND, LPRECT, BOOL);
|
||||
|
||||
// Winmm.dll:
|
||||
typedef MCIERROR(WINAPI *mciSendCommand_Type)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
|
||||
@ -392,6 +393,7 @@ DXWEXTERN GetActiveWindow_Type pGetActiveWindow DXWINITIALIZED;
|
||||
DXWEXTERN IsWindowVisible_Type pIsWindowVisible DXWINITIALIZED;
|
||||
DXWEXTERN SystemParametersInfo_Type pSystemParametersInfoA DXWINITIALIZED;
|
||||
DXWEXTERN KillTimer_Type pKillTimer DXWINITIALIZED;
|
||||
DXWEXTERN GetUpdateRect_Type pGetUpdateRect DXWINITIALIZED;
|
||||
|
||||
// Winmm.dll:
|
||||
DXWEXTERN mciSendCommand_Type pmciSendCommand DXWINITIALIZED;
|
||||
@ -591,6 +593,7 @@ extern HWND WINAPI extGetActiveWindow(void);
|
||||
extern BOOL WINAPI extIsWindowVisible(HWND);
|
||||
extern BOOL WINAPI extSystemParametersInfoA(UINT, UINT, PVOID, UINT);
|
||||
extern BOOL WINAPI extKillTimer(HWND, UINT_PTR);
|
||||
extern BOOL WINAPI extGetUpdateRect(HWND, LPRECT, BOOL);
|
||||
|
||||
// Winmm.dll:
|
||||
extern MCIERROR WINAPI extmciSendCommand(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
|
||||
|
@ -91,6 +91,7 @@ static HookEntry_Type RemapHooks[]={
|
||||
{"GetClientRect", (FARPROC)GetClientRect, (FARPROC *)&pGetClientRect, (FARPROC)extGetClientRect},
|
||||
{"GetWindowRect", (FARPROC)GetWindowRect, (FARPROC *)&pGetWindowRect, (FARPROC)extGetWindowRect},
|
||||
{"MapWindowPoints", (FARPROC)MapWindowPoints, (FARPROC *)&pMapWindowPoints, (FARPROC)extMapWindowPoints},
|
||||
//{"GetUpdateRect", (FARPROC)GetUpdateRect, (FARPROC *)&pGetUpdateRect, (FARPROC)extGetUpdateRect},
|
||||
{0, NULL, 0, 0} // terminator
|
||||
};
|
||||
|
||||
@ -2272,3 +2273,20 @@ BOOL WINAPI extKillTimer(HWND hWnd, UINT_PTR uIDEvent)
|
||||
if(ret) dxw.PopTimer(hWnd, uIDEvent);
|
||||
return ret;
|
||||
}
|
||||
|
||||
BOOL WINAPI extGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL bErase)
|
||||
{
|
||||
BOOL ret;
|
||||
OutTraceDW("GetUpdateRect: hwnd=%x Erase=%x\n", hWnd, bErase);
|
||||
ret = (*pGetUpdateRect)(hWnd, lpRect, bErase);
|
||||
if(ret){
|
||||
OutTraceDW("GetUpdateRect: rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
|
||||
if(dxw.IsFullScreen()){
|
||||
dxw.UnmapClient(lpRect);
|
||||
OutTraceDW("GetUpdateRect: FIXED rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
|
||||
}
|
||||
}
|
||||
else
|
||||
OutTraceE("GetUpdateRect ERROR: err=%d\n", GetLastError());
|
||||
return ret;
|
||||
}
|
@ -207,7 +207,7 @@
|
||||
#define IDC_NOTEXTURES 1166
|
||||
#define IDC_LIMITSCREENRES 1167
|
||||
#define IDC_SHOWTIMESTRETCH 1168
|
||||
|
||||
#define IDC_FINETIMING 1169
|
||||
#define ID_MODIFY 32771
|
||||
#define ID_DELETE 32772
|
||||
#define ID_ADD 32773
|
||||
|
@ -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_FINETIMING, cTarget->m_FineTiming);
|
||||
DDX_Text(pDX, IDC_MAXFPS, cTarget->m_MaxFPS);
|
||||
DDX_LBIndex(pDX, IDC_LISTTS, cTarget->m_InitTS);
|
||||
//{{AFX_DATA_MAP(CTabTiming)
|
||||
|
@ -125,6 +125,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_ShowTimeStretch = FALSE;
|
||||
m_TimeStretch = FALSE;
|
||||
m_StretchTimers = FALSE;
|
||||
m_FineTiming = FALSE;
|
||||
m_InterceptRDTSC = FALSE;
|
||||
m_HookOpenGL = FALSE;
|
||||
m_ForceHookOpenGL = FALSE;
|
||||
|
@ -106,6 +106,7 @@ public:
|
||||
BOOL m_ShowTimeStretch;
|
||||
BOOL m_TimeStretch;
|
||||
BOOL m_StretchTimers;
|
||||
BOOL m_FineTiming;
|
||||
BOOL m_InterceptRDTSC;
|
||||
BOOL m_HookOpenGL;
|
||||
BOOL m_ForceHookOpenGL;
|
||||
|
Binary file not shown.
@ -404,6 +404,7 @@ BEGIN
|
||||
CONTROL "Show time stretch",IDC_SHOWTIMESTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,134,84,10
|
||||
CONTROL "Intercept RDTSC opcode",IDC_INTERCEPTRDTSC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,164,127,10
|
||||
CONTROL "Stretch timers",IDC_STRETCHTIMERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,176,127,10
|
||||
CONTROL "Fine time adjust",IDC_FINETIMING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,146,88,10
|
||||
END
|
||||
|
||||
IDD_TAB_OUTPUT DIALOGEX 0, 0, 300, 240
|
||||
|
Binary file not shown.
@ -234,6 +234,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_FineTiming) t->flags4 |= FINETIMING;
|
||||
if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC;
|
||||
if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL;
|
||||
if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL;
|
||||
@ -392,6 +393,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_FineTiming = t->flags4 & FINETIMING ? 1 : 0;
|
||||
dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0;
|
||||
dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0;
|
||||
dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user