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 LIMITFPS 0x00001000 // delays primary blit operations to limit FPS
#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 TIMESTRETCH 0x00010000 // make system time stretchable
#define HOOKOPENGL 0x00020000 // Hook OpenGL calls
#define WALLPAPERMODE 0x00040000 // 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 SHOWFPSOVERLAY 0x00200000 // shows FPS value to status win / log / screen overlay
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
@ -78,6 +79,7 @@
#define OUTDEBUG 0x00000100 // detailed debugging indormation
#define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE)
#define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS)
// DxWnd host app data to be passed to the hook callback
typedef struct TARGETMAP
@ -115,7 +117,7 @@ typedef struct
DWORD dwPid;
BOOL isLogging;
DWORD FPSCount;
int iTimeShift;
int TimeShift;
} DXWNDSTATUS;
extern DXWNDSTATUS DxWndStatus;
@ -125,8 +127,7 @@ int StartHook(void);
int EndHook(void);
void GetDllVersion(char *);
int GetHookStatus(DXWNDSTATUS *);
void SetHookStatus(DXWNDSTATUS *);
int GetTimeShift();
DXWNDSTATUS *GetHookInfo();
int HookInit(TARGETMAP *, HWND);
void *SetHook(void *, void *);

View File

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

View File

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

View File

@ -22,4 +22,7 @@ added status and time stretching view panels to tray icon menu
v2.02.06:
preliminary FPS counter overlapped on game screen, Alt-F7 to toggle display on/off.
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;
OutTraceD("Toggle logging ON\n");
}
DxWndStatus.isLogging=(dxw.dwTFlags & OUTTRACE);
SetHookStatus(&DxWndStatus);
GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
}
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__);
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)
{
@ -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_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--;
OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
DxWndStatus.iTimeShift=dxw.TimeShift;
SetHookStatus(&DxWndStatus);
GetHookInfo()->TimeShift=dxw.TimeShift;
}
break;
case VK_F4:
@ -1026,6 +1024,8 @@ void HookSysLibs(char *module)
if(tmp) pGetLocalTime = (GetLocalTime_Type)tmp;
tmp = HookAPI(module, "kernel32.dll", GetSystemTime, "GetSystemTime", extGetSystemTime);
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);
if(tmp) pSleep = (Sleep_Type)tmp;
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 FPSCount = 0;
extern void SetFPS(int);
//DXWNDSTATUS Status;
DWORD tmp;
tmp = GetTickCount();
if((tmp - time) > 1000) {
char sBuf[80+12+1]; // title + fps string + terminator
char *fpss;
// log fps count
OutTrace("FPSCount=%d\n", FPSCount);
// show fps count on status win
GetHookStatus(&DxWndStatus);
DxWndStatus.FPSCount = FPSCount;
SetHookStatus(&DxWndStatus);
GetHookInfo()->FPSCount = FPSCount; // for overlay display
// show fps on win title bar
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
FPSCount=0;
time = tmp;
@ -346,35 +356,32 @@ static void CountFPS()
}
}
static void LimitFrameCount(int delay)
static void LimitFrameCount(DWORD delay)
{
static DWORD time = 0xFFFFFFFF;
extern void do_slow(int);
DWORD tmp;
tmp = GetTickCount();
if((tmp - time) > (DWORD)delay) {
time = tmp;
}
else
Sleep(tmp - time);
//do_sslow(tmp - time);
static DWORD oldtime=(*pGetTickCount)();
DWORD newtime;
newtime = (*pGetTickCount)();
// use '<' and not '<=' to avoid the risk of sleeping forever....
if(newtime < oldtime+delay) (*pSleep)(oldtime+delay-newtime);
oldtime = newtime;
}
static BOOL SkipFrameCount(int delay)
static BOOL SkipFrameCount(DWORD delay)
{
static DWORD time = 0xFFFFFFFF;
DWORD tmp;
tmp = GetTickCount();
if((tmp - time) > (DWORD)delay) {
time = tmp;
return FALSE;
}
return TRUE;
static DWORD oldtime=(*pGetTickCount)();
DWORD newtime;
newtime = (*pGetTickCount)();
// use '<' and not '<=' to avoid the risk of sleeping forever....
if(newtime < oldtime+delay) return TRUE;
oldtime = newtime;
return FALSE;
}
BOOL dxwCore::HandleFPS()
{
if(dwFlags2 & SHOWFPS) CountFPS();
if(dwFlags2 & (SHOWFPS|SHOWFPSOVERLAY)) CountFPS(hWnd);
if(dwFlags2 & LIMITFPS) LimitFrameCount(dxw.MaxFPS);
if(dwFlags2 & SKIPFPS) if(SkipFrameCount(dxw.MaxFPS)) return TRUE;
return FALSE;
@ -407,7 +414,7 @@ DWORD dxwCore::GetTickCount(void)
dwNextRealTick=(*pGetTickCount)();
dwTick=(dwNextRealTick-dwLastRealTick);
TimeShift=GetTimeShift();
TimeShift=GetHookInfo()->TimeShift;
dwTick = TimeShifter(dwTick, TimeShift);
dwLastFakeTick += dwTick;
dwLastRealTick = dwNextRealTick;
@ -416,11 +423,46 @@ DWORD dxwCore::GetTickCount(void)
DWORD dxwCore::StretchTime(DWORD dwTimer)
{
TimeShift=GetTimeShift();
TimeShift=GetHookInfo()->TimeShift;
dwTimer = TimeShifter(dwTimer, -TimeShift);
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)
{
DWORD dwTick;
@ -442,7 +484,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime)
else {
dwCurrentTick=(*pGetTickCount)();
dwTick=(dwCurrentTick-dwStartTick);
TimeShift=GetTimeShift();
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).
@ -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)
{
HDC xdc; // the working dc
@ -466,16 +537,8 @@ void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds)
static DWORD color;
if((*pGetTickCount)()-dwTimer > 4000){
if(!dwTimer) srand ((*pGetTickCount)());
dwTimer = (*pGetTickCount)();
//corner = rand() % 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
switch (corner) {
case 0: x=10; y=10; break;
@ -489,7 +552,7 @@ void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds)
SetTextColor(xdc,color);
//SetBkMode(xdc, TRANSPARENT);
SetBkMode(xdc, OPAQUE);
sprintf(sBuf, "FPS: %d", DxWndStatus.FPSCount);
sprintf(sBuf, "FPS: %d", GetHookInfo()->FPSCount);
TextOut(xdc, x, y, sBuf, strlen(sBuf));
lpdds->ReleaseDC(xdc);
}

