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

v2_02_07_src

Former-commit-id: fb4c995685e09cdec938622ea9e024cd87add506
This commit is contained in:
gho tik 2013-01-25 11:17:02 -05:00 committed by Refael ACkermann
parent 8f3bc994d0
commit ef5a5afd7a
26 changed files with 1407 additions and 1154 deletions

View File

@ -58,13 +58,14 @@
#define FIXNCHITTEST 0x00000800 // fixes WM_NCHITTEST message X,Y coordinates #define FIXNCHITTEST 0x00000800 // fixes WM_NCHITTEST message X,Y coordinates
#define LIMITFPS 0x00001000 // delays primary blit operations to limit FPS #define LIMITFPS 0x00001000 // delays primary blit operations to limit FPS
#define SKIPFPS 0x00002000 // skips primary blit operations up to limit #define SKIPFPS 0x00002000 // skips primary blit operations up to limit
#define SHOWFPS 0x00004000 // shows FPS value to status win / log #define SHOWFPS 0x00004000 // shows FPS value to status win / log / title bar
#define HIDEMULTIMONITOR 0x00008000 // hide multimonitor configurations: GetAdapterCount returns 1. #define HIDEMULTIMONITOR 0x00008000 // hide multimonitor configurations: GetAdapterCount returns 1.
#define TIMESTRETCH 0x00010000 // make system time stretchable #define TIMESTRETCH 0x00010000 // make system time stretchable
#define HOOKOPENGL 0x00020000 // Hook OpenGL calls #define HOOKOPENGL 0x00020000 // Hook OpenGL calls
#define WALLPAPERMODE 0x00040000 // mouse events are discarded (good for screensaver-like) #define WALLPAPERMODE 0x00040000 // mouse events are discarded (good for screensaver-like)
#define SHOWHWCURSOR 0x00080000 // mouse events are discarded (good for screensaver-like) #define SHOWHWCURSOR 0x00080000 // mouse events are discarded (good for screensaver-like)
#define HOOKGDI 0x00100000 // Hook GDI functions #define HOOKGDI 0x00100000 // Hook GDI functions
#define SHOWFPSOVERLAY 0x00200000 // shows FPS value to status win / log / screen overlay
// logging Tflags DWORD: // logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
@ -78,6 +79,7 @@
#define OUTDEBUG 0x00000100 // detailed debugging indormation #define OUTDEBUG 0x00000100 // detailed debugging indormation
#define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE) #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE)
#define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS)
// DxWnd host app data to be passed to the hook callback // DxWnd host app data to be passed to the hook callback
typedef struct TARGETMAP typedef struct TARGETMAP
@ -115,7 +117,7 @@ typedef struct
DWORD dwPid; DWORD dwPid;
BOOL isLogging; BOOL isLogging;
DWORD FPSCount; DWORD FPSCount;
int iTimeShift; int TimeShift;
} DXWNDSTATUS; } DXWNDSTATUS;
extern DXWNDSTATUS DxWndStatus; extern DXWNDSTATUS DxWndStatus;
@ -125,8 +127,7 @@ int StartHook(void);
int EndHook(void); int EndHook(void);
void GetDllVersion(char *); void GetDllVersion(char *);
int GetHookStatus(DXWNDSTATUS *); int GetHookStatus(DXWNDSTATUS *);
void SetHookStatus(DXWNDSTATUS *); DXWNDSTATUS *GetHookInfo();
int GetTimeShift();
int HookInit(TARGETMAP *, HWND); int HookInit(TARGETMAP *, HWND);
void *SetHook(void *, void *); void *SetHook(void *, void *);

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:19d29414d50135080a863b7865dfe2c8685150e1df359c9a5e528a65d5f9a46d oid sha256:b0ffe0f3143b439d28c1b4d7f195991b383f36ed919ba89aab0abf2de7c9481e
size 263168 size 271360

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fcaebaa1f5eaffeb624d13fdb6f6058db5383fcaeadf22df4a641a766127c8d5 oid sha256:3d43f746689ac5abcadcfbbb0dbd302cc3d4186ce2df7aa8bd9c24eb1b8694d4
size 488448 size 488960

View File

@ -22,4 +22,7 @@ added status and time stretching view panels to tray icon menu
v2.02.06: v2.02.06:
preliminary FPS counter overlapped on game screen, Alt-F7 to toggle display on/off. preliminary FPS counter overlapped on game screen, Alt-F7 to toggle display on/off.
fixed buf on time stretch logging (and possible game crash). fixed buf on time stretch logging (and possible game crash).
revised GetDC handling with 8BPP paletized surfaces: avoided need to emulate reverse-blitting and got an impressive speed improvement for games such as Age of Empires I & II and Hyperblade. revised GetDC handling with 8BPP paletized surfaces: avoided need to emulate reverse-blitting and got an impressive speed improvement for games such as Age of Empires I & II and Hyperblade.
v2.02.07:
many fixes on the FPS and time control features.

File diff suppressed because it is too large Load Diff

View File

@ -117,8 +117,7 @@ static void dx_ToggleLogging()
dxw.dwTFlags |= OUTTRACE; dxw.dwTFlags |= OUTTRACE;
OutTraceD("Toggle logging ON\n"); OutTraceD("Toggle logging ON\n");
} }
DxWndStatus.isLogging=(dxw.dwTFlags & OUTTRACE); GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
SetHookStatus(&DxWndStatus);
} }
void DumpImportTable(char *module) void DumpImportTable(char *module)
@ -300,7 +299,7 @@ void *HookAPI(const char *module, char *dll, void *apiproc, const char *apiname,
OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__);
return 0; return 0;
} }
//OutTraceD("HookAPI hook=%s.%s address=%x->%x\n", module, apiname, org, hookproc); if(IsDebug) OutTrace("HookAPI hook=%s.%s address=%x->%x\n", module, apiname, org, hookproc);
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -706,8 +705,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++; if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++;
if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--; if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--;
OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption()); OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
DxWndStatus.iTimeShift=dxw.TimeShift; GetHookInfo()->TimeShift=dxw.TimeShift;
SetHookStatus(&DxWndStatus);
} }
break; break;
case VK_F4: case VK_F4:
@ -1026,6 +1024,8 @@ void HookSysLibs(char *module)
if(tmp) pGetLocalTime = (GetLocalTime_Type)tmp; if(tmp) pGetLocalTime = (GetLocalTime_Type)tmp;
tmp = HookAPI(module, "kernel32.dll", GetSystemTime, "GetSystemTime", extGetSystemTime); tmp = HookAPI(module, "kernel32.dll", GetSystemTime, "GetSystemTime", extGetSystemTime);
if(tmp) pGetSystemTime = (GetSystemTime_Type)tmp; if(tmp) pGetSystemTime = (GetSystemTime_Type)tmp;
tmp = HookAPI(module, "kernel32.dll", GetSystemTimeAsFileTime, "GetSystemTimeAsFileTime", extGetSystemTimeAsFileTime);
if(tmp) pGetSystemTimeAsFileTime = (GetSystemTimeAsFileTime_Type)tmp;
tmp = HookAPI(module, "kernel32.dll", Sleep, "Sleep", extSleep); tmp = HookAPI(module, "kernel32.dll", Sleep, "Sleep", extSleep);
if(tmp) pSleep = (Sleep_Type)tmp; if(tmp) pSleep = (Sleep_Type)tmp;
tmp = HookAPI(module, "kernel32.dll", SleepEx, "SleepEx", extSleepEx); tmp = HookAPI(module, "kernel32.dll", SleepEx, "SleepEx", extSleepEx);

View File

