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:
parent
8f3bc994d0
commit
ef5a5afd7a
@ -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 *);
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:19d29414d50135080a863b7865dfe2c8685150e1df359c9a5e528a65d5f9a46d
|
||||
size 263168
|
||||
oid sha256:b0ffe0f3143b439d28c1b4d7f195991b383f36ed919ba89aab0abf2de7c9481e
|
||||
size 271360
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fcaebaa1f5eaffeb624d13fdb6f6058db5383fcaeadf22df4a641a766127c8d5
|
||||
size 488448
|
||||
oid sha256:3d43f746689ac5abcadcfbbb0dbd302cc3d4186ce2df7aa8bd9c24eb1b8694d4
|
||||
size 488960
|
||||
|
@ -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.
|
1983
debug/dxwnd.ini
1983
debug/dxwnd.ini
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
137
dll/dxwcore.cpp
137
dll/dxwcore.cpp
@ -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);
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -5,4 +5,4 @@ EXPORTS
|
||||
EndHook @3
|
||||
GetDllVersion @4
|
||||
GetHookStatus @5
|
||||
SetHookStatus @6
|
||||
GetHookInfo @6
|
||||
|
Binary file not shown.
103
dll/glhook.cpp
103
dll/glhook.cpp
@ -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);
|
||||
}
|
||||
|
28
dll/glhook.h
28
dll/glhook.h
@ -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;
|
29
dll/hd3d.cpp
29
dll/hd3d.cpp
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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.
@ -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.
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user