View File

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

View File

@ -120,14 +120,14 @@ int GetHookStatus(DXWNDSTATUS *s)
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)
@ -171,7 +171,7 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
pStatus->IsFullScreen=FALSE;
pStatus->hWnd=hwnd;
pStatus->dwPid=GetProcessId(GetCurrentProcess());
pStatus->iTimeShift=pMapping[i].InitTS;
pStatus->TimeShift=pMapping[i].InitTS;
DxWndStatus = *pStatus;
HookInit(&pMapping[i], hwnd);
}

View File

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

Binary file not shown.

View File

@ -2,45 +2,10 @@
#include "dxwcore.hpp"
#include "syslibs.h"
#include "dxhook.h"
#define DXWDECLARATIONS TRUE
#include "glhook.h"
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);
}
#undef DXWDECLARATIONS
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);
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
return NULL;
}
@ -76,7 +47,63 @@ void HookOpenGLLibs(char *module, char *customlib)
if(tmp) pglScissor = (glScissor_Type)tmp;
tmp = HookAPI(module, customlib, NULL, "glGetIntegerv", extglGetIntegerv);
if(tmp) pglGetIntegerv = (glGetIntegerv_Type)tmp;
tmp = HookAPI(module, customlib, NULL, "glDrawBuffer", extglDrawBuffer);
if(tmp) pglDrawBuffer = (glDrawBuffer_Type)tmp;
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 *glScissor_Type)(GLint, GLint, GLsizei, GLsizei);
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 extglScissor(GLint, GLint, GLsizei, GLsizei);
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;
extern glScissor_Type pglScissor;
extern glGetIntegerv_Type pglGetIntegerv;
#ifdef DXWDECLARATIONS
#undef DXWEXTERN
#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 *GetAdapterDisplayMode_Type)(void *, UINT, 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 extDirect3DCreate9(UINT);
@ -20,6 +21,7 @@ HRESULT WINAPI extEnumAdapterModes8(void *, UINT, UINT , D3DDISPLAYMODE *);
HRESULT WINAPI extEnumAdapterModes9(void *, UINT, D3DFORMAT, UINT , D3DDISPLAYMODE *);
HRESULT WINAPI extGetAdapterDisplayMode(void *, UINT, D3DDISPLAYMODE *);
HRESULT WINAPI extGetDisplayMode(void *, D3DDISPLAYMODE *);
HRESULT WINAPI extPresent(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
extern char *ExplainDDError(DWORD);
@ -31,6 +33,8 @@ EnumAdapterModes8_Type pEnumAdapterModes8;
EnumAdapterModes9_Type pEnumAdapterModes9;
GetAdapterDisplayMode_Type pGetAdapterDisplayMode;
GetDisplayMode_Type pGetDisplayMode;
Present_Type pPresent;
DWORD dwD3DVersion;
int HookDirect3D(char *module, int version){
@ -123,6 +127,15 @@ HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresentationParamet
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 res;
@ -243,21 +256,25 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
pReset=NULL; // to avoid assert condition
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D8)");
SetHook((void *)(**(DWORD **)ppd3dd + 56), extReset, (void **)&pReset, "Reset(D8)");
SetHook((void *)(**(DWORD **)ppd3dd + 60), extPresent, (void **)&pPresent, "Present(D8)");
}
else {
void *pReset;
pReset=NULL; // to avoid assert condition
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(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();
DxWndStatus.DXVersion=(short)dwD3DVersion;
DxWndStatus.Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
SetHookStatus(&DxWndStatus);
GetHookInfo()->IsFullScreen = dxw.IsFullScreen();
GetHookInfo()->DXVersion=(short)dwD3DVersion;
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
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
// should I make it configurable ? (640x480, 800x600, 1024x768)
dxw.SetScreenSize(); // 800 x 600 by default
DxWndStatus.Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=0; // unknown
DxWndStatus.DXVersion=0; // unknown
DxWndStatus.isLogging=(dxw.dwTFlags & OUTTRACE);
SetHookStatus(&DxWndStatus);
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
GetHookInfo()->ColorDepth=0; // unknown
GetHookInfo()->DXVersion=0; // unknown
GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
if(!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrDevMode)){
OutTraceE("EnumDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__);
@ -679,7 +678,7 @@ void do_slow(int delay)
TranslateMessage (&uMsg);
DispatchMessage (&uMsg);
}
Sleep(1);
(*pSleep)(1);
}
}
@ -1492,9 +1491,8 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd,
}
dxw.SetScreenSize(dwwidth, dwheight);
DxWndStatus.Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth();
SetHookStatus(&DxWndStatus);
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight);
if(dxw.dwFlags1 & EMULATESURFACE){
@ -1632,8 +1630,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
if(res)
OutTraceE("SetCooperativeLevel: ERROR err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
DxWndStatus.IsFullScreen=dxw.IsFullScreen();
SetHookStatus(&DxWndStatus);
GetHookInfo()->IsFullScreen=dxw.IsFullScreen();
// 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
@ -1646,9 +1643,6 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
else
dxw.SethWnd(hwnd); // save the good one
}
DxWndStatus.IsFullScreen=dxw.IsFullScreen();
SetHookStatus(&DxWndStatus);
return res;
}
@ -1676,11 +1670,10 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf
ddsd.dwSize = CurSize;
if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){
DxWndStatus.Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
DxWndStatus.DXVersion=dxversion;
SetHookStatus(&DxWndStatus);
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
GetHookInfo()->DXVersion=dxversion;
lpServiceDD = lpdd; // v2.1.87
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(lpDDP==NULL){
// should link here to the GDI palette? See Hyperblade....
//static PALETTEENTRY Palette[256];
extern PALETTEENTRY *GDIPalette;
//res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, Palette, &lpDDP, NULL);
res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, GDIPalette, &lpDDP, NULL);
dxw.palNumEntries=256;
res=(*pCreatePalette)(lpdd, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL);
if (res) {
OutTraceE("CreateSurface: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
@ -1914,11 +1905,10 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf
ddsd.dwSize = dwSize;
if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){
DxWndStatus.Height=(short)dxw.GetScreenHeight();
DxWndStatus.Width=(short)dxw.GetScreenWidth();
DxWndStatus.ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
DxWndStatus.DXVersion=dxversion;
SetHookStatus(&DxWndStatus);
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
GetHookInfo()->DXVersion=dxversion;
dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps;
dxw.dwBackBufferCount = (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) ? ddsd.dwBackBufferCount : 0;
lpServiceDD = lpdd; // v2.1.87
@ -2446,7 +2436,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
work on my PC.
*/
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);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
}
@ -2481,7 +2471,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
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);
if (res==DDERR_NOCLIPLIST){
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);
tmp = GetTickCount();
if((time - tmp) > 32) time = tmp;
Sleep(time - tmp);
(*pSleep)(time - tmp);
if(step) time += 16;
else time += 17;
step ^= 1;
@ -2900,7 +2890,7 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC
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);
if (res==DDERR_NOCLIPLIST) {
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;
nHDest= nHeight;
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);
}
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))){
int nWDest, nHDest;
dxw.MapRect(&nXDest, &nYDest, &nWDest, &nHDest);
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest);
res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, dwRop);
}
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 ?
if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest);
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__);
return res;
@ -1888,7 +1891,7 @@ static DWORD dwThrdId;
void AutoRefresh(HDC hdc)
{
while(1){
Sleep(10);
(*pSleep)(10);
(*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
// 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 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);
ret=(*pGDICreatePalette)(plpal);
if(IsDebug){
OutTraceD("PalEntry[%x]= ", MyPal.palNumEntries);
for(idx=0; idx<MyPal.palNumEntries; idx++) OutTraceD("(%x)", plpal->palPalEntry[idx]);
OutTraceD("PalEntry[%x]= ", plpal->palNumEntries);
for(idx=0; idx<plpal->palNumEntries; idx++) OutTraceD("(%x)", plpal->palPalEntry[idx]);
OutTraceD("\n");
}
MyPal.palVersion=plpal->palVersion;
MyPal.palNumEntries=plpal->palNumEntries;
if(MyPal.palNumEntries>256) MyPal.palNumEntries=256;
for(idx=0; idx<MyPal.palNumEntries; idx++) MyPal.palPalEntry[idx]=plpal->palPalEntry[idx];
dxw.palVersion=plpal->palVersion;
dxw.palNumEntries=plpal->palNumEntries;
if(dxw.palNumEntries>256) dxw.palNumEntries=256;
for(idx=0; idx<dxw.palNumEntries; idx++) dxw.palPalEntry[idx]=plpal->palPalEntry[idx];
OutTraceD("GDI.CreatePalette: hPalette=%x\n", ret);
return ret;
}
@ -2314,12 +2306,12 @@ UINT WINAPI extRealizePalette(HDC hdc)
// should be cleaned up a little....
// maybe not: now both Diablo & Dementia colors are working...
if(dxw.dwFlags1 & EMULATESURFACE)
mySetPalette(0, MyPal.palNumEntries, MyPal.palPalEntry);
mySetPalette(0, dxw.palNumEntries, dxw.palPalEntry);
// DEBUGGING
if(IsDebug){
int idx;
OutTraceD("PaletteEntries[%x]= ", MyPal.palNumEntries);
for(idx=0; idx<MyPal.palNumEntries; idx++) OutTraceD("(%x)", PaletteEntries[idx]);
OutTraceD("PaletteEntries[%x]= ", dxw.palNumEntries);
for(idx=0; idx<dxw.palNumEntries; idx++) OutTraceD("(%x)", PaletteEntries[idx]);
OutTraceD("\n");
}
return ret;
@ -2512,7 +2504,7 @@ DWORD WINAPI extGetTickCount(void)
void WINAPI extGetSystemTime(LPSYSTEMTIME 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);
}
@ -2522,7 +2514,7 @@ void WINAPI extGetLocalTime(LPSYSTEMTIME lpLocalTime)
SYSTEMTIME SystemTime;
dxw.GetSystemTime(&SystemTime);
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);
}
@ -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
// GetSystemTime vs. Sleep or SetTimer
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);
}
@ -2548,7 +2540,7 @@ VOID WINAPI extSleep(DWORD dwMilliseconds)
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);
}
@ -2563,16 +2555,22 @@ DWORD WINAPI extSleepEx(DWORD dwMilliseconds, BOOL bAlertable)
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);
}
DWORD WINAPI exttimeGetTime(void)
{
OutTrace("timeGetTime\n");
if (IsDebug) OutTrace("timeGetTime\n");
return dxw.GetTickCount();
}
void WINAPI extGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
if (IsDebug) OutTrace("GetSystemTimeAsFileTime\n");
dxw.GetSystemTimeAsFileTime(lpSystemTimeAsFileTime);
}
int WINAPI extShowCursor(BOOL bShow)
{
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 FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR);
typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME);
typedef void (WINAPI *GetSystemTimeAsFileTime_Type)(LPFILETIME);
typedef DWORD (WINAPI *GetTickCount_Type)(void);
typedef HMODULE (WINAPI *LoadLibraryA_Type)(LPCTSTR);
typedef HMODULE (WINAPI *LoadLibraryExA_Type)(LPCTSTR, HANDLE, DWORD);
@ -142,6 +143,7 @@ DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED;
DXWEXTERN GetLocalTime_Type pGetLocalTime DXWINITIALIZED;
DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED;
DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED;
DXWEXTERN GetSystemTimeAsFileTime_Type pGetSystemTimeAsFileTime DXWINITIALIZED;
DXWEXTERN GetTickCount_Type pGetTickCount DXWINITIALIZED;
DXWEXTERN LoadLibraryA_Type pLoadLibraryA 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 FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR);
extern void WINAPI extGetSystemTime(LPSYSTEMTIME);
extern void WINAPI extGetSystemTimeAsFileTime(LPFILETIME);
extern DWORD WINAPI extGetTickCount(void);
extern HMODULE WINAPI extLoadLibraryA(LPCTSTR);
extern HMODULE WINAPI extLoadLibraryExA(LPCTSTR, HANDLE, DWORD);