@ -324,19 +324,29 @@ void dxwCore::ScreenRefresh(void)
} }
static void CountFPS() static void CountFPS(HWND hwnd)
{ {
static DWORD time = 0xFFFFFFFF; static DWORD time = 0xFFFFFFFF;
static DWORD FPSCount = 0; static DWORD FPSCount = 0;
extern void SetFPS(int);
//DXWNDSTATUS Status;
DWORD tmp; DWORD tmp;
tmp = GetTickCount(); tmp = GetTickCount();
if((tmp - time) > 1000) { if((tmp - time) > 1000) {
char sBuf[80+12+1]; // title + fps string + terminator
char *fpss;
// log fps count // log fps count
OutTrace("FPSCount=%d\n", FPSCount); OutTrace("FPSCount=%d\n", FPSCount);
// show fps count on status win // show fps count on status win
GetHookStatus(&DxWndStatus); GetHookInfo()->FPSCount = FPSCount; // for overlay display
DxWndStatus.FPSCount = FPSCount; // show fps on win title bar
SetHookStatus(&DxWndStatus); if (dxw.dwFlags2 & SHOWFPS){
GetWindowText(hwnd, sBuf, 80);
fpss=strstr(sBuf," ~ (");
if(fpss==NULL) fpss=&sBuf[strlen(sBuf)];
sprintf(fpss, " ~ (%d FPS)", FPSCount);
SetWindowText(hwnd, sBuf);
}
// reset // reset
FPSCount=0; FPSCount=0;
time = tmp; time = tmp;
@ -346,35 +356,32 @@ static void CountFPS()
} }
} }
static void LimitFrameCount(int delay)
static void LimitFrameCount(DWORD delay)
{ {
static DWORD time = 0xFFFFFFFF; static DWORD oldtime=(*pGetTickCount)();
extern void do_slow(int); DWORD newtime;
DWORD tmp; newtime = (*pGetTickCount)();
tmp = GetTickCount(); // use '<' and not '<=' to avoid the risk of sleeping forever....
if((tmp - time) > (DWORD)delay) { if(newtime < oldtime+delay) (*pSleep)(oldtime+delay-newtime);
time = tmp; oldtime = newtime;
}
else
Sleep(tmp - time);
//do_sslow(tmp - time);
} }
static BOOL SkipFrameCount(int delay) static BOOL SkipFrameCount(DWORD delay)
{ {
static DWORD time = 0xFFFFFFFF; static DWORD oldtime=(*pGetTickCount)();
DWORD tmp; DWORD newtime;
tmp = GetTickCount(); newtime = (*pGetTickCount)();
if((tmp - time) > (DWORD)delay) { // use '<' and not '<=' to avoid the risk of sleeping forever....
time = tmp; if(newtime < oldtime+delay) return TRUE;
return FALSE; oldtime = newtime;
} return FALSE;
return TRUE;
} }
BOOL dxwCore::HandleFPS() BOOL dxwCore::HandleFPS()
{ {
if(dwFlags2 & SHOWFPS) CountFPS(); if(dwFlags2 & (SHOWFPS|SHOWFPSOVERLAY)) CountFPS(hWnd);
if(dwFlags2 & LIMITFPS) LimitFrameCount(dxw.MaxFPS); if(dwFlags2 & LIMITFPS) LimitFrameCount(dxw.MaxFPS);
if(dwFlags2 & SKIPFPS) if(SkipFrameCount(dxw.MaxFPS)) return TRUE; if(dwFlags2 & SKIPFPS) if(SkipFrameCount(dxw.MaxFPS)) return TRUE;
return FALSE; return FALSE;
@ -407,7 +414,7 @@ DWORD dxwCore::GetTickCount(void)
dwNextRealTick=(*pGetTickCount)(); dwNextRealTick=(*pGetTickCount)();
dwTick=(dwNextRealTick-dwLastRealTick); dwTick=(dwNextRealTick-dwLastRealTick);
TimeShift=GetTimeShift(); TimeShift=GetHookInfo()->TimeShift;
dwTick = TimeShifter(dwTick, TimeShift); dwTick = TimeShifter(dwTick, TimeShift);
dwLastFakeTick += dwTick; dwLastFakeTick += dwTick;
dwLastRealTick = dwNextRealTick; dwLastRealTick = dwNextRealTick;
@ -416,11 +423,46 @@ DWORD dxwCore::GetTickCount(void)
DWORD dxwCore::StretchTime(DWORD dwTimer) DWORD dxwCore::StretchTime(DWORD dwTimer)
{ {
TimeShift=GetTimeShift(); TimeShift=GetHookInfo()->TimeShift;
dwTimer = TimeShifter(dwTimer, -TimeShift); dwTimer = TimeShifter(dwTimer, -TimeShift);
return dwTimer; return dwTimer;
} }
void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
DWORD dwTick;
DWORD dwCurrentTick;
FILETIME CurrFileTime;
static DWORD dwStartTick=0;
static DWORD dwUpdateTick=0;
static FILETIME StartFileTime;
extern DXWNDSTATUS *pStatus;
if(dwStartTick==0) {
SYSTEMTIME StartingTime;
// first time through, initialize & return true time
dwStartTick = (*pGetTickCount)();
(*pGetSystemTime)(&StartingTime);
SystemTimeToFileTime(&StartingTime, &StartFileTime);
*lpSystemTimeAsFileTime = StartFileTime;
}
else {
dwCurrentTick=(*pGetTickCount)();
dwTick=(dwCurrentTick-dwStartTick);
TimeShift=GetHookInfo()->TimeShift;
dwTick = TimeShifter(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.
CurrFileTime.dwHighDateTime = StartFileTime.dwHighDateTime; // wrong !!!!
CurrFileTime.dwLowDateTime = StartFileTime.dwLowDateTime + (10000 * dwTick); // wrong !!!!
*lpSystemTimeAsFileTime=CurrFileTime;
// reset to avoid time jumps on TimeShift changes...
StartFileTime = CurrFileTime;
dwStartTick = dwCurrentTick;
}
}
void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime)
{ {
DWORD dwTick; DWORD dwTick;
@ -442,7 +484,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime)
else { else {
dwCurrentTick=(*pGetTickCount)(); dwCurrentTick=(*pGetTickCount)();
dwTick=(dwCurrentTick-dwStartTick); dwTick=(dwCurrentTick-dwStartTick);
TimeShift=GetTimeShift(); TimeShift=GetHookInfo()->TimeShift;
dwTick = TimeShifter(dwTick, TimeShift); dwTick = TimeShifter(dwTick, TimeShift);
// From MSDN: Contains a 64-bit value representing the number of // From MSDN: Contains a 64-bit value representing the number of
// 100-nanosecond intervals since January 1, 1601 (UTC). // 100-nanosecond intervals since January 1, 1601 (UTC).
@ -456,6 +498,35 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime)
} }
} }
void dxwCore::ShowFPS(HDC xdc)
{
char sBuf[81];
static DWORD dwTimer = 0;
static int corner = 0;
static int x, y;
static DWORD color;
if((*pGetTickCount)()-dwTimer > 4000){
RECT rect;
dwTimer = (*pGetTickCount)();
corner = dwTimer % 4;
color=0xFF0000; // blue
(*pGetClientRect)(hWnd, &rect);
switch (corner) {
case 0: x=10; y=10; break;
case 1: x=rect.right-60; y=10; break;
case 2: x=rect.right-60; y=rect.bottom-20; break;
case 3: x=10; y=rect.bottom-20; break;
}
}
SetTextColor(xdc,color);
//SetBkMode(xdc, TRANSPARENT);
SetBkMode(xdc, OPAQUE);
sprintf(sBuf, "FPS: %d", GetHookInfo()->FPSCount);
TextOut(xdc, x, y, sBuf, strlen(sBuf));
}
void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds) void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds)
{ {
HDC xdc; // the working dc HDC xdc; // the working dc
@ -466,16 +537,8 @@ void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds)
static DWORD color; static DWORD color;
if((*pGetTickCount)()-dwTimer > 4000){ if((*pGetTickCount)()-dwTimer > 4000){
if(!dwTimer) srand ((*pGetTickCount)());
dwTimer = (*pGetTickCount)(); dwTimer = (*pGetTickCount)();
//corner = rand() % 4;
corner = dwTimer % 4; corner = dwTimer % 4;
//color = ((0x80 + (rand() % 0x80))) +
// ((0x80 + (rand() % 0x80))<<8) +
// ((0x80 + (rand() % 0x80))<<16);
// color = rand() % 0x1000000;
//color = RGB(rand()%0x100, rand()%0x100, rand()%0x100);
//color = RGB(dwTimer%0x100, dwTimer%0x100, dwTimer%0x100);
color=0xFF0000; // blue color=0xFF0000; // blue
switch (corner) { switch (corner) {
case 0: x=10; y=10; break; case 0: x=10; y=10; break;
@ -489,7 +552,7 @@ void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds)
SetTextColor(xdc,color); SetTextColor(xdc,color);
//SetBkMode(xdc, TRANSPARENT); //SetBkMode(xdc, TRANSPARENT);
SetBkMode(xdc, OPAQUE); SetBkMode(xdc, OPAQUE);
sprintf(sBuf, "FPS: %d", DxWndStatus.FPSCount); sprintf(sBuf, "FPS: %d", GetHookInfo()->FPSCount);
TextOut(xdc, x, y, sBuf, strlen(sBuf)); TextOut(xdc, x, y, sBuf, strlen(sBuf));
lpdds->ReleaseDC(xdc); lpdds->ReleaseDC(xdc);
} }

View File

@ -41,8 +41,10 @@ public: // methods
void SetPrimarySurface(void); void SetPrimarySurface(void);
void ResetPrimarySurface(void); void ResetPrimarySurface(void);
void GetSystemTime(LPSYSTEMTIME lpSystemTime); void GetSystemTime(LPSYSTEMTIME lpSystemTime);
void GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime);
DWORD StretchTime(DWORD); DWORD StretchTime(DWORD);
void ShowFPS(LPDIRECTDRAWSURFACE); void ShowFPS(LPDIRECTDRAWSURFACE);
void ShowFPS(HDC);
char *GetTSCaption(int); char *GetTSCaption(int);
char *GetTSCaption(void); char *GetTSCaption(void);
@ -72,6 +74,9 @@ public: // simple data variables
//BOOL IsWithinDDraw; // flag to avoid double intervention at ddraw & GDI level //BOOL IsWithinDDraw; // flag to avoid double intervention at ddraw & GDI level
BOOL IsGDIPalette; BOOL IsGDIPalette;
char *CustomOpenGLLib; char *CustomOpenGLLib;
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
// Implementation // Implementation
protected: protected:

View File

@ -120,14 +120,14 @@ int GetHookStatus(DXWNDSTATUS *s)
return HookStatus; return HookStatus;
} }
void SetHookStatus(DXWNDSTATUS *s) DXWNDSTATUS *GetHookInfo()
{ {
*pStatus=*s; return pStatus;
} }
int GetTimeShift() void SetFPS(int fps)
{ {
return pStatus->iTimeShift; pStatus->FPSCount=fps;
} }
LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam) LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
@ -171,7 +171,7 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
pStatus->IsFullScreen=FALSE; pStatus->IsFullScreen=FALSE;
pStatus->hWnd=hwnd; pStatus->hWnd=hwnd;
pStatus->dwPid=GetProcessId(GetCurrentProcess()); pStatus->dwPid=GetProcessId(GetCurrentProcess());
pStatus->iTimeShift=pMapping[i].InitTS; pStatus->TimeShift=pMapping[i].InitTS;
DxWndStatus = *pStatus; DxWndStatus = *pStatus;
HookInit(&pMapping[i], hwnd); HookInit(&pMapping[i], hwnd);
} }

