From 60c8028a1d6b529280abf47b99efb1ec12371a18 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 23 Mar 2014 12:38:58 -0400 Subject: [PATCH] v2_02_65_src Former-commit-id: 80a015af2f1fbc6441330b08ad896bf4b3981927 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/exports/DeathSpank The Baconing.dxw | 26 +++++ .../{deadrising2otr1.dxw => Fallout.dxw} | 16 +-- build/exports/JetMoto.dxw | 24 +++++ build/exports/Total Soccer 2000 (DirectX).dxw | 4 +- build/exports/WarWind.dxw | 26 +++++ build/exports/Warcraft 2 Battlenet Ed.dxw | 4 +- build/exports/Warwind 2.dxw | 26 +++++ build/exports/dxwnd.ini | 8 +- build/readme-relnotes.txt | 8 +- dll/ddraw.cpp | 46 +++++++-- dll/dxhook.cpp | 4 +- dll/dxwcore.cpp | 92 +++++++++++++++--- dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 195584 -> 211968 bytes dll/hd3d.cpp | 6 ++ dll/syslibs.h | 3 + dll/user32.cpp | 18 ++++ host/Resource.h | 2 +- host/TabTiming.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 171232 -> 171368 bytes host/dxwndhost.rc | 1 + host/dxwndhost.vs2008.suo | Bin 123392 -> 123392 bytes host/dxwndhostView.cpp | 2 + 29 files changed, 281 insertions(+), 48 deletions(-) create mode 100644 build/exports/DeathSpank The Baconing.dxw rename build/exports/{deadrising2otr1.dxw => Fallout.dxw} (51%) create mode 100644 build/exports/JetMoto.dxw create mode 100644 build/exports/WarWind.dxw create mode 100644 build/exports/Warwind 2.dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 18c8458..999e08b 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -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 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index d8ecca9..7447a6c 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f848ba14637f8a11e413b5263df2c0eb3de7c1bba21f2db3602e9971c0f85804 -size 464896 +oid sha256:33ac0e7db3ed4efc6da6c4cc7f0988314aa96698631c5937ccb988ed50a82be3 +size 466432 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 9a01ae1..d36685a 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad2a6e8e0b8119551bfb5352ba7c18e3c892b6dbae0a1e6d1be32b2d5bc9c094 +oid sha256:b1ab56aec078a3b4123d5d7fe8319b0c9baea51b7e987f61dfe5c61b47c1c56d size 535552 diff --git a/build/exports/DeathSpank The Baconing.dxw b/build/exports/DeathSpank The Baconing.dxw new file mode 100644 index 0000000..854119a --- /dev/null +++ b/build/exports/DeathSpank The Baconing.dxw @@ -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 diff --git a/build/exports/deadrising2otr1.dxw b/build/exports/Fallout.dxw similarity index 51% rename from build/exports/deadrising2otr1.dxw rename to build/exports/Fallout.dxw index 11f51ac..2a26179 100644 --- a/build/exports/deadrising2otr1.dxw +++ b/build/exports/Fallout.dxw @@ -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 diff --git a/build/exports/JetMoto.dxw b/build/exports/JetMoto.dxw new file mode 100644 index 0000000..65069a9 --- /dev/null +++ b/build/exports/JetMoto.dxw @@ -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 diff --git a/build/exports/Total Soccer 2000 (DirectX).dxw b/build/exports/Total Soccer 2000 (DirectX).dxw index 454c0eb..eba889f 100644 --- a/build/exports/Total Soccer 2000 (DirectX).dxw +++ b/build/exports/Total Soccer 2000 (DirectX).dxw @@ -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 diff --git a/build/exports/WarWind.dxw b/build/exports/WarWind.dxw new file mode 100644 index 0000000..c16dc11 --- /dev/null +++ b/build/exports/WarWind.dxw @@ -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 diff --git a/build/exports/Warcraft 2 Battlenet Ed.dxw b/build/exports/Warcraft 2 Battlenet Ed.dxw index 4cc9791..127c947 100644 --- a/build/exports/Warcraft 2 Battlenet Ed.dxw +++ b/build/exports/Warcraft 2 Battlenet Ed.dxw @@ -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 diff --git a/build/exports/Warwind 2.dxw b/build/exports/Warwind 2.dxw new file mode 100644 index 0000000..8919031 --- /dev/null +++ b/build/exports/Warwind 2.dxw @@ -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 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index b98db4d..5dfa345 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1007 -posy=65 -sizx=769 -sizy=832 +posx=1316 +posy=462 +sizx=320 +sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 24da705..7fc7b72 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -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 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 66e9cba..2631b68 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -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 && (iRefreshDelayCountHeight=(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; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 9365f81..4f32445 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -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", "", "", "", "", "", "", "", "", "", "", "", }; diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index f1742f3..6888f0e 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -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) diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 685218c..c5200a0 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -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 *); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index f6e03aa..3ea0e22 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.64" +#define VERSION "2.02.65" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 1faf03506966da327e14fb674a691e61846228dc..4fbd3d8b5320b7913c7426b3406422d3cf845647 100644 GIT binary patch delta 15921 zcmds;cX(A*y2kg~oIny2|d0%ID+TZJ-so=oI1`2%pqF;i#2rJrb(gTIjzT&A->BfD> zEnZo%mm3&eJHGhW=&2Q>W*Nt6RXnZw^=`YP$o&s^9ppT)u5Hb4fBWX5!Qr~D<1~X` z{RiF{f442ZP~&ukz{-MTJAIE^uQ)kzRn;h7Ha<`zzm|>LZ0Z!BZJZkwV%5u8#l6To zv_o-0(`E0Pvw^x7i_K%j2QId0U~6`EQ*8SMW?#`FGt%xpWm0U)0F!FV=9_5qoXtON z8r$T{+!l82B2y<&*eWTQlw?vWWb$UbH@z1({vkZ+5Bv)};CXoK;9ZT(JU3Xn$aFEb zaEXbx6OOxycH#*WZCfuk^KD_0!O7Fi$(S{zi;Ww;R%>(8tSMb$+?U#$vz4NL!;?C} zpE{dQqJ1~xYPPJGndqMYH3&Wg-W`4ud?>sZJPAGmJ`#RAJRd$9J`R2xoM*fR>8>klt49?x+(JW@k5oYu}Lr+wg= zf<~e0XJ^%Qy9Bdlo08aIN|`xsY{qcovr`k@#F$w)S6^q0vnhy&tnUUJEHs}QyJenf zVe<-2Vz67P*=|-B8P{%UVp4;t87AJC_JREREzJhI^OR{ENN!mz@J)8Iy*1MevY)m! z$vj;9GTSA`#F~wE!BSSuPuz@PmA2-rv3Xyz{tPueOwls4)yKlJ+m@MCz6_SmnB`_^ zaP%;<%(b~0rlQ^0!A%aP6`D?F^(xcJj-F|j*`!u(thwKsGp316xxu8H^`RTFWgAQ~ z-j^NzxY=q8PnzUl@<~$`6?i*3(H1Vkvt-RPhmB1+WmeinOLd%TSw?Te>P`%n?tzSZ1~;rF<*Al*D0 zz8U0C3uaY!|Bk|JfY!iNz6RECkDJvQZWY_Qmisq5e}zf2c~9cpovv_y ze5s3jEXFRGZqi=Laldl?+fbw|;O$CFl$I*xvDc*cDt$xgn@IP=55WHhKL|ere+&LL z{2lmV_`C2U@T2he;P1na!9Vah3C@QQAHk2qKZgGZw}pM&Ayv;oornJf|JlCP$F0A* zuNzyG=Vk@72Dv3MHY?99>>TN9*Q1uc2CoYDc4zaEdo#T9A9z3fJu1{I2Fvo?tRR4J`(GNxZ`4u-VyeE&rQ3GzW(c zK+|gCH8Y%63z`-$HV`^NthtA^5M$TEyxrlMV(mPvy;$!s^E;0qFh_8v0)d=aVh@P1 z-aI1qjE6lhw#CC<5!>ToY*aKh7~UXX)Mq|Fk>i~8K%?*OI9@a~2gkP`|PB>C*c`E3us?}CCdQ{;2+hV4 z5F5`Yd0c^!7R10M3Vcd|j4M)Hqy@3HEE9W9alFCRVjINRTG(`))D>`oOi$>cBwR{lE!&i=i{sUtFBS%VY|fM6k{9PFZK@791Ol!Im4YE&Qxcx z-O<1#lurlRWUlYD8R6x3a}c@){B1bzhNn3UPlUe*2Mdk2p%FMVvc>ut$7>$eH9tT~ z#y0$+*hvrjMC>$DwBd^ggT*2Xb5(&?maeW8b03GA7Kb#FD^x!AVrMs-y<^AF=x488 z>vr_Bh;LNYAE{d26>OB)ZDLtqw~I{_>j`$3Sb^AVu<2rvrb+go*yD-=a_0G*aQj*$ zI0*0w1wJiS0JcnQwHPbg8nKOH!@xF)Z588W?PW2}_*gO{;k(5SuzjnzLL)1Vg+^Dh zNpOy`G>)cZ>>w{dcSib~7)y{NEzPI5cNKJ$-d+{4(O^}@62u1Di|gE-rmr}E`a%d2OHKUPo1-NHC{BlxXw+8uDRrtq;&ztD9< zXW`V#9=gU^IXTCXlojK=HR{wv%0Mf#MQwPW42lGe|#{Wt@_XBW=p3%B*ww` zF|lVoY@OJP9`>r(>mJ6LEsc{_mM44kFCv36XRZ-gA&Oz>2$7O;FlK|Jak)pv-lCpZ z6Aw!hyV}D#iS_od9I;W}!8lKFyaG8u-zj#V7;D)5Vzb0J7|#})E0zoPu-H5?-gx-- zuc#PKt2)8Bt?qZmwr+*hM!zMdN@&X=7~jd=XMSJ2vK656t_w}MQTI;NZf@3wcO@|Y zZV_zuSNDi1Ds>kv9G7g`+D0eMfXZue(IKG=I)RI08)5n!!hADce5HM6lS!%Qlpu6h z`A$h?4hus)xjTk($L$0j9>$K-#u-!esynQ)@lC1_%eL9s4ZRy4@Aw#Beb|y8eLYz4 zq1zPA=HEx!*pJ=Te2fmfvBpua;v755?<;Bt&N?zMt#^|O9h{8t6Kz1rcyF~`IO8kG zxc&ExoE{EW#>{ZUPDJc3kEp@{L?z<{Zivsc<3DzX+ZSeHnf%Ccclf2={5K2oSHwJz z!sqI59TzhnFPJ#hmRw_!Qdm5!1RUnM$3-2Zl)X)iu_blfzV^d9Zd_nztyB#n0rgGM zf%rOcfz|cvg-2ND1hUZB+45AW@F)nLDq5%Q4*dn3R#l9;8Z*FZd01U&-da5|4ocko zpe+>RT*z{3iLLS}!Cue-1+Mc1zM!}lJ#p(5x7`!>8gxF+@rJQOrnu=?Zz!m|6CSEg zI1W)Wpt-{Fi*ZIUjL!^vNURm~9I?kk%pRWNwm`vc#9xhZbdw_IK(A6{u^6WWrO+I% zc8Rrs{)^(?5Cd}di5(Lg1@?j1=VDwyeL=<-_pKniunnP8>@gJ7-2t`d73>}s*DV)MbW#CnLatLrH? zSd1k&0h$BpM6u`j{6iEtNpK1R?iHKnVFh9{#HJ$7FE-o59uWJJ*kg#BE4Dyv9@xSV zL-{We*3NV#_M+5#~4Z0x)i!JmK^!7ZHq_mfDM zz}e9)h3COH=Rax!g}sw70<{SbB(LFC_LkpD6i2?uP}7c4fl$Ehnpv~bfhRdrz^afSO>AWU>(J>#Mr@Qi}mrazG8zs zY_M3qhm8&~G`Der>}@%(qfPd(DPob06~@gJ`%>m{SG44D@823(S+z%nU1{j2jy?Ze~O-64`7h^TeG{95)siHx2GT zBlx3W4&XVl3aC;HB=f0y#fkL-t07iTjB)kF8jIZvmMYdltRq;D6J*ELS^Y;( zq`YuvcrUSjVnELIVgt#7T~E5c#ERx+9QaFlQwdHw?^ZFKCaMW?{MuH2IBFgG$RWX> zesU|hff>;i{a8Xe?RB4BbW1mabrtI^mJgOAmMg}Wb%WSQv1h?XiA@k=m7ORyRjdQp zw2Imhc|ed;s7Ijlkj@k1J1K*H2WLT@qB~D^2EmB`cA&! zSV16XoY*w6G_V4(nPS}4m?bt>tPR-1VhhE%2NV!nA;t;pGtj)gvtDox^ag0!RxuXg z%VN95*y{I)y(QKJ>}|0R#8SXM6#G=HE!bybUsuBQS^S&@ek1s!0-J-K6T2wJnTZq4 zfAEfxGH+LSWwCfM&VdueS|H`X2IR0V#i9aaA+3rO-)2MK$oMhO_u|C`Te(}|AC04t z9FR_aC^Ecw7|-hCEaN}0<#66ZGJFM`wgpa>0568qw!z70T(;3l;ADKWJK?mwaC15S zsRe%nPQ4G#K;HbDaA%zJAI@m!9EA9;!-FKVH}l`; z+~-Wk_EQY=RIkBhW>WPtL`|@=zVj&dER9Ua&&0Gzw~m)3bk3N#G797gIdlM_<=diM!o6|`tMCHupx5$ zCFQ^zv&hfI$bL9Wg?<6v8_w3kzg@TwViZ!YpUJ2{htv4+pNw(WL9kcP73&P0&V#Uf z#TfS|=w3)4HfsHh;Z&6Ej?+&5&1wH+3fOY7YS3I8=OEoFb{q5x#qAdZat?^SBgPAV z0$m&Fr()gN`yE!`DZ$nVI4$NP7bQE@3OoZWUW`Lfg4hT#{&^?bJ6dHjs`Y{83 zZQv^&lvFXaTRVEUN%uFxd3kDfPbn0z_8!(jtg{$ zW{R}}V@;tQi|pVu!5=39d8eN#ki`|*N8vUJFUsopy)rYHj878&1sWbij2EfFlfk(C z!8l$c9h&_mcR$GdnfNDJf$cnjT@;ulmX5ggin~?}$mt_?y%?)wuGn}_+?`_F65)jz zhiwtGOc=L62x*fQ7}*M85k|H`=6Eu5yMy+q81ugk&6a;yjNQ~@isMECW9Yv?v%+7f zfa?=v!+%g<94FoQo5jSP1J-128bso1@Bl2bSwN0&exYByEl}LGV37@k$fvwPV4vYQ zFZ{XULiH~?Dx5hMDNn{vZ;@|)8DcaQ29?4WWC~-?_{J)#W+e#gQi8kcJo4IVC>&cDJ~B>@&!Dy*5W$oyz+AG!F<{9 z4$w5LIc$@iriOp94iY}8gHMUYgKdZA+c_x4kzuLgQY(c|%>E$_n#SojFGhBg*a$IJ zyisB|hgo=XIt739z`^?!$aU}-1wJ6g5}F6iS5)L-&q3b`wpxrAe*wA~(k)^<--FP! z?PAnBxHzGe2r~0-XiQn0Lt?xzr`>$#?|N8w%z7(>^+d{iETulsF-WiTu$!R!f(`eu zeCQ0YTm2q54VoQKff$QxJ~Yz>p17sZ?0%Pvb%)-G8>4L(;|=YEo`Cd#hn2YGKpf8V6 zC-k5PJ_JqMA+`p(M667V7x^5T&Fc$K+zG|i!uw+kFA~pp3Cr-XOtIWpbwYf1uL82i zD^(!x`VcgW@GY@)=>E{OAH?p4J}Y+K!+sLGAa)PpeiL(1ad?CGu>MtGErLZ0viK9A zc>{ID7~BAwH`vm{+C%pN>mbI877IR>#Mo4C z5xdvJCX3Ax*e%d=k(ahXjIVePH0R8Ft2l$5JDoAu@O(eI`u}|Q*t6;E|4-I=kz0Nr zm*u4Qm~MrS_Bk}i%P+)ud#9o6B0b|_-#{mUeJeH+dLuNgZq;y+aBc6ek3VRsg1mS- zbZ?~1#CYLh&`ppI7wZb022C3)HW+%G*fcR7FA$q9)&lJQF!MVL1aAafsKBSi`hzVK z+a<=EIR@Pc=|^JhnszJhq!=IM40IOKuf%x1PZW1C#MF@MV+Dg{x6=SAGjaj!K+_tE zQ74Nv5@T#rXpSV!#R{QQ6gNTaHn53ekBPDWecUg&&;tWvR_qQ0E*9G>)(h-)vHc!) zK83S{N$EY?MgMLhz#71B{+1E9M?)5eK0?r!MYkxmk0*Ej{b zAJQ!zR$LwLpOs>(;1=ld(6myqxzM}B_KH0M_PW@9G4>t@#Ey#bg71m_D8`#PCvE(3 z;i4w|*Zr^Xcv=m|$KzO>;;w}DLDLe&c>c!F{1TWd#@AF^ah=8Tz`BUtAm%6RFPJaL zCdTcwWTX?s9)KRLxVd61>Uq%lNCRT*kTyWGuiYdz0{UTS+ACrcp|{0pAm1mL1Nf!_ z-xiwy_Kp~T>Bx(+_8V!Rheb(8dsvKg6{W0ORi)!o*w12prvc%8uv|=&#QZI@f6l(%@NUTh(8Q2LiE<1TA zt>OHsI<1b_70`9XlEW-Kr@0z`jKRTfVHm0{L!kK{hKlk0@Sm=2K$7dKlNiv?Qd=%Mq)gSPQZK zU@gV25@RfXVxEOGC-SQ{wvSvut{Mg^kh3rTJdQR(tP6DHr|6MIGEc~_qjivS4a~oJ zz6H>12K-q$8DA3@)3j&AqS&}s+UX^xzW=1yH9(&z?pqK0PV84P&KE9-#Z(MmgDe)B zmMBJDTP*VJu@RWQJvsxzasJS^lYt71e3-i&f%q^NvL)fb(Cz`(-L$o090%5k?GfWc zABASe^qv@JP_Ik>pfnzAFTR0?N+|;QU}qK3uu}LKOFspg)<%pM;WxNUq*-EF(EL`% zWBru!B9U)-5yopozR^waD{vv;-O#kif_@HkWKnJv$5*@@x(Ct~V*G}^7@GE;SSs}U zV&97m1N*yJ%*r~Lkj>lX!b+4`#jSvmPcv*3mm6&59y23=9Cx>yldoLG|Btx@qR!92jL71&#h7s(MDB-RUTu-H8wHc5<|0=x)Ifg1y~Cp~P5*ve?V z|8xXAE4WU9>`T^*1;yC+Zx!1s2IRahwoi-~KM2hye@l#c-&EZDV(l9N9uxdTushhN z(mzDA@6QOjub9FL!O~&wb`vbw=icGkwJ)2*Kvs`r{&aMJY3Vy~-4l272kiX+*VeNo zFPqSj%S_Yi+*HRY^*wRAZS;(3Vh;_&|CevvViUV?cC209z#QY|`5%54`oH(vl$xQh kPM7|L>;K`GMO2+j`ZgN+QiuODW%zsKCFkn$f&15g0t4SthyVZp delta 3020 zcma)8eN0qW7Qg4bnc;yr4&ykB7RD)pqEh5@TGx+^l(H-~g2b{eWp$vgb*-(VOB%M@ zg;(~Eri~T!=^XnJN~vW(TpQ`6TuM+`ZMF$f`(^89liI0ns})0SLmJzx+H+@s6|&9F zo&56Vp8M{(=bYa;=RV_lvT=P{yC0_YtXgcb2R%=Jw)VbvK@&n4)#ekHA$xXV_C8&dT!O;e)8%(7;G%B1$@WvE41z7{Uk!(5J>y=+FB!FrGKPl{ zU~FJ)WYja%`wjeji19Gv*Nn}KAY%(-8)GZu_lz6-?xXyCjIo`e_U_>4PR2S$BM5r; zXOKQiEhyYR$_RcA#dPEVIAwV`^re^u+dXpNB`5`Yp&zs9^_}3A<(*K2y&Ir(hCR<}c#Iip#7E}EY{-kC0l;y2Fe}+*$MZSpV%NPYy++Lvht76lQd1ugZvZX540l-vgq22kW3?o!MV4@ zPUW9L9|i2_reo>gCS#bxyz(-f0E+B}RMU7Qi89h)D6|?lllF2Z(bY8AKxZ>K&v-`( z9Z3f}wJ$*z1-S&JFB5d=4gs1CRf}j%8|W0wf_4gC1&4Ix!8I^(rPvE;G_uh1-c&fC9z5%)66iMlPP`c?$F3UXFcatYtqtFL4iw zGE(8f$1UU^!uuVZUXzF??+MJL&R0}iS|LDPSNI_AUY_nbY;V;}ETT$Xvyr|6uT!m^ z3+Ah3T8i27$TTYL$7j3qxK}ikGjkXEaR{Qs_O8T#B{F~W_ikg-%kd2E*|d+0)wq7o zrtI$fF)2YA!Gn6*U;&M|(P{ec^vXaDb|!{u&`+KWXfXfbaBz|e;p3Fd6RSiWwUpuA zu`ZTekE1%RvttGY_Cq#RTt;6ksiKW{ka?7+w&DTno?t+}9mM4cD}JkVjgMKvNa)v+ zR0GyfjF}_udG1Zlp4jm2ivAy)(^@+&RZT>f%}t1R(BRkDDsdm)oG$&}V6Rm^UW*k7 z<@A)YQ3ahU{)+d=)*@_%(BE)S8V%^z$jC#c`3Ocp4h|#QB=+G=FuRHu$r&!+uF z-I;hfrn+nuk1lm^&B9`z+I`9T7XBYXl&8CC+i~1y4s5rR{R6C~ z#$4pgEo1s^AL1{l{(Y{clKoJi+KF@jbPh$FipR|QG)dbMSM-__#-rYu$857FwQ=o> zMm-tcT4f}Y8C()~kOj|7WaX4uaaxh0*q`8OrP8d)5t7G@Wh%M|- zO+!k15)P7)pdC^qB~$P+c<4)u_RyRkFOyjQMXd_tqMc6vG|v2s=EAr)4m$oG*5$|L zhro$46}@NiB$_8J`84`5R$1TV?35E9TGV(BD`Si2(AD!Bf<3`{is;(Qs$S+R(yAB4 zo4RGow0`b;iIjK(<0>%OdIA?hTuE`}BoGe!R)4QvO{s$|$6RiCBKBZ$!4;_6H?vo`K5ZpHL k7R!4l2$7A~F&WHr)^sysbunh@;~#7MUG9_kJ$J(&0L95=IRF3v diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 49097f9..df0c5f5 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -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 diff --git a/dll/syslibs.h b/dll/syslibs.h index 57bbafe..ca6201c 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -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); diff --git a/dll/user32.cpp b/dll/user32.cpp index cdedbf2..c51118b 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -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; +} \ No newline at end of file diff --git a/host/Resource.h b/host/Resource.h index 11dd3a2..a2f1f49 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -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 diff --git a/host/TabTiming.cpp b/host/TabTiming.cpp index e0c5bc5..6275e2c 100644 --- a/host/TabTiming.cpp +++ b/host/TabTiming.cpp @@ -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) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 5fe6a6b..7fade23 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -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; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index f9c9186..8e20f1c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -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; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 492576383e06decae67612acb315990505aa45f0..d3a62db00e421c511093a5eb8c7000aa883c5f12 100644 GIT binary patch delta 3043 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 diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 3ad9b2f..8e7d020 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -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 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 764520a6a3a36fb6a1720eab775ce775486844cb..0a385bbb855ca0a0b8700641756fa82afa337ce4 100644 GIT binary patch delta 4575 zcmb`L3s98T702&cme=xdUDjnqTow>TR9x^8G)e$5GQPk^7+;}kXhu_I&`>o-UDWuF zK{*N68Z~MoK2U4i$Tz+!w8l1%TI&##nOcLUb;hX=Owq(lM|#e3Bs86AW9-#G=ic8v zd(U_8J$t_k4#N7lPrt5j-`*5=*?r zU#cpgyRWQMe-qk@9Qf<#T5NX3`ZhVsLGR9i!BJDqJcd$itz@&6(k&Aq30K5i#QEo( z_;607Z*i9o1Ms)zG%SlNz+8*R*BoaL4*fH^Unlj{^G-oj%m%7DNq?y6Z@csGb_;+~ zc4{XnUuKUW2y{?A3gaWAbYulMu`D^?KV)-qeh}EGuTxu}udL_M01BRh1$`P@AM>z0 zCfiQr-1eBeQxEl>WqR3U;R$axDGKT@8B2d9A5qG^gzKh9ZEcN!1vv6@c%^5JZaD#i ze081>3%I_E-#qw=N#dI;Gjjvi(~zCpx`R@vnQ_mzIJ3|K$9#Xv3pR&5q{Ti%v9WP< znfVe|CXLB8-2&V(#*uNG+IL7zq`RcANdF);lkSo3lfEW>LwZ2^mSi$1<-0ki2w%P~8W8`~(coy10q?Mya?6i12`<`U~Bn@CEKb~my~ zr0%31q-0W0QVOXTsW+()DV5aMq-@GVl{8X1sUPX#do%h$l^JYU`g{=9w_$FXo2QrqPs3hZ{?|mzy68gBX{T?_tJ5RU zT$q3>_NGEL&N!Zg7plYYc8J>-vu<=Io*l&>oRJ58;9Z=|^=vioX(cR0DV2Rjx; zqcz82+GE0<3lsFt7a-I3o2EB9)S93e;xE%4aspo=@d7rI{epB=+Sl~F0EpJx0>BM_ z**tF8u>v>(x}t_AXC3b_lFg88t9C*-rjP7yEO5YjK+j|gKCF+yx?-m>q#M}H)hS@p zE0#hEW{q?jmB~;7*jSkpF^gi1BaKzXYOv8V6fgv>sqTmY>L==DHDA4;rm0z&{U8xN z#~iq+FxIe-fSW-&Zy3bjKkH+8rpDGG@FG;sci@q~InerXOek;Bq}CDh;g%_Mod0y7 zNXEVK5EhC@_YFi(jmvm#aHl@91Z>9QVpt8hc9#tooz1L%3Cy@V!Dh^y1v>x>wj|(7 zU)yy55{RuX1q)U#$uc&TKq;VWszWy|r4y?(yt^@aF_=xY%i#B+lo^js2cvlngjxWKgnBu7u>O&EPiNZ$cxWDY3{nTnXa=>xP@Pxe7*O{~8-!$Tk~}Esz3uKPFP2 z-wx?m5FLXBv35FOXnClFkcQLB=PHcv)k%*z3B8PhD&E_IC~#`$R>;8d-UO`M8jBac zb(kw={$dZhBkj6m3fPVEZIBJRelK*Ve4<6qu(3 z{I3%U<74f*Wxr=B%k zZyN%y9ZxV~-iK(wgkE;eH(ymIxB@a%8paQv5N4yaoarBr-n&B~jygOTZ%GVXPH=VG z7b48@pML2yKw{u)t7{4jU#5C-^DL}nSR$nkVM{*v`h3~@eX$2 z3Y8jR6RCbs7{BGXno8og9T$GZaCHKS&oM5GgmtI-E5cR?UxQkL~MhwDq-=&w6Oicx)M7e ztkx@#lhzP;N*Ez^TG$z39HdUz2f}#T=Y;V^j~|eWNse{1uw-IE!YsnPX#~Rrb`aQ` zm{sa_u@S@qzsE9(If-#`Nnae*GvzO@#*zouhWwAss#;Nh55 z=8)y}U^Z9SI$>^N>xJ!T$KDb4zOV%HJ0`3_7$NnkuuH;tdY=U-N^mM+bcf`?e3gu) zA6>}0gk@1ZoI9ut6y~D(Q^H0F=~)S7E6$?J`RS^51z4`^p*Hc5XP%Ik)5c_4Wjt$$XY;<-#!c5eYiv%Hwfdi?R8fmg zn?wHmQ%{&gPmn_+TKDeBl1QZ=Kqx#@`w`?>U{%|_z$j~g27sk)K$l&Dd>m#;Gny|! zI6SjREmS4+t3|5fUtPW_dvgr0WNTt_t@S*5n=I!R{}EuD)N9$|=8f@s`sZ*}n=-(z zBWfXmZjZ5a)3o#LcDOFu2OS^x=3Maw%+sYOp)cLUQ}y$;Q24_yp?|N1oph1utqlVv z1^RE#M%`to2NzB1zx)xwe`Ti|Y=o}60`>a6pF delta 3679 zcma)d)~W0-o5udsxQP>Ux;sCXS7B?dVXxU^!E@agy?)#+h+XQ0O`0fek)wozKH+P zC`%eu48*KqA7p5iDR~CjvkIJeZfu9?T@a#1t8z&gWbFt2$xDoM1sQuA`640Yz#^E0 zHSSMhSu*GZo3?FSSDYF6#!gJPCQIu+aAD1V{WsPGU1jY`<&Gv){UN za{#FA@l+0wxSf%F9@Q-atsv73SYiocWmdTv?3CoV+g5*8IsV!>RjYj9Ox$4a>slNb z%8A|`N}C!Ad+yfoP>uyo2L5V#&tT!Meq|8UT+H%!{8n8egm*i~235wXS6`|R?gpRi z>41E#Gnilj%W!A3{+ZX*v<`N{SYJ?L;#o)?&M{|G6TyFK+X^BUIIsQT(RgEmP7U9o zER4>tG{%C(WhDlK0gse9_pi#=Zj?Oaj+@FL=tLMXU z4I*)N{QL(V?A+tf_OAZSEmnZA@d(^7tBW8dx;oc;gao{kc8JxdZ7?^t@*wlTm{w8 z{3Mv=853m4%TGf#hH7aPe{t#AtKk)BSOQ+%`wT<@H~l7z=3_S9z8;Q1^BOSXmt8(| ze?yb}EYOsn&c*FJta{-#*Z|ENXubKm0@zfSrhoea7!A0--KN{>p$R%(go}xgJiOHO z{@svd!Q4|>vKJu>H+Yv}bgNljTLxzA^cnSa4NwBj2f!fPC4_Lp%WmC$2pRx$H#v3Z zLCA)<5N-Qijqn(*crRgX5{@f;p4O2M1A9BA8SlzoT6kAd4$_+iVuQ}C@kUJm)P z^E5n4&yS|D5src^dIKJA=z%mn?FdXv#7V|f40#-UT#%K~Ba0_rM8fpRDYEP=tfooy z$P<5t2qmS6>iDL(;gcYY6{I@l!w67u56H;i3uqB0k;sK8yu4OwQwu zHOh@=AwpAbmWfv&;{TtX@o31tyCYYiiO)SZ?Nhs4*$0d7|JuOisDHX?LCTDH_j*L87UZtd|Bd)|<`yH|{7aU8D5T!~nf%F!Mt)0YdEa`0$ zTL+2RG?GqYJ5OT9)*1U1;v)IjV#fUwlPkEEb%Nv}wW;!S^4xQN>77=L^E8r+^p0X& zKZ?ZLW_NatkwOh_Kh9U0s~CFBJby)g|}%rWBaJoC=M4!lblY(vAaQq05P zMn6)X8{wGk-z2W%z59)d?H_A;m2lreZ`0=yHrl=hJ1S0+dhWY*wzU3 zy161EbGo6x5CPmWd4B44F-w$*pNi+iN->xGI`K5c1!B7_I!OJqH9#2q{$u6s7>+dr z{-HZ&+--(8(F_aJ+&#T3FTo|CLuBZ)N>*Nm*td?}e;JaXAq`xUeyOH!5zSPKn!c|U z3lRGkGkHA|Cdw7PaGh3yNT8FDDer|u^&%Uk*c4(`72B2PwHJ2}D5uB>t$_ zCB>){JH?+AOr#GwZkWI8-1IY!yhpJ@iY;70mZw-6#nTm|1v%X5xr#*;k0*z=0{ ziB-iI&Hn)fx$#Dd^T{_U#>d0!u|(R|it%inSL{>8c*Ie~{-Ibpv73tBQEU>i0ma6d zsMFMb>_gi_1-1x7@|^gDVw)A?8*Wi-r(%9$)r!5W*hFHlD7JS*-fN1XVwse;^MHbf z6y)hTtXPX;vx&7T_BX`{iN7m$OEG?uxn?2gznDosJPX2rY|uNzDhdlchMRIAuN#U3P9r`YQwSc77RN3cf4j*=f3puYv^T1;QFkWK`f z?z;-hp&*w&N^yRt7$Wg_voy@*%jf-sF*< rD4Z|@-}0rq2S|SuLZm_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;