View File

@ -119,6 +119,10 @@
#define IDC_HOOKOPENGL 1080
#define IDC_WALLPAPERMODE 1081
#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_DELETE 32772
#define ID_ADD 32773
@ -158,9 +162,9 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#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_CONTROL_VALUE 1080
#define _APS_NEXT_CONTROL_VALUE 1089
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

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

View File

@ -79,6 +79,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_LimitFPS = FALSE;
m_SkipFPS = FALSE;
m_ShowFPS = FALSE;
m_ShowFPSOverlay = FALSE;
m_TimeStretch = FALSE;
m_HookOpenGL = FALSE;
m_InitX = 0;
@ -92,11 +93,42 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SizX = 800;
m_SizY = 600;
m_MaxFPS = 0;
m_InitTS = 0;
m_InitTS = 8;
//}}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)
{
CDialog::DoDataExchange(pDX);
@ -164,6 +196,7 @@ void CTargetDlg::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_LIMITFPS, m_LimitFPS);
DDX_Check(pDX, IDC_SKIPFPS, m_SkipFPS);
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_HOOKOPENGL, m_HookOpenGL);
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_SIZY, m_SizY);
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
}

View File

@ -84,6 +84,7 @@ public:
BOOL m_SkipFPS;
BOOL m_LimitFPS;
BOOL m_ShowFPS;
BOOL m_ShowFPSOverlay;
BOOL m_TimeStretch;
BOOL m_HookOpenGL;
int m_InitX;
@ -151,6 +152,8 @@ public:
afx_msg void OnBnClickedHandleExceptions();
afx_msg void OnEnChangeMaxx();
afx_msg void OnEnChangeInitx();
public:
virtual BOOL OnInitDialog();
};
//{{AFX_INSERT_LOCATION}}
// 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()
END_MESSAGE_MAP()
#define IDTIMER 1
#define IDTimeSiderTIMER 2
// CTimeSliderDialog message handlers
void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent)
{
DXWNDSTATUS Status;
CSliderCtrl *Slider;
CStatic *Text;
char sMsg[81];
@ -51,22 +50,21 @@ void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent)
CDialog::OnTimer(nIDEvent);
i_TimeSlider=Slider->GetPos();
if(GetHookStatus(&Status)!=DXW_RUNNING) {
if(GetHookStatus(NULL)!=DXW_RUNNING) {
Slider->SetPos(0);
Text->SetWindowTextA("idle");
return;
}
if(i_TimeSlider==iLastPos){
// no change, check for keyboard input changes
i_TimeSlider=Status.iTimeShift;
i_TimeSlider=GetHookInfo()->TimeShift;
if(i_TimeSlider != iLastPos) Slider->SetPos(i_TimeSlider);
}
else {
// slider position changed, set the new value
if (i_TimeSlider < -8) i_TimeSlider=-8;
if (i_TimeSlider > 8) i_TimeSlider= 8;
Status.iTimeShift=i_TimeSlider;
SetHookStatus(&Status);
GetHookInfo()->TimeShift=i_TimeSlider;
}
iLastPos = i_TimeSlider;
sprintf(sMsg, "Time speed %s", GetTSCaption(i_TimeSlider));
@ -77,14 +75,12 @@ BOOL CTimeSliderDialog::OnInitDialog()
{
CSliderCtrl *Slider;
CDialog::OnInitDialog();
DXWNDSTATUS Status;
GetHookStatus(&Status);
Slider=(CSliderCtrl *)this->GetDlgItem(IDC_TIMESLIDER);
Slider->SetRange(-8, +8, 0);
Slider->SetTicFreq(1);
Slider->SetPos(Status.iTimeShift);
SetTimer(IDTIMER, 1000, NULL);
Slider->SetPos(GetHookInfo()->TimeShift);
SetTimer(IDTimeSiderTIMER, 1000, NULL);
// TODO: Add extra initialization here
@ -97,12 +93,10 @@ void CTimeSliderDialog::OnOK()
// stop timer
// MessageBoxEx(0, "Stopping Time Slider dialog", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL);
KillTimer(IDTIMER);
KillTimer(IDTimeSiderTIMER);
DXWNDSTATUS Status;
GetHookStatus(&Status);
Status.iTimeShift=i_TimeSlider;
SetHookStatus(&Status);
GetHookInfo()->TimeShift=i_TimeSlider;
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 "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 "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,123,28,9
EDITTEXT IDC_MAXFPS,635,126,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,133,27,9
LTEXT "delay (msec)",IDC_STATIC,591,128,43,8
GROUPBOX "Frame per Second",IDC_STATIC,549,111,120,58
CONTROL "Show FPS",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,145,52,9
GROUPBOX "",IDC_STATIC,555,119,110,24
CONTROL "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,98,28,9
EDITTEXT IDC_MAXFPS,635,101,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,108,27,9
LTEXT "delay (msec)",IDC_STATIC,591,103,43,8
GROUPBOX "Frame per Second",IDC_STATIC,549,84,120,86
CONTROL "Show FPS on title",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,120,72,9
GROUPBOX "",IDC_STATIC,555,94,110,24
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
CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,14,98,9
EDITTEXT IDC_OPENGLLIB,554,36,108,12,ES_AUTOHSCROLL
@ -316,7 +316,8 @@ BEGIN
GROUPBOX "GDI Handling",IDC_STATIC,172,144,120,62
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
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
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_SkipFPS = TargetMaps[i].flags2 & SKIPFPS ? 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_HookOpenGL = TargetMaps[i].flags2 & HOOKOPENGL ? 1 : 0;
dlg.m_InitX = TargetMaps[i].initx;
@ -442,7 +443,7 @@ void CDxwndhostView::OnModify()
dlg.m_SizX = TargetMaps[i].sizx;
dlg.m_SizY = TargetMaps[i].sizy;
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()){
strcpy_s(TargetMaps[i].path, sizeof(TargetMaps[i].path), dlg.m_FilePath);
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_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS;
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_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
TargetMaps[i].initx = dlg.m_InitX;
@ -538,7 +540,7 @@ void CDxwndhostView::OnModify()
TargetMaps[i].sizx = dlg.m_SizX;
TargetMaps[i].sizy = dlg.m_SizY;
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].OpenGLLib, sizeof(TargetMaps[i].OpenGLLib), dlg.m_OpenGLLib);
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_SkipFPS) TargetMaps[i].flags2 |= SKIPFPS;
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_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
TargetMaps[i].initx = dlg.m_InitX;
@ -827,7 +830,10 @@ void CDxwndhostView::OnAdd()
TargetMaps[i].sizx = dlg.m_SizX;
TargetMaps[i].sizy = dlg.m_SizY;
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();
listitem.mask = LVIF_TEXT;
listitem.iItem = i;
@ -959,6 +965,7 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray)
case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break;
case DXW_ACTIVE: IconId=IDI_DXWAIT; Status="READY"; break;
case DXW_RUNNING: IconId=IDI_DXRUN; Status="RUNNING"; break;
default: IconId=IDI_DXIDLE; Status="???"; break;
}
if (DxStatus != DXW_RUNNING){
TickCount=0;