View File

@ -5,4 +5,4 @@ EXPORTS
EndHook @3 EndHook @3
GetDllVersion @4 GetDllVersion @4
GetHookStatus @5 GetHookStatus @5
SetHookStatus @6 GetHookInfo @6

Binary file not shown.

View File

@ -2,45 +2,10 @@
#include "dxwcore.hpp" #include "dxwcore.hpp"
#include "syslibs.h" #include "syslibs.h"
#include "dxhook.h" #include "dxhook.h"
#define DXWDECLARATIONS TRUE
#include "glhook.h" #include "glhook.h"
#undef DXWDECLARATIONS
glViewport_Type pglViewport;
glScissor_Type pglScissor;
glGetIntegerv_Type pglGetIntegerv;
void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height)
{
RECT client;
(*pGetClientRect)(dxw.GethWnd(), &client);
OutTraceD("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
if(IsDebug) OutTrace("glViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n",
client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight());
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
OutTraceD("glViewport: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
(*pglViewport)(x, y, width, height);
}
void WINAPI extglScissor(GLint x, GLint y, GLsizei width, GLsizei height)
{
RECT client;
(*pGetClientRect)(dxw.GethWnd(), &client);
OutTraceD("glScissor: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
OutTraceD("glScissor: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
(*pglScissor)(x, y, width, height);
}
void WINAPI extglGetIntegerv(GLenum pname, GLint *params)
{
(*pglGetIntegerv)(pname, params);
OutTraceD("glGetIntegerv: pname=%d\n", pname);
}
FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule) FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule)
{ {
@ -59,6 +24,12 @@ FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule)
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglGetIntegerv); OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglGetIntegerv);
return (FARPROC)extglGetIntegerv; return (FARPROC)extglGetIntegerv;
} }
if (!strcmp(proc,"glDrawBuffer")){
pglDrawBuffer=(glDrawBuffer_Type)(*pGetProcAddress)(hModule, proc);
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglDrawBuffer);
return (FARPROC)extglDrawBuffer;
}
// NULL -> keep the original call address // NULL -> keep the original call address
return NULL; return NULL;
} }
@ -76,7 +47,63 @@ void HookOpenGLLibs(char *module, char *customlib)
if(tmp) pglScissor = (glScissor_Type)tmp; if(tmp) pglScissor = (glScissor_Type)tmp;
tmp = HookAPI(module, customlib, NULL, "glGetIntegerv", extglGetIntegerv); tmp = HookAPI(module, customlib, NULL, "glGetIntegerv", extglGetIntegerv);
if(tmp) pglGetIntegerv = (glGetIntegerv_Type)tmp; if(tmp) pglGetIntegerv = (glGetIntegerv_Type)tmp;
tmp = HookAPI(module, customlib, NULL, "glDrawBuffer", extglDrawBuffer);
if(tmp) pglDrawBuffer = (glDrawBuffer_Type)tmp;
return; return;
} }
void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height)
{
RECT client;
//if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return;
(*pGetClientRect)(dxw.GethWnd(), &client);
OutTraceD("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
if(IsDebug) OutTrace("glViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n",
client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight());
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
OutTraceD("glViewport: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
(*pglViewport)(x, y, width, height);
}
void WINAPI extglScissor(GLint x, GLint y, GLsizei width, GLsizei height)
{
RECT client;
//if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return;
(*pGetClientRect)(dxw.GethWnd(), &client);
OutTraceD("glScissor: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
OutTraceD("glScissor: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
(*pglScissor)(x, y, width, height);
}
void WINAPI extglGetIntegerv(GLenum pname, GLint *params)
{
(*pglGetIntegerv)(pname, params);
OutTraceD("glGetIntegerv: pname=%d\n", pname);
}
void WINAPI extglDrawBuffer(GLenum mode)
{
if (IsDebug) OutTrace("glDrawBuffer: mode=%x\n", mode);
// handle FPS only to backbuffer updates (if stereo, on left backbuffer...)
// using the frontbuffer seems less reliable: Return to Castle Wolfenstein doesn't use it at all!
if (dxw.dwFlags2 & HANDLEFPS){
switch (mode){
//case GL_FRONT_LEFT:
case GL_BACK_LEFT:
//case GL_FRONT:
case GL_BACK:
case GL_LEFT:
case GL_FRONT_AND_BACK:
if(dxw.HandleFPS()) return;
}
}
(*pglDrawBuffer)(mode);
}

View File

@ -6,11 +6,33 @@ extern void HookOpenGLLibs(char *, char *);
typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei); typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei);
typedef void (WINAPI *glScissor_Type)(GLint, GLint, GLsizei, GLsizei); typedef void (WINAPI *glScissor_Type)(GLint, GLint, GLsizei, GLsizei);
typedef void (WINAPI *glGetIntegerv_Type)(GLenum, GLint *); typedef void (WINAPI *glGetIntegerv_Type)(GLenum, GLint *);
typedef void (WINAPI *glFinish_Type)(void);
typedef void (WINAPI *glFlush_Type)(void);
typedef void (WINAPI *glDrawBuffer_Type)(GLenum);
extern void WINAPI extglViewport(GLint, GLint, GLsizei, GLsizei); extern void WINAPI extglViewport(GLint, GLint, GLsizei, GLsizei);
extern void WINAPI extglScissor(GLint, GLint, GLsizei, GLsizei); extern void WINAPI extglScissor(GLint, GLint, GLsizei, GLsizei);
extern void WINAPI extglGetIntegerv(GLenum, GLint *); extern void WINAPI extglGetIntegerv(GLenum, GLint *);
extern void WINAPI extglFinish(void);
extern void WINAPI extglFlush(void);
extern void WINAPI extglDrawBuffer(GLenum);
extern glViewport_Type pglViewport; #ifdef DXWDECLARATIONS
extern glScissor_Type pglScissor; #undef DXWEXTERN
extern glGetIntegerv_Type pglGetIntegerv; #undef DXWINITIALIZED
#define DXWEXTERN
#define DXWINITIALIZED = NULL
#else
#undef DXWEXTERN
#undef DXWINITIALIZED
#define DXWEXTERN extern
#define DXWINITIALIZED
#endif
// GDI32.dll:
DXWEXTERN glViewport_Type pglViewport;
DXWEXTERN glScissor_Type pglScissor;
DXWEXTERN glGetIntegerv_Type pglGetIntegerv;
//DXWEXTERN glFinish_Type pglFinish;
//DXWEXTERN glFlush_Type pglFlush;
DXWEXTERN glDrawBuffer_Type pglDrawBuffer;

View File

@ -11,6 +11,7 @@ typedef HRESULT (WINAPI *EnumAdapterModes8_Type)(void *, UINT, UINT, D3DDISPLAYM
typedef HRESULT (WINAPI *EnumAdapterModes9_Type)(void *, UINT, D3DFORMAT ,UINT, D3DDISPLAYMODE *); typedef HRESULT (WINAPI *EnumAdapterModes9_Type)(void *, UINT, D3DFORMAT ,UINT, D3DDISPLAYMODE *);
typedef HRESULT (WINAPI *GetAdapterDisplayMode_Type)(void *, UINT, D3DDISPLAYMODE *); typedef HRESULT (WINAPI *GetAdapterDisplayMode_Type)(void *, UINT, D3DDISPLAYMODE *);
typedef HRESULT (WINAPI *GetDisplayMode_Type)(void *, D3DDISPLAYMODE *); typedef HRESULT (WINAPI *GetDisplayMode_Type)(void *, D3DDISPLAYMODE *);
typedef HRESULT (WINAPI *Present_Type)(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
void* WINAPI extDirect3DCreate8(UINT); void* WINAPI extDirect3DCreate8(UINT);
void* WINAPI extDirect3DCreate9(UINT); void* WINAPI extDirect3DCreate9(UINT);
@ -20,6 +21,7 @@ HRESULT WINAPI extEnumAdapterModes8(void *, UINT, UINT , D3DDISPLAYMODE *);
HRESULT WINAPI extEnumAdapterModes9(void *, UINT, D3DFORMAT, UINT , D3DDISPLAYMODE *); HRESULT WINAPI extEnumAdapterModes9(void *, UINT, D3DFORMAT, UINT , D3DDISPLAYMODE *);
HRESULT WINAPI extGetAdapterDisplayMode(void *, UINT, D3DDISPLAYMODE *); HRESULT WINAPI extGetAdapterDisplayMode(void *, UINT, D3DDISPLAYMODE *);
HRESULT WINAPI extGetDisplayMode(void *, D3DDISPLAYMODE *); HRESULT WINAPI extGetDisplayMode(void *, D3DDISPLAYMODE *);
HRESULT WINAPI extPresent(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
extern char *ExplainDDError(DWORD); extern char *ExplainDDError(DWORD);
@ -31,6 +33,8 @@ EnumAdapterModes8_Type pEnumAdapterModes8;
EnumAdapterModes9_Type pEnumAdapterModes9; EnumAdapterModes9_Type pEnumAdapterModes9;
GetAdapterDisplayMode_Type pGetAdapterDisplayMode; GetAdapterDisplayMode_Type pGetAdapterDisplayMode;
GetDisplayMode_Type pGetDisplayMode; GetDisplayMode_Type pGetDisplayMode;
Present_Type pPresent;
DWORD dwD3DVersion; DWORD dwD3DVersion;
int HookDirect3D(char *module, int version){ int HookDirect3D(char *module, int version){
@ -123,6 +127,15 @@ HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresentationParamet
return D3D_OK; return D3D_OK;
} }
HRESULT WINAPI extPresent(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
if (IsDebug) OutTrace("Present\n");
// frame counter handling....
if (dxw.HandleFPS()) return D3D_OK;
// proxy ....
return (*pPresent)(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}
HRESULT WINAPI extGetDisplayMode(void *lpd3d, D3DDISPLAYMODE *pMode) HRESULT WINAPI extGetDisplayMode(void *lpd3d, D3DDISPLAYMODE *pMode)
{ {
HRESULT res; HRESULT res;
@ -243,21 +256,25 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
pReset=NULL; // to avoid assert condition pReset=NULL; // to avoid assert condition
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D8)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D8)");
SetHook((void *)(**(DWORD **)ppd3dd + 56), extReset, (void **)&pReset, "Reset(D8)"); SetHook((void *)(**(DWORD **)ppd3dd + 56), extReset, (void **)&pReset, "Reset(D8)");
SetHook((void *)(**(DWORD **)ppd3dd + 60), extPresent, (void **)&pPresent, "Present(D8)");
} }
else { else {
void *pReset; void *pReset;
pReset=NULL; // to avoid assert condition pReset=NULL; // to avoid assert condition
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D9)"); SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D9)");
SetHook((void *)(**(DWORD **)ppd3dd + 64), extReset, (void **)&pReset, "Reset(D9)"); SetHook((void *)(**(DWORD **)ppd3dd + 64), extReset, (void **)&pReset, "Reset(D9)");
SetHook((void *)(**(DWORD **)ppd3dd + 68), extPresent, (void **)&pPresent, "Present(D9)");
} }
DxWndStatus.IsFullScreen = dxw.IsFullScreen(); GetHookInfo()->IsFullScreen = dxw.IsFullScreen();
DxWndStatus.DXVersion=(short)dwD3DVersion; GetHookInfo()->DXVersion=(short)dwD3DVersion;
DxWndStatus.Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth(); GetHookInfo()->Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
SetHookStatus(&DxWndStatus);
return 0; return 0;
} }
// to do:
// hook IDirect3DDevice9::CreateAdditionalSwapChain to intercept Present method on further Swap Chains
// hook SetCursorPosition ShowCursor to handle cursor

View File

@ -398,12 +398,11 @@ void InitScreenParameters()
// set default VGA mode 800x600 // set default VGA mode 800x600
// should I make it configurable ? (640x480, 800x600, 1024x768) // should I make it configurable ? (640x480, 800x600, 1024x768)
dxw.SetScreenSize(); // 800 x 600 by default dxw.SetScreenSize(); // 800 x 600 by default
DxWndStatus.Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth(); GetHookInfo()->Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=0; // unknown GetHookInfo()->ColorDepth=0; // unknown
DxWndStatus.DXVersion=0; // unknown GetHookInfo()->DXVersion=0; // unknown
DxWndStatus.isLogging=(dxw.dwTFlags & OUTTRACE); GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
SetHookStatus(&DxWndStatus);
if(!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrDevMode)){ if(!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrDevMode)){
OutTraceE("EnumDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); OutTraceE("EnumDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
@ -679,7 +678,7 @@ void do_slow(int delay)
TranslateMessage (&uMsg); TranslateMessage (&uMsg);
DispatchMessage (&uMsg); DispatchMessage (&uMsg);
} }
Sleep(1); (*pSleep)(1);
} }
} }
@ -1492,9 +1491,8 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd,
} }
dxw.SetScreenSize(dwwidth, dwheight); dxw.SetScreenSize(dwwidth, dwheight);
DxWndStatus.Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth(); GetHookInfo()->Width=(short)dxw.GetScreenWidth();
SetHookStatus(&DxWndStatus);
AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight); AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight);
if(dxw.dwFlags1 & EMULATESURFACE){ if(dxw.dwFlags1 & EMULATESURFACE){
@ -1632,8 +1630,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
if(res) if(res)
OutTraceE("SetCooperativeLevel: ERROR err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("SetCooperativeLevel: ERROR err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
DxWndStatus.IsFullScreen=dxw.IsFullScreen(); GetHookInfo()->IsFullScreen=dxw.IsFullScreen();
SetHookStatus(&DxWndStatus);
// WARN: GP500 was setting cooperative level against the desktop! This can be partially // WARN: GP500 was setting cooperative level against the desktop! This can be partially
// intercepted by hooking the GetDesktopWindow() call, but in windowed mode this can't be // intercepted by hooking the GetDesktopWindow() call, but in windowed mode this can't be
@ -1646,9 +1643,6 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
else else
dxw.SethWnd(hwnd); // save the good one dxw.SethWnd(hwnd); // save the good one
} }
DxWndStatus.IsFullScreen=dxw.IsFullScreen();
SetHookStatus(&DxWndStatus);
return res; return res;
} }
@ -1676,11 +1670,10 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf
ddsd.dwSize = CurSize; ddsd.dwSize = CurSize;
if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){ if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){
DxWndStatus.Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth(); GetHookInfo()->Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
DxWndStatus.DXVersion=dxversion; GetHookInfo()->DXVersion=dxversion;
SetHookStatus(&DxWndStatus);
lpServiceDD = lpdd; // v2.1.87 lpServiceDD = lpdd; // v2.1.87
dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps; dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps;
@ -1875,10 +1868,8 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf
if(ddsd.ddpfPixelFormat.dwRGBBitCount==8){ // use a better condition here.... if(ddsd.ddpfPixelFormat.dwRGBBitCount==8){ // use a better condition here....
if(lpDDP==NULL){ if(lpDDP==NULL){
// should link here to the GDI palette? See Hyperblade.... // should link here to the GDI palette? See Hyperblade....
//static PALETTEENTRY Palette[256]; dxw.palNumEntries=256;
extern PALETTEENTRY *GDIPalette; res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL);
//res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, Palette, &lpDDP, NULL);
res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, GDIPalette, &lpDDP, NULL);
if (res) { if (res) {
OutTraceE("CreateSurface: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("CreateSurface: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res; return res;
@ -1914,11 +1905,10 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf
ddsd.dwSize = dwSize; ddsd.dwSize = dwSize;
if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){ if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){
DxWndStatus.Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth(); GetHookInfo()->Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
DxWndStatus.DXVersion=dxversion; GetHookInfo()->DXVersion=dxversion;
SetHookStatus(&DxWndStatus);
dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps; dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps;
dxw.dwBackBufferCount = (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) ? ddsd.dwBackBufferCount : 0; dxw.dwBackBufferCount = (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) ? ddsd.dwBackBufferCount : 0;
lpServiceDD = lpdd; // v2.1.87 lpServiceDD = lpdd; // v2.1.87
@ -2446,7 +2436,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
work on my PC. work on my PC.
*/ */
if(res==DDERR_UNSUPPORTED){ if(res==DDERR_UNSUPPORTED){
if (dxw.dwFlags2 & SHOWFPS) dxw.ShowFPS(lpddssrc); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc);
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
} }
@ -2481,7 +2471,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
lpDDSSource = lpdds; lpDDSSource = lpdds;
} }
if (dxw.dwFlags2 & SHOWFPS) dxw.ShowFPS(lpDDSSource); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource);
res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0);
if (res==DDERR_NOCLIPLIST){ if (res==DDERR_NOCLIPLIST){
RenewClipper(lpDD, lpDDSEmu_Prim); RenewClipper(lpDD, lpDDSEmu_Prim);
@ -2677,7 +2667,7 @@ HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE
if(!(dxw.dwFlags1 & SAVELOAD)) return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); if(!(dxw.dwFlags1 & SAVELOAD)) return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent);
tmp = GetTickCount(); tmp = GetTickCount();
if((time - tmp) > 32) time = tmp; if((time - tmp) > 32) time = tmp;
Sleep(time - tmp); (*pSleep)(time - tmp);
if(step) time += 16; if(step) time += 16;
else time += 17; else time += 17;
step ^= 1; step ^= 1;
@ -2900,7 +2890,7 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC
lpDDSSource=lpdds; lpDDSSource=lpdds;
} }
if (dxw.dwFlags2 & SHOWFPS) dxw.ShowFPS(lpDDSSource); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource);
res=(*pBlt)(lpDDSEmu_Prim, &screen, lpDDSSource, &rect, DDBLT_WAIT, 0); res=(*pBlt)(lpDDSEmu_Prim, &screen, lpDDSSource, &rect, DDBLT_WAIT, 0);
if (res==DDERR_NOCLIPLIST) { if (res==DDERR_NOCLIPLIST) {
RenewClipper(lpDD, lpDDSEmu_Prim); RenewClipper(lpDD, lpDDSEmu_Prim);

View File

@ -1825,6 +1825,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH
nWDest= nWidth; nWDest= nWidth;
nHDest= nHeight; nHDest= nHeight;
dxw.MapRect(&nXDest, &nYDest, &nWDest, &nHDest); dxw.MapRect(&nXDest, &nYDest, &nWDest, &nHDest);
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest);
res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop);
} }
else { else {
@ -1847,6 +1848,7 @@ BOOL WINAPI extGDIPatBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){
int nWDest, nHDest; int nWDest, nHDest;
dxw.MapRect(&nXDest, &nYDest, &nWDest, &nHDest); dxw.MapRect(&nXDest, &nYDest, &nWDest, &nHDest);
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest);
res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, dwRop); res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, dwRop);
} }
else { else {
@ -1869,6 +1871,7 @@ BOOL WINAPI extGDIStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, in
// to do: what happend if StretchBlt is applied on screen DC ? // to do: what happend if StretchBlt is applied on screen DC ?
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest);
res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop);
if(!res) OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); if(!res) OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__);
return res; return res;
@ -1888,7 +1891,7 @@ static DWORD dwThrdId;
void AutoRefresh(HDC hdc) void AutoRefresh(HDC hdc)
{ {
while(1){ while(1){
Sleep(10); (*pSleep)(10);
(*pInvalidateRect)(dxw.GethWnd(), 0, FALSE); (*pInvalidateRect)(dxw.GethWnd(), 0, FALSE);
} }
} }
@ -2257,17 +2260,6 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase)
// maps the GDI palette to the buffered DirectDraw one. This fixes the screen // maps the GDI palette to the buffered DirectDraw one. This fixes the screen
// output for "Dementia" (a.k.a. "Armed & Delirious"). // output for "Dementia" (a.k.a. "Armed & Delirious").
typedef struct tagDxWndLOGPALETTE
{
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[ 256 ];
} DxWndLOGPALETTE;
DxWndLOGPALETTE MyPal;
PALETTEENTRY *GDIPalette = MyPal.palPalEntry;
//BOOL G_bForceBackground;
HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal)
{ {
HPALETTE ret; HPALETTE ret;
@ -2277,14 +2269,14 @@ HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal)
OutTraceD("GDI.CreatePalette: plpal=%x version=%x NumEntries=%x\n", plpal, plpal->palVersion, plpal->palNumEntries); OutTraceD("GDI.CreatePalette: plpal=%x version=%x NumEntries=%x\n", plpal, plpal->palVersion, plpal->palNumEntries);
ret=(*pGDICreatePalette)(plpal); ret=(*pGDICreatePalette)(plpal);
if(IsDebug){ if(IsDebug){
OutTraceD("PalEntry[%x]= ", MyPal.palNumEntries); OutTraceD("PalEntry[%x]= ", plpal->palNumEntries);
for(idx=0; idx<MyPal.palNumEntries; idx++) OutTraceD("(%x)", plpal->palPalEntry[idx]); for(idx=0; idx<plpal->palNumEntries; idx++) OutTraceD("(%x)", plpal->palPalEntry[idx]);
OutTraceD("\n"); OutTraceD("\n");
} }
MyPal.palVersion=plpal->palVersion; dxw.palVersion=plpal->palVersion;
MyPal.palNumEntries=plpal->palNumEntries; dxw.palNumEntries=plpal->palNumEntries;
if(MyPal.palNumEntries>256) MyPal.palNumEntries=256; if(dxw.palNumEntries>256) dxw.palNumEntries=256;
for(idx=0; idx<MyPal.palNumEntries; idx++) MyPal.palPalEntry[idx]=plpal->palPalEntry[idx]; for(idx=0; idx<dxw.palNumEntries; idx++) dxw.palPalEntry[idx]=plpal->palPalEntry[idx];
OutTraceD("GDI.CreatePalette: hPalette=%x\n", ret); OutTraceD("GDI.CreatePalette: hPalette=%x\n", ret);
return ret; return ret;
} }
@ -2314,12 +2306,12 @@ UINT WINAPI extRealizePalette(HDC hdc)
// should be cleaned up a little.... // should be cleaned up a little....
// maybe not: now both Diablo & Dementia colors are working... // maybe not: now both Diablo & Dementia colors are working...
if(dxw.dwFlags1 & EMULATESURFACE) if(dxw.dwFlags1 & EMULATESURFACE)
mySetPalette(0, MyPal.palNumEntries, MyPal.palPalEntry); mySetPalette(0, dxw.palNumEntries, dxw.palPalEntry);
// DEBUGGING // DEBUGGING
if(IsDebug){ if(IsDebug){
int idx; int idx;
OutTraceD("PaletteEntries[%x]= ", MyPal.palNumEntries); OutTraceD("PaletteEntries[%x]= ", dxw.palNumEntries);
for(idx=0; idx<MyPal.palNumEntries; idx++) OutTraceD("(%x)", PaletteEntries[idx]); for(idx=0; idx<dxw.palNumEntries; idx++) OutTraceD("(%x)", PaletteEntries[idx]);
OutTraceD("\n"); OutTraceD("\n");
} }
return ret; return ret;
@ -2512,7 +2504,7 @@ DWORD WINAPI extGetTickCount(void)
void WINAPI extGetSystemTime(LPSYSTEMTIME lpSystemTime) void WINAPI extGetSystemTime(LPSYSTEMTIME lpSystemTime)
{ {
dxw.GetSystemTime(lpSystemTime); dxw.GetSystemTime(lpSystemTime);
OutTrace("GetSystemTime: %02d:%02d:%02d.%03d\n", if (IsDebug) OutTrace("GetSystemTime: %02d:%02d:%02d.%03d\n",
lpSystemTime->wHour, lpSystemTime->wMinute, lpSystemTime->wSecond, lpSystemTime->wMilliseconds); lpSystemTime->wHour, lpSystemTime->wMinute, lpSystemTime->wSecond, lpSystemTime->wMilliseconds);
} }
@ -2522,7 +2514,7 @@ void WINAPI extGetLocalTime(LPSYSTEMTIME lpLocalTime)
SYSTEMTIME SystemTime; SYSTEMTIME SystemTime;
dxw.GetSystemTime(&SystemTime); dxw.GetSystemTime(&SystemTime);
SystemTimeToTzSpecificLocalTime(NULL, &SystemTime, lpLocalTime); SystemTimeToTzSpecificLocalTime(NULL, &SystemTime, lpLocalTime);
OutTrace("GetLocalTime: %02d:%02d:%02d.%03d\n", if (IsDebug) OutTrace("GetLocalTime: %02d:%02d:%02d.%03d\n",
lpLocalTime->wHour, lpLocalTime->wMinute, lpLocalTime->wSecond, lpLocalTime->wMilliseconds); lpLocalTime->wHour, lpLocalTime->wMinute, lpLocalTime->wSecond, lpLocalTime->wMilliseconds);
} }
@ -2533,7 +2525,7 @@ UINT_PTR WINAPI extSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPRO
// and the lesser the pauses must be lasting! Shift operations are reverted in // and the lesser the pauses must be lasting! Shift operations are reverted in
// GetSystemTime vs. Sleep or SetTimer // GetSystemTime vs. Sleep or SetTimer
uShiftedElapse = dxw.StretchTime(uElapse); uShiftedElapse = dxw.StretchTime(uElapse);
OutTrace("SetTimer: elapse=%d->%d timeshift=%d\n", uElapse, uShiftedElapse, dxw.TimeShift); if (IsDebug) OutTrace("SetTimer: elapse=%d->%d timeshift=%d\n", uElapse, uShiftedElapse, dxw.TimeShift);
return (*pSetTimer)(hWnd, nIDEvent, uShiftedElapse, lpTimerFunc); return (*pSetTimer)(hWnd, nIDEvent, uShiftedElapse, lpTimerFunc);
} }
@ -2548,7 +2540,7 @@ VOID WINAPI extSleep(DWORD dwMilliseconds)
else dwNewDelay = INFINITE-1; // maximum allowed !!! else dwNewDelay = INFINITE-1; // maximum allowed !!!
} }
} }
OutTrace("Sleep: msec=%d->%d timeshift=%d\n", dwMilliseconds, dwNewDelay, dxw.TimeShift); if (IsDebug) OutTrace("Sleep: msec=%d->%d timeshift=%d\n", dwMilliseconds, dwNewDelay, dxw.TimeShift);
(*pSleep)(dwNewDelay); (*pSleep)(dwNewDelay);
} }
@ -2563,16 +2555,22 @@ DWORD WINAPI extSleepEx(DWORD dwMilliseconds, BOOL bAlertable)
else dwNewDelay = INFINITE-1; // maximum allowed !!! else dwNewDelay = INFINITE-1; // maximum allowed !!!
} }
} }
OutTrace("SleepEx: msec=%d->%d alertable=%x, timeshift=%d\n", dwMilliseconds, dwNewDelay, bAlertable, dxw.TimeShift); if (IsDebug) OutTrace("SleepEx: msec=%d->%d alertable=%x, timeshift=%d\n", dwMilliseconds, dwNewDelay, bAlertable, dxw.TimeShift);
return (*pSleepEx)(dwNewDelay, bAlertable); return (*pSleepEx)(dwNewDelay, bAlertable);
} }
DWORD WINAPI exttimeGetTime(void) DWORD WINAPI exttimeGetTime(void)
{ {
OutTrace("timeGetTime\n"); if (IsDebug) OutTrace("timeGetTime\n");
return dxw.GetTickCount(); return dxw.GetTickCount();
} }
void WINAPI extGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
if (IsDebug) OutTrace("GetSystemTimeAsFileTime\n");
dxw.GetSystemTimeAsFileTime(lpSystemTimeAsFileTime);
}
int WINAPI extShowCursor(BOOL bShow) int WINAPI extShowCursor(BOOL bShow)
{ {
static int iFakeCounter; static int iFakeCounter;

View File

@ -43,6 +43,7 @@ typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD,
typedef void (WINAPI *GetLocalTime_Type)(LPSYSTEMTIME); typedef void (WINAPI *GetLocalTime_Type)(LPSYSTEMTIME);
typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR); typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR);
typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME); typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME);
typedef void (WINAPI *GetSystemTimeAsFileTime_Type)(LPFILETIME);
typedef DWORD (WINAPI *GetTickCount_Type)(void); typedef DWORD (WINAPI *GetTickCount_Type)(void);
typedef HMODULE (WINAPI *LoadLibraryA_Type)(LPCTSTR); typedef HMODULE (WINAPI *LoadLibraryA_Type)(LPCTSTR);
typedef HMODULE (WINAPI *LoadLibraryExA_Type)(LPCTSTR, HANDLE, DWORD); typedef HMODULE (WINAPI *LoadLibraryExA_Type)(LPCTSTR, HANDLE, DWORD);
@ -142,6 +143,7 @@ DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED;
DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED; DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED;
DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED; DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED;
DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED; DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED;
DXWEXTERN GetSystemTimeAsFileTime_Type pGetSystemTimeAsFileTime DXWINITIALIZED;
DXWEXTERN GetTickCount_Type pGetTickCount DXWINITIALIZED; DXWEXTERN GetTickCount_Type pGetTickCount DXWINITIALIZED;
DXWEXTERN LoadLibraryA_Type pLoadLibraryA DXWINITIALIZED; DXWEXTERN LoadLibraryA_Type pLoadLibraryA DXWINITIALIZED;
DXWEXTERN LoadLibraryExA_Type pLoadLibraryExA DXWINITIALIZED; DXWEXTERN LoadLibraryExA_Type pLoadLibraryExA DXWINITIALIZED;
@ -234,6 +236,7 @@ extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWO
extern void WINAPI extGetLocalTime(LPSYSTEMTIME); extern void WINAPI extGetLocalTime(LPSYSTEMTIME);
extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR); extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR);
extern void WINAPI extGetSystemTime(LPSYSTEMTIME); extern void WINAPI extGetSystemTime(LPSYSTEMTIME);
extern void WINAPI extGetSystemTimeAsFileTime(LPFILETIME);
extern DWORD WINAPI extGetTickCount(void); extern DWORD WINAPI extGetTickCount(void);
extern HMODULE WINAPI extLoadLibraryA(LPCTSTR); extern HMODULE WINAPI extLoadLibraryA(LPCTSTR);
extern HMODULE WINAPI extLoadLibraryExA(LPCTSTR, HANDLE, DWORD); extern HMODULE WINAPI extLoadLibraryExA(LPCTSTR, HANDLE, DWORD);

View File

@ -119,6 +119,10 @@
#define IDC_HOOKOPENGL 1080 #define IDC_HOOKOPENGL 1080
#define IDC_WALLPAPERMODE 1081 #define IDC_WALLPAPERMODE 1081
#define IDC_HOOKGDI 1082 #define IDC_HOOKGDI 1082
#define IDC_SHOWFPSOVERLAY 1083
#define IDC_COMBOTS 1085
#define IDC_LIST2 1088
#define IDC_LISTTS 1088
#define ID_MODIFY 32771 #define ID_MODIFY 32771
#define ID_DELETE 32772 #define ID_DELETE 32772
#define ID_ADD 32773 #define ID_ADD 32773
@ -158,9 +162,9 @@
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1 #define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 151 #define _APS_NEXT_RESOURCE_VALUE 152
#define _APS_NEXT_COMMAND_VALUE 32816 #define _APS_NEXT_COMMAND_VALUE 32816
#define _APS_NEXT_CONTROL_VALUE 1080 #define _APS_NEXT_CONTROL_VALUE 1089
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif

View File

@ -28,7 +28,7 @@ BEGIN_MESSAGE_MAP(CStatusDialog, CDialog)
ON_WM_TIMER() ON_WM_TIMER()
END_MESSAGE_MAP() END_MESSAGE_MAP()
#define IDTIMER 1 #define IDStatusTIMER 1
// CStatusDialog message handlers // CStatusDialog message handlers
@ -47,17 +47,17 @@ void CStatusDialog::OnTimer(UINT_PTR nIDEvent)
extern char *GetTSCaption(int); extern char *GetTSCaption(int);
CDialog::OnTimer(nIDEvent); CDialog::OnTimer(nIDEvent);
DxStatus=GetHookStatus(NULL); DxStatus=GetHookStatus(&DxWndStatus);
switch (DxStatus){ switch (DxStatus){
case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break; case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break;
case DXW_ACTIVE: IconId=IDI_DXWAIT; Status="READY"; break; case DXW_ACTIVE: IconId=IDI_DXWAIT; Status="READY"; break;
case DXW_RUNNING: IconId=IDI_DXRUN; Status="RUNNING"; break; case DXW_RUNNING: IconId=IDI_DXRUN; Status="RUNNING"; break;
default: IconId=IDI_DXIDLE; Status="???"; break;
} }
GetDllVersion(DllVersion); GetDllVersion(DllVersion);
DxWndStatus.Status=DxStatus;
if(DxStatus==DXW_RUNNING){ if(DxStatus==DXW_RUNNING){
GetHookStatus(&DxWndStatus);
Target=&pTargets[DxWndStatus.TaskIdx]; Target=&pTargets[DxWndStatus.TaskIdx];
sprintf_s(sMsg, 1024, sprintf_s(sMsg, 1024,
@ -70,13 +70,13 @@ void CStatusDialog::OnTimer(UINT_PTR nIDEvent)
DxWndStatus.Width, DxWndStatus.Height, DxWndStatus.ColorDepth, DxWndStatus.Width, DxWndStatus.Height, DxWndStatus.ColorDepth,
DxWndStatus.IsFullScreen ? "Yes":"No", DxWndStatus.DXVersion, DxWndStatus.IsFullScreen ? "Yes":"No", DxWndStatus.DXVersion,
DxWndStatus.isLogging?"ON":"OFF"); DxWndStatus.isLogging?"ON":"OFF");
if(Target->flags2 & SHOWFPS){ if(Target->flags2 & (SHOWFPS|SHOWFPSOVERLAY)){
sprintf(sMsgBuf, "\nFPS = %d", DxWndStatus.FPSCount); sprintf(sMsgBuf, "\nFPS = %d", DxWndStatus.FPSCount);
strcat(sMsg, sMsgBuf); strcat(sMsg, sMsgBuf);
} }
if(Target->flags2 & TIMESTRETCH){ if(Target->flags2 & TIMESTRETCH){
if(DxWndStatus.iTimeShift>=-8 && DxWndStatus.iTimeShift<=8){ if(DxWndStatus.TimeShift>=-8 && DxWndStatus.TimeShift<=8){
sprintf(sMsgBuf, "\nTime speed: %s", GetTSCaption(DxWndStatus.iTimeShift)); sprintf(sMsgBuf, "\nTime speed %s", GetTSCaption(DxWndStatus.TimeShift));
strcat(sMsg, sMsgBuf); strcat(sMsg, sMsgBuf);
} }
} }
@ -91,7 +91,7 @@ BOOL CStatusDialog::OnInitDialog()
{ {
CDialog::OnInitDialog(); CDialog::OnInitDialog();
SetTimer(IDTIMER, 1000, NULL); SetTimer(IDStatusTIMER, 1000, NULL);
// TODO: Add extra initialization here // TODO: Add extra initialization here
@ -103,7 +103,7 @@ void CStatusDialog::OnOK()
{ {
// TODO: Add your specialized code here and/or call the base class // TODO: Add your specialized code here and/or call the base class
KillTimer(IDTIMER); KillTimer(IDStatusTIMER);
// stop timer // stop timer
CDialog::OnOK(); CDialog::OnOK();

View File

@ -79,6 +79,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_LimitFPS = FALSE; m_LimitFPS = FALSE;
m_SkipFPS = FALSE; m_SkipFPS = FALSE;
m_ShowFPS = FALSE; m_ShowFPS = FALSE;
m_ShowFPSOverlay = FALSE;
m_TimeStretch = FALSE; m_TimeStretch = FALSE;
m_HookOpenGL = FALSE; m_HookOpenGL = FALSE;
m_InitX = 0; m_InitX = 0;
@ -92,11 +93,42 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SizX = 800; m_SizX = 800;
m_SizY = 600; m_SizY = 600;
m_MaxFPS = 0; m_MaxFPS = 0;
m_InitTS = 0; m_InitTS = 8;
//}}AFX_DATA_INIT //}}AFX_DATA_INIT
} }
//void TSCombo::OnEnable(BOOL bEnable)
//{
// CComboBox::OnEnable(bEnable);
//
// // Get edit control which happens to be the first child window
// CEdit* pEdit = (CEdit*)GetWindow(GW_CHILD);
//
// // Always have the edit box enabled
// pEdit->EnableWindow(TRUE);
//
// // Set read only is combo box is disabled
// pEdit->SetReadOnly(!bEnable);
//}
BOOL CTargetDlg::OnInitDialog()
{
CListBox *TSList;
CDialog::OnInitDialog();
int i;
extern char *GetTSCaption(int);
//MessageBoxEx(0, "Init Dialog", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL);
TSList=(CListBox *)this->GetDlgItem(IDC_LISTTS);
TSList->ResetContent();
for(i=-8; i<=8; i++) TSList->AddString(GetTSCaption(i));
TSList->SetCurSel(m_InitTS);
return TRUE;
}
void CTargetDlg::DoDataExchange(CDataExchange* pDX) void CTargetDlg::DoDataExchange(CDataExchange* pDX)
{ {
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
@ -164,6 +196,7 @@ void CTargetDlg::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_LIMITFPS, m_LimitFPS); DDX_Check(pDX, IDC_LIMITFPS, m_LimitFPS);
DDX_Check(pDX, IDC_SKIPFPS, m_SkipFPS); DDX_Check(pDX, IDC_SKIPFPS, m_SkipFPS);
DDX_Check(pDX, IDC_SHOWFPS, m_ShowFPS); DDX_Check(pDX, IDC_SHOWFPS, m_ShowFPS);
DDX_Check(pDX, IDC_SHOWFPSOVERLAY, m_ShowFPSOverlay);
DDX_Check(pDX, IDC_TIMESTRETCH, m_TimeStretch); DDX_Check(pDX, IDC_TIMESTRETCH, m_TimeStretch);
DDX_Check(pDX, IDC_HOOKOPENGL, m_HookOpenGL); DDX_Check(pDX, IDC_HOOKOPENGL, m_HookOpenGL);
DDX_Text(pDX, IDC_INITX, m_InitX); DDX_Text(pDX, IDC_INITX, m_InitX);
@ -177,7 +210,8 @@ void CTargetDlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_SIZX, m_SizX); DDX_Text(pDX, IDC_SIZX, m_SizX);
DDX_Text(pDX, IDC_SIZY, m_SizY); DDX_Text(pDX, IDC_SIZY, m_SizY);
DDX_Text(pDX, IDC_MAXFPS, m_MaxFPS); DDX_Text(pDX, IDC_MAXFPS, m_MaxFPS);
DDX_Text(pDX, IDC_INITTS, m_InitTS); //DDX_Text(pDX, IDC_INITTS, m_InitTS);
DDX_LBIndex(pDX, IDC_LISTTS, m_InitTS);
//}}AFX_DATA_MAP //}}AFX_DATA_MAP
} }

View File

@ -84,6 +84,7 @@ public:
BOOL m_SkipFPS; BOOL m_SkipFPS;
BOOL m_LimitFPS; BOOL m_LimitFPS;
BOOL m_ShowFPS; BOOL m_ShowFPS;
BOOL m_ShowFPSOverlay;
BOOL m_TimeStretch; BOOL m_TimeStretch;
BOOL m_HookOpenGL; BOOL m_HookOpenGL;
int m_InitX; int m_InitX;
@ -151,6 +152,8 @@ public:
afx_msg void OnBnClickedHandleExceptions(); afx_msg void OnBnClickedHandleExceptions();
afx_msg void OnEnChangeMaxx(); afx_msg void OnEnChangeMaxx();
afx_msg void OnEnChangeInitx(); afx_msg void OnEnChangeInitx();
public:
virtual BOOL OnInitDialog();
}; };
//{{AFX_INSERT_LOCATION}} //{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ Will insert additional declarations immediately before the previous line. // Microsoft Visual C++ Will insert additional declarations immediately before the previous line.

View File

@ -33,13 +33,12 @@ BEGIN_MESSAGE_MAP(CTimeSliderDialog, CDialog)
ON_WM_TIMER() ON_WM_TIMER()
END_MESSAGE_MAP() END_MESSAGE_MAP()
#define IDTIMER 1 #define IDTimeSiderTIMER 2
// CTimeSliderDialog message handlers // CTimeSliderDialog message handlers
void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent) void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent)
{ {
DXWNDSTATUS Status;
CSliderCtrl *Slider; CSliderCtrl *Slider;
CStatic *Text; CStatic *Text;
char sMsg[81]; char sMsg[81];
@ -51,22 +50,21 @@ void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent)
CDialog::OnTimer(nIDEvent); CDialog::OnTimer(nIDEvent);
i_TimeSlider=Slider->GetPos(); i_TimeSlider=Slider->GetPos();
if(GetHookStatus(&Status)!=DXW_RUNNING) { if(GetHookStatus(NULL)!=DXW_RUNNING) {
Slider->SetPos(0); Slider->SetPos(0);
Text->SetWindowTextA("idle"); Text->SetWindowTextA("idle");
return; return;
} }
if(i_TimeSlider==iLastPos){ if(i_TimeSlider==iLastPos){
// no change, check for keyboard input changes // no change, check for keyboard input changes
i_TimeSlider=Status.iTimeShift; i_TimeSlider=GetHookInfo()->TimeShift;
if(i_TimeSlider != iLastPos) Slider->SetPos(i_TimeSlider); if(i_TimeSlider != iLastPos) Slider->SetPos(i_TimeSlider);
} }
else { else {
// slider position changed, set the new value // slider position changed, set the new value
if (i_TimeSlider < -8) i_TimeSlider=-8; if (i_TimeSlider < -8) i_TimeSlider=-8;
if (i_TimeSlider > 8) i_TimeSlider= 8; if (i_TimeSlider > 8) i_TimeSlider= 8;
Status.iTimeShift=i_TimeSlider; GetHookInfo()->TimeShift=i_TimeSlider;
SetHookStatus(&Status);
} }
iLastPos = i_TimeSlider; iLastPos = i_TimeSlider;
sprintf(sMsg, "Time speed %s", GetTSCaption(i_TimeSlider)); sprintf(sMsg, "Time speed %s", GetTSCaption(i_TimeSlider));
@ -77,14 +75,12 @@ BOOL CTimeSliderDialog::OnInitDialog()
{ {
CSliderCtrl *Slider; CSliderCtrl *Slider;
CDialog::OnInitDialog(); CDialog::OnInitDialog();
DXWNDSTATUS Status;
GetHookStatus(&Status);
Slider=(CSliderCtrl *)this->GetDlgItem(IDC_TIMESLIDER); Slider=(CSliderCtrl *)this->GetDlgItem(IDC_TIMESLIDER);
Slider->SetRange(-8, +8, 0); Slider->SetRange(-8, +8, 0);
Slider->SetTicFreq(1); Slider->SetTicFreq(1);
Slider->SetPos(Status.iTimeShift); Slider->SetPos(GetHookInfo()->TimeShift);
SetTimer(IDTIMER, 1000, NULL); SetTimer(IDTimeSiderTIMER, 1000, NULL);
// TODO: Add extra initialization here // TODO: Add extra initialization here
@ -97,12 +93,10 @@ void CTimeSliderDialog::OnOK()
// stop timer // stop timer
// MessageBoxEx(0, "Stopping Time Slider dialog", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); // MessageBoxEx(0, "Stopping Time Slider dialog", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL);
KillTimer(IDTIMER); KillTimer(IDTimeSiderTIMER);
DXWNDSTATUS Status; DXWNDSTATUS Status;
GetHookStatus(&Status); GetHookInfo()->TimeShift=i_TimeSlider;
Status.iTimeShift=i_TimeSlider;
SetHookStatus(&Status);
CDialog::OnOK(); CDialog::OnOK();
} }

Binary file not shown.

View File

@ -298,15 +298,15 @@ BEGIN
CONTROL "Limit available resources",IDC_LIMITRESOURCES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,184,93,10 CONTROL "Limit available resources",IDC_LIMITRESOURCES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,184,93,10
CONTROL "Force win resize",IDC_FORCEWINRESIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,134,98,9 CONTROL "Force win resize",IDC_FORCEWINRESIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,134,98,9
CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,94,98,9 CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,94,98,9
CONTROL "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,123,28,9 CONTROL "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,98,28,9
EDITTEXT IDC_MAXFPS,635,126,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT EDITTEXT IDC_MAXFPS,635,101,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,133,27,9 CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,108,27,9
LTEXT "delay (msec)",IDC_STATIC,591,128,43,8 LTEXT "delay (msec)",IDC_STATIC,591,103,43,8
GROUPBOX "Frame per Second",IDC_STATIC,549,111,120,58 GROUPBOX "Frame per Second",IDC_STATIC,549,84,120,86
CONTROL "Show FPS",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,145,52,9 CONTROL "Show FPS on title",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,120,72,9
GROUPBOX "",IDC_STATIC,555,119,110,24 GROUPBOX "",IDC_STATIC,555,94,110,24
CONTROL "Hide multi-monitor config.",IDC_HIDEMULTIMONITOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,144,98,9 CONTROL "Hide multi-monitor config.",IDC_HIDEMULTIMONITOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,144,98,9
CONTROL "Time Stretch - init val:",IDC_TIMESTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,155,75,9 CONTROL "Time Stretch - initial:",IDC_TIMESTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,140,75,9
GROUPBOX "OpenGL",IDC_STATIC,549,3,120,50 GROUPBOX "OpenGL",IDC_STATIC,549,3,120,50
CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,14,98,9 CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,14,98,9
EDITTEXT IDC_OPENGLLIB,554,36,108,12,ES_AUTOHSCROLL EDITTEXT IDC_OPENGLLIB,554,36,108,12,ES_AUTOHSCROLL
@ -316,7 +316,8 @@ BEGIN
GROUPBOX "GDI Handling",IDC_STATIC,172,144,120,62 GROUPBOX "GDI Handling",IDC_STATIC,172,144,120,62
CONTROL "Hook GDI",IDC_HOOKGDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,154,102,9 CONTROL "Hook GDI",IDC_HOOKGDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,154,102,9
CONTROL "Disable setting gamma ramp",IDC_DISABLEGAMMARAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,174,102,9 CONTROL "Disable setting gamma ramp",IDC_DISABLEGAMMARAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,174,102,9
EDITTEXT IDC_INITTS,635,152,14,12,ES_AUTOHSCROLL,WS_EX_RIGHT CONTROL "Show FPS overlay",IDC_SHOWFPSOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,130,72,9
LISTBOX IDC_LISTTS,635,131,26,27,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END END
IDD_STATUS DIALOGEX 0, 0, 186, 95 IDD_STATUS DIALOGEX 0, 0, 186, 95

Binary file not shown.

View File

@ -429,6 +429,7 @@ void CDxwndhostView::OnModify()
dlg.m_LimitFPS = TargetMaps[i].flags2 & LIMITFPS ? 1 : 0; dlg.m_LimitFPS = TargetMaps[i].flags2 & LIMITFPS ? 1 : 0;
dlg.m_SkipFPS = TargetMaps[i].flags2 & SKIPFPS ? 1 : 0; dlg.m_SkipFPS = TargetMaps[i].flags2 & SKIPFPS ? 1 : 0;
dlg.m_ShowFPS = TargetMaps[i].flags2 & SHOWFPS ? 1 : 0; dlg.m_ShowFPS = TargetMaps[i].flags2 & SHOWFPS ? 1 : 0;
dlg.m_ShowFPSOverlay = TargetMaps[i].flags2 & SHOWFPSOVERLAY ? 1 : 0;
dlg.m_TimeStretch = TargetMaps[i].flags2 & TIMESTRETCH ? 1 : 0; dlg.m_TimeStretch = TargetMaps[i].flags2 & TIMESTRETCH ? 1 : 0;
dlg.m_HookOpenGL = TargetMaps[i].flags2 & HOOKOPENGL ? 1 : 0; dlg.m_HookOpenGL = TargetMaps[i].flags2 & HOOKOPENGL ? 1 : 0;
dlg.m_InitX = TargetMaps[i].initx; dlg.m_InitX = TargetMaps[i].initx;
@ -442,7 +443,7 @@ void CDxwndhostView::OnModify()
dlg.m_SizX = TargetMaps[i].sizx; dlg.m_SizX = TargetMaps[i].sizx;
dlg.m_SizY = TargetMaps[i].sizy; dlg.m_SizY = TargetMaps[i].sizy;
dlg.m_MaxFPS = TargetMaps[i].MaxFPS; dlg.m_MaxFPS = TargetMaps[i].MaxFPS;
dlg.m_InitTS = TargetMaps[i].InitTS; dlg.m_InitTS = TargetMaps[i].InitTS+8;
if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){
strcpy_s(TargetMaps[i].path, sizeof(TargetMaps[i].path), dlg.m_FilePath); strcpy_s(TargetMaps[i].path, sizeof(TargetMaps[i].path), dlg.m_FilePath);
strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module); strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module);
@ -525,6 +526,7 @@ void CDxwndhostView::OnModify()
if(dlg.m_LimitFPS) TargetMaps[i].flags2 |= LIMITFPS; if(dlg.m_LimitFPS) TargetMaps[i].flags2 |= LIMITFPS;
if(dlg.m_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS; if(dlg.m_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS;
if(dlg.m_ShowFPS) TargetMaps[i].flags2 |= SHOWFPS; if(dlg.m_ShowFPS) TargetMaps[i].flags2 |= SHOWFPS;
if(dlg.m_ShowFPSOverlay) TargetMaps[i].flags2 |= SHOWFPSOVERLAY;
if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH; if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH;
if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL; if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
TargetMaps[i].initx = dlg.m_InitX; TargetMaps[i].initx = dlg.m_InitX;
@ -538,7 +540,7 @@ void CDxwndhostView::OnModify()
TargetMaps[i].sizx = dlg.m_SizX; TargetMaps[i].sizx = dlg.m_SizX;
TargetMaps[i].sizy = dlg.m_SizY; TargetMaps[i].sizy = dlg.m_SizY;
TargetMaps[i].MaxFPS = dlg.m_MaxFPS; TargetMaps[i].MaxFPS = dlg.m_MaxFPS;
TargetMaps[i].InitTS = dlg.m_InitTS; TargetMaps[i].InitTS = dlg.m_InitTS-8;
strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module); strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module);
strcpy_s(TargetMaps[i].OpenGLLib, sizeof(TargetMaps[i].OpenGLLib), dlg.m_OpenGLLib); strcpy_s(TargetMaps[i].OpenGLLib, sizeof(TargetMaps[i].OpenGLLib), dlg.m_OpenGLLib);
strcpy_s(TitleMaps[i].title, sizeof(TitleMaps[i].title), dlg.m_Title); strcpy_s(TitleMaps[i].title, sizeof(TitleMaps[i].title), dlg.m_Title);
@ -814,6 +816,7 @@ void CDxwndhostView::OnAdd()
if(dlg.m_LimitFPS) TargetMaps[i].flags2 |= LIMITFPS; if(dlg.m_LimitFPS) TargetMaps[i].flags2 |= LIMITFPS;
if(dlg.m_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS; if(dlg.m_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS;
if(dlg.m_ShowFPS) TargetMaps[i].flags2 |= SHOWFPS; if(dlg.m_ShowFPS) TargetMaps[i].flags2 |= SHOWFPS;
if(dlg.m_ShowFPSOverlay) TargetMaps[i].flags2 |= SHOWFPSOVERLAY;
if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH; if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH;
if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL; if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
TargetMaps[i].initx = dlg.m_InitX; TargetMaps[i].initx = dlg.m_InitX;
@ -827,7 +830,10 @@ void CDxwndhostView::OnAdd()
TargetMaps[i].sizx = dlg.m_SizX; TargetMaps[i].sizx = dlg.m_SizX;
TargetMaps[i].sizy = dlg.m_SizY; TargetMaps[i].sizy = dlg.m_SizY;
TargetMaps[i].MaxFPS = dlg.m_MaxFPS; TargetMaps[i].MaxFPS = dlg.m_MaxFPS;
TargetMaps[i].InitTS = dlg.m_InitTS; if (dlg.m_InitTS>=-8 && dlg.m_InitTS<=8)
TargetMaps[i].InitTS = dlg.m_InitTS-8;
else
MessageBoxEx(0, "Bad InitTS", "Warning", MB_OK, NULL);
CListCtrl& listctrl = GetListCtrl(); CListCtrl& listctrl = GetListCtrl();
listitem.mask = LVIF_TEXT; listitem.mask = LVIF_TEXT;
listitem.iItem = i; listitem.iItem = i;
@ -959,6 +965,7 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray)
case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break; case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break;
case DXW_ACTIVE: IconId=IDI_DXWAIT; Status="READY"; break; case DXW_ACTIVE: IconId=IDI_DXWAIT; Status="READY"; break;
case DXW_RUNNING: IconId=IDI_DXRUN; Status="RUNNING"; break; case DXW_RUNNING: IconId=IDI_DXRUN; Status="RUNNING"; break;
default: IconId=IDI_DXIDLE; Status="???"; break;
} }
if (DxStatus != DXW_RUNNING){ if (DxStatus != DXW_RUNNING){
TickCount=0; TickCount=0;