From 483a64c7e31fb7525069aacd61c41844f4bdecaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 6 Nov 2021 17:11:23 +0100 Subject: [PATCH 0001/1724] change default settings and rename ddraw.ini for high res pach tests --- src/config.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index 2112bcc..c2cf65b 100644 --- a/src/config.c +++ b/src/config.c @@ -10,6 +10,8 @@ #include "hook.h" #include "debug.h" +#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) + static void cfg_init(); static void cfg_create_ini(); @@ -27,7 +29,11 @@ void cfg_load() g_ddraw->border = cfg_get_bool("border", TRUE); g_ddraw->boxing = cfg_get_bool("boxing", FALSE); g_ddraw->maintas = cfg_get_bool("maintas", FALSE); - g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE); + g_ddraw->adjmouse = + cfg_get_bool("adjmouse", TRUE) || + !cfg_get_bool("handlemouse", TRUE) || + FILE_EXISTS(".\\plugin\\HardwareCursor.w2p"); + g_ddraw->devmode = cfg_get_bool("devmode", FALSE); g_ddraw->vsync = cfg_get_bool("vsync", FALSE); g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE); @@ -240,7 +246,7 @@ static void cfg_create_ini() "windowed=false\n" "\n" "; Maintain aspect ratio\n" - "maintas=false\n" + "maintas=true\n" "\n" "; Windowboxing / Integer Scaling\n" "boxing=false\n" @@ -255,7 +261,7 @@ static void cfg_create_ini() "\n" "; Automatic mouse sensitivity scaling\n" "; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window\n" - "adjmouse=true\n" + "adjmouse=false\n" "\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" @@ -983,7 +989,7 @@ static void cfg_init() } /* set up settings ini */ - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + strncpy(g_config.ini_path, ".\\dd-hd.ini", sizeof(g_config.ini_path) - 1); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) cfg_create_ini(); From 2e23e4309c0508a056a77f7cfa6d80a444e4a021 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 6 Nov 2021 17:12:02 +0100 Subject: [PATCH 0002/1724] run lobby in fullscreen with opengl/gdi renderer --- inc/dd.h | 1 + src/config.c | 24 ++---------------------- src/winapi_hooks.c | 25 ++++++++++++++----------- src/wndproc.c | 8 ++------ 4 files changed, 19 insertions(+), 39 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 4afc477..5fc29c0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -155,6 +155,7 @@ typedef struct CNCDDRAW BOOL bnet_was_fullscreen; BOOL bnet_was_upscaled; RECT bnet_win_rect; + DEVMODE bnet_mode; POINT bnet_pos; void* last_freed_palette; /* Dungeon Keeper hack */ BOOL child_window_exists; diff --git a/src/config.c b/src/config.c index c2cf65b..3d8946d 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,7 @@ void cfg_load() g_ddraw->vhack = cfg_get_bool("vhack", FALSE); g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); - g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); + g_ddraw->nonexclusive = TRUE;// cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); @@ -149,11 +149,7 @@ void cfg_load() { g_ddraw->renderer = gdi_render_main; } - else if (tolower(tmp[0]) == 'd') /* direct3d9 */ - { - g_ddraw->renderer = d3d9_render_main; - } - else if (tolower(tmp[0]) == 'o') /* opengl */ + else /* opengl */ { if (oglu_load_dll()) { @@ -165,22 +161,6 @@ void cfg_load() g_ddraw->renderer = gdi_render_main; } } - else /* auto */ - { - if (!g_ddraw->wine && d3d9_is_available()) - { - g_ddraw->renderer = d3d9_render_main; - } - else if (oglu_load_dll()) - { - g_ddraw->renderer = ogl_render_main; - } - else - { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; - } - } } void cfg_save() diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 55fd09a..b26365b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -617,13 +617,13 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) dst_height, flags); } - - g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled; - - SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); - - g_ddraw->resizable = TRUE; } + + g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled; + + SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); + + g_ddraw->resizable = TRUE; } } @@ -649,9 +649,12 @@ HWND WINAPI fake_CreateWindowExA( if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) { - int ws = g_config.window_state; - util_toggle_fullscreen(); - g_config.window_state = ws; + memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); + + g_ddraw->render.mode.dmPelsWidth = 640; + g_ddraw->render.mode.dmPelsHeight = 480; + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + g_ddraw->bnet_was_fullscreen = TRUE; } @@ -684,8 +687,8 @@ HWND WINAPI fake_CreateWindowExA( int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; - X += pt.x + align_x; - Y += pt.y + align_y; + X += pt.x;// +align_x; + Y += pt.y;// +align_y; dwStyle |= WS_CLIPCHILDREN; } diff --git a/src/wndproc.c b/src/wndproc.c index 230d050..e001662 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -145,16 +145,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET); - if (!g_ddraw->windowed) - g_ddraw->bnet_was_fullscreen = FALSE; - if (!g_ddraw->bnet_active) { if (g_ddraw->bnet_was_fullscreen) { - int ws = g_config.window_state; - util_toggle_fullscreen(); - g_config.window_state = ws; + memcpy(&g_ddraw->render.mode, &g_ddraw->bnet_mode, sizeof(DEVMODE)); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); g_ddraw->bnet_was_fullscreen = FALSE; } else if (g_ddraw->bnet_was_upscaled) From f7d5d6a46e3a6563d5e95bdd58ce4e04d0f92629 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 6 Nov 2021 18:51:07 +0100 Subject: [PATCH 0003/1724] don't change display settings for original war2 --- src/winapi_hooks.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b26365b..3f96827 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -649,13 +649,17 @@ HWND WINAPI fake_CreateWindowExA( if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) { - memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); + if (g_ddraw->render.mode.dmPelsWidth != 640 || + g_ddraw->render.mode.dmPelsHeight != 480) + { + memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); - g_ddraw->render.mode.dmPelsWidth = 640; - g_ddraw->render.mode.dmPelsHeight = 480; - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); - - g_ddraw->bnet_was_fullscreen = TRUE; + g_ddraw->render.mode.dmPelsWidth = 640; + g_ddraw->render.mode.dmPelsHeight = 480; + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + + g_ddraw->bnet_was_fullscreen = TRUE; + } } real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect); From b4cb502f6a112426c943d71e390333881e015133 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 6 Nov 2021 20:12:15 +0100 Subject: [PATCH 0004/1724] don't enable nonexclusive --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 3d8946d..67f2a9e 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,7 @@ void cfg_load() g_ddraw->vhack = cfg_get_bool("vhack", FALSE); g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); - g_ddraw->nonexclusive = TRUE;// cfg_get_bool("nonexclusive", FALSE); + g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); From 6a241ca0aefe02959c1dfdd083746bfda6039952 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 7 Nov 2021 22:42:55 +0100 Subject: [PATCH 0005/1724] add OBS game capture support for bnet lobby --- inc/IDirectDrawSurface.h | 4 ++ inc/ddsurface.h | 2 +- inc/wndproc.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 12 +++++ src/ddsurface.c | 78 ++++++++++++++++++++++++++-- src/render_d3d9.c | 26 ++++++++-- src/render_gdi.c | 16 +++++- src/render_ogl.c | 25 +++++++-- src/winapi_hooks.c | 2 + src/wndproc.c | 8 +++ 10 files changed, 160 insertions(+), 14 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 97aa39f..1cb624d 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -30,6 +30,10 @@ typedef struct IDirectDrawSurfaceImpl DWORD l_pitch; DWORD lx_pitch; + void* bnet_surface; + HDC bnet_dc; + HBITMAP bnet_bitmap; + PBITMAPINFO bmi; HBITMAP bitmap; HDC hdc; diff --git a/inc/ddsurface.h b/inc/ddsurface.h index f641118..b069885 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -33,6 +33,6 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); - +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This); #endif diff --git a/inc/wndproc.h b/inc/wndproc.h index 6d2a199..d74dff7 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,6 +9,7 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define IDT_TIMER_LEAVE_BNET 541287654 +#define IDT_TIMER_REDRAW_BNET 541287655 LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index de4b209..b86f2c4 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -90,9 +90,21 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) HeapFree(GetProcessHeap(), 0, This->surface); } + if (This->bnet_bitmap) + { + DeleteObject(This->bnet_bitmap); + } + else if (This->bnet_surface) + { + HeapFree(GetProcessHeap(), 0, This->bnet_surface); + } + if (This->hdc) DeleteDC(This->hdc); + if (This->bnet_dc) + DeleteDC(This->bnet_dc); + if (This->bmi) HeapFree(GetProcessHeap(), 0, This->bmi); diff --git a/src/ddsurface.c b/src/ddsurface.c index 8a8ceef..bb75231 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1190,28 +1190,39 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD return DD_OK; } -HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) { /* Hack for Warcraft II BNE and Diablo */ HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; - if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (hwnd) { HDC primary_dc; dds_GetDC(This, &primary_dc); + if (g_ddraw->primary->palette) + { + SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); + } + /* GdiTransparentBlt idea taken from Aqrit's war2 ddraw */ RGBQUAD quad; GetDIBColorTable(primary_dc, 0xFE, 1, &quad); COLORREF color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue); BOOL erase = FALSE; + HWND hwnd_bnet[20]; + int i = 0; + + memset(&hwnd_bnet[0], 0, sizeof(hwnd_bnet)); do { RECT rc; if (fake_GetWindowRect(hwnd, &rc)) { + hwnd_bnet[i++] = hwnd; + if (rc.bottom - rc.top == 479) erase = TRUE; @@ -1236,6 +1247,36 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } while ((hwnd = FindWindowEx(HWND_DESKTOP, hwnd, "SDlgDialog", NULL))); + /* hack for windows 8/10 fullscreen exclusive mode */ + EnterCriticalSection(&g_ddraw->cs); + + for (i = sizeof(hwnd_bnet) / sizeof(hwnd_bnet[0]); i--; ) + { + if (hwnd_bnet[i]) + { + RECT rc; + if (fake_GetWindowRect(hwnd_bnet[i], &rc)) + { + HDC dc = GetDC(hwnd_bnet[i]); + + BitBlt( + g_ddraw->primary->bnet_dc, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top, + dc, + 0, + 0, + SRCCOPY); + + ReleaseDC(hwnd_bnet[i], dc); + } + } + } + + LeaveCriticalSection(&g_ddraw->cs); + if (erase) { BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; @@ -1245,10 +1286,21 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) g_ddraw->ticks_limiter.use_blt_or_flip = x; } + + if (g_ddraw->render.run) + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + } +} + +HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +{ + if ((This->caps & DDSCAPS_PRIMARYSURFACE)) + { + dds_RedrawBnet(This); } /* Hack for Star Trek Armada */ - hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1471,6 +1523,26 @@ HRESULT dd_CreateSurface( { g_ddraw->primary = dst_surface; FakePrimarySurface = dst_surface->surface; + + dst_surface->bnet_dc = CreateCompatibleDC(g_ddraw->render.hdc); + + dst_surface->bnet_bitmap = + CreateDIBSection( + dst_surface->bnet_dc, + dst_surface->bmi, + DIB_RGB_COLORS, + (void**)&dst_surface->bnet_surface, NULL, 0); + + if (!dst_surface->bnet_bitmap) + { + dst_surface->bnet_surface = + HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); + } + + SelectObject(dst_surface->bnet_dc, dst_surface->bnet_bitmap); } SelectObject(dst_surface->hdc, dst_surface->bitmap); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index f640fb0..c6e3b95 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -442,6 +442,27 @@ DWORD WINAPI d3d9_render_main(void) } } } + + if (g_ddraw->bnet_active) + { + RECT rc = { 0,0,g_ddraw->width,g_ddraw->height }; + + if (SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) + { + unsigned char* src = (unsigned char*)g_ddraw->primary->bnet_surface; + unsigned char* dst = (unsigned char*)lock_rc.pBits; + + for (int i = 0; i < g_ddraw->height; i++) + { + memcpy(dst, src, g_ddraw->primary->l_pitch); + + src += g_ddraw->primary->l_pitch; + dst += lock_rc.Pitch; + } + + IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); + } + } } LeaveCriticalSection(&g_ddraw->cs); @@ -456,11 +477,6 @@ DWORD WINAPI d3d9_render_main(void) IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); IDirect3DDevice9_EndScene(g_d3d9.device); - if (g_ddraw->bnet_active) - { - IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - } - if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL))) { DWORD_PTR result; diff --git a/src/render_gdi.c b/src/render_gdi.c index 74528f3..e2e8ef0 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -97,8 +97,20 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->bnet_active) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; - FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS, + SRCCOPY); } else if (upscale_hack) { diff --git a/src/render_ogl.c b/src/render_ogl.c index 87c6b1e..1c5336c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -701,6 +701,28 @@ static void ogl_render() } } } + + if (g_ddraw->bnet_active) + { + glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); + + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glTexSubImage2D( + GL_TEXTURE_2D, + 0, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ogl.surface_format, + g_ogl.surface_type, + g_ddraw->primary->bnet_surface); + + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + } } LeaveCriticalSection(&g_ddraw->cs); @@ -823,9 +845,6 @@ static void ogl_render() glEnd(); } - if (g_ddraw->bnet_active) - glClear(GL_COLOR_BUFFER_BIT); - SwapBuffers(g_ddraw->render.hdc); #if _DEBUG diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3f96827..8f3c9c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -591,6 +591,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL)) { + KillTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET); g_ddraw->bnet_active = FALSE; SetFocus(g_ddraw->hwnd); mouse_lock(); @@ -680,6 +681,7 @@ HWND WINAPI fake_CreateWindowExA( g_ddraw->resizable = FALSE; g_ddraw->bnet_active = TRUE; + SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL); mouse_unlock(); } diff --git a/src/wndproc.c b/src/wndproc.c index e001662..d69cbb5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -4,6 +4,7 @@ #include "dllmain.h" #include "dd.h" #include "hook.h" +#include "ddsurface.h" #include "mouse.h" #include "render_d3d9.h" #include "config.h" @@ -162,6 +163,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + case IDT_TIMER_REDRAW_BNET: + { + if (g_ddraw->primary) + dds_RedrawBnet(g_ddraw->primary); + + return 0; + } } break; } From 8c6b2814a90cbbc5ff9840a4408c70e902e1c1f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 7 Nov 2021 23:22:46 +0100 Subject: [PATCH 0006/1724] redraw only top window for better performance --- inc/ddsurface.h | 3 +- src/ddsurface.c | 101 +++++++++++++++++++++++------------------------- src/wndproc.c | 2 +- 3 files changed, 52 insertions(+), 54 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index b069885..eae85f7 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -33,6 +33,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); -void dds_RedrawBnet(IDirectDrawSurfaceImpl* This); +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack); +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This); #endif diff --git a/src/ddsurface.c b/src/ddsurface.c index bb75231..3237122 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1190,39 +1190,66 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD return DD_OK; } -void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack) { /* Hack for Warcraft II BNE and Diablo */ HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; if (hwnd) { + if (obs_hack) + { + /* hack for windows 8/10 fullscreen exclusive mode */ + + if (g_ddraw->primary->palette) + { + SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); + } + + EnterCriticalSection(&g_ddraw->cs); + + RECT rc; + if (fake_GetWindowRect(hwnd, &rc)) + { + HDC dc = GetDC(hwnd); + + BitBlt( + g_ddraw->primary->bnet_dc, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top, + dc, + 0, + 0, + SRCCOPY); + + ReleaseDC(hwnd, dc); + } + + LeaveCriticalSection(&g_ddraw->cs); + + if (g_ddraw->render.run) + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + + return; + } + HDC primary_dc; dds_GetDC(This, &primary_dc); - if (g_ddraw->primary->palette) - { - SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); - } - /* GdiTransparentBlt idea taken from Aqrit's war2 ddraw */ RGBQUAD quad; GetDIBColorTable(primary_dc, 0xFE, 1, &quad); COLORREF color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue); BOOL erase = FALSE; - HWND hwnd_bnet[20]; - int i = 0; - - memset(&hwnd_bnet[0], 0, sizeof(hwnd_bnet)); do { RECT rc; if (fake_GetWindowRect(hwnd, &rc)) { - hwnd_bnet[i++] = hwnd; - if (rc.bottom - rc.top == 479) erase = TRUE; @@ -1247,36 +1274,6 @@ void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) } while ((hwnd = FindWindowEx(HWND_DESKTOP, hwnd, "SDlgDialog", NULL))); - /* hack for windows 8/10 fullscreen exclusive mode */ - EnterCriticalSection(&g_ddraw->cs); - - for (i = sizeof(hwnd_bnet) / sizeof(hwnd_bnet[0]); i--; ) - { - if (hwnd_bnet[i]) - { - RECT rc; - if (fake_GetWindowRect(hwnd_bnet[i], &rc)) - { - HDC dc = GetDC(hwnd_bnet[i]); - - BitBlt( - g_ddraw->primary->bnet_dc, - rc.left, - rc.top, - rc.right - rc.left, - rc.bottom - rc.top, - dc, - 0, - 0, - SRCCOPY); - - ReleaseDC(hwnd_bnet[i], dc); - } - } - } - - LeaveCriticalSection(&g_ddraw->cs); - if (erase) { BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; @@ -1286,23 +1283,15 @@ void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) g_ddraw->ticks_limiter.use_blt_or_flip = x; } - - if (g_ddraw->render.run) - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } } -HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE)) - { - dds_RedrawBnet(This); - } - /* Hack for Star Trek Armada */ HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; - if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (hwnd) { HDC primary_dc; dds_GetDC(This, &primary_dc); @@ -1336,7 +1325,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) g_ddraw->ticks_limiter.use_blt_or_flip = x; } +} +HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +{ + if ((This->caps & DDSCAPS_PRIMARYSURFACE)) + { + dds_RedrawBnet(This, FALSE); + dds_RedrawArmada(This); + } if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { diff --git a/src/wndproc.c b/src/wndproc.c index d69cbb5..d38deff 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -166,7 +166,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case IDT_TIMER_REDRAW_BNET: { if (g_ddraw->primary) - dds_RedrawBnet(g_ddraw->primary); + dds_RedrawBnet(g_ddraw->primary, TRUE); return 0; } From 87d3fb169adebdaf2a3365ae7ec887d832e1da8b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 8 Nov 2021 02:36:28 +0100 Subject: [PATCH 0007/1724] center in windowed mode + clear --- src/render_d3d9.c | 2 ++ src/render_ogl.c | 2 ++ src/winapi_hooks.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c6e3b95..cd8c9e7 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -445,6 +445,8 @@ DWORD WINAPI d3d9_render_main(void) if (g_ddraw->bnet_active) { + IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + RECT rc = { 0,0,g_ddraw->width,g_ddraw->height }; if (SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) diff --git a/src/render_ogl.c b/src/render_ogl.c index 1c5336c..f267a97 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -704,6 +704,8 @@ static void ogl_render() if (g_ddraw->bnet_active) { + glClear(GL_COLOR_BUFFER_BIT); + glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); if (g_ogl.adjust_alignment) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8f3c9c0..01c3ef6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -693,8 +693,14 @@ HWND WINAPI fake_CreateWindowExA( int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; - X += pt.x;// +align_x; - Y += pt.y;// +align_y; + if (g_ddraw->windowed) + { + X += align_x; + Y += align_y; + } + + X += pt.x; + Y += pt.y; dwStyle |= WS_CLIPCHILDREN; } From fce63191375c476cf0b1dc5cf31e261113dd812b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 8 Nov 2021 03:18:28 +0100 Subject: [PATCH 0008/1724] re-enable d3d9 but only for windowed/borderless - default to opengl --- src/config.c | 38 ++++++++++++++++++++++++++++++++++++-- src/wndproc.c | 3 ++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 67f2a9e..ccdf8b1 100644 --- a/src/config.c +++ b/src/config.c @@ -149,7 +149,18 @@ void cfg_load() { g_ddraw->renderer = gdi_render_main; } - else /* opengl */ + else if (tolower(tmp[0]) == 'd') /* direct3d9 */ + { + g_ddraw->renderer = d3d9_render_main; + + if (!g_ddraw->windowed) + { + g_ddraw->fullscreen = TRUE; + g_ddraw->windowed = TRUE; + g_config.window_rect.left = g_config.window_rect.top = -32000; + } + } + else if (tolower(tmp[0]) == 'o') /* opengl */ { if (oglu_load_dll()) { @@ -161,6 +172,29 @@ void cfg_load() g_ddraw->renderer = gdi_render_main; } } + else /* auto */ + { + if (!g_ddraw->wine && d3d9_is_available()) + { + g_ddraw->renderer = d3d9_render_main; + + if (!g_ddraw->windowed) + { + g_ddraw->fullscreen = TRUE; + g_ddraw->windowed = TRUE; + g_config.window_rect.left = g_config.window_rect.top = -32000; + } + } + else if (oglu_load_dll()) + { + g_ddraw->renderer = ogl_render_main; + } + else + { + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; + } + } } void cfg_save() @@ -252,7 +286,7 @@ static void cfg_create_ini() "posY=-32000\n" "\n" "; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n" - "renderer=auto\n" + "renderer=opengl\n" "\n" "; Developer mode (don't lock the cursor)\n" "devmode=false\n" diff --git a/src/wndproc.c b/src/wndproc.c index d38deff..a8c085c 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -587,7 +587,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam wParam == g_ddraw->hotkeys.toggle_fullscreen && !g_ddraw->fullscreen && context_code && - !key_state) + !key_state && + g_ddraw->renderer != d3d9_render_main) { util_toggle_fullscreen(); return 0; From a4725e7b2d867cae144c1a4cc31043499d653cb6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Nov 2021 23:19:26 +0100 Subject: [PATCH 0009/1724] leave fullscreen exclusive on bnet --- src/winapi_hooks.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 01c3ef6..438eb04 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -661,6 +661,17 @@ HWND WINAPI fake_CreateWindowExA( g_ddraw->bnet_was_fullscreen = TRUE; } + else + { + real_SetWindowPos( + g_ddraw->hwnd, + 0, + 0, + 0, + g_ddraw->render.width, + g_ddraw->render.height + 1, + SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); + } } real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect); From e38222053bed5edc0ed4c1e2086bffb8c9db531d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Nov 2021 02:00:40 +0100 Subject: [PATCH 0010/1724] clear bnet surface on alt+enter --- src/utils.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/utils.c b/src/utils.c index db2dd5d..2f957ce 100644 --- a/src/utils.c +++ b/src/utils.c @@ -279,6 +279,8 @@ void util_toggle_fullscreen() if (g_ddraw->bnet_active) return; + memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height); + if (g_ddraw->windowed) { mouse_unlock(); From aa1ba9f6eccf333a77babca8a6b357f3af5b7e6e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Nov 2021 02:05:39 +0100 Subject: [PATCH 0011/1724] make lowest resolutio check less strict --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 2f957ce..8958fb1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -158,7 +158,7 @@ BOOL util_get_lowest_resolution( DWORD max_height) { BOOL result = FALSE; - int org_ratio = (int)((ratio + 0.005f) * 100); + int org_ratio = (int)((ratio + 0.005f) * 10); SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 }; DWORD i = 0; DEVMODE m; @@ -174,7 +174,7 @@ BOOL util_get_lowest_resolution( m.dmPelsWidth < lowest.cx && m.dmPelsHeight < lowest.cy) { - int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100); + int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10); if (res_ratio == org_ratio) { From e70c7523c2b64e140cd9fa1c61f79b42dba06c18 Mon Sep 17 00:00:00 2001 From: Andrey Filipenkov Date: Sun, 14 Nov 2021 16:53:30 +0300 Subject: [PATCH 0012/1724] add usage instructions for Wine --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea0747a..987e991 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Instructions 1. Download [cnc-ddraw.zip](https://github.com/CnCNet/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder -2. Start the game +2. Wine only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) +3. Start the game Note: If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. From bf3d21c835793558475c2f6e83ef04250457a5c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Nov 2021 03:45:05 +0100 Subject: [PATCH 0013/1724] add exports for game patching --- ddraw.def | 8 ++++++++ src/dllmain.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/ddraw.def b/ddraw.def index c1b0b64..3b4b6bb 100644 --- a/ddraw.def +++ b/ddraw.def @@ -18,5 +18,13 @@ EXPORTS DirectInputCreateW = fake_DirectInputCreateW DirectInputCreateEx = fake_DirectInputCreateEx DirectInput8Create = fake_DirectInput8Create + DDmemcpy + DDmemmove + DDmemset + DDZeroMemory + DDmemcpyStd + DDmemmoveStd + DDmemsetStd + DDZeroMemoryStd GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA diff --git a/src/dllmain.c b/src/dllmain.c index e33135a..86f1439 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -232,3 +232,45 @@ DWORD WINAPI DDInternalUnlock(DWORD a) TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } + +/* Exports for game patching */ + +void* __cdecl DDmemcpy(void* _Dst, void const* _Src, size_t _Size) +{ + return memcpy(_Dst, _Src, _Size); +} + +void* __cdecl DDmemmove(void* _Dst, void const* _Src, size_t _Size) +{ + return memmove(_Dst, _Src, _Size); +} + +void* __cdecl DDmemset(void* _Dst, int _Val, size_t _Size) +{ + return memset(_Dst, _Val, _Size); +} + +void __cdecl DDZeroMemory(PVOID Destination, SIZE_T Length) +{ + memset(Destination, 0, Length); +} + +void* __stdcall DDmemcpyStd(void* _Dst, void const* _Src, size_t _Size) +{ + return memcpy(_Dst, _Src, _Size); +} + +void* __stdcall DDmemmoveStd(void* _Dst, void const* _Src, size_t _Size) +{ + return memmove(_Dst, _Src, _Size); +} + +void* __stdcall DDmemsetStd(void* _Dst, int _Val, size_t _Size) +{ + return memset(_Dst, _Val, _Size); +} + +void __stdcall DDZeroMemoryStd(PVOID Destination, SIZE_T Length) +{ + memset(Destination, 0, Length); +} From a71528f35f18faacdb1a53235d9ce696f3b0427c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Nov 2021 12:51:35 +0100 Subject: [PATCH 0014/1724] add workaround for multi-monitor setups --- src/render_gdi.c | 49 ++++++++++++++++++++++++++++++++-------------- src/render_ogl.c | 2 +- src/winapi_hooks.c | 10 ++++++++-- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index e2e8ef0..fd78f80 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -74,7 +74,7 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } @@ -97,20 +97,39 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->bnet_active) { - StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, - 0, - 0, - g_ddraw->width, - g_ddraw->height, - g_ddraw->primary->bnet_surface, - g_ddraw->primary->bmi, - DIB_RGB_COLORS, - SRCCOPY); + if (GetSystemMetrics(SM_CMONITORS) == 1) + { + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS, + SRCCOPY); + } + else + { + SetDIBitsToDevice( + g_ddraw->render.hdc, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + 0, + 0, + 0, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS); + } } else if (upscale_hack) { diff --git a/src/render_ogl.c b/src/render_ogl.c index f267a97..60d87cd 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -676,7 +676,7 @@ static void ogl_render() if (g_ddraw->fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 438eb04..5c7a91e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -650,8 +650,9 @@ HWND WINAPI fake_CreateWindowExA( if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) { - if (g_ddraw->render.mode.dmPelsWidth != 640 || - g_ddraw->render.mode.dmPelsHeight != 480) + if ((g_ddraw->render.mode.dmPelsWidth != 640 || + g_ddraw->render.mode.dmPelsHeight != 480) && + GetSystemMetrics(SM_CMONITORS) == 1) { memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); @@ -709,6 +710,11 @@ HWND WINAPI fake_CreateWindowExA( X += align_x; Y += align_y; } + else if (GetSystemMetrics(SM_CMONITORS) > 1) + { + X += min(g_ddraw->render.width / 2 - 640 / 2, added_width); + Y += min(g_ddraw->render.height / 2 - 480 / 2, added_height); + } X += pt.x; Y += pt.y; From 6a38496bf76fea3a84087a9a3fd66d2911900fa1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Nov 2021 17:38:22 +0100 Subject: [PATCH 0015/1724] fix cursor lock on alt+tab --- src/mouse.c | 2 +- src/wndproc.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mouse.c b/src/mouse.c index 34ab4f9..9b43aa7 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -13,7 +13,7 @@ void mouse_lock() if (g_ddraw->devmode || g_ddraw->bnet_active) return; - if (g_hook_active && !g_ddraw->locked) + if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd)) { int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; diff --git a/src/wndproc.c b/src/wndproc.c index a8c085c..736c626 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -504,6 +504,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->renderer != d3d9_render_main) { ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); } } From 6e9307a422984d0ccf7776fb4053878b19a9d1ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Nov 2021 12:49:13 +0100 Subject: [PATCH 0016/1724] give bnet lobby a name to make OBS auto scene switcher working with the game --- src/winapi_hooks.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5c7a91e..1a73cd6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -720,6 +720,11 @@ HWND WINAPI fake_CreateWindowExA( Y += pt.y; dwStyle |= WS_CLIPCHILDREN; + + if (lpWindowName && !lpWindowName[0]) + { + lpWindowName = "Bnet Lobby"; + } } return real_CreateWindowExA( From aca2ca707102d7fb8f43952c7071e8dacc35f39e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Nov 2021 17:38:22 +0100 Subject: [PATCH 0017/1724] fix cursor lock on alt+tab (cherry picked from commit 6a38496bf76fea3a84087a9a3fd66d2911900fa1) --- src/mouse.c | 2 +- src/wndproc.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mouse.c b/src/mouse.c index 34ab4f9..9b43aa7 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -13,7 +13,7 @@ void mouse_lock() if (g_ddraw->devmode || g_ddraw->bnet_active) return; - if (g_hook_active && !g_ddraw->locked) + if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd)) { int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; diff --git a/src/wndproc.c b/src/wndproc.c index 230d050..795c819 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -500,6 +500,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->renderer != d3d9_render_main) { ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); } } From f803a9363f077dc7aaf52bff5e44cb3036caad77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Dec 2021 03:28:50 +0100 Subject: [PATCH 0018/1724] #132 add SWP_SHOWWINDOW --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 73773f3..2c5d822 100644 --- a/src/dd.c +++ b/src/dd.c @@ -675,7 +675,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE); - real_SetWindowPos(g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); + real_SetWindowPos(g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); real_MoveWindow(g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); BOOL d3d9_active = FALSE; From 27812d69f4d771c22240f6b7fb65512b24187daa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Dec 2021 03:28:59 +0100 Subject: [PATCH 0019/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 6d17f10..a811eb3 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 5 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b8fd6d1f812df847bc5c1eaec3c1dce66da1826a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Dec 2021 02:41:02 +0100 Subject: [PATCH 0020/1724] #131 #125 add option to remove video memory flag --- inc/dd.h | 1 + src/config.c | 5 +++++ src/ddsurface.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 4afc477..6c2983a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -135,6 +135,7 @@ typedef struct CNCDDRAW BOOL wine; HCURSOR old_cursor; int show_cursor_count; + BOOL novidmem; BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index 2112bcc..53f1c4c 100644 --- a/src/config.c +++ b/src/config.c @@ -38,6 +38,7 @@ void cfg_load() g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); + g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); @@ -730,18 +731,21 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" + "novidmem=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" + "novidmem=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" + "novidmem=true\n" "\n" "; Kings Quest 8\n" "[Mask]\n" @@ -936,6 +940,7 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" + "novidmem=true\n" "\n" "; Worms Armageddon\n" "[WA]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 8a8ceef..aa592b9 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -852,7 +852,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = This->bpp; lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; - if (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER)) + if (!g_ddraw->novidmem || (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) { lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } From c36522d377d3ab94d9106745269e1d06634bad8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Dec 2021 03:16:08 +0100 Subject: [PATCH 0021/1724] #133 add option to save screenshots in a different directory --- inc/dd.h | 1 + src/config.c | 4 ++++ src/screenshot.c | 4 +++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 6c2983a..bb36710 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -62,6 +62,7 @@ typedef struct CNCDDRAW DEVMODE mode; struct IDirectDrawSurfaceImpl* primary; char title[128]; + char screenshot_dir[MAX_PATH]; CRITICAL_SECTION cs; /* real export from system32\ddraw.dll */ diff --git a/src/config.c b/src/config.c index 53f1c4c..8fdaca6 100644 --- a/src/config.c +++ b/src/config.c @@ -45,6 +45,7 @@ void cfg_load() g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); + cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) g_ddraw->adjmouse = FALSE; @@ -291,6 +292,9 @@ static void cfg_create_ini() "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n" "configlang=auto\n" "\n" + "; Where should screenshots be saved\n" + "screenshotdir=.\\Screenshots\\\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/screenshot.c b/src/screenshot.c index 02e3d22..caf4164 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -132,8 +132,10 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } } + CreateDirectoryA(g_ddraw->screenshot_dir, NULL); + strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); - _snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time); + _snprintf(filename, sizeof(filename), "%s%s-%s.png", g_ddraw->screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { From a44193fe4769e39186f0345291b4f4939c5489e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Dec 2021 03:26:51 +0100 Subject: [PATCH 0022/1724] improve screenshot performance --- src/screenshot.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/screenshot.c b/src/screenshot.c index caf4164..ee9a3d4 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -45,31 +45,30 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) { unsigned int error = TRUE; - unsigned int* dst_buf = malloc(src->width * src->height * 4); + unsigned int* buf = malloc(src->width * src->height * 4); - if (dst_buf) + if (buf) { unsigned short* src_buf = (unsigned short*)dds_GetBuffer(src); + unsigned int* dst_buf = buf; for (int y = 0; y < src->height; y++) { - int dst_row = y * src->width; - for (int x = 0; x < src->width; x++) { - unsigned short pixel = src_buf[dst_row + x]; + unsigned short pixel = *src_buf++; BYTE red = ((pixel & 0xF800) >> 11) << 3; BYTE green = ((pixel & 0x07E0) >> 5) << 2; BYTE blue = ((pixel & 0x001F)) << 3; - dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red; + *dst_buf++ = (0xFF << 24) | (blue << 16) | (green << 8) | red; } } - error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height); + error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); - free(dst_buf); + free(buf); } return !error; @@ -78,31 +77,30 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) { unsigned int error = TRUE; - unsigned int* dst_buf = malloc(src->width * src->height * 4); + unsigned int* buf = malloc(src->width * src->height * 4); - if (dst_buf) + if (buf) { unsigned int* src_buf = (unsigned int*)dds_GetBuffer(src); + unsigned int* dst_buf = buf; for (int y = 0; y < src->height; y++) { - int dst_row = y * src->width; - for (int x = 0; x < src->width; x++) { - unsigned int pixel = src_buf[dst_row + x]; + unsigned int pixel = *src_buf++; - BYTE red = (pixel >> 16) & 0xFF; + BYTE red = (pixel >> 16) & 0xFF; BYTE green = (pixel >> 8) & 0xFF; - BYTE blue = pixel & 0xFF; + BYTE blue = pixel & 0xFF; - dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red; + *dst_buf++ = (0xFF << 24) | (blue << 16) | (green << 8) | red; } } - error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height); + error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); - free(dst_buf); + free(buf); } return !error; From d654beab46639de3d7c36c2e0cb29f55a1f1a5dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 Dec 2021 04:49:08 +0100 Subject: [PATCH 0023/1724] fix debug build --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 87cb336..817e29a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -26,7 +26,7 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) 0, 0); - if (dmp) + if (dmp != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION info; info.ThreadId = GetCurrentThreadId(); From c6a56032941809351ea278501834d123caaaddc1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 Dec 2021 04:59:25 +0100 Subject: [PATCH 0024/1724] optional D3DCREATE_FPU_PRESERVE for dune2000 and other games that might need it --- inc/dd.h | 1 + src/config.c | 13 +++++++++++++ src/render_d3d9.c | 12 ++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index bb36710..48dc680 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -137,6 +137,7 @@ typedef struct CNCDDRAW HCURSOR old_cursor; int show_cursor_count; BOOL novidmem; + BOOL fpupreserve; BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index 8fdaca6..928e95c 100644 --- a/src/config.c +++ b/src/config.c @@ -45,6 +45,7 @@ void cfg_load() g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); + g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -337,6 +338,10 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected\n" "fixchilds=2\n" "\n" + "; Set the precision for Direct3D9 floating-point calculations to the precision used by the calling thread\n" + "; Note: Enable this if there are desyncs in online games\n" + "fpupreserve=false\n" + "\n" "\n" "\n" "; ### Hotkeys ###\n" @@ -648,6 +653,14 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=2\n" "\n" + "; Dune 2000\n" + "[dune2000]\n" + "fpupreserve=false\n" + "\n" + "; Dune 2000 - CnCNet\n" + "[dune2000-spawn]\n" + "fpupreserve=false\n" + "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" "maxgameticks=60\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index f640fb0..06f6185 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -71,11 +71,11 @@ BOOL d3d9_create() g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { - D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, - D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, - D3DCREATE_HARDWARE_VERTEXPROCESSING, - D3DCREATE_MIXED_VERTEXPROCESSING, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING, + D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING, + D3DCREATE_MULTITHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING, }; for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) @@ -86,7 +86,7 @@ BOOL d3d9_create() D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_ddraw->hwnd, - D3DCREATE_MULTITHREADED | behavior_flags[i], + behavior_flags[i] | (g_ddraw->fpupreserve ? D3DCREATE_FPU_PRESERVE : 0), &g_d3d9.params, &g_d3d9.device))) return g_d3d9.device && d3d9_create_resouces() && d3d9_set_states(); From 0f8eb68de65b2e57bacb4226e3f399856fd05f89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 Dec 2021 05:00:32 +0100 Subject: [PATCH 0025/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index a811eb3..45d3522 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -3,8 +3,8 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 -#define VERSION_BUILD 5 -#define VERSION_REVISION 1 +#define VERSION_BUILD 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 00bcc983f259ef1988b0d6144c8dd8dbadec8cd5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Jan 2022 13:08:33 +0100 Subject: [PATCH 0026/1724] add preset for Jagged Alliance 2 - Vengeance Reloaded mod (cherry picked from commit 3a6d564c5d34df60a31bb7054efd8eceda5cd543) --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 928e95c..c661701 100644 --- a/src/config.c +++ b/src/config.c @@ -764,6 +764,13 @@ static void cfg_create_ini() "releasealt=true\n" "novidmem=true\n" "\n" + "; Jagged Alliance 2 - Vengeance Reloaded mod\n" + "[JA2_Vengeance]\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" + "novidmem=true\n" + "\n" "; Kings Quest 8\n" "[Mask]\n" "renderer=opengl\n" From c90b63adb5db1bb766d06547b4062b70709b9483 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Feb 2022 05:11:15 +0100 Subject: [PATCH 0027/1724] #135 add preset for Airline Tycoon Deluxe --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index c661701..bee037c 100644 --- a/src/config.c +++ b/src/config.c @@ -444,6 +444,10 @@ static void cfg_create_ini() "renderer=opengl\n" "maxgameticks=60\n" "\n" + "; Airline Tycoon Deluxe\n" + "[AT]\n" + "fixchilds=0\n" + "\n" "; Blade & Sword\n" "[comeon]\n" "fixchilds=3\n" From 9c02e0ee93ee84bd3c9fa17afe91f862fce95266 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Feb 2022 06:05:39 +0100 Subject: [PATCH 0028/1724] fix dune2000 presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index bee037c..e709e53 100644 --- a/src/config.c +++ b/src/config.c @@ -659,11 +659,11 @@ static void cfg_create_ini() "\n" "; Dune 2000\n" "[dune2000]\n" - "fpupreserve=false\n" + "fpupreserve=true\n" "\n" "; Dune 2000 - CnCNet\n" "[dune2000-spawn]\n" - "fpupreserve=false\n" + "fpupreserve=true\n" "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" From 8409769b7304a22074f7d5dc5ff904e89830623f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 24 Jan 2022 01:35:11 +0100 Subject: [PATCH 0029/1724] #138 call SetDisplayMode from SetCooperativeLevel when there's no DDSCL_FULLSCREEN flag (cherry picked from commit 90591ac8286c20cecfada08d102787943cf9f515) --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 2c5d822..961cbea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -849,6 +849,11 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } + if (!(dwFlags & DDSCL_FULLSCREEN)) + { + dd_SetDisplayMode(640, 480, 8, SDM_MODE_SET_BY_GAME); + } + return DD_OK; } From f013a76c7e284caa14325832b4e3150b6e7786c2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Feb 2022 04:50:23 +0100 Subject: [PATCH 0030/1724] #138 fix bMenu bool in AdjustWindowRect calls (cherry picked from commit aee8747898f7b41f92e93ae8dd80c8ac5b38291e) --- src/dd.c | 2 +- src/utils.c | 13 +++++++------ src/wndproc.c | 18 +++++++++++++++--- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/dd.c b/src/dd.c index 961cbea..8e92a84 100644 --- a/src/dd.c +++ b/src/dd.c @@ -674,7 +674,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; - AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE); + AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), GetMenu(g_ddraw->hwnd) != NULL); real_SetWindowPos(g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); real_MoveWindow(g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); diff --git a/src/utils.c b/src/utils.c index db2dd5d..f3fa8bf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -199,6 +199,7 @@ void util_toggle_maximize() LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); LONG exstyle = GetWindowLong(g_ddraw->hwnd, GWL_EXSTYLE); + BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL; if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) { @@ -214,7 +215,7 @@ void util_toggle_maximize() dst_rc.right = g_ddraw->width; dst_rc.bottom = g_ddraw->height; - AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); + AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } else if (g_ddraw->boxing) { @@ -233,11 +234,11 @@ void util_toggle_maximize() } } - AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); + AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } else if (g_ddraw->maintas) { - util_unadjust_window_rect(&dst_rc, style, FALSE, exstyle); + util_unadjust_window_rect(&dst_rc, style, got_menu, exstyle); int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; @@ -253,7 +254,7 @@ void util_toggle_maximize() dst_rc.bottom = h; } - AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); + AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } RECT pos_rc; @@ -262,8 +263,8 @@ void util_toggle_maximize() pos_rc.right = (dst_rc.right - dst_rc.left); pos_rc.bottom = (dst_rc.bottom - dst_rc.top); - util_unadjust_window_rect(&pos_rc, style, FALSE, exstyle); - util_unadjust_window_rect(&dst_rc, style, FALSE, exstyle); + util_unadjust_window_rect(&pos_rc, style, got_menu, exstyle); + util_unadjust_window_rect(&dst_rc, style, got_menu, exstyle); util_set_window_rect( pos_rc.left, diff --git a/src/wndproc.c b/src/wndproc.c index 795c819..f52f317 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -252,7 +252,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* maintain aspect ratio */ if (g_ddraw->maintas && CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE)) && + util_unadjust_window_rect( + &clientrc, + GetWindowLong(hWnd, GWL_STYLE), + GetMenu(hWnd) != NULL, + GetWindowLong(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { float scaleH = (float)g_ddraw->height / g_ddraw->width; @@ -285,7 +289,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* enforce minimum window size */ if (CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE)) && + util_unadjust_window_rect( + &clientrc, + GetWindowLong(hWnd, GWL_STYLE), + GetMenu(hWnd) != NULL, + GetWindowLong(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { if (clientrc.right < g_ddraw->width) @@ -337,7 +345,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* save new window position */ if (CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE))) + util_unadjust_window_rect( + &clientrc, + GetWindowLong(hWnd, GWL_STYLE), + GetMenu(hWnd) != NULL, + GetWindowLong(hWnd, GWL_EXSTYLE))) { g_config.window_rect.left = clientrc.left; g_config.window_rect.top = clientrc.top; From 7d966e5e8dd8164fee282b5a9d0bd23fa86fa294 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Feb 2022 04:02:06 +0100 Subject: [PATCH 0031/1724] #138 force windowe mode in zone list --- src/dd.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 8e92a84..e6a9406 100644 --- a/src/dd.c +++ b/src/dd.c @@ -849,9 +849,22 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } - if (!(dwFlags & DDSCL_FULLSCREEN)) + /* Infantry Online Zone List Window */ + if (g_ddraw->infantryhack) { - dd_SetDisplayMode(640, 480, 8, SDM_MODE_SET_BY_GAME); + static BOOL windowed; + + if (!(dwFlags & DDSCL_FULLSCREEN)) + { + windowed = g_ddraw->windowed; + + g_ddraw->windowed = TRUE; + dd_SetDisplayMode(640, 480, 8, SDM_MODE_SET_BY_GAME); + } + else + { + g_ddraw->windowed = windowed; + } } return DD_OK; From b2d6e13ba843e75928cfb794d5a8a126da0c0a23 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Feb 2022 04:03:00 +0100 Subject: [PATCH 0032/1724] #138 add preset for infantry online --- inc/dd.h | 1 + src/config.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 48dc680..3032a07 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -151,6 +151,7 @@ typedef struct CNCDDRAW int resolutions; BOOL armadahack; BOOL tshack; + BOOL infantryhack; int maxgameticks; BOOL alt_key_down; BOOL releasealt; diff --git a/src/config.c b/src/config.c index e709e53..10caae4 100644 --- a/src/config.c +++ b/src/config.c @@ -53,6 +53,7 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); + g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); g_ddraw->hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); g_ddraw->hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); @@ -747,6 +748,12 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=opengl\n" "\n" + "; Infantry Online\n" + "[infantry]\n" + "devmode=true\n" + "resolutions=2\n" + "infantryhack=true\n" + "\n" "; Jagged Alliance 2\n" "[ja2]\n" "fixmousehook=true\n" From e8cc0f5b1c01d8d9a68b0192a84584c73208fd8c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Feb 2022 04:18:49 +0100 Subject: [PATCH 0033/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 45d3522..3a706ca 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 6 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 8f34d10cdccc697213795bab55912e0dfb4f376d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Feb 2022 15:40:25 +0100 Subject: [PATCH 0034/1724] #136 add some more checks to BltFast --- src/ddsurface.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index aa592b9..f69ad6f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -647,6 +647,12 @@ HRESULT dds_BltFast( int dst_x = dwX; int dst_y = dwY; + if (dst_x < 0) + dst_x = 0; + + if (dst_y < 0) + dst_y = 0; + RECT dst_rect = { dst_x, dst_y, (src_rect.right - src_rect.left) + dst_x, (src_rect.bottom - src_rect.top) + dst_y }; if (dst_rect.left < 0) From d190bf4c9f769cd220a5ef3f3b63c52d65fba9e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 7 Feb 2022 12:22:26 +0100 Subject: [PATCH 0035/1724] fix for last commit --- src/ddsurface.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index f69ad6f..7b9538f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -642,16 +642,31 @@ HRESULT dds_BltFast( src_rect.top = src_rect.bottom; } - int src_x = src_rect.left; - int src_y = src_rect.top; int dst_x = dwX; int dst_y = dwY; if (dst_x < 0) + { + src_rect.left += abs(dst_x); + + if (src_rect.left > src_rect.right) + src_rect.left = src_rect.right; + dst_x = 0; + } if (dst_y < 0) + { + src_rect.top += abs(dst_y); + + if (src_rect.top > src_rect.bottom) + src_rect.top = src_rect.bottom; + dst_y = 0; + } + + int src_x = src_rect.left; + int src_y = src_rect.top; RECT dst_rect = { dst_x, dst_y, (src_rect.right - src_rect.left) + dst_x, (src_rect.bottom - src_rect.top) + dst_y }; From 571372f9ca2fa1d7876274820bcb24505c841f12 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Feb 2022 10:17:05 +0100 Subject: [PATCH 0036/1724] fix adjmouse bug --- src/winapi_hooks.c | 8 ++++---- src/wndproc.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 55fd09a..a0821b9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -66,13 +66,13 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (g_ddraw->adjmouse) { - x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width); - y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height); + x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width - 1); + y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height - 1); } else { - x = pt.x; - y = pt.y; + x = min(pt.x, g_ddraw->width - 1); + y = min(pt.y, g_ddraw->height - 1); } if (g_ddraw->vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) diff --git a/src/wndproc.c b/src/wndproc.c index f52f317..b10c797 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -736,8 +736,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - x = min(x, g_ddraw->width); - y = min(y, g_ddraw->height); + x = min(x, g_ddraw->width - 1); + y = min(y, g_ddraw->height - 1); InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); From 96bcaeb036b6e004a29a9aa392a1304003af6e3d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Feb 2022 10:36:41 +0100 Subject: [PATCH 0037/1724] log available display modes --- src/dd.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/dd.c b/src/dd.c index e6a9406..53946ee 100644 --- a/src/dd.c +++ b/src/dd.c @@ -58,6 +58,16 @@ HRESULT dd_EnumDisplayModes( while (EnumDisplaySettings(NULL, i, &m)) { + TRACE_EXT( + " %u: %ux%u@%u %u bpp | flags=0x%08X, FO=%u\n", + i, + m.dmPelsWidth, + m.dmPelsHeight, + m.dmDisplayFrequency, + m.dmBitsPerPel, + m.dmDisplayFlags, + m.dmDisplayFixedOutput); + if (refresh_rate != 60 && m.dmDisplayFrequency >= 50) refresh_rate = m.dmDisplayFrequency; From c8c10836b534e376eed531425b4acaf5f3634b2b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Feb 2022 16:24:39 +0100 Subject: [PATCH 0038/1724] allow SC_KEYMENU in case there's a menu (Infantry Online) --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index b10c797..417b9a4 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam exit(0); } - if (wParam == SC_KEYMENU) + if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL) return 0; if (!GameHandlesClose) From 8fd63703a8edc9a9de36dee408f4f0e7ba2a3d98 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Feb 2022 17:16:29 +0100 Subject: [PATCH 0039/1724] #138 remove WM_SIZE and WM_MOVE messages (they're interfering with the game's own windowed mode...) (cherry picked from commit d83c3362aef66783327128a0cf3617c1ad4c44b1) --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 53946ee..f8a22cd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -774,8 +774,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (dwFlags & SDM_MODE_SET_BY_GAME) { - real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); - real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + //real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); } From bedf34664cb832433d5837b80ccb76bab8fa19c4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Feb 2022 17:00:34 +0100 Subject: [PATCH 0040/1724] #138 use 16bpp for zone list (fixes windowed black screen outside of zone list) (cherry picked from commit dbaf9c2f88ea7678d20b816a35e2bc5babbdcfc5) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index f8a22cd..d85c507 100644 --- a/src/dd.c +++ b/src/dd.c @@ -869,7 +869,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) windowed = g_ddraw->windowed; g_ddraw->windowed = TRUE; - dd_SetDisplayMode(640, 480, 8, SDM_MODE_SET_BY_GAME); + dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); } else { From 69041f7493b30373390b7ce3539eee4d1157c6c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Feb 2022 20:22:17 +0100 Subject: [PATCH 0041/1724] #138 force fullscreen 640x480 if user selects "windowed" in the menu (cherry picked from commit 2edbeabd3e3f96bb31ceea08299ff0914f5bdaa1) --- src/dd.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index d85c507..3907a4c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -864,17 +864,19 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { static BOOL windowed; - if (!(dwFlags & DDSCL_FULLSCREEN)) + if (dwFlags & DDSCL_FULLSCREEN) + { + g_ddraw->windowed = windowed; + } + else if (dwFlags & DDSCL_NOWINDOWCHANGES) { windowed = g_ddraw->windowed; - g_ddraw->windowed = TRUE; + if (GetMenu(g_ddraw->hwnd) != NULL) + g_ddraw->windowed = TRUE; + dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); } - else - { - g_ddraw->windowed = windowed; - } } return DD_OK; From 6ed0ed899c8376399930a59d9cbbc04835db7622 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Feb 2022 12:22:22 +0100 Subject: [PATCH 0042/1724] tweak wndproc hooks (cherry picked from commit 642240e8441b0e6c0f56e63b5dd40b46df7208b5) --- src/debug.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/debug.c b/src/debug.c index 817e29a..f418d72 100644 --- a/src/debug.c +++ b/src/debug.c @@ -4,6 +4,7 @@ #include "ddraw.h" #include "dd.h" #include "ddsurface.h" +#include "wndproc.h" #include "debug.h" @@ -1219,6 +1220,9 @@ char* dbg_mes_to_str(int id) case 8720: return "OCM_PARENTNOTIFY"; case 32768: return "WM_APP"; case 52429: return "WM_RASDIALEVENT"; + case WM_DISPLAYCHANGE_DDRAW: return "WM_DISPLAYCHANGE_DDRAW"; + case WM_SIZE_DDRAW: return "WM_SIZE_DDRAW"; + case WM_MOVE_DDRAW: return "WM_MOVE_DDRAW"; } return 0; From 68633e7aa6eac9d08636634e6c767350a32d72ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Feb 2022 12:23:18 +0100 Subject: [PATCH 0043/1724] #138 center window for infantry online (cherry picked from commit d476fbc7045482d0b17e85cc83e109450f41ee7c) --- src/dd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 3907a4c..94604a3 100644 --- a/src/dd.c +++ b/src/dd.c @@ -433,7 +433,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if (g_ddraw->width && + if ((g_ddraw->width || g_ddraw->infantryhack) && (g_ddraw->width != dwWidth || g_ddraw->height != dwHeight) && (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) { @@ -772,10 +772,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL); } - if (dwFlags & SDM_MODE_SET_BY_GAME) + if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_ddraw->infantryhack) { - //real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); - //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); } From 553ee34433e30303147a2939fa1a7d1451c34815 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Feb 2022 00:04:07 +0100 Subject: [PATCH 0044/1724] force fullscreen = FALSE on zone list --- src/dd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 94604a3..c669fc9 100644 --- a/src/dd.c +++ b/src/dd.c @@ -862,18 +862,23 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) /* Infantry Online Zone List Window */ if (g_ddraw->infantryhack) { - static BOOL windowed; + static BOOL windowed, fullscreen; if (dwFlags & DDSCL_FULLSCREEN) { g_ddraw->windowed = windowed; + g_ddraw->fullscreen = fullscreen; } else if (dwFlags & DDSCL_NOWINDOWCHANGES) { windowed = g_ddraw->windowed; + fullscreen = g_ddraw->fullscreen; if (GetMenu(g_ddraw->hwnd) != NULL) + { g_ddraw->windowed = TRUE; + g_ddraw->fullscreen = FALSE; + } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); } From 38d39b75fac4d761ab0e29515954e0f6519eac1e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Feb 2022 00:18:02 +0100 Subject: [PATCH 0045/1724] add preset for sole survivor --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index 10caae4..323ade7 100644 --- a/src/config.c +++ b/src/config.c @@ -482,6 +482,18 @@ static void cfg_create_ini() "[claw]\n" "noactivateapp=true\n" "\n" + "; Command & Conquer: Sole Survivor\n" + "[SOLE]\n" + "maxgameticks=120\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" + "; Command & Conquer: Sole Survivor\n" + "[SoleSurvivor]\n" + "maxgameticks=120\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" "; Command & Conquer Gold - CnCNet\n" "[cnc95]\n" "maxfps=125\n" From a58e5cdc2a111f8b4c875aed5b3e57fe1b4ead9f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Feb 2022 00:18:09 +0100 Subject: [PATCH 0046/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 3a706ca..9db4a12 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -3,8 +3,8 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 -#define VERSION_BUILD 6 -#define VERSION_REVISION 1 +#define VERSION_BUILD 7 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 2ecf58f1b333433c2cd2f0e20ed8bd2e2782db78 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Mar 2022 02:29:05 +0100 Subject: [PATCH 0047/1724] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 987e991..cba70d6 100644 --- a/README.md +++ b/README.md @@ -94,3 +94,6 @@ If you want to play in windowed mode then start the game once in fullscreen and - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. + + +![](https://img.shields.io/github/downloads/cncnet/cnc-ddraw/total) From 650b06a6630b05b6f26cb0734914fc331a1f2fb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Mar 2022 02:31:05 +0100 Subject: [PATCH 0048/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cba70d6..2efd0a6 100644 --- a/README.md +++ b/README.md @@ -96,4 +96,4 @@ If you want to play in windowed mode then start the game once in fullscreen and There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. -![](https://img.shields.io/github/downloads/cncnet/cnc-ddraw/total) +[![](https://img.shields.io/github/downloads/cncnet/cnc-ddraw/total)](https://github.com/CnCNet/cnc-ddraw/releases) From b7b9a30dc053186de6cd430b6d1ae3372a1a63cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 02:17:38 +0200 Subject: [PATCH 0049/1724] update ddraw.rc --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 9db4a12..5de7fff 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 7 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) @@ -21,7 +21,7 @@ PRODUCTVERSION VERSION VALUE "FileDescription", "DirectDraw replacement" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "ddraw" - VALUE "LegalCopyright", "Copyright (c) 2010-2021" + VALUE "LegalCopyright", "Copyright (c) 2010-2022" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" From d318bae6aa0e2e4789690666c2f74da8e87aee2c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 02:44:27 +0200 Subject: [PATCH 0050/1724] force release of d3d9 device --- src/render_d3d9.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 06f6185..9a267b4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -159,13 +159,13 @@ BOOL d3d9_release() if (g_d3d9.device) { - IDirect3DDevice9_Release(g_d3d9.device); + while (IDirect3DDevice9_Release(g_d3d9.device)); g_d3d9.device = NULL; } if (g_d3d9.instance) { - IDirect3D9_Release(g_d3d9.instance); + while (IDirect3D9_Release(g_d3d9.instance)); g_d3d9.instance = NULL; } From 678160848e1cd9d8db716b9c230acd4c2a638ca8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 03:48:24 +0200 Subject: [PATCH 0051/1724] Make sure native res is always available --- src/dd.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/dd.c b/src/dd.c index c669fc9..c743689 100644 --- a/src/dd.c +++ b/src/dd.c @@ -27,6 +27,19 @@ HRESULT dd_EnumDisplayModes( /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ + DWORD max_w = 0; + DWORD max_h = 0; + DEVMODE reg_m; + + memset(®_m, 0, sizeof(DEVMODE)); + reg_m.dmSize = sizeof(DEVMODE); + + if (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) + { + max_w = reg_m.dmPelsWidth; + max_h = reg_m.dmPelsHeight; + } + SIZE resolutions[] = { { 320, 200 }, @@ -39,8 +52,17 @@ HRESULT dd_EnumDisplayModes( { 1280, 1024 }, { 1600, 1200 }, { 1280, 720 }, - { 1920, 1080 }, + { max_w, max_h }, }; + + for (int x = 0; x < (sizeof(resolutions) / sizeof(resolutions[0])) - 1; x++) + { + if (resolutions[x].cx == max_w && resolutions[x].cy == max_h) + { + resolutions[x].cx = 0; + resolutions[x].cy = 0; + } + } if (g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) { @@ -176,19 +198,6 @@ HRESULT dd_EnumDisplayModes( if (!g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) { - DWORD max_w = 0; - DWORD max_h = 0; - DEVMODE m; - - memset(&m, 0, sizeof(DEVMODE)); - m.dmSize = sizeof(DEVMODE); - - if (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, &m)) - { - max_w = m.dmPelsWidth; - max_h = m.dmPelsHeight; - } - for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { if (!resolutions[i].cx || !resolutions[i].cy) @@ -196,6 +205,7 @@ HRESULT dd_EnumDisplayModes( if ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h)) { + DEVMODE m; memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); From 204c7716e302eac56c424843712e2d009c9f4a8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 03:53:59 +0200 Subject: [PATCH 0052/1724] #157 add preset for Divine Divinity --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 323ade7..9ad849a 100644 --- a/src/config.c +++ b/src/config.c @@ -670,6 +670,11 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=2\n" "\n" + "; Divine Divinity\n" + "[div]\n" + "resolutions=2\n" + "singlecpu=false\n" + "\n" "; Dune 2000\n" "[dune2000]\n" "fpupreserve=true\n" From 62ef95aa149b9356d50356b2356de4963a444bc1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 03:55:40 +0200 Subject: [PATCH 0053/1724] adjust Blade & Sword preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 9ad849a..b347efc 100644 --- a/src/config.c +++ b/src/config.c @@ -451,6 +451,7 @@ static void cfg_create_ini() "\n" "; Blade & Sword\n" "[comeon]\n" + "maxgameticks=62\n" "fixchilds=3\n" "fixpitch=true\n" "\n" From 59e13d002baed72daff1d968fc1381734f4afe46 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 05:51:15 +0200 Subject: [PATCH 0054/1724] adjust ja2 presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index b347efc..01c5c72 100644 --- a/src/config.c +++ b/src/config.c @@ -774,6 +774,7 @@ static void cfg_create_ini() "\n" "; Jagged Alliance 2\n" "[ja2]\n" + "singlecpu=false\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" @@ -781,6 +782,7 @@ static void cfg_create_ini() "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" + "singlecpu=false\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" @@ -788,6 +790,7 @@ static void cfg_create_ini() "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" + "singlecpu=false\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" @@ -795,6 +798,7 @@ static void cfg_create_ini() "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" + "singlecpu=false\n" "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" From 4e2d7aea85f7b4e3b4e1a0b6af0cf7e8d268c63a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 05:57:45 +0200 Subject: [PATCH 0055/1724] update presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 01c5c72..d3e4619 100644 --- a/src/config.c +++ b/src/config.c @@ -904,11 +904,15 @@ static void cfg_create_ini() "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" + "renderer=opengl\n" + "nonexclusive=true\n" "fixpitch=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" + "renderer=opengl\n" + "nonexclusive=true\n" "fixpitch=true\n" "adjmouse=true\n" "\n" From 641313eaafcc184813a4e04bf1cdb94d4f71a61b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 06:07:23 +0200 Subject: [PATCH 0056/1724] #160 log WndProc --- src/wndproc.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 417b9a4..4ac1f8b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -16,16 +16,17 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - /* - TRACE( - " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", - dbg_mes_to_str(uMsg), - uMsg, - wParam, - wParam, - lParam, - lParam); - */ + if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR) + { + TRACE_EXT( + " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", + dbg_mes_to_str(uMsg), + uMsg, + wParam, + wParam, + lParam, + lParam); + } static BOOL in_size_move = FALSE; static int redraw_count = 0; From e5fcb98d5e5b96f08b37f966a80befd3ce0375fb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 06:16:21 +0200 Subject: [PATCH 0057/1724] don't log key message --- src/wndproc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 4ac1f8b..3734a00 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -16,7 +16,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR) + if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && + uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR) { TRACE_EXT( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", From e59f492c0f756993a01b28391938a0b3afef3363 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 06:25:33 +0200 Subject: [PATCH 0058/1724] filter some more messages --- src/wndproc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3734a00..e4a82c2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -17,7 +17,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && - uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR) + uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && + uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP) { TRACE_EXT( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", From 94a1603462a57507a1e170c4436e50b30d339baf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 06:45:24 +0200 Subject: [PATCH 0059/1724] Update README.md --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2efd0a6..c8f9181 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,11 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Instructions 1. Download [cnc-ddraw.zip](https://github.com/CnCNet/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder -2. Wine only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) -3. Start the game +2. Start the game +Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) + +  Note: If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. @@ -36,6 +38,10 @@ If you want to play in windowed mode then start the game once in fullscreen and   +Note: cnc-ddraw does not support Direct3D/Glide, it will only work with games that use a DirectDraw (Software) renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/CnCNet/cnc-ddraw/issues/44 + +  + **Compatibility settings in ddraw.ini** - If there are **problems on Alt+Tab** then try to set `noactivateapp=true` - If it still doesn't work also try `renderer=opengl` or `renderer=gdi`. @@ -60,6 +66,7 @@ If you want to play in windowed mode then start the game once in fullscreen and * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor * [Right Alt] + [Right Ctrl] = Unlock cursor +* [Alt] + [Page Down] = Maximize window (Window borders must be disabled in config)   From e1727dc37971f35d05da25fb1cf4d319220d6691 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 09:02:00 +0200 Subject: [PATCH 0060/1724] #164 add hack for atrox --- src/utils.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index f3fa8bf..ece43df 100644 --- a/src/utils.c +++ b/src/utils.c @@ -374,7 +374,14 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - //TRACE(" util_enum_child_proc right=%u, bottom=%u\n", size.right, size.bottom); + /* + TRACE( + " util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n", + size.right, + size.bottom, + pos.left, + pos.top); + */ if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) { @@ -397,7 +404,14 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } else { - g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; + if (pos.left == -92 && size.right == 100) + { + /* hack for Atrox */ + } + else + { + g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; + } if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_PAINT) { From 294e8f7d34445906d02a3e76ab94c1661c788181 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 09:08:59 +0200 Subject: [PATCH 0061/1724] #164 add preset for Atrox --- inc/dd.h | 1 + src/config.c | 5 +++++ src/wndproc.c | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 3032a07..45dea1c 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -138,6 +138,7 @@ typedef struct CNCDDRAW int show_cursor_count; BOOL novidmem; BOOL fpupreserve; + BOOL allow_wmactivate; BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index d3e4619..d23ae04 100644 --- a/src/config.c +++ b/src/config.c @@ -46,6 +46,7 @@ void cfg_load() g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); + g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -371,6 +372,10 @@ static void cfg_create_ini() "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" + "; Atrox\n" + "[Atrox]\n" + "allow_wmactivate=true\n" + "\n" "; Atomic Bomberman\n" "[BM]\n" "maxgameticks=60\n" diff --git a/src/wndproc.c b/src/wndproc.c index e4a82c2..fba6472 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -502,7 +502,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } //if (g_ddraw->windowed || g_ddraw->noactivateapp) - return 0; + + if (!g_ddraw->allow_wmactivate) + return 0; break; } From dcba755d9525bdac71cd6f732d7376b0faded276 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 10:18:26 +0200 Subject: [PATCH 0062/1724] #164 revert atrox hack and use preset instead --- src/config.c | 1 + src/utils.c | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index d23ae04..40a2c06 100644 --- a/src/config.c +++ b/src/config.c @@ -374,6 +374,7 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "fixchilds=0\n" "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" diff --git a/src/utils.c b/src/utils.c index ece43df..c859e43 100644 --- a/src/utils.c +++ b/src/utils.c @@ -374,14 +374,14 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - /* + /**/ TRACE( " util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n", size.right, size.bottom, pos.left, pos.top); - */ + if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) { @@ -404,14 +404,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } else { - if (pos.left == -92 && size.right == 100) - { - /* hack for Atrox */ - } - else - { - g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; - } + g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_PAINT) { From c633d326668b99a2e04d04f917da8e4dd7c1a898 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 10:19:18 +0200 Subject: [PATCH 0063/1724] disable logging --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index c859e43..76fc56b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -374,14 +374,14 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - /**/ + /* TRACE( " util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n", size.right, size.bottom, pos.left, pos.top); - + */ if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) { From 4821c8d2168ea35028a636a231383c5cf45212f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Sep 2022 10:26:00 +0200 Subject: [PATCH 0064/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 5de7fff..1e6920e 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -3,8 +3,8 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 -#define VERSION_BUILD 7 -#define VERSION_REVISION 1 +#define VERSION_BUILD 8 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 73afd3707a65f13543f0f80fbf3b5c633333ec2d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 6 Sep 2022 07:28:17 +0200 Subject: [PATCH 0065/1724] make sure HighValue is not lower than LowValue --- src/ddsurface.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 7b9538f..a4fd909 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -231,6 +231,9 @@ HRESULT dds_Blt( color_key.dwColorSpaceHighValue = (dwFlags & DDBLT_KEYSRCOVERRIDE) ? lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue; + + if (color_key.dwColorSpaceHighValue < color_key.dwColorSpaceLowValue) + color_key.dwColorSpaceHighValue = color_key.dwColorSpaceLowValue; } float scale_w = (float)src_w / dst_w; From a05d7f1192a49d52f5c47e7ff9584b069ec54fac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 6 Sep 2022 08:05:33 +0200 Subject: [PATCH 0066/1724] #167 add preset for Total Annihilation: Escalation --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 40a2c06..6788097 100644 --- a/src/config.c +++ b/src/config.c @@ -960,6 +960,13 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Total Annihilation: Escalation\n" + "[TotalA]\n" + "checkfile=.\\TAESC.INI\n" + "renderer=opengl\n" + "fixwndprochook=true\n" + "adjmouse=false\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From a227aa17d0b4f59a3b2c9901f8ce00a43d8ccd0b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 6 Sep 2022 08:05:58 +0200 Subject: [PATCH 0067/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 1e6920e..ff366f2 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 8 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 58cb1e0a048057beacebaf6b38019235eadb231e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 6 Sep 2022 10:30:51 +0200 Subject: [PATCH 0068/1724] experimental colorkey blitter test code --- src/ddsurface.c | 89 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index a4fd909..dd84191 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -244,31 +244,88 @@ HRESULT dds_Blt( unsigned char key_low = (unsigned char)color_key.dwColorSpaceLowValue; unsigned char key_high = (unsigned char)color_key.dwColorSpaceHighValue; - for (int y = 0; y < dst_h; y++) + /* + if (src_w == dst_w && src_h == dst_h && !mirror_left_right && !mirror_up_down) { - int scaled_y = (int)(y * scale_h); + unsigned char* src = + (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; + unsigned char* dst = + (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); - int src_row = src_surface->width * (scaled_y + src_y); - int dst_row = This->width * (y + dst_y); + unsigned int dst_p = This->l_pitch - (dst_w * This->lx_pitch); + unsigned int src_p = src_surface->l_pitch - (dst_w * src_surface->lx_pitch); - for (int x = 0; x < dst_w; x++) + if (key_low == key_high) { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned char c = ((unsigned char*)src_buf)[scaled_x + src_x + src_row]; - - if (c < key_low || c > key_high) + for (int y = 0; y < dst_h; y++) { - ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; + for (int x = 0; x < dst_w; x++) + { + unsigned char c = *src++; + + if (c != key_low) + { + *dst = c; + } + + dst++; + } + + src += src_p; + dst += dst_p; + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned char c = *src++; + + if (c < key_low || c > key_high) + { + *dst = c; + } + + dst++; + } + + src += src_p; + dst += dst_p; } } } + else + { + */ + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surface->width * (scaled_y + src_y); + int dst_row = This->width * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned char c = ((unsigned char*)src_buf)[scaled_x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } + //} } else if (This->bpp == 16) { From 15221b3120b1d775712d989c54f438cf99b31ff0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 7 Sep 2022 02:51:42 +0200 Subject: [PATCH 0069/1724] add crc32 for testing --- cnc-ddraw.vcxproj | 2 + cnc-ddraw.vcxproj.filters | 6 +++ inc/crc32.h | 10 +++++ src/crc32.c | 82 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 inc/crc32.h create mode 100644 src/crc32.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index aebb0ee..39f0eb1 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -15,6 +15,7 @@ + @@ -60,6 +61,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index fa979dc..6e0e134 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -150,6 +150,9 @@ Source Files + + Source Files + @@ -257,6 +260,9 @@ Header Files + + Header Files + diff --git a/inc/crc32.h b/inc/crc32.h new file mode 100644 index 0000000..d842810 --- /dev/null +++ b/inc/crc32.h @@ -0,0 +1,10 @@ +#ifndef CRC32_H +#define CRC32_H + +#define WIN32_LEAN_AND_MEAN +#include + + +unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); + +#endif diff --git a/src/crc32.c b/src/crc32.c new file mode 100644 index 0000000..826842f --- /dev/null +++ b/src/crc32.c @@ -0,0 +1,82 @@ +/*----------------------------------------------------------------------------*\ + * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. + * + * This program generates the CRC-32 values for the files named in the + * command-line arguments. These are the same CRC-32 values used by GZIP, + * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and + * used independently. + * + * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. + * + * Based on the byte-oriented implementation "File Verification Using CRC" + * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. + * + * v1.0.0: original release. + * v1.0.1: fixed printf formats. + * v1.0.2: fixed something else. + * v1.0.3: replaced CRC constant table by generator function. + * v1.0.4: reformatted code, made ANSI C. 1994-12-05. + * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. +\*----------------------------------------------------------------------------*/ + +#include +#include + + +unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, + size_t bufLen ) +{ + static const unsigned long crcTable[256] = { + 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, + 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, + 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, + 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, + 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, + 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, + 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, + 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, + 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, + 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, + 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, + 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, + 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, + 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, + 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, + 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, + 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, + 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, + 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, + 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, + 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, + 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, + 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, + 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, + 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, + 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, + 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, + 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, + 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, + 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, + 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, + 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, + 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, + 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, + 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, + 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, + 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; + unsigned long crc32; + unsigned char *byteBuf; + size_t i; + + /** accumulate crc32 for buffer **/ + crc32 = inCrc32 ^ 0xFFFFFFFF; + byteBuf = (unsigned char*) buf; + for (i=0; i < bufLen; i++) { + crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; + } + return( crc32 ^ 0xFFFFFFFF ); +} + +/*----------------------------------------------------------------------------*\ + * END OF MODULE: crc32.c +\*----------------------------------------------------------------------------*/ From 0997f514c47fe7df17d4ecfa358d9682dd07a65a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 02:19:15 +0200 Subject: [PATCH 0070/1724] separate blitters into a different file --- cnc-ddraw.vcxproj | 2 + cnc-ddraw.vcxproj.filters | 6 + inc/blt.h | 93 +++++ src/blt.c | 660 ++++++++++++++++++++++++++++++++ src/ddsurface.c | 769 ++++++++------------------------------ src/render_d3d9.c | 24 +- 6 files changed, 935 insertions(+), 619 deletions(-) create mode 100644 inc/blt.h create mode 100644 src/blt.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 39f0eb1..4cde61e 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -15,6 +15,7 @@ + @@ -61,6 +62,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 6e0e134..6871a26 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -153,6 +153,9 @@ Source Files + + Source Files + @@ -263,6 +266,9 @@ Header Files + + Header Files + diff --git a/inc/blt.h b/inc/blt.h new file mode 100644 index 0000000..f216988 --- /dev/null +++ b/inc/blt.h @@ -0,0 +1,93 @@ +#ifndef BLT_H +#define BLT_H + +#define WIN32_LEAN_AND_MEAN +#include + + +void blt_clean( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + int bpp); + +void blt_overlap( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + int bpp); + +void blt_colorkey( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + unsigned int key_low, + unsigned int key_high, + int bpp); + +void blt_colorkey_mirror_stretch( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_w, + int src_h, + int src_p, + unsigned int key_low, + unsigned int key_high, + BOOL mirror_up_down, + BOOL mirror_left_right, + int bpp); + +void blt_colorfill( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned int color, + int bpp); + +void blt_stretch( + unsigned char* dst_buf, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src_buf, + int src_x, + int src_y, + int src_w, + int src_h, + int src_p, + int bpp); + +#endif diff --git a/src/blt.c b/src/blt.c new file mode 100644 index 0000000..79d9314 --- /dev/null +++ b/src/blt.c @@ -0,0 +1,660 @@ +#include +#include "debug.h" +#include "scale_pattern.h" +#include "blt.h" + + +void blt_clean( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + int bpp) +{ + int bytes_pp = bpp / 8; + + size_t size = dst_w * bytes_pp; + + src += (src_x * bytes_pp) + (src_p * src_y); + dst += (dst_x * bytes_pp) + (dst_p * dst_y); + + for (int i = 0; i < dst_h; i++) + { + memcpy(dst, src, size); + + src += src_p; + dst += dst_p; + } +} + +void blt_overlap( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + int bpp) +{ + int bytes_pp = bpp / 8; + + size_t size = dst_w * bytes_pp; + + src += (src_x * bytes_pp) + (src_p * src_y); + dst += (dst_x * bytes_pp) + (dst_p * dst_y); + + if (dst_y > src_y) + { + src += src_p * dst_h; + dst += dst_p * dst_h; + + for (int i = dst_h; i-- > 0;) + { + src -= src_p; + dst -= dst_p; + + memmove(dst, src, size); + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + memmove(dst, src, size); + + src += src_p; + dst += dst_p; + } + } +} + +void blt_colorkey( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_p, + unsigned int key_low, + unsigned int key_high, + int bpp) +{ + int bytes_pp = bpp / 8; + + size_t d_p = dst_p - (dst_w * bytes_pp); + size_t s_p = src_p - (dst_w * bytes_pp); + + src += (src_x * bytes_pp) + (src_p * src_y); + dst += (dst_x * bytes_pp) + (dst_p * dst_y); + + if (bpp == 8) + { + unsigned char key_l = (unsigned char)key_low; + unsigned char key_h = (unsigned char)key_high; + + if (key_l == key_h) + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned char c = *src++; + + if (c != key_l) + { + *dst = c; + } + + dst++; + } + + src += s_p; + dst += d_p; + } + } + else + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned char c = *src++; + + if (c < key_l || c > key_h) + { + *dst = c; + } + + dst++; + } + + src += s_p; + dst += d_p; + } + } + } + else if (bpp == 16) + { + unsigned short key_l = (unsigned short)key_low; + unsigned short key_h = (unsigned short)key_high; + + if (key_l == key_h) + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned short c = *((unsigned short*)src)++; + + if (c != key_l) + { + *((unsigned short*)dst) = c; + } + + ((unsigned short*)dst)++; + } + + src += s_p; + dst += d_p; + } + } + else + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned short c = *((unsigned short*)src)++; + + if (c < key_l || c > key_h) + { + *((unsigned short*)dst) = c; + } + + ((unsigned short*)dst)++; + } + + src += s_p; + dst += d_p; + } + } + } + else if (bpp == 32) + { + unsigned int key_l = (unsigned int)key_low; + unsigned int key_h = (unsigned int)key_high; + + if (key_l == key_h) + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned int c = *((unsigned int*)src)++; + + if (c != key_l) + { + *((unsigned int*)dst) = c; + } + + ((unsigned int*)dst)++; + } + + src += s_p; + dst += d_p; + } + } + else + { + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned int c = *((unsigned int*)src)++; + + if (c < key_l || c > key_h) + { + *((unsigned int*)dst) = c; + } + + ((unsigned int*)dst)++; + } + + src += s_p; + dst += d_p; + } + } + } +} + +void blt_colorkey_mirror_stretch( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src, + int src_x, + int src_y, + int src_w, + int src_h, + int src_p, + unsigned int key_low, + unsigned int key_high, + BOOL mirror_up_down, + BOOL mirror_left_right, + int bpp) +{ + int bytes_pp = bpp / 8; + + int dst_surf_w = dst_p / bytes_pp; + int src_surf_w = src_p / bytes_pp; + + float scale_w = (float)src_w / dst_w; + float scale_h = (float)src_h / dst_h; + + if (bpp == 8) + { + unsigned char key_l = (unsigned char)key_low; + unsigned char key_h = (unsigned char)key_high; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surf_w * (scaled_y + src_y); + int dst_row = dst_surf_w * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned char c = ((unsigned char*)src)[scaled_x + src_x + src_row]; + + if (c < key_l || c > key_h) + { + ((unsigned char*)dst)[x + dst_x + dst_row] = c; + } + } + } + } + else if (bpp == 16) + { + unsigned short key_l = (unsigned short)key_low; + unsigned short key_h = (unsigned short)key_high; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surf_w * (scaled_y + src_y); + int dst_row = dst_surf_w * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned short c = ((unsigned short*)src)[scaled_x + src_x + src_row]; + + if (c < key_l || c > key_h) + { + ((unsigned short*)dst)[x + dst_x + dst_row] = c; + } + } + } + } + else if (bpp == 32) + { + unsigned int key_l = (unsigned int)key_low; + unsigned int key_h = (unsigned int)key_high; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surf_w * (scaled_y + src_y); + int dst_row = dst_surf_w * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned int c = ((unsigned int*)src)[scaled_x + src_x + src_row]; + + if (c < key_l || c > key_h) + { + ((unsigned int*)dst)[x + dst_x + dst_row] = c; + } + } + } + } +} + +void blt_colorfill( + unsigned char* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned int color, + int bpp) +{ + int bytes_pp = bpp / 8; + + size_t size = dst_w * bytes_pp; + + dst += (dst_x * bytes_pp) + (dst_p * dst_y); + + if (bpp == 8) + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } + } + else if (bpp == 16) + { + if ((color & 0xFF) == ((color >> 8) & 0xFF)) + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } + } + else + { + unsigned short* first_row = (unsigned short*)dst; + + for (int x = 0; x < dst_w; x++) + { + first_row[x] = (unsigned short)color; + } + + for (int i = 1; i < dst_h; i++) + { + dst += dst_p; + memcpy(dst, first_row, size); + } + } + } + else if (bpp == 32) + { + if ((color & 0xFF) == ((color >> 8) & 0xFF) && + (color & 0xFF) == ((color >> 16) & 0xFF) && + (color & 0xFF) == ((color >> 24) & 0xFF)) + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } + } + else + { + unsigned int* first_row = (unsigned int*)dst; + + for (int x = 0; x < dst_w; x++) + { + first_row[x] = color; + } + + for (int i = 1; i < dst_h; i++) + { + dst += dst_p; + memcpy(dst, first_row, size); + } + } + } +} + +void blt_stretch( + unsigned char* dst_buf, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned char* src_buf, + int src_x, + int src_y, + int src_w, + int src_h, + int src_p, + int bpp) +{ + /* Linear scaling using integer math + * Since the scaling pattern for x will aways be the same, the pattern itself gets pre-calculated + * and stored in an array. + * Y scaling pattern gets calculated during the blit loop + */ + unsigned int x_ratio = (unsigned int)((src_w << 16) / dst_w) + 1; + unsigned int y_ratio = (unsigned int)((src_h << 16) / dst_h) + 1; + + unsigned int s_src_x, s_src_y; + unsigned int dest_base, source_base; + + scale_pattern* pattern = malloc((dst_w + 1) * (sizeof(scale_pattern))); + int pattern_idx = 0; + unsigned int last_src_x = 0; + + if (pattern != NULL) + { + pattern[pattern_idx] = (scale_pattern){ ONCE, 0, 0, 1 }; + + /* Build the pattern! */ + int x; + for (x = 1; x < dst_w; x++) { + s_src_x = (x * x_ratio) >> 16; + if (s_src_x == last_src_x) + { + if (pattern[pattern_idx].type == REPEAT || pattern[pattern_idx].type == ONCE) + { + pattern[pattern_idx].type = REPEAT; + pattern[pattern_idx].count++; + } + else if (pattern[pattern_idx].type == SEQUENCE) + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ REPEAT, x, s_src_x, 1 }; + } + } + else if (s_src_x == last_src_x + 1) + { + if (pattern[pattern_idx].type == SEQUENCE || pattern[pattern_idx].type == ONCE) + { + pattern[pattern_idx].type = SEQUENCE; + pattern[pattern_idx].count++; + } + else if (pattern[pattern_idx].type == REPEAT) + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; + } + } + else + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; + } + last_src_x = s_src_x; + } + pattern[pattern_idx + 1] = (scale_pattern){ END, 0, 0, 0 }; + + + /* Do the actual blitting */ + int bytes_pp = bpp / 8; + int dst_surf_w = dst_p / bytes_pp; + int src_surf_w = src_p / bytes_pp; + + int count = 0; + int y; + + for (y = 0; y < dst_h; y++) { + + dest_base = dst_x + dst_surf_w * (y + dst_y); + + s_src_y = (y * y_ratio) >> 16; + + source_base = src_x + src_surf_w * (s_src_y + src_y); + + pattern_idx = 0; + scale_pattern* current = &pattern[pattern_idx]; + + if (bpp == 8) + { + unsigned char* d, * s, v; + unsigned char* src = (unsigned char*)src_buf; + unsigned char* dst = (unsigned char*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + else if (bpp == 16) + { + unsigned short* d, * s, v; + unsigned short* src = (unsigned short*)src_buf; + unsigned short* dst = (unsigned short*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count * bytes_pp); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + else if (bpp == 32) + { + unsigned int* d, * s, v; + unsigned int* src = (unsigned int*)src_buf; + unsigned int* dst = (unsigned int*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count * bytes_pp); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + } + free(pattern); + } + +} diff --git a/src/ddsurface.c b/src/ddsurface.c index dd84191..9eb784b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -5,11 +5,11 @@ #include "hook.h" #include "ddsurface.h" #include "mouse.h" -#include "scale_pattern.h" #include "IDirectDrawSurface.h" #include "winapi_hooks.h" #include "debug.h" #include "utils.h" +#include "blt.h" HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurface) @@ -29,11 +29,11 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI } HRESULT dds_Blt( - IDirectDrawSurfaceImpl* This, - LPRECT lpDestRect, - IDirectDrawSurfaceImpl* lpDDSrcSurface, - LPRECT lpSrcRect, - DWORD dwFlags, + IDirectDrawSurfaceImpl* This, + LPRECT lpDestRect, + IDirectDrawSurfaceImpl* lpDDSrcSurface, + LPRECT lpSrcRect, + DWORD dwFlags, LPDDBLTFX lpDDBltFx) { dbg_dump_dds_blt_flags(dwFlags); @@ -121,79 +121,17 @@ HRESULT dds_Blt( void* dst_buf = dds_GetBuffer(This); void* src_buf = dds_GetBuffer(src_surface); - if (dst_buf && (dwFlags & DDBLT_COLORFILL) && dst_w > 0 && dst_h > 0) + if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) { - unsigned char* dst = (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); - unsigned char* first_row = dst; - unsigned int dst_pitch = dst_w * This->lx_pitch; - int x, i; - - if (This->bpp == 8) - { - unsigned char color = (unsigned char)lpDDBltFx->dwFillColor; - - for (i = 0; i < dst_h; i++) - { - memset(dst, color, dst_pitch); - dst += This->l_pitch; - } - } - else if (This->bpp == 16) - { - unsigned short* row1 = (unsigned short*)dst; - unsigned short color = (unsigned short)lpDDBltFx->dwFillColor; - - if ((color & 0xFF) == (color >> 8)) - { - unsigned char c8 = (unsigned char)(color & 0xFF); - - for (i = 0; i < dst_h; i++) - { - memset(dst, c8, dst_pitch); - dst += This->l_pitch; - } - } - else - { - for (x = 0; x < dst_w; x++) - row1[x] = color; - - for (i = 1; i < dst_h; i++) - { - dst += This->l_pitch; - memcpy(dst, first_row, dst_pitch); - } - } - } - else if (This->bpp == 32) - { - unsigned int* row1 = (unsigned int*)dst; - unsigned int color = lpDDBltFx->dwFillColor; - - if ((color & 0xFF) == ((color >> 8) & 0xFF) && - (color & 0xFF) == ((color >> 16) & 0xFF) && - (color & 0xFF) == ((color >> 24) & 0xFF)) - { - unsigned char c8 = (unsigned char)(color & 0xFF); - - for (i = 0; i < dst_h; i++) - { - memset(dst, c8, dst_pitch); - dst += This->l_pitch; - } - } - else - { - for (x = 0; x < dst_w; x++) - row1[x] = color; - - for (i = 1; i < dst_h; i++) - { - dst += This->l_pitch; - memcpy(dst, first_row, dst_pitch); - } - } - } + blt_colorfill( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + lpDDBltFx->dwFillColor, + This->bpp); } if (src_surface && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) @@ -215,8 +153,8 @@ HRESULT dds_Blt( StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); } else if ( - (dwFlags & DDBLT_KEYSRC) || - (dwFlags & DDBLT_KEYSRCOVERRIDE) || + (dwFlags & DDBLT_KEYSRC) || + (dwFlags & DDBLT_KEYSRCOVERRIDE) || mirror_left_right || mirror_up_down) { @@ -236,410 +174,91 @@ HRESULT dds_Blt( color_key.dwColorSpaceHighValue = color_key.dwColorSpaceLowValue; } - float scale_w = (float)src_w / dst_w; - float scale_h = (float)src_h / dst_h; - - if (This->bpp == 8) + if (src_w == dst_w && src_h == dst_h && !mirror_left_right && !mirror_up_down) { - unsigned char key_low = (unsigned char)color_key.dwColorSpaceLowValue; - unsigned char key_high = (unsigned char)color_key.dwColorSpaceHighValue; - - /* - if (src_w == dst_w && src_h == dst_h && !mirror_left_right && !mirror_up_down) - { - unsigned char* src = - (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); - - unsigned char* dst = - (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); - - unsigned int dst_p = This->l_pitch - (dst_w * This->lx_pitch); - unsigned int src_p = src_surface->l_pitch - (dst_w * src_surface->lx_pitch); - - if (key_low == key_high) - { - for (int y = 0; y < dst_h; y++) - { - for (int x = 0; x < dst_w; x++) - { - unsigned char c = *src++; - - if (c != key_low) - { - *dst = c; - } - - dst++; - } - - src += src_p; - dst += dst_p; - } - } - else - { - for (int i = 0; i < dst_h; i++) - { - for (int x = 0; x < dst_w; x++) - { - unsigned char c = *src++; - - if (c < key_low || c > key_high) - { - *dst = c; - } - - dst++; - } - - src += src_p; - dst += dst_p; - } - } - } - else - { - */ - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_surface->width * (scaled_y + src_y); - int dst_row = This->width * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned char c = ((unsigned char*)src_buf)[scaled_x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - //} - } - else if (This->bpp == 16) - { - unsigned short key_low = (unsigned short)color_key.dwColorSpaceLowValue; - unsigned short key_high = (unsigned short)color_key.dwColorSpaceHighValue; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_surface->width * (scaled_y + src_y); - int dst_row = This->width * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned short c = ((unsigned short*)src_buf)[scaled_x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned short*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - } - else if (This->bpp == 32) - { - unsigned int key_low = color_key.dwColorSpaceLowValue; - unsigned int key_high = color_key.dwColorSpaceHighValue; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_surface->width * (scaled_y + src_y); - int dst_row = This->width * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned int c = ((unsigned int*)src_buf)[scaled_x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned int*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - } - } - else - { - if (!is_stretch_blt) - { - int width = dst_w > src_w ? src_w : dst_w; - int height = dst_h > src_h ? src_h : dst_h; - - unsigned char* src = - (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); - - unsigned char* dst = - (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); - - unsigned int dst_pitch = width * This->lx_pitch; - - if (This == src_surface) - { - if (dst_y > src_y) - { - src += src_surface->l_pitch * height; - dst += This->l_pitch * height; - - for (int i = height; i-- > 0;) - { - src -= src_surface->l_pitch; - dst -= This->l_pitch; - - memmove(dst, src, dst_pitch); - } - } - else - { - for (int i = 0; i < height; i++) - { - memmove(dst, src, dst_pitch); - - src += src_surface->l_pitch; - dst += This->l_pitch; - } - } - } - else - { - for (int i = 0; i < height; i++) - { - memcpy(dst, src, dst_pitch); - - src += src_surface->l_pitch; - dst += This->l_pitch; - } - } + blt_colorkey( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + color_key.dwColorSpaceLowValue, + color_key.dwColorSpaceHighValue, + This->bpp); } else { - /* Linear scaling using integer math - * Since the scaling pattern for x will aways be the same, the pattern itself gets pre-calculated - * and stored in an array. - * Y scaling pattern gets calculated during the blit loop - */ - unsigned int x_ratio = (unsigned int)((src_w << 16) / dst_w) + 1; - unsigned int y_ratio = (unsigned int)((src_h << 16) / dst_h) + 1; - - unsigned int s_src_x, s_src_y; - unsigned int dest_base, source_base; - - scale_pattern* pattern = malloc((dst_w + 1) * (sizeof(scale_pattern))); - int pattern_idx = 0; - unsigned int last_src_x = 0; - - if (pattern != NULL) - { - pattern[pattern_idx] = (scale_pattern){ ONCE, 0, 0, 1 }; - - /* Build the pattern! */ - int x; - for (x = 1; x < dst_w; x++) { - s_src_x = (x * x_ratio) >> 16; - if (s_src_x == last_src_x) - { - if (pattern[pattern_idx].type == REPEAT || pattern[pattern_idx].type == ONCE) - { - pattern[pattern_idx].type = REPEAT; - pattern[pattern_idx].count++; - } - else if (pattern[pattern_idx].type == SEQUENCE) - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ REPEAT, x, s_src_x, 1 }; - } - } - else if (s_src_x == last_src_x + 1) - { - if (pattern[pattern_idx].type == SEQUENCE || pattern[pattern_idx].type == ONCE) - { - pattern[pattern_idx].type = SEQUENCE; - pattern[pattern_idx].count++; - } - else if (pattern[pattern_idx].type == REPEAT) - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; - } - } - else - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; - } - last_src_x = s_src_x; - } - pattern[pattern_idx + 1] = (scale_pattern){ END, 0, 0, 0 }; - - - /* Do the actual blitting */ - int count = 0; - int y; - - for (y = 0; y < dst_h; y++) { - - dest_base = dst_x + This->width * (y + dst_y); - - s_src_y = (y * y_ratio) >> 16; - - source_base = src_x + src_surface->width * (s_src_y + src_y); - - pattern_idx = 0; - scale_pattern* current = &pattern[pattern_idx]; - - if (This->bpp == 8) - { - unsigned char* d, * s, v; - unsigned char* src = (unsigned char*)src_buf; - unsigned char* dst = (unsigned char*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count * This->lx_pitch); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); - } - else if (This->bpp == 16) - { - unsigned short* d, * s, v; - unsigned short* src = (unsigned short*)src_buf; - unsigned short* dst = (unsigned short*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count * This->lx_pitch); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); - } - else if (This->bpp == 32) - { - unsigned int* d, * s, v; - unsigned int* src = (unsigned int*)src_buf; - unsigned int* dst = (unsigned int*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count * This->lx_pitch); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); - } - } - free(pattern); - } + blt_colorkey_mirror_stretch( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_w, + src_h, + src_surface->l_pitch, + color_key.dwColorSpaceLowValue, + color_key.dwColorSpaceHighValue, + mirror_up_down, + mirror_left_right, + This->bpp); } - + } + else if (is_stretch_blt) + { + blt_stretch( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_w, + src_h, + src_surface->l_pitch, + This->bpp); + } + else if (This == src_surface) + { + blt_overlap( + dst_buf, + dst_x, + dst_y, + min(dst_w, src_w), + min(dst_h, src_h), + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + This->bpp); + } + else + { + blt_clean( + dst_buf, + dst_x, + dst_y, + min(dst_w, src_w), + min(dst_h, src_h), + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + This->bpp); } } @@ -666,11 +285,11 @@ HRESULT dds_Blt( } HRESULT dds_BltFast( - IDirectDrawSurfaceImpl* This, - DWORD dwX, - DWORD dwY, - IDirectDrawSurfaceImpl* lpDDSrcSurface, - LPRECT lpSrcRect, + IDirectDrawSurfaceImpl* This, + DWORD dwX, + DWORD dwY, + IDirectDrawSurfaceImpl* lpDDSrcSurface, + LPRECT lpSrcRect, DWORD dwFlags) { dbg_dump_dds_blt_fast_flags(dwFlags); @@ -772,116 +391,50 @@ HRESULT dds_BltFast( } else if (dwFlags & DDBLTFAST_SRCCOLORKEY) { - if (This->bpp == 8) - { - unsigned char key_low = (unsigned char)src_surface->color_key.dwColorSpaceLowValue; - unsigned char key_high = (unsigned char)src_surface->color_key.dwColorSpaceHighValue; - - for (int y = 0; y < dst_h; y++) - { - int dst_row = This->width * (y + dst_y); - int src_row = src_surface->width * (y + src_y); - - for (int x = 0; x < dst_w; x++) - { - unsigned char c = ((unsigned char*)src_buf)[x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - } - else if (This->bpp == 16) - { - unsigned short key_low = (unsigned short)src_surface->color_key.dwColorSpaceLowValue; - unsigned short key_high = (unsigned short)src_surface->color_key.dwColorSpaceHighValue; - - for (int y = 0; y < dst_h; y++) - { - int dst_row = This->width * (y + dst_y); - int src_row = src_surface->width * (y + src_y); - - for (int x = 0; x < dst_w; x++) - { - unsigned short c = ((unsigned short*)src_buf)[x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned short*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - } - else if (This->bpp == 32) - { - unsigned int key_low = src_surface->color_key.dwColorSpaceLowValue; - unsigned int key_high = src_surface->color_key.dwColorSpaceHighValue; - - for (int y = 0; y < dst_h; y++) - { - int dst_row = This->width * (y + dst_y); - int src_row = src_surface->width * (y + src_y); - - for (int x = 0; x < dst_w; x++) - { - unsigned int c = ((unsigned int*)src_buf)[x + src_x + src_row]; - - if (c < key_low || c > key_high) - { - ((unsigned int*)dst_buf)[x + dst_x + dst_row] = c; - } - } - } - } + blt_colorkey( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + src_surface->color_key.dwColorSpaceLowValue, + src_surface->color_key.dwColorSpaceHighValue, + This->bpp); + } + else if (This == src_surface) + { + blt_overlap( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + This->bpp); } else { - unsigned char* src = - (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); - - unsigned char* dst = - (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); - - unsigned int dst_pitch = dst_w * This->lx_pitch; - - if (This == src_surface) - { - if (dst_y > src_y) - { - src += src_surface->l_pitch * dst_h; - dst += This->l_pitch * dst_h; - - for (int i = dst_h; i-- > 0;) - { - src -= src_surface->l_pitch; - dst -= This->l_pitch; - - memmove(dst, src, dst_pitch); - } - } - else - { - for (int i = 0; i < dst_h; i++) - { - memmove(dst, src, dst_pitch); - - src += src_surface->l_pitch; - dst += This->l_pitch; - } - } - } - else - { - for (int i = 0; i < dst_h; i++) - { - memcpy(dst, src, dst_pitch); - - src += src_surface->l_pitch; - dst += This->l_pitch; - } - } + blt_clean( + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + src_buf, + src_x, + src_y, + src_surface->l_pitch, + This->bpp); } } @@ -960,8 +513,8 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur } HRESULT dds_EnumAttachedSurfaces( - IDirectDrawSurfaceImpl* This, - LPVOID lpContext, + IDirectDrawSurfaceImpl* This, + LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) { static DDSURFACEDESC2 desc; @@ -1163,10 +716,10 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix } HRESULT dds_Lock( - IDirectDrawSurfaceImpl* This, - LPRECT lpDestRect, - LPDDSURFACEDESC lpDDSurfaceDesc, - DWORD dwFlags, + IDirectDrawSurfaceImpl* This, + LPRECT lpDestRect, + LPDDSURFACEDESC lpDDSurfaceDesc, + DWORD dwFlags, HANDLE hEvent) { dbg_dump_dds_lock_flags(dwFlags); @@ -1409,9 +962,9 @@ void* dds_GetBuffer(IDirectDrawSurfaceImpl* This) } HRESULT dd_CreateSurface( - IDirectDrawImpl* This, - LPDDSURFACEDESC lpDDSurfaceDesc, - IDirectDrawSurfaceImpl** lpDDSurface, + IDirectDrawImpl* This, + LPDDSURFACEDESC lpDDSurfaceDesc, + IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter) { dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); @@ -1429,7 +982,7 @@ HRESULT dd_CreateSurface( return DD_OK; } - IDirectDrawSurfaceImpl* dst_surface = + IDirectDrawSurfaceImpl* dst_surface = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl)); dst_surface->lpVtbl = &g_dds_vtbl; @@ -1490,7 +1043,7 @@ HRESULT dd_CreateSurface( } } - dst_surface->bmi = + dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -1507,7 +1060,7 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits); } - dst_surface->bmi->bmiHeader.biSizeImage = + dst_surface->bmi->bmiHeader.biSizeImage = ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; if (dst_surface->bpp == 8) @@ -1534,7 +1087,7 @@ HRESULT dd_CreateSurface( } dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); - dst_surface->bitmap = + dst_surface->bitmap = CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); @@ -1579,10 +1132,10 @@ HRESULT dd_CreateSurface( } TRACE( - " surface = %p (%ux%u@%u)\n", - dst_surface, - dst_surface->width, - dst_surface->height, + " surface = %p (%ux%u@%u)\n", + dst_surface, + dst_surface->width, + dst_surface->height, dst_surface->bpp); *lpDDSurface = dst_surface; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 9a267b4..5915280 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -8,6 +8,7 @@ #include "render_d3d9.h" #include "utils.h" #include "wndproc.h" +#include "blt.h" #include "debug.h" @@ -388,17 +389,18 @@ DWORD WINAPI d3d9_render_main(void) if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) { - unsigned char* src = (unsigned char*)g_ddraw->primary->surface; - unsigned char* dst = (unsigned char*)lock_rc.pBits; - - int i; - for (i = 0; i < g_ddraw->height; i++) - { - memcpy(dst, src, g_ddraw->primary->l_pitch); - - src += g_ddraw->primary->l_pitch; - dst += lock_rc.Pitch; - } + blt_clean( + lock_rc.pBits, + 0, + 0, + min(g_ddraw->width, g_ddraw->primary->width), + min(g_ddraw->height, g_ddraw->primary->height), + lock_rc.Pitch, + g_ddraw->primary->surface, + 0, + 0, + g_ddraw->primary->l_pitch, + g_ddraw->primary->bpp); IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); } From c21123b60674617d8cc658427c01ad2b9c688d6a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 04:20:51 +0200 Subject: [PATCH 0071/1724] specify full path to ddraw.ini in case of bad working dir --- inc/config.h | 1 + src/config.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index f70523c..71e8693 100644 --- a/inc/config.h +++ b/inc/config.h @@ -12,6 +12,7 @@ typedef struct CNCDDRAWCONFIG char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; + char process_file_ext[MAX_PATH]; int save_settings; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 6788097..c92fd2a 100644 --- a/src/config.c +++ b/src/config.c @@ -1047,9 +1047,10 @@ static void cfg_init() /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { - _splitpath(g_config.game_path, NULL, NULL, g_config.process_file_name, NULL); + _splitpath(g_config.game_path, NULL, NULL, g_config.process_file_name, g_config.process_file_ext); - char* end = strstr(g_config.game_path, g_config.process_file_name); + int len = strlen(g_config.game_path) - strlen(g_config.process_file_name) - strlen(g_config.process_file_ext); + char* end = strstr(g_config.game_path + len, g_config.process_file_name); if (end) { @@ -1066,6 +1067,14 @@ static void cfg_init() if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) cfg_create_ini(); + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + cfg_create_ini(); + } } DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) From a05f918671029ecb4b2e63fdb36312104ea0c721 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 04:42:17 +0200 Subject: [PATCH 0072/1724] #164 adjust Atrox preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index c92fd2a..aad6132 100644 --- a/src/config.c +++ b/src/config.c @@ -375,6 +375,7 @@ static void cfg_create_ini() "; Atrox\n" "[Atrox]\n" "fixchilds=0\n" + "adjmouse=false\n" "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" From 20d3cf06d85e27c34f248694a8c665fe295fa737 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 06:57:15 +0200 Subject: [PATCH 0073/1724] enable GameHandlesClose for Infantry Online to make sure it can save its settings properly --- src/config.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index aad6132..aa4a039 100644 --- a/src/config.c +++ b/src/config.c @@ -9,6 +9,7 @@ #include "render_ogl.h" #include "hook.h" #include "debug.h" +#include "dllmain.h" static void cfg_init(); static void cfg_create_ini(); @@ -54,7 +55,11 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); + + if (g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE)) + { + GameHandlesClose = TRUE; + } g_ddraw->hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); g_ddraw->hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); From b25612fe32bb68649b3f0ca7af3e92254519b652 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 07:34:23 +0200 Subject: [PATCH 0074/1724] update makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 7889b8e..5b0fbbc 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,8 @@ FILES = src/IDirect3D/IDirect3D.c \ src/IDirectDraw/IDirectDrawSurface.c \ src/IDirectDraw/IDirectDrawGammaControl.c \ src/IAMMediaStream/IAMMediaStream.c \ + src/crc32.c \ + src/blt.c \ src/dd.c \ src/ddpalette.c \ src/ddsurface.c \ From e86a0ae4d93a2db537f72876ee5bd3869769164f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 08:12:11 +0200 Subject: [PATCH 0075/1724] fix GCC build --- src/blt.c | 50 ++++++++++++++++++++++++++++---------------------- src/config.c | 2 +- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/blt.c b/src/blt.c index 79d9314..f5c9eac 100644 --- a/src/blt.c +++ b/src/blt.c @@ -95,8 +95,8 @@ void blt_colorkey( { int bytes_pp = bpp / 8; - size_t d_p = dst_p - (dst_w * bytes_pp); - size_t s_p = src_p - (dst_w * bytes_pp); + size_t d_p = (dst_p / bytes_pp) - dst_w; + size_t s_p = (src_p / bytes_pp) - dst_w; src += (src_x * bytes_pp) + (src_p * src_y); dst += (dst_x * bytes_pp) + (dst_p * dst_y); @@ -152,24 +152,27 @@ void blt_colorkey( unsigned short key_l = (unsigned short)key_low; unsigned short key_h = (unsigned short)key_high; + unsigned short* d = (unsigned short*)dst; + unsigned short* s = (unsigned short*)src; + if (key_l == key_h) { for (int y = 0; y < dst_h; y++) { for (int x = 0; x < dst_w; x++) { - unsigned short c = *((unsigned short*)src)++; + unsigned short c = *s++; if (c != key_l) { - *((unsigned short*)dst) = c; + *d = c; } - ((unsigned short*)dst)++; + d++; } - src += s_p; - dst += d_p; + s += s_p; + d += d_p; } } else @@ -178,18 +181,18 @@ void blt_colorkey( { for (int x = 0; x < dst_w; x++) { - unsigned short c = *((unsigned short*)src)++; + unsigned short c = *s++; if (c < key_l || c > key_h) { - *((unsigned short*)dst) = c; + *d = c; } - ((unsigned short*)dst)++; + d++; } - src += s_p; - dst += d_p; + s += s_p; + d += d_p; } } } @@ -198,24 +201,27 @@ void blt_colorkey( unsigned int key_l = (unsigned int)key_low; unsigned int key_h = (unsigned int)key_high; + unsigned int* d = (unsigned int*)dst; + unsigned int* s = (unsigned int*)src; + if (key_l == key_h) { for (int y = 0; y < dst_h; y++) { for (int x = 0; x < dst_w; x++) { - unsigned int c = *((unsigned int*)src)++; + unsigned int c = *s++; if (c != key_l) { - *((unsigned int*)dst) = c; + *d = c; } - ((unsigned int*)dst)++; + d++; } - src += s_p; - dst += d_p; + s += s_p; + d += d_p; } } else @@ -224,18 +230,18 @@ void blt_colorkey( { for (int x = 0; x < dst_w; x++) { - unsigned int c = *((unsigned int*)src)++; + unsigned int c = *s++; if (c < key_l || c > key_h) { - *((unsigned int*)dst) = c; + *d = c; } - ((unsigned int*)dst)++; + d++; } - src += s_p; - dst += d_p; + s += s_p; + d += d_p; } } } diff --git a/src/config.c b/src/config.c index aa4a039..8a40c21 100644 --- a/src/config.c +++ b/src/config.c @@ -56,7 +56,7 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - if (g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE)) + if ((g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE))) { GameHandlesClose = TRUE; } From 8df3d5dcb47e2c7c67ac118953b4983a85bd5aa5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Sep 2022 08:20:20 +0200 Subject: [PATCH 0076/1724] enable optimizations --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5b0fbbc..6211c58 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -include config.mk WINDRES ?= windres -LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s +LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -O3 CFLAGS = -std=c99 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 From 10d0477cbd22c61a3fa607603ee82e744b7079c4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 10:44:04 +0200 Subject: [PATCH 0077/1724] add color conversion blitters --- inc/blt.h | 24 ++++++++++++ src/blt.c | 100 ++++++++++++++++++++++++++++++++++++++++------- src/screenshot.c | 67 ++++++++++++++++--------------- 3 files changed, 143 insertions(+), 48 deletions(-) diff --git a/inc/blt.h b/inc/blt.h index f216988..363139f 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -75,6 +75,30 @@ void blt_colorfill( unsigned int color, int bpp); +void blt_rgb565_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned short* src, + int src_x, + int src_y, + int src_p); + +void blt_bgra8888_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned int* src, + int src_x, + int src_y, + int src_p); + void blt_stretch( unsigned char* dst_buf, int dst_x, diff --git a/src/blt.c b/src/blt.c index f5c9eac..9bafb50 100644 --- a/src/blt.c +++ b/src/blt.c @@ -95,8 +95,8 @@ void blt_colorkey( { int bytes_pp = bpp / 8; - size_t d_p = (dst_p / bytes_pp) - dst_w; - size_t s_p = (src_p / bytes_pp) - dst_w; + size_t s_a = (src_p / bytes_pp) - dst_w; + size_t d_a = (dst_p / bytes_pp) - dst_w; src += (src_x * bytes_pp) + (src_p * src_y); dst += (dst_x * bytes_pp) + (dst_p * dst_y); @@ -122,8 +122,8 @@ void blt_colorkey( dst++; } - src += s_p; - dst += d_p; + src += s_a; + dst += d_a; } } else @@ -142,8 +142,8 @@ void blt_colorkey( dst++; } - src += s_p; - dst += d_p; + src += s_a; + dst += d_a; } } } @@ -171,8 +171,8 @@ void blt_colorkey( d++; } - s += s_p; - d += d_p; + s += s_a; + d += d_a; } } else @@ -191,8 +191,8 @@ void blt_colorkey( d++; } - s += s_p; - d += d_p; + s += s_a; + d += d_a; } } } @@ -220,8 +220,8 @@ void blt_colorkey( d++; } - s += s_p; - d += d_p; + s += s_a; + d += d_a; } } else @@ -240,8 +240,8 @@ void blt_colorkey( d++; } - s += s_p; - d += d_p; + s += s_a; + d += d_a; } } } @@ -449,6 +449,78 @@ void blt_colorfill( } } +void blt_rgb565_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned short* src, + int src_x, + int src_y, + int src_p) +{ + size_t s_a = (src_p / sizeof(unsigned short)) - dst_w; + size_t d_a = (dst_p / sizeof(unsigned int)) - dst_w; + + src += (src_x * sizeof(unsigned short)) + (src_p * src_y); + dst += (dst_x * sizeof(unsigned int)) + (dst_p * dst_y); + + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned short pixel = *src++; + + BYTE r = ((pixel & 0xF800) >> 11) << 3; + BYTE g = ((pixel & 0x07E0) >> 5) << 2; + BYTE b = ((pixel & 0x001F)) << 3; + + *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; + } + + src += s_a; + dst += d_a; + } +} + +void blt_bgra8888_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned int* src, + int src_x, + int src_y, + int src_p) +{ + size_t s_a = (src_p / sizeof(unsigned int)) - dst_w; + size_t d_a = (dst_p / sizeof(unsigned int)) - dst_w; + + src += (src_x * sizeof(unsigned int)) + (src_p * src_y); + dst += (dst_x * sizeof(unsigned int)) + (dst_p * dst_y); + + for (int y = 0; y < dst_h; y++) + { + for (int x = 0; x < dst_w; x++) + { + unsigned int pixel = *src++; + + BYTE r = pixel >> 16; + BYTE g = pixel >> 8; + BYTE b = pixel; + + *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; + } + + src += s_a; + dst += d_a; + } +} + void blt_stretch( unsigned char* dst_buf, int dst_x, diff --git a/src/screenshot.c b/src/screenshot.c index ee9a3d4..457afb9 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -6,6 +6,7 @@ #include "ddpalette.h" #include "ddsurface.h" #include "lodepng.h" +#include "blt.h" static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) @@ -29,7 +30,15 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) unsigned char* dst_buf = NULL; size_t dst_buf_size = 0; - unsigned int error = lodepng_encode(&dst_buf, &dst_buf_size, dds_GetBuffer(src), src->width, src->height, &state); + + unsigned int error = + lodepng_encode( + &dst_buf, + &dst_buf_size, + dds_GetBuffer(src), + src->l_pitch / src->lx_pitch, /* can't specify pitch so we use bitmap real width */ + src->height, + &state); if (!error && dst_buf) lodepng_save_file(dst_buf, dst_buf_size, filename); @@ -49,22 +58,17 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) if (buf) { - unsigned short* src_buf = (unsigned short*)dds_GetBuffer(src); - unsigned int* dst_buf = buf; - - for (int y = 0; y < src->height; y++) - { - for (int x = 0; x < src->width; x++) - { - unsigned short pixel = *src_buf++; - - BYTE red = ((pixel & 0xF800) >> 11) << 3; - BYTE green = ((pixel & 0x07E0) >> 5) << 2; - BYTE blue = ((pixel & 0x001F)) << 3; - - *dst_buf++ = (0xFF << 24) | (blue << 16) | (green << 8) | red; - } - } + blt_rgb565_to_rgba8888( + buf, + 0, + 0, + src->width, + src->height, + src->width * 4, + dds_GetBuffer(src), + 0, + 0, + src->l_pitch); error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); @@ -81,22 +85,17 @@ static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) if (buf) { - unsigned int* src_buf = (unsigned int*)dds_GetBuffer(src); - unsigned int* dst_buf = buf; - - for (int y = 0; y < src->height; y++) - { - for (int x = 0; x < src->width; x++) - { - unsigned int pixel = *src_buf++; - - BYTE red = (pixel >> 16) & 0xFF; - BYTE green = (pixel >> 8) & 0xFF; - BYTE blue = pixel & 0xFF; - - *dst_buf++ = (0xFF << 24) | (blue << 16) | (green << 8) | red; - } - } + blt_bgra8888_to_rgba8888( + buf, + 0, + 0, + src->width, + src->height, + src->width * 4, + dds_GetBuffer(src), + 0, + 0, + src->l_pitch); error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); @@ -108,7 +107,7 @@ static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) { - if (!src || !dds_GetBuffer(src)) + if (!src || !dds_GetBuffer(src) || !src->width || !src->height) return FALSE; char title[128]; From 1564c538fdfde99e34cc440e42436dc5c0085242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 10:57:16 +0200 Subject: [PATCH 0078/1724] use sizeof index 0 --- src/blt.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/blt.c b/src/blt.c index 9bafb50..d057eda 100644 --- a/src/blt.c +++ b/src/blt.c @@ -461,11 +461,11 @@ void blt_rgb565_to_rgba8888( int src_y, int src_p) { - size_t s_a = (src_p / sizeof(unsigned short)) - dst_w; - size_t d_a = (dst_p / sizeof(unsigned int)) - dst_w; + size_t s_a = (src_p / sizeof(src[0])) - dst_w; + size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - src += (src_x * sizeof(unsigned short)) + (src_p * src_y); - dst += (dst_x * sizeof(unsigned int)) + (dst_p * dst_y); + src += (src_x * sizeof(src[0])) + (src_p * src_y); + dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); for (int y = 0; y < dst_h; y++) { @@ -497,11 +497,11 @@ void blt_bgra8888_to_rgba8888( int src_y, int src_p) { - size_t s_a = (src_p / sizeof(unsigned int)) - dst_w; - size_t d_a = (dst_p / sizeof(unsigned int)) - dst_w; + size_t s_a = (src_p / sizeof(src[0])) - dst_w; + size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - src += (src_x * sizeof(unsigned int)) + (src_p * src_y); - dst += (dst_x * sizeof(unsigned int)) + (dst_p * dst_y); + src += (src_x * sizeof(src[0])) + (src_p * src_y); + dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); for (int y = 0; y < dst_h; y++) { From 3ac47313e2ad610049c0841e06a4e169782beeab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 11:25:15 +0200 Subject: [PATCH 0079/1724] don't use min macro --- src/config.c | 4 ++-- src/ddsurface.c | 19 ++++++++++--------- src/render_d3d9.c | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/config.c b/src/config.c index 8a40c21..ea6f50a 100644 --- a/src/config.c +++ b/src/config.c @@ -36,7 +36,7 @@ void cfg_load() g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); + g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); @@ -332,7 +332,7 @@ static void cfg_create_ini() "\n" "; Fixes issues where the pitch of a surface is not a multiple of 4\n" "; Note: Enable this if some parts of the screen are being displayed diagonally\n" - "fixpitch=false\n" + "fixpitch=true\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 9eb784b..7e867eb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1030,16 +1030,17 @@ HRESULT dd_CreateSurface( if (dst_surface->width && dst_surface->height) { - if (dst_surface->width == 71 && dst_surface->height == 24) dst_surface->width = 72; //Commandos + DWORD bmp_width = dst_surface->width; + DWORD bmp_height = dst_surface->height; dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->l_pitch = dst_surface->width * dst_surface->lx_pitch; + dst_surface->l_pitch = bmp_width * dst_surface->lx_pitch; - if (g_ddraw->fixpitch && !(dst_surface->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) + if (g_ddraw->fixpitch) { while (dst_surface->l_pitch % 4) { - dst_surface->l_pitch = ++dst_surface->width * dst_surface->lx_pitch; + dst_surface->l_pitch = ++bmp_width * dst_surface->lx_pitch; } } @@ -1047,8 +1048,8 @@ HRESULT dd_CreateSurface( HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dst_surface->bmi->bmiHeader.biWidth = dst_surface->width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); + dst_surface->bmi->bmiHeader.biWidth = bmp_width; + dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height + 200); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1061,7 +1062,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; + ((bmp_width * clr_bits + 31) & ~31) / 8 * bmp_height; if (dst_surface->bpp == 8) { @@ -1090,7 +1091,7 @@ HRESULT dd_CreateSurface( dst_surface->bitmap = CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); + dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); if (!dst_surface->bitmap) { @@ -1098,7 +1099,7 @@ HRESULT dd_CreateSurface( HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); + dst_surface->l_pitch * (bmp_height + 200) * dst_surface->lx_pitch); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5915280..8e2b07a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -393,8 +393,8 @@ DWORD WINAPI d3d9_render_main(void) lock_rc.pBits, 0, 0, - min(g_ddraw->width, g_ddraw->primary->width), - min(g_ddraw->height, g_ddraw->primary->height), + g_ddraw->primary->width, + g_ddraw->primary->height, lock_rc.Pitch, g_ddraw->primary->surface, 0, From 1e57228500d1109e86fbb286c5eccc9a82c8c3e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 11:26:53 +0200 Subject: [PATCH 0080/1724] Revert "don't use min macro" This reverts commit 3ac47313e2ad610049c0841e06a4e169782beeab. --- src/config.c | 4 ++-- src/ddsurface.c | 19 +++++++++---------- src/render_d3d9.c | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/config.c b/src/config.c index ea6f50a..8a40c21 100644 --- a/src/config.c +++ b/src/config.c @@ -36,7 +36,7 @@ void cfg_load() g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); + g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); @@ -332,7 +332,7 @@ static void cfg_create_ini() "\n" "; Fixes issues where the pitch of a surface is not a multiple of 4\n" "; Note: Enable this if some parts of the screen are being displayed diagonally\n" - "fixpitch=true\n" + "fixpitch=false\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 7e867eb..9eb784b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1030,17 +1030,16 @@ HRESULT dd_CreateSurface( if (dst_surface->width && dst_surface->height) { - DWORD bmp_width = dst_surface->width; - DWORD bmp_height = dst_surface->height; + if (dst_surface->width == 71 && dst_surface->height == 24) dst_surface->width = 72; //Commandos dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->l_pitch = bmp_width * dst_surface->lx_pitch; + dst_surface->l_pitch = dst_surface->width * dst_surface->lx_pitch; - if (g_ddraw->fixpitch) + if (g_ddraw->fixpitch && !(dst_surface->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) { while (dst_surface->l_pitch % 4) { - dst_surface->l_pitch = ++bmp_width * dst_surface->lx_pitch; + dst_surface->l_pitch = ++dst_surface->width * dst_surface->lx_pitch; } } @@ -1048,8 +1047,8 @@ HRESULT dd_CreateSurface( HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dst_surface->bmi->bmiHeader.biWidth = bmp_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height + 200); + dst_surface->bmi->bmiHeader.biWidth = dst_surface->width; + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1062,7 +1061,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((bmp_width * clr_bits + 31) & ~31) / 8 * bmp_height; + ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { @@ -1091,7 +1090,7 @@ HRESULT dd_CreateSurface( dst_surface->bitmap = CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); - dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) { @@ -1099,7 +1098,7 @@ HRESULT dd_CreateSurface( HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (bmp_height + 200) * dst_surface->lx_pitch); + dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 8e2b07a..5915280 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -393,8 +393,8 @@ DWORD WINAPI d3d9_render_main(void) lock_rc.pBits, 0, 0, - g_ddraw->primary->width, - g_ddraw->primary->height, + min(g_ddraw->width, g_ddraw->primary->width), + min(g_ddraw->height, g_ddraw->primary->height), lock_rc.Pitch, g_ddraw->primary->surface, 0, From efad3e0fd5e8565dca9b35e77de38e9b5c35e09c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 11:30:27 +0200 Subject: [PATCH 0081/1724] don't use min macro --- src/render_d3d9.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5915280..8e2b07a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -393,8 +393,8 @@ DWORD WINAPI d3d9_render_main(void) lock_rc.pBits, 0, 0, - min(g_ddraw->width, g_ddraw->primary->width), - min(g_ddraw->height, g_ddraw->primary->height), + g_ddraw->primary->width, + g_ddraw->primary->height, lock_rc.Pitch, g_ddraw->primary->surface, 0, From e578df74e341a972fc53a32fa123c15c6c96ba3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 12:57:05 +0200 Subject: [PATCH 0082/1724] make fixpitch setting working with primary surface too --- inc/render_ogl.h | 1 - src/config.c | 4 ++-- src/ddsurface.c | 19 ++++++++++--------- src/render_d3d9.c | 2 ++ src/render_gdi.c | 2 ++ src/render_ogl.c | 14 ++++++++------ 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index efd4be9..4de364f 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -32,7 +32,6 @@ typedef struct OGLRENDERER GLuint scale_vbos[3]; GLuint scale_vao; BOOL use_opengl; - BOOL adjust_alignment; BOOL filter_bilinear; } OGLRENDERER; diff --git a/src/config.c b/src/config.c index 8a40c21..ea6f50a 100644 --- a/src/config.c +++ b/src/config.c @@ -36,7 +36,7 @@ void cfg_load() g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); + g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); @@ -332,7 +332,7 @@ static void cfg_create_ini() "\n" "; Fixes issues where the pitch of a surface is not a multiple of 4\n" "; Note: Enable this if some parts of the screen are being displayed diagonally\n" - "fixpitch=false\n" + "fixpitch=true\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 9eb784b..7e867eb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1030,16 +1030,17 @@ HRESULT dd_CreateSurface( if (dst_surface->width && dst_surface->height) { - if (dst_surface->width == 71 && dst_surface->height == 24) dst_surface->width = 72; //Commandos + DWORD bmp_width = dst_surface->width; + DWORD bmp_height = dst_surface->height; dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->l_pitch = dst_surface->width * dst_surface->lx_pitch; + dst_surface->l_pitch = bmp_width * dst_surface->lx_pitch; - if (g_ddraw->fixpitch && !(dst_surface->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) + if (g_ddraw->fixpitch) { while (dst_surface->l_pitch % 4) { - dst_surface->l_pitch = ++dst_surface->width * dst_surface->lx_pitch; + dst_surface->l_pitch = ++bmp_width * dst_surface->lx_pitch; } } @@ -1047,8 +1048,8 @@ HRESULT dd_CreateSurface( HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dst_surface->bmi->bmiHeader.biWidth = dst_surface->width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); + dst_surface->bmi->bmiHeader.biWidth = bmp_width; + dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height + 200); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1061,7 +1062,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; + ((bmp_width * clr_bits + 31) & ~31) / 8 * bmp_height; if (dst_surface->bpp == 8) { @@ -1090,7 +1091,7 @@ HRESULT dd_CreateSurface( dst_surface->bitmap = CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); + dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); if (!dst_surface->bitmap) { @@ -1098,7 +1099,7 @@ HRESULT dd_CreateSurface( HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); + dst_surface->l_pitch * (bmp_height + 200) * dst_surface->lx_pitch); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 8e2b07a..e34482f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -361,6 +361,8 @@ DWORD WINAPI d3d9_render_main(void) if (g_ddraw->primary && g_ddraw->primary->bpp == g_ddraw->bpp && + g_ddraw->primary->width == g_ddraw->width && + g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { if (g_ddraw->vhack) diff --git a/src/render_gdi.c b/src/render_gdi.c index 74528f3..ce1fc92 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -49,6 +49,8 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->primary && g_ddraw->primary->bpp == g_ddraw->bpp && + g_ddraw->primary->width == g_ddraw->width && + g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { if (warning_end_tick) diff --git a/src/render_ogl.c b/src/render_ogl.c index 87c6b1e..2b7948e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -184,8 +184,6 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); - g_ogl.adjust_alignment = (width % 4) != 0; - g_ogl.scale_w = (float)width / g_ogl.surface_tex_width; g_ogl.scale_h = (float)height / g_ogl.surface_tex_height; @@ -598,6 +596,8 @@ static void ogl_render() if (g_ddraw->primary && g_ddraw->primary->bpp == g_ddraw->bpp && + g_ddraw->primary->width == g_ddraw->width && + g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { if (g_ddraw->vhack) @@ -644,8 +644,10 @@ static void ogl_render() glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - if (g_ogl.adjust_alignment) - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + DWORD row_len = g_ddraw->primary->l_pitch ? g_ddraw->primary->l_pitch / g_ddraw->primary->lx_pitch : 0; + + if (row_len != g_ddraw->primary->width) + glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len); glTexSubImage2D( GL_TEXTURE_2D, @@ -658,8 +660,8 @@ static void ogl_render() g_ogl.surface_type, g_ddraw->primary->surface); - if (g_ogl.adjust_alignment) - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + if (row_len != g_ddraw->primary->width) + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } static int error_check_count = 0; From 9becc9be3c9da2435fb8c8b80ab6bf75e4d3ccc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Sep 2022 23:55:45 +0200 Subject: [PATCH 0083/1724] ifdef debug code --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index fba6472..eee7eff 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -16,6 +16,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { +#ifdef _DEBUG_X if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP) @@ -29,6 +30,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam, lParam); } +#endif static BOOL in_size_move = FALSE; static int redraw_count = 0; From 25d86690072fe0a7efa4a9f2fb04144117f9ee4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Sep 2022 00:12:31 +0200 Subject: [PATCH 0084/1724] fix pitch values --- src/dd.c | 65 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/dd.c b/src/dd.c index c743689..eec51ac 100644 --- a/src/dd.c +++ b/src/dd.c @@ -128,17 +128,17 @@ HRESULT dd_EnumDisplayModes( memset(&s, 0, sizeof(s)); - s.dwSize = sizeof(DDSURFACEDESC); - s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; - s.dwHeight = m.dmPelsHeight; - s.dwWidth = m.dmPelsWidth; - s.lPitch = s.dwWidth; - s.dwRefreshRate = 60; - s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 8; + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwRefreshRate = 60; + s.dwHeight = m.dmPelsHeight; + s.dwWidth = m.dmPelsWidth; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) { if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) @@ -148,12 +148,12 @@ HRESULT dd_EnumDisplayModes( } } - s.lPitch = s.dwWidth * 2; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 16; s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) { @@ -164,12 +164,12 @@ HRESULT dd_EnumDisplayModes( } } - s.lPitch = s.dwWidth * 4; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 32; s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) { @@ -219,28 +219,29 @@ HRESULT dd_EnumDisplayModes( memset(&s, 0, sizeof(s)); - s.dwSize = sizeof(DDSURFACEDESC); - s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; - s.dwHeight = resolutions[i].cy; - s.dwWidth = resolutions[i].cx; - s.lPitch = s.dwWidth; - s.dwRefreshRate = 60; s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 8; + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwRefreshRate = 60; + s.dwHeight = resolutions[i].cy; + s.dwWidth = resolutions[i].cx; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); return DD_OK; } - s.lPitch = s.dwWidth * 2; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 16; s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { @@ -251,12 +252,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->resolutions == RESLIST_MINI) continue; - s.lPitch = s.dwWidth * 4; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 32; s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { @@ -322,34 +323,40 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) memset(lpDDSurfaceDesc, 0, size); - lpDDSurfaceDesc->dwSize = size; - lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; - lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; - lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth; - lpDDSurfaceDesc->dwRefreshRate = 60; lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + lpDDSurfaceDesc->dwSize = size; + lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + lpDDSurfaceDesc->dwRefreshRate = 60; + lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; + lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->bpp == 32) { - lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth * 4; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; } else if (g_ddraw->bpp != 8) { - lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth * 2; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; } } @@ -358,7 +365,9 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) { - *lpdwFreq = 60; + if (lpdwFreq) + *lpdwFreq = 60; + return DD_OK; } From adee27207adce80a3aa26f96130e7af3eb59432b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Sep 2022 00:27:38 +0200 Subject: [PATCH 0085/1724] add Undocumented compatibility settings to ddraw.ini --- src/config.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index ea6f50a..e022744 100644 --- a/src/config.c +++ b/src/config.c @@ -330,10 +330,6 @@ static void cfg_create_ini() "; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible\n" "nonexclusive=false\n" "\n" - "; Fixes issues where the pitch of a surface is not a multiple of 4\n" - "; Note: Enable this if some parts of the screen are being displayed diagonally\n" - "fixpitch=true\n" - "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" "\n" @@ -350,6 +346,20 @@ static void cfg_create_ini() "fpupreserve=false\n" "\n" "\n" + "; Undocumented compatibility settings\n" + "accuratetimers=false\n" + "fixpitch=true\n" + "fixwndprochook=false\n" + "novidmem=false\n" + "fixnotresponding=false\n" + "locktopleft=false\n" + "releasealt=false\n" + "gdilinear=false\n" + "allow_wmactivate=false\n" + "dinputhook=false\n" + "bpp=0\n" + "\n" + "\n" "\n" "; ### Hotkeys ###\n" "; Use the following settings to configure your hotkeys, 0x00 = disabled\n" From 0c525c08c1f2392ca078bb1931de9b7446e47587 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Sep 2022 00:30:34 +0200 Subject: [PATCH 0086/1724] adjust Atrox preset so it works with the unmodified CD version --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index e022744..691f6f2 100644 --- a/src/config.c +++ b/src/config.c @@ -389,8 +389,9 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "renderer=gdi\n" + "hook=2\n" "fixchilds=0\n" - "adjmouse=false\n" "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" From 7e414e961a844ddb7a55085c710188f1217e40e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Sep 2022 00:34:09 +0200 Subject: [PATCH 0087/1724] adjust Total Annihilation Beta Patch preset --- src/config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 691f6f2..f4af46e 100644 --- a/src/config.c +++ b/src/config.c @@ -977,12 +977,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Total Annihilation: Escalation\n" + "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" - "checkfile=.\\TAESC.INI\n" "renderer=opengl\n" "fixwndprochook=true\n" - "adjmouse=false\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" From 0f24bfae70947e74b7fb7b67bcc77577417ddbcf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Sep 2022 12:19:02 +0200 Subject: [PATCH 0088/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index ff366f2..e0fa908 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -3,8 +3,8 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 -#define VERSION_BUILD 8 -#define VERSION_REVISION 1 +#define VERSION_BUILD 9 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 21ccd1547fe65be658fd49a97d88688092cec236 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Sep 2022 07:34:40 +0200 Subject: [PATCH 0089/1724] fix build for newer SDK versions --- inc/dllmain.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inc/dllmain.h b/inc/dllmain.h index f23fef6..176d72a 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -16,12 +16,14 @@ typedef enum PROCESS_DPI_AWARENESS { PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS; +#ifndef _DPI_AWARENESS_CONTEXTS_ DECLARE_HANDLE(DPI_AWARENESS_CONTEXT); #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1) #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2) #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3) #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4) #define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5) +#endif typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS); typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); From 19c4d67087898097f0b2d92dc26bc6715410544c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 07:39:47 +0200 Subject: [PATCH 0090/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e0fa908..2cef748 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b03600fb4f79c55b460d5e5b5cd59fee68d6329d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 07:41:01 +0200 Subject: [PATCH 0091/1724] #101 clear backbuffer on flip --- inc/IDirectDrawSurface.h | 1 + inc/dd.h | 1 + src/config.c | 3 +++ src/ddsurface.c | 7 +++++++ 4 files changed, 12 insertions(+) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 97aa39f..f5f897e 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -21,6 +21,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD width; DWORD height; DWORD bpp; + DWORD size; DWORD flags; DWORD caps; diff --git a/inc/dd.h b/inc/dd.h index 45dea1c..0c6219c 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -146,6 +146,7 @@ typedef struct CNCDDRAW int fixchilds; BOOL fixwndprochook; BOOL fixnotresponding; + BOOL flipclear; BOOL locktopleft; BOOL d3d9linear; BOOL gdilinear; diff --git a/src/config.c b/src/config.c index f4af46e..76f6e44 100644 --- a/src/config.c +++ b/src/config.c @@ -39,6 +39,7 @@ void cfg_load() g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); + g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); @@ -357,6 +358,7 @@ static void cfg_create_ini() "gdilinear=false\n" "allow_wmactivate=false\n" "dinputhook=false\n" + "flipclear=false\n" "bpp=0\n" "\n" "\n" @@ -491,6 +493,7 @@ static void cfg_create_ini() "[CARMA95]\n" "renderer=opengl\n" "noactivateapp=true\n" + "flipclear=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 7e867eb..99eb515 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -545,6 +545,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa InterlockedExchangePointer(&backbuffer->surface, buf); InterlockedExchangePointer(&backbuffer->bitmap, bitmap); InterlockedExchangePointer(&backbuffer->hdc, dc); + + if (g_ddraw->flipclear) + { + memset(buf, 0, backbuffer->size); + } + LeaveCriticalSection(&g_ddraw->cs); if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer) @@ -1092,6 +1098,7 @@ HRESULT dd_CreateSurface( CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); + dst_surface->size = dst_surface->l_pitch * bmp_height * dst_surface->lx_pitch; if (!dst_surface->bitmap) { From 46121793ca1d969e27fda2d7ad03bafc42e2ec7b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 07:41:58 +0200 Subject: [PATCH 0092/1724] adjust second carma preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 76f6e44..295059b 100644 --- a/src/config.c +++ b/src/config.c @@ -499,6 +499,7 @@ static void cfg_create_ini() "[CARM95]\n" "renderer=opengl\n" "noactivateapp=true\n" + "flipclear=true\n" "\n" "; Carmageddon 2\n" "[Carma2_SW]\n" From dc0204cf71b8796aa6d4d6dee639e03b5109e27f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 09:34:48 +0200 Subject: [PATCH 0093/1724] remove fixpitch setting --- inc/dd.h | 1 - src/config.c | 22 ---------------------- src/dd.c | 1 + src/ddsurface.c | 14 +++----------- 4 files changed, 4 insertions(+), 34 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 0c6219c..a72aea0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -142,7 +142,6 @@ typedef struct CNCDDRAW BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; - BOOL fixpitch; int fixchilds; BOOL fixwndprochook; BOOL fixnotresponding; diff --git a/src/config.c b/src/config.c index 295059b..215d702 100644 --- a/src/config.c +++ b/src/config.c @@ -36,7 +36,6 @@ void cfg_load() g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); @@ -404,7 +403,6 @@ static void cfg_create_ini() "[empires]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" @@ -412,7 +410,6 @@ static void cfg_create_ini() "[empiresx]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" @@ -420,14 +417,12 @@ static void cfg_create_ini() "[EMPIRES2]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; Age of Empires II: The Conquerors\n" "[age2_x1]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; American Conquest\n" @@ -478,7 +473,6 @@ static void cfg_create_ini() "[comeon]\n" "maxgameticks=62\n" "fixchilds=3\n" - "fixpitch=true\n" "\n" "; Blood II - The Chosen / Shogo - Mobile Armor Division\n" "[Client]\n" @@ -658,35 +652,27 @@ static void cfg_create_ini() "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" "adjmouse=true\n" - "fixpitch=true\n" "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" "adjmouse=true\n" - "fixpitch=true\n" "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" "adjmouse=true\n" - "fixpitch=true\n" "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" "adjmouse=true\n" - "fixpitch=true\n" "renderer=opengl\n" "nonexclusive=true\n" "\n" - "; Commandos\n" - "[Comandos]\n" - "fixpitch=true\n" - "\n" "; Call To Power 2\n" "[ctp2]\n" "maintas=false\n" @@ -733,10 +719,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Eggsucker\n" - "[eggsucker]\n" - "fixpitch=true\n" - "\n" "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" @@ -933,14 +915,12 @@ static void cfg_create_ini() "[battlegrounds]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" "renderer=opengl\n" "nonexclusive=true\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; Stronghold Crusader HD\n" @@ -970,7 +950,6 @@ static void cfg_create_ini() "\n" "; Shadow Watch\n" "[sw]\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; Shadow Flare\n" @@ -1016,7 +995,6 @@ static void cfg_create_ini() "; Uprising\n" "[uprising]\n" "renderer=opengl\n" - "fixpitch=true\n" "adjmouse=true\n" "\n" "; Uprising 2\n" diff --git a/src/dd.c b/src/dd.c index eec51ac..d8fe35e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -12,6 +12,7 @@ #include "fps_limiter.h" #include "debug.h" #include "utils.h" +#include "blt.h" CNCDDRAW* g_ddraw = NULL; diff --git a/src/ddsurface.c b/src/ddsurface.c index 99eb515..5edbb21 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1036,19 +1036,11 @@ HRESULT dd_CreateSurface( if (dst_surface->width && dst_surface->height) { - DWORD bmp_width = dst_surface->width; - DWORD bmp_height = dst_surface->height; - dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->l_pitch = bmp_width * dst_surface->lx_pitch; + dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; - if (g_ddraw->fixpitch) - { - while (dst_surface->l_pitch % 4) - { - dst_surface->l_pitch = ++bmp_width * dst_surface->lx_pitch; - } - } + DWORD bmp_width = dst_surface->l_pitch / dst_surface->lx_pitch; + DWORD bmp_height = dst_surface->height; dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); From 28b7181ecb7b309b9e201c58dee76e42476ff061 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 09:40:27 +0200 Subject: [PATCH 0094/1724] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c8f9181..360dd87 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,6 @@ Note: cnc-ddraw does not support Direct3D/Glide, it will only work with games th - If **videos or other UI elements are invisible** then try to set `nonexclusive=true`. -- If some parts of the screen are **being displayed diagonally** then try to set `fixpitch=true`. - - If the game is **stuttering on a Freesync/G-Sync monitor** then try to set `minfps=-1`.   From bc40d0fc3bbe3756af0c64b5106f01265a352c0d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 09:51:19 +0200 Subject: [PATCH 0095/1724] some cleanup in surface.c --- src/ddsurface.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 5edbb21..1f10ed5 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1038,16 +1038,16 @@ HRESULT dd_CreateSurface( { dst_surface->lx_pitch = dst_surface->bpp / 8; dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; + dst_surface->size = dst_surface->l_pitch * dst_surface->height * dst_surface->lx_pitch; - DWORD bmp_width = dst_surface->l_pitch / dst_surface->lx_pitch; - DWORD bmp_height = dst_surface->height; + DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dst_surface->bmi->bmiHeader.biWidth = bmp_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height + 200); + dst_surface->bmi->bmiHeader.biWidth = aligned_width; + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1060,7 +1060,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((bmp_width * clr_bits + 31) & ~31) / 8 * bmp_height; + ((aligned_width * clr_bits + 31) & ~31) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { @@ -1089,8 +1089,7 @@ HRESULT dd_CreateSurface( dst_surface->bitmap = CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); - dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); - dst_surface->size = dst_surface->l_pitch * bmp_height * dst_surface->lx_pitch; + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) { @@ -1098,7 +1097,7 @@ HRESULT dd_CreateSurface( HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (bmp_height + 200) * dst_surface->lx_pitch); + dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) From f4a403f434e4e768fa6cdbed1c3628bc467e6b0b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 09:53:29 +0200 Subject: [PATCH 0096/1724] improve blt_colorfill performance --- src/blt.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/blt.c b/src/blt.c index d057eda..2805b3e 100644 --- a/src/blt.c +++ b/src/blt.c @@ -387,20 +387,34 @@ void blt_colorfill( if (bpp == 8) { - for (int i = 0; i < dst_h; i++) + if (size == dst_p) { - memset(dst, color, size); - dst += dst_p; + memset(dst, color, dst_p * dst_h); + } + else + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } } } else if (bpp == 16) { if ((color & 0xFF) == ((color >> 8) & 0xFF)) { - for (int i = 0; i < dst_h; i++) + if (size == dst_p) { - memset(dst, color, size); - dst += dst_p; + memset(dst, color, dst_p * dst_h); + } + else + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } } } else @@ -425,10 +439,17 @@ void blt_colorfill( (color & 0xFF) == ((color >> 16) & 0xFF) && (color & 0xFF) == ((color >> 24) & 0xFF)) { - for (int i = 0; i < dst_h; i++) + if (size == dst_p) { - memset(dst, color, size); - dst += dst_p; + memset(dst, color, dst_p * dst_h); + } + else + { + for (int i = 0; i < dst_h; i++) + { + memset(dst, color, size); + dst += dst_p; + } } } else From 5ad539bbb4edf7bdf42c5f86c8ac486bb632a538 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 10:18:24 +0200 Subject: [PATCH 0097/1724] remove duplicate code --- src/blt.c | 78 ++++++++++++++++--------------------------------------- 1 file changed, 23 insertions(+), 55 deletions(-) diff --git a/src/blt.c b/src/blt.c index 2805b3e..3c7e809 100644 --- a/src/blt.c +++ b/src/blt.c @@ -385,7 +385,13 @@ void blt_colorfill( dst += (dst_x * bytes_pp) + (dst_p * dst_y); - if (bpp == 8) + if (bpp == 8 || + (bpp == 16 && + (color & 0xFF) == ((color >> 8) & 0xFF)) || + (bpp == 32 && + (color & 0xFF) == ((color >> 8) & 0xFF) && + (color & 0xFF) == ((color >> 16) & 0xFF) && + (color & 0xFF) == ((color >> 24) & 0xFF))) { if (size == dst_p) { @@ -402,70 +408,32 @@ void blt_colorfill( } else if (bpp == 16) { - if ((color & 0xFF) == ((color >> 8) & 0xFF)) + unsigned short* first_row = (unsigned short*)dst; + + for (int x = 0; x < dst_w; x++) { - if (size == dst_p) - { - memset(dst, color, dst_p * dst_h); - } - else - { - for (int i = 0; i < dst_h; i++) - { - memset(dst, color, size); - dst += dst_p; - } - } + first_row[x] = (unsigned short)color; } - else + + for (int i = 1; i < dst_h; i++) { - unsigned short* first_row = (unsigned short*)dst; - - for (int x = 0; x < dst_w; x++) - { - first_row[x] = (unsigned short)color; - } - - for (int i = 1; i < dst_h; i++) - { - dst += dst_p; - memcpy(dst, first_row, size); - } + dst += dst_p; + memcpy(dst, first_row, size); } } else if (bpp == 32) { - if ((color & 0xFF) == ((color >> 8) & 0xFF) && - (color & 0xFF) == ((color >> 16) & 0xFF) && - (color & 0xFF) == ((color >> 24) & 0xFF)) + unsigned int* first_row = (unsigned int*)dst; + + for (int x = 0; x < dst_w; x++) { - if (size == dst_p) - { - memset(dst, color, dst_p * dst_h); - } - else - { - for (int i = 0; i < dst_h; i++) - { - memset(dst, color, size); - dst += dst_p; - } - } + first_row[x] = color; } - else + + for (int i = 1; i < dst_h; i++) { - unsigned int* first_row = (unsigned int*)dst; - - for (int x = 0; x < dst_w; x++) - { - first_row[x] = color; - } - - for (int i = 1; i < dst_h; i++) - { - dst += dst_p; - memcpy(dst, first_row, size); - } + dst += dst_p; + memcpy(dst, first_row, size); } } } From 4cacc350c92b3bb98dae397063be7df538a78234 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 13:41:46 +0200 Subject: [PATCH 0098/1724] improve blitter performance --- src/blt.c | 53 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/src/blt.c b/src/blt.c index 3c7e809..4193182 100644 --- a/src/blt.c +++ b/src/blt.c @@ -24,12 +24,19 @@ void blt_clean( src += (src_x * bytes_pp) + (src_p * src_y); dst += (dst_x * bytes_pp) + (dst_p * dst_y); - for (int i = 0; i < dst_h; i++) + if (size == dst_p && dst_p == src_p) { - memcpy(dst, src, size); + memcpy(dst, src, dst_p * dst_h); + } + else + { + for (int i = 0; i < dst_h; i++) + { + memcpy(dst, src, size); - src += src_p; - dst += dst_p; + src += src_p; + dst += dst_p; + } } } @@ -66,6 +73,10 @@ void blt_overlap( memmove(dst, src, size); } } + else if (size == dst_p && dst_p == src_p) + { + memmove(dst, src, dst_p * dst_h); + } else { for (int i = 0; i < dst_h; i++) @@ -108,9 +119,9 @@ void blt_colorkey( if (key_l == key_h) { - for (int y = 0; y < dst_h; y++) + for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = dst + dst_w; dst < w_end;) { unsigned char c = *src++; @@ -121,16 +132,16 @@ void blt_colorkey( dst++; } - + src += s_a; dst += d_a; } } else { - for (int y = 0; y < dst_h; y++) + for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = dst + dst_w; dst < w_end;) { unsigned char c = *src++; @@ -157,9 +168,9 @@ void blt_colorkey( if (key_l == key_h) { - for (int y = 0; y < dst_h; y++) + for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = d + dst_w; d < w_end;) { unsigned short c = *s++; @@ -177,9 +188,9 @@ void blt_colorkey( } else { - for (int y = 0; y < dst_h; y++) + for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = d + dst_w; d < w_end;) { unsigned short c = *s++; @@ -206,9 +217,9 @@ void blt_colorkey( if (key_l == key_h) { - for (int y = 0; y < dst_h; y++) + for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = d + dst_w; d < w_end;) { unsigned int c = *s++; @@ -226,9 +237,9 @@ void blt_colorkey( } else { - for (int y = 0; y < dst_h; y++) + for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = d + dst_w; d < w_end;) { unsigned int c = *s++; @@ -456,9 +467,9 @@ void blt_rgb565_to_rgba8888( src += (src_x * sizeof(src[0])) + (src_p * src_y); dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); - for (int y = 0; y < dst_h; y++) + for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = dst + dst_w; dst < w_end;) { unsigned short pixel = *src++; @@ -492,9 +503,9 @@ void blt_bgra8888_to_rgba8888( src += (src_x * sizeof(src[0])) + (src_p * src_y); dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); - for (int y = 0; y < dst_h; y++) + for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (int x = 0; x < dst_w; x++) + for (void* w_end = dst + dst_w; dst < w_end;) { unsigned int pixel = *src++; From a2475ed259693f769c6ab136141a68702b84e0fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 15:51:14 +0200 Subject: [PATCH 0099/1724] replace blt_stretch --- cnc-ddraw.vcxproj | 1 - cnc-ddraw.vcxproj.filters | 3 - inc/blt.h | 4 +- inc/scale_pattern.h | 18 --- src/blt.c | 274 ++++++++++++-------------------------- 5 files changed, 88 insertions(+), 212 deletions(-) delete mode 100644 inc/scale_pattern.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 4cde61e..db234cc 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -92,7 +92,6 @@ - diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 6871a26..39187f8 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -176,9 +176,6 @@ Header Files - - Header Files - Header Files diff --git a/inc/blt.h b/inc/blt.h index 363139f..34bffa4 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -100,13 +100,13 @@ void blt_bgra8888_to_rgba8888( int src_p); void blt_stretch( - unsigned char* dst_buf, + unsigned char* dst, int dst_x, int dst_y, int dst_w, int dst_h, int dst_p, - unsigned char* src_buf, + unsigned char* src, int src_x, int src_y, int src_w, diff --git a/inc/scale_pattern.h b/inc/scale_pattern.h deleted file mode 100644 index a4027df..0000000 --- a/inc/scale_pattern.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _SCALE_PATTERN_H -#define _SCALE_PATTERN_H - -typedef enum { - REPEAT, - SEQUENCE, - ONCE, - END -} SCALE_PATTERN_TYPE; - -typedef struct { - SCALE_PATTERN_TYPE type; - int dst_index; - int src_index; - int count; -} scale_pattern; - -#endif diff --git a/src/blt.c b/src/blt.c index 4193182..ef1bb47 100644 --- a/src/blt.c +++ b/src/blt.c @@ -522,13 +522,13 @@ void blt_bgra8888_to_rgba8888( } void blt_stretch( - unsigned char* dst_buf, + unsigned char* dst, int dst_x, int dst_y, int dst_w, int dst_h, int dst_p, - unsigned char* src_buf, + unsigned char* src, int src_x, int src_y, int src_w, @@ -536,203 +536,101 @@ void blt_stretch( int src_p, int bpp) { - /* Linear scaling using integer math - * Since the scaling pattern for x will aways be the same, the pattern itself gets pre-calculated - * and stored in an array. - * Y scaling pattern gets calculated during the blit loop - */ - unsigned int x_ratio = (unsigned int)((src_w << 16) / dst_w) + 1; - unsigned int y_ratio = (unsigned int)((src_h << 16) / dst_h) + 1; + int bytes_pp = bpp / 8; - unsigned int s_src_x, s_src_y; - unsigned int dest_base, source_base; + size_t size = dst_w * bytes_pp; - scale_pattern* pattern = malloc((dst_w + 1) * (sizeof(scale_pattern))); - int pattern_idx = 0; - unsigned int last_src_x = 0; + int dst_surf_w = dst_p / bytes_pp; + int src_surf_w = src_p / bytes_pp; - if (pattern != NULL) + float scale_w = (float)src_w / dst_w; + float scale_h = (float)src_h / dst_h; + + int last_y = -1; + int last_row = -1; + + if (bpp == 8) { - pattern[pattern_idx] = (scale_pattern){ ONCE, 0, 0, 1 }; + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + int dst_row = dst_surf_w * (y + dst_y); - /* Build the pattern! */ - int x; - for (x = 1; x < dst_w; x++) { - s_src_x = (x * x_ratio) >> 16; - if (s_src_x == last_src_x) + if (scaled_y == last_y) { - if (pattern[pattern_idx].type == REPEAT || pattern[pattern_idx].type == ONCE) - { - pattern[pattern_idx].type = REPEAT; - pattern[pattern_idx].count++; - } - else if (pattern[pattern_idx].type == SEQUENCE) - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ REPEAT, x, s_src_x, 1 }; - } + memcpy(&dst[dst_x + dst_row], &dst[dst_x + last_row], size); + continue; } - else if (s_src_x == last_src_x + 1) + + last_y = scaled_y; + last_row = dst_row; + + int src_row = src_surf_w * (scaled_y + src_y); + + for (int x = 0; x < dst_w; x++) { - if (pattern[pattern_idx].type == SEQUENCE || pattern[pattern_idx].type == ONCE) - { - pattern[pattern_idx].type = SEQUENCE; - pattern[pattern_idx].count++; - } - else if (pattern[pattern_idx].type == REPEAT) - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; - } - } - else - { - pattern_idx++; - pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; - } - last_src_x = s_src_x; - } - pattern[pattern_idx + 1] = (scale_pattern){ END, 0, 0, 0 }; + int scaled_x = (int)(x * scale_w); - - /* Do the actual blitting */ - int bytes_pp = bpp / 8; - int dst_surf_w = dst_p / bytes_pp; - int src_surf_w = src_p / bytes_pp; - - int count = 0; - int y; - - for (y = 0; y < dst_h; y++) { - - dest_base = dst_x + dst_surf_w * (y + dst_y); - - s_src_y = (y * y_ratio) >> 16; - - source_base = src_x + src_surf_w * (s_src_y + src_y); - - pattern_idx = 0; - scale_pattern* current = &pattern[pattern_idx]; - - if (bpp == 8) - { - unsigned char* d, * s, v; - unsigned char* src = (unsigned char*)src_buf; - unsigned char* dst = (unsigned char*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); - } - else if (bpp == 16) - { - unsigned short* d, * s, v; - unsigned short* src = (unsigned short*)src_buf; - unsigned short* dst = (unsigned short*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count * bytes_pp); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); - } - else if (bpp == 32) - { - unsigned int* d, * s, v; - unsigned int* src = (unsigned int*)src_buf; - unsigned int* dst = (unsigned int*)dst_buf; - - do { - switch (current->type) - { - case ONCE: - dst[dest_base + current->dst_index] = - src[source_base + current->src_index]; - break; - - case REPEAT: - d = (dst + dest_base + current->dst_index); - v = src[source_base + current->src_index]; - - count = current->count; - while (count-- > 0) - *d++ = v; - - break; - - case SEQUENCE: - d = dst + dest_base + current->dst_index; - s = src + source_base + current->src_index; - - memcpy((void*)d, (void*)s, current->count * bytes_pp); - break; - - case END: - default: - break; - } - - current = &pattern[++pattern_idx]; - } while (current->type != END); + dst[x + dst_x + dst_row] = src[scaled_x + src_x + src_row]; } } - free(pattern); } + else if (bpp == 16) + { + unsigned short* d = (unsigned short*)dst; + unsigned short* s = (unsigned short*)src; + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + int dst_row = dst_surf_w * (y + dst_y); + + if (scaled_y == last_y) + { + memcpy(&d[dst_x + dst_row], &d[dst_x + last_row], size); + continue; + } + + last_y = scaled_y; + last_row = dst_row; + + int src_row = src_surf_w * (scaled_y + src_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + d[x + dst_x + dst_row] = s[scaled_x + src_x + src_row]; + } + } + } + else if (bpp == 32) + { + unsigned int* d = (unsigned int*)dst; + unsigned int* s = (unsigned int*)src; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + int dst_row = dst_surf_w * (y + dst_y); + + if (scaled_y == last_y) + { + memcpy(&d[dst_x + dst_row], &d[dst_x + last_row], size); + continue; + } + + last_y = scaled_y; + last_row = dst_row; + + int src_row = src_surf_w * (scaled_y + src_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + d[x + dst_x + dst_row] = s[scaled_x + src_x + src_row]; + } + } + } } From d09e2a3dbf4795886e05b99e6add081c0fee2d5a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 15:52:56 +0200 Subject: [PATCH 0100/1724] remove include --- src/blt.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/blt.c b/src/blt.c index ef1bb47..5c9dc1a 100644 --- a/src/blt.c +++ b/src/blt.c @@ -1,6 +1,5 @@ #include #include "debug.h" -#include "scale_pattern.h" #include "blt.h" From fe60c7910a2e33a65831e83706bf569df1e63d81 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 16:08:46 +0200 Subject: [PATCH 0101/1724] tweak blt_stretch --- src/blt.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/blt.c b/src/blt.c index 5c9dc1a..d711b38 100644 --- a/src/blt.c +++ b/src/blt.c @@ -550,27 +550,30 @@ void blt_stretch( if (bpp == 8) { + unsigned char* d = (unsigned char*)dst; + unsigned char* s = (unsigned char*)src; + for (int y = 0; y < dst_h; y++) { int scaled_y = (int)(y * scale_h); - int dst_row = dst_surf_w * (y + dst_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); if (scaled_y == last_y) { - memcpy(&dst[dst_x + dst_row], &dst[dst_x + last_row], size); + memcpy(&d[dst_row], &d[last_row], size); continue; } last_y = scaled_y; last_row = dst_row; - int src_row = src_surf_w * (scaled_y + src_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); for (int x = 0; x < dst_w; x++) { int scaled_x = (int)(x * scale_w); - dst[x + dst_x + dst_row] = src[scaled_x + src_x + src_row]; + d[x + dst_row] = s[scaled_x + src_row]; } } } @@ -582,24 +585,24 @@ void blt_stretch( for (int y = 0; y < dst_h; y++) { int scaled_y = (int)(y * scale_h); - int dst_row = dst_surf_w * (y + dst_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); if (scaled_y == last_y) { - memcpy(&d[dst_x + dst_row], &d[dst_x + last_row], size); + memcpy(&d[dst_row], &d[last_row], size); continue; } last_y = scaled_y; last_row = dst_row; - int src_row = src_surf_w * (scaled_y + src_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); for (int x = 0; x < dst_w; x++) { int scaled_x = (int)(x * scale_w); - d[x + dst_x + dst_row] = s[scaled_x + src_x + src_row]; + d[x + dst_row] = s[scaled_x + src_row]; } } } @@ -611,24 +614,24 @@ void blt_stretch( for (int y = 0; y < dst_h; y++) { int scaled_y = (int)(y * scale_h); - int dst_row = dst_surf_w * (y + dst_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); if (scaled_y == last_y) { - memcpy(&d[dst_x + dst_row], &d[dst_x + last_row], size); + memcpy(&d[dst_row], &d[last_row], size); continue; } last_y = scaled_y; last_row = dst_row; - int src_row = src_surf_w * (scaled_y + src_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); for (int x = 0; x < dst_w; x++) { int scaled_x = (int)(x * scale_w); - d[x + dst_x + dst_row] = s[scaled_x + src_x + src_row]; + d[x + dst_row] = s[scaled_x + src_row]; } } } From 28c481ef30bb0ff3263affa6d8653ef13f7dad44 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 16:16:35 +0200 Subject: [PATCH 0102/1724] tweak blt_colorkey_mirror_stretch --- src/blt.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/blt.c b/src/blt.c index d711b38..2007e51 100644 --- a/src/blt.c +++ b/src/blt.c @@ -296,8 +296,8 @@ void blt_colorkey_mirror_stretch( if (mirror_up_down) scaled_y = src_h - 1 - scaled_y; - int src_row = src_surf_w * (scaled_y + src_y); - int dst_row = dst_surf_w * (y + dst_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); for (int x = 0; x < dst_w; x++) { @@ -306,11 +306,11 @@ void blt_colorkey_mirror_stretch( if (mirror_left_right) scaled_x = src_w - 1 - scaled_x; - unsigned char c = ((unsigned char*)src)[scaled_x + src_x + src_row]; + unsigned char c = ((unsigned char*)src)[scaled_x + src_row]; if (c < key_l || c > key_h) { - ((unsigned char*)dst)[x + dst_x + dst_row] = c; + ((unsigned char*)dst)[x + dst_row] = c; } } } @@ -327,8 +327,8 @@ void blt_colorkey_mirror_stretch( if (mirror_up_down) scaled_y = src_h - 1 - scaled_y; - int src_row = src_surf_w * (scaled_y + src_y); - int dst_row = dst_surf_w * (y + dst_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); for (int x = 0; x < dst_w; x++) { @@ -337,11 +337,11 @@ void blt_colorkey_mirror_stretch( if (mirror_left_right) scaled_x = src_w - 1 - scaled_x; - unsigned short c = ((unsigned short*)src)[scaled_x + src_x + src_row]; + unsigned short c = ((unsigned short*)src)[scaled_x + src_row]; if (c < key_l || c > key_h) { - ((unsigned short*)dst)[x + dst_x + dst_row] = c; + ((unsigned short*)dst)[x + dst_row] = c; } } } @@ -358,8 +358,8 @@ void blt_colorkey_mirror_stretch( if (mirror_up_down) scaled_y = src_h - 1 - scaled_y; - int src_row = src_surf_w * (scaled_y + src_y); - int dst_row = dst_surf_w * (y + dst_y); + int src_row = src_x + src_surf_w * (scaled_y + src_y); + int dst_row = dst_x + dst_surf_w * (y + dst_y); for (int x = 0; x < dst_w; x++) { @@ -368,11 +368,11 @@ void blt_colorkey_mirror_stretch( if (mirror_left_right) scaled_x = src_w - 1 - scaled_x; - unsigned int c = ((unsigned int*)src)[scaled_x + src_x + src_row]; + unsigned int c = ((unsigned int*)src)[scaled_x + src_row]; if (c < key_l || c > key_h) { - ((unsigned int*)dst)[x + dst_x + dst_row] = c; + ((unsigned int*)dst)[x + dst_row] = c; } } } From 9a41252e7378cab1bbf740cb8499befbdd989e6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 17:16:20 +0200 Subject: [PATCH 0103/1724] fix size --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 1f10ed5..f50a980 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1038,7 +1038,7 @@ HRESULT dd_CreateSurface( { dst_surface->lx_pitch = dst_surface->bpp / 8; dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; - dst_surface->size = dst_surface->l_pitch * dst_surface->height * dst_surface->lx_pitch; + dst_surface->size = dst_surface->l_pitch * dst_surface->height; DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; @@ -1097,7 +1097,7 @@ HRESULT dd_CreateSurface( HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); + dst_surface->l_pitch * (dst_surface->height + 200)); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) From b309ce705ad083b7ef430ecb779476b491a94adf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 17:28:24 +0200 Subject: [PATCH 0104/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 2cef748..dd1b952 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From f9462e590303fb0d97f1a0aa3505b13947a84ca3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 14 Sep 2022 15:30:16 +0200 Subject: [PATCH 0105/1724] fix color conversion blitters --- src/blt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/blt.c b/src/blt.c index 2007e51..192dd94 100644 --- a/src/blt.c +++ b/src/blt.c @@ -1,4 +1,5 @@ #include +//#include #include "debug.h" #include "blt.h" @@ -25,6 +26,7 @@ void blt_clean( if (size == dst_p && dst_p == src_p) { + //__movsb(dst, src, dst_p * dst_h); memcpy(dst, src, dst_p * dst_h); } else @@ -463,8 +465,8 @@ void blt_rgb565_to_rgba8888( size_t s_a = (src_p / sizeof(src[0])) - dst_w; size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - src += (src_x * sizeof(src[0])) + (src_p * src_y); - dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); + src += src_x + ((src_p / sizeof(src[0])) * src_y); + dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { @@ -499,8 +501,8 @@ void blt_bgra8888_to_rgba8888( size_t s_a = (src_p / sizeof(src[0])) - dst_w; size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - src += (src_x * sizeof(src[0])) + (src_p * src_y); - dst += (dst_x * sizeof(dst[0])) + (dst_p * dst_y); + src += src_x + ((src_p / sizeof(src[0])) * src_y); + dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { From 0133030c6a856b18f754557510f0bfef59df4ec7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 02:12:27 +0200 Subject: [PATCH 0106/1724] add memset blt_clear wrapper --- inc/blt.h | 4 ++++ src/blt.c | 7 +++++++ src/ddsurface.c | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/inc/blt.h b/inc/blt.h index 34bffa4..220a580 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -65,6 +65,10 @@ void blt_colorkey_mirror_stretch( BOOL mirror_left_right, int bpp); +void blt_clear( + unsigned char* dst, + size_t size); + void blt_colorfill( unsigned char* dst, int dst_x, diff --git a/src/blt.c b/src/blt.c index 192dd94..6f3286b 100644 --- a/src/blt.c +++ b/src/blt.c @@ -381,6 +381,13 @@ void blt_colorkey_mirror_stretch( } } +void blt_clear( + unsigned char* dst, + size_t size) +{ + memset(dst, 0, size); +} + void blt_colorfill( unsigned char* dst, int dst_x, diff --git a/src/ddsurface.c b/src/ddsurface.c index f50a980..416e7de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -548,7 +548,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (g_ddraw->flipclear) { - memset(buf, 0, backbuffer->size); + blt_clear(buf, backbuffer->size); } LeaveCriticalSection(&g_ddraw->cs); From f39e3fcddb174347319ae991be9b51493cd9cecc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 09:57:36 +0200 Subject: [PATCH 0107/1724] fix GetAttachedSurface --- src/ddsurface.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 416e7de..5611f0a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -584,7 +584,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, IDirectDrawSurfaceImpl** lpDDsurface) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && (This->caps & DDSCAPS_FLIP) && (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER)) + if (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER) { if (This->backbuffer) { @@ -601,6 +601,9 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps return DD_OK; } + return DDERR_NOTFOUND; +} + HRESULT dds_GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDDSCaps) { lpDDSCaps->dwCaps = This->caps; From edf69fcc2a6537ccba0cb4815ff88ae3161a6e7b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 10:10:52 +0200 Subject: [PATCH 0108/1724] add support for DDSD_LPSURFACE and DDSD_PITCH --- inc/IDirectDrawSurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 2 +- src/ddsurface.c | 11 +++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index f5f897e..36590d2 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -30,6 +30,7 @@ typedef struct IDirectDrawSurfaceImpl void* surface; DWORD l_pitch; DWORD lx_pitch; + BOOL custom_surface; PBITMAPINFO bmi; HBITMAP bitmap; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index de4b209..2f55074 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -85,7 +85,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { DeleteObject(This->bitmap); } - else if (This->surface) + else if (This->surface && !This->custom_surface) { HeapFree(GetProcessHeap(), 0, This->surface); } diff --git a/src/ddsurface.c b/src/ddsurface.c index 5611f0a..143ad73 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -596,7 +596,6 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps IDirectDrawSurface_AddRef(This); *lpDDsurface = This; } - } return DD_OK; } @@ -1037,7 +1036,15 @@ HRESULT dd_CreateSurface( dst_surface->height = lpDDSurfaceDesc->dwHeight; } - if (dst_surface->width && dst_surface->height) + if ((dst_surface->flags & DDSD_LPSURFACE) && (dst_surface->flags & DDSD_PITCH)) + { + dst_surface->surface = lpDDSurfaceDesc->lpSurface; + dst_surface->l_pitch = lpDDSurfaceDesc->lPitch; + dst_surface->lx_pitch = dst_surface->bpp / 8; + dst_surface->size = dst_surface->l_pitch * dst_surface->height; + dst_surface->custom_surface = TRUE; + } + else if (dst_surface->width && dst_surface->height) { dst_surface->lx_pitch = dst_surface->bpp / 8; dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; From 5a9284a44e6d55a8aad9f0a70cb061f792624fff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 10:21:33 +0200 Subject: [PATCH 0109/1724] save and pass DDSD_BACKBUFFERCOUNT --- inc/IDirectDrawSurface.h | 1 + src/ddsurface.c | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 36590d2..704888f 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -24,6 +24,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD size; DWORD flags; DWORD caps; + DWORD backbuffer_count; IDirectDrawPaletteImpl* palette; diff --git a/src/ddsurface.c b/src/ddsurface.c index 143ad73..81021ca 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -476,7 +476,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur memset(lpDDSurfaceDesc, 0, size); lpDDSurfaceDesc->dwSize = size; - lpDDSurfaceDesc->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_LPSURFACE; + lpDDSurfaceDesc->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_BACKBUFFERCOUNT; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; lpDDSurfaceDesc->lPitch = This->l_pitch; @@ -485,6 +485,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = This->bpp; lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; + lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; if (!g_ddraw->novidmem || (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) { @@ -597,8 +598,8 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps *lpDDsurface = This; } - return DD_OK; -} + return DD_OK; + } return DDERR_NOTFOUND; } @@ -1121,6 +1122,8 @@ HRESULT dd_CreateSurface( if (dst_surface->flags & DDSD_BACKBUFFERCOUNT) { + dst_surface->backbuffer_count = lpDDSurfaceDesc->dwBackBufferCount; + TRACE(" dwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); DDSURFACEDESC desc; From 8cd1fe7afa3c8688bab3f167e7a91dce793d2773 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 20:31:32 +0200 Subject: [PATCH 0110/1724] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 360dd87..80e42f0 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/W   -Note: If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. +If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. If you want to play in windowed mode then start the game once in fullscreen and then press Alt+Enter to enable the cnc-ddraw windowed mode (Or enable windowed mode in the config program without using Alt+Enter). @@ -38,7 +38,11 @@ If you want to play in windowed mode then start the game once in fullscreen and   -Note: cnc-ddraw does not support Direct3D/Glide, it will only work with games that use a DirectDraw (Software) renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/CnCNet/cnc-ddraw/issues/44 +**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/CnCNet/cnc-ddraw/issues/44 + +  + +Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/CnCNet/cnc-ddraw/wiki) for more details.   From 9b3cd4cf84c834bc849b69f343b5197cd6fae306 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 02:59:21 +0200 Subject: [PATCH 0111/1724] fix some warning messages --- src/blt.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/blt.c b/src/blt.c index 6f3286b..732c3c6 100644 --- a/src/blt.c +++ b/src/blt.c @@ -120,9 +120,9 @@ void blt_colorkey( if (key_l == key_h) { - for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) + for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (void* w_end = dst + dst_w; dst < w_end;) + for (unsigned char* w_end = dst + dst_w; dst < w_end;) { unsigned char c = *src++; @@ -140,9 +140,9 @@ void blt_colorkey( } else { - for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) + for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (void* w_end = dst + dst_w; dst < w_end;) + for (unsigned char* w_end = dst + dst_w; dst < w_end;) { unsigned char c = *src++; @@ -169,9 +169,9 @@ void blt_colorkey( if (key_l == key_h) { - for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) + for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (void* w_end = d + dst_w; d < w_end;) + for (unsigned short* w_end = d + dst_w; d < w_end;) { unsigned short c = *s++; @@ -189,9 +189,9 @@ void blt_colorkey( } else { - for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) + for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (void* w_end = d + dst_w; d < w_end;) + for (unsigned short* w_end = d + dst_w; d < w_end;) { unsigned short c = *s++; @@ -218,9 +218,9 @@ void blt_colorkey( if (key_l == key_h) { - for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) + for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (void* w_end = d + dst_w; d < w_end;) + for (unsigned int* w_end = d + dst_w; d < w_end;) { unsigned int c = *s++; @@ -238,9 +238,9 @@ void blt_colorkey( } else { - for (void* h_end = d + dst_h * (dst_w + d_a); d < h_end;) + for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;) { - for (void* w_end = d + dst_w; d < w_end;) + for (unsigned int* w_end = d + dst_w; d < w_end;) { unsigned int c = *s++; @@ -475,9 +475,9 @@ void blt_rgb565_to_rgba8888( src += src_x + ((src_p / sizeof(src[0])) * src_y); dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); - for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) + for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (void* w_end = dst + dst_w; dst < w_end;) + for (unsigned int* w_end = dst + dst_w; dst < w_end;) { unsigned short pixel = *src++; @@ -511,9 +511,9 @@ void blt_bgra8888_to_rgba8888( src += src_x + ((src_p / sizeof(src[0])) * src_y); dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); - for (void* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) + for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) { - for (void* w_end = dst + dst_w; dst < w_end;) + for (unsigned int* w_end = dst + dst_w; dst < w_end;) { unsigned int pixel = *src++; From 9b5856c49625af7f4b9a9e3409bb5cc479d88643 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 03:25:17 +0200 Subject: [PATCH 0112/1724] add post build event for DebugLog build --- cnc-ddraw.vcxproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index db234cc..2b0309e 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -223,6 +223,13 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) ddraw.def + + +if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) + + From 8a63e2b976b24f331a90e3ceb1ed36854588bdaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 11:22:05 +0200 Subject: [PATCH 0113/1724] allocate memory with CreateFileMapping --- inc/IDirectDrawSurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 3 ++ src/ddsurface.c | 48 +++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 704888f..579b7d6 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -29,6 +29,7 @@ typedef struct IDirectDrawSurfaceImpl IDirectDrawPaletteImpl* palette; void* surface; + HANDLE surface_mapping; DWORD l_pitch; DWORD lx_pitch; BOOL custom_surface; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 2f55074..c1b2197 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -96,6 +96,9 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->bmi) HeapFree(GetProcessHeap(), 0, This->bmi); + if (This->surface_mapping) + CloseHandle(This->surface_mapping); + if (This->backbuffer) IDirectDrawSurface_Release(This->backbuffer); diff --git a/src/ddsurface.c b/src/ddsurface.c index 81021ca..be89140 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1053,9 +1053,10 @@ HRESULT dd_CreateSurface( DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; - dst_surface->bmi = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); + DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; + DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + 200); + dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); @@ -1097,18 +1098,49 @@ HRESULT dd_CreateSurface( } dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + + dst_surface->surface_mapping = + CreateFileMappingA( + INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE | SEC_COMMIT, + 0, + bmp_size + 256, + NULL); + + DWORD map_offset = 0; + + if (dst_surface->surface_mapping) + { + LPVOID data = MapViewOfFile(dst_surface->surface_mapping, FILE_MAP_READ, 0, 0, 0); + if (data) + { + while (((DWORD)data + map_offset) % 128) map_offset++; + UnmapViewOfFile(data); + } + + if (!data || (map_offset % sizeof(DWORD))) + { + map_offset = 0; + CloseHandle(dst_surface->surface_mapping); + dst_surface->surface_mapping = NULL; + } + } + dst_surface->bitmap = - CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); + CreateDIBSection( + dst_surface->hdc, + dst_surface->bmi, + DIB_RGB_COLORS, + (void**)&dst_surface->surface, + dst_surface->surface_mapping, + map_offset); dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) { - dst_surface->surface = - HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - dst_surface->l_pitch * (dst_surface->height + 200)); + dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) From 160ba70fa5f8f768dc2bb6c78eaa0160b4c13286 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 11:24:41 +0200 Subject: [PATCH 0114/1724] add post build event for Release build --- cnc-ddraw.vcxproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 2b0309e..233f75a 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -203,6 +203,13 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) ddraw.def + + +if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) + + From 087ccc719aa4c074edb7299dcba0b7bd9385f3cd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 11:47:09 +0200 Subject: [PATCH 0115/1724] use movsb --- src/blt.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/blt.c b/src/blt.c index 732c3c6..681f613 100644 --- a/src/blt.c +++ b/src/blt.c @@ -1,5 +1,5 @@ #include -//#include +#include #include "debug.h" #include "blt.h" @@ -26,8 +26,16 @@ void blt_clean( if (size == dst_p && dst_p == src_p) { - //__movsb(dst, src, dst_p * dst_h); - memcpy(dst, src, dst_p * dst_h); + size_t s = dst_p * dst_h; + + if (s >= 1024 * 100) + { + __movsb(dst, src, s); + } + else + { + memcpy(dst, src, s); + } } else { From ee5d236198a68c688ce7481e6095622bb24a33be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 12:08:22 +0200 Subject: [PATCH 0116/1724] use stosb --- src/blt.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/blt.c b/src/blt.c index 681f613..9b62205 100644 --- a/src/blt.c +++ b/src/blt.c @@ -393,7 +393,14 @@ void blt_clear( unsigned char* dst, size_t size) { - memset(dst, 0, size); + if (size >= 1024 * 200) + { + __stosb(dst, 0, size); + } + else + { + memset(dst, 0, size); + } } void blt_colorfill( @@ -422,7 +429,16 @@ void blt_colorfill( { if (size == dst_p) { - memset(dst, color, dst_p * dst_h); + size_t s = dst_p * dst_h; + + if (s >= 1024 * 200) + { + __stosb(dst, color, dst_p * dst_h); + } + else + { + memset(dst, color, dst_p * dst_h); + } } else { From 9703d59b43b9d782a6cae35032a311edd3e4de95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 12:10:45 +0200 Subject: [PATCH 0117/1724] use local var --- src/blt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blt.c b/src/blt.c index 9b62205..f69451c 100644 --- a/src/blt.c +++ b/src/blt.c @@ -433,11 +433,11 @@ void blt_colorfill( if (s >= 1024 * 200) { - __stosb(dst, color, dst_p * dst_h); + __stosb(dst, color, s); } else { - memset(dst, color, dst_p * dst_h); + memset(dst, color, s); } } else From c4e8f959d4d0dfccaa5ae8c905f5c428ed38b177 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 12:33:08 +0200 Subject: [PATCH 0118/1724] flip file mapping --- src/ddsurface.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index be89140..55f0ebd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -542,10 +542,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap); HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc); + HANDLE map = (HANDLE)InterlockedExchangePointer(&This->surface_mapping, backbuffer->surface_mapping); InterlockedExchangePointer(&backbuffer->surface, buf); InterlockedExchangePointer(&backbuffer->bitmap, bitmap); InterlockedExchangePointer(&backbuffer->hdc, dc); + InterlockedExchangePointer(&backbuffer->surface_mapping, map); if (g_ddraw->flipclear) { From 18622bff3a10b8a19caab12fdacfffb6d8ccaf0c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 16:13:06 +0200 Subject: [PATCH 0119/1724] remove TRACE --- src/ddsurface.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 55f0ebd..32f6718 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -651,11 +651,6 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) return DDERR_INVALIDPARAMS; } - if ((This->l_pitch % 4)) - { - TRACE("NOT_IMPLEMENTED GetDC: width=%d height=%d\n", This->width, This->height); - } - RGBQUAD* data = This->palette ? This->palette->data_rgb : g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : From 9dedb5a7242471a130da39c6b20576bc082b03b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Sep 2022 23:46:59 +0200 Subject: [PATCH 0120/1724] use full path to ddraw.ini to fix issues with bad working dirs --- src/config.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 215d702..74c35da 100644 --- a/src/config.c +++ b/src/config.c @@ -1060,17 +1060,29 @@ static void cfg_init() } /* set up settings ini */ - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) - cfg_create_ini(); + if (strlen(g_config.game_path) > 0) + { + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + cfg_create_ini(); + } + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + } + } + else + { + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + } if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); - - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) - cfg_create_ini(); + cfg_create_ini(); } } From cb87c01023df75b7a2369d3df487b7e6f07bf5b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 09:00:42 +0200 Subject: [PATCH 0121/1724] force redraw on device reset --- src/render_d3d9.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index e34482f..16ceae4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -117,7 +117,16 @@ BOOL d3d9_reset() if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { - return d3d9_set_states(); + BOOL result = d3d9_set_states(); + + if (result) + { + InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + } + + return result; } return FALSE; From 8b8601470a374bcf479429a1cf181cb5b02b70c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 09:00:58 +0200 Subject: [PATCH 0122/1724] adjust TA preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 74c35da..2776954 100644 --- a/src/config.c +++ b/src/config.c @@ -962,7 +962,7 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" - "renderer=opengl\n" + "singlecpu=false\n" "fixwndprochook=true\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" From 40e8519352800084cf9b9d2dd0bc54a3f5c45229 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 09:05:30 +0200 Subject: [PATCH 0123/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index dd1b952..e8e45a9 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 484022b97d93bb791f3b87d0642730f8b20debc7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 11:49:19 +0200 Subject: [PATCH 0124/1724] update presets --- src/config.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/config.c b/src/config.c index 2776954..f82ae33 100644 --- a/src/config.c +++ b/src/config.c @@ -876,10 +876,6 @@ static void cfg_create_ini() "[Pharaoh]\n" "adjmouse=true\n" "\n" - "; Pacific General\n" - "[PACGEN]\n" - "renderer=opengl\n" - "\n" "; Pax Imperia\n" "[Pax Imperia]\n" "renderer=opengl\n" @@ -939,10 +935,6 @@ static void cfg_create_ini() "[Stronghold]\n" "adjmouse=true\n" "\n" - "; Steel Panthers: World At War\n" - "[MECH]\n" - "renderer=opengl\n" - "\n" "; Sim City 3000\n" "[SC3]\n" "renderer=opengl\n" @@ -994,7 +986,6 @@ static void cfg_create_ini() "\n" "; Uprising\n" "[uprising]\n" - "renderer=opengl\n" "adjmouse=true\n" "\n" "; Uprising 2\n" @@ -1002,10 +993,6 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" - "; Warlords 3\n" - "[Darklord]\n" - "renderer=gdi\n" - "\n" "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" From 8d6b2f3bfe3907042453ec9efafb426fda336ac2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 13:46:45 +0200 Subject: [PATCH 0125/1724] add option to lock surfaces --- inc/IDirectDrawSurface.h | 1 + inc/dd.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 2 ++ src/config.c | 3 +++ src/ddsurface.c | 8 ++++++++ src/render_d3d9.c | 6 ++++++ src/render_gdi.c | 6 ++++++ src/render_ogl.c | 6 ++++++ 8 files changed, 33 insertions(+) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 579b7d6..5cef293 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -25,6 +25,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD flags; DWORD caps; DWORD backbuffer_count; + CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; diff --git a/inc/dd.h b/inc/dd.h index a72aea0..b04fac0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -147,6 +147,7 @@ typedef struct CNCDDRAW BOOL fixnotresponding; BOOL flipclear; BOOL locktopleft; + BOOL lock_surfaces; BOOL d3d9linear; BOOL gdilinear; int resolutions; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index c1b2197..30f6f6a 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -110,6 +110,8 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) IDirectDrawPalette_Release(This->palette); } + DeleteCriticalSection(&This->cs); + HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/config.c b/src/config.c index f82ae33..a6352ec 100644 --- a/src/config.c +++ b/src/config.c @@ -42,6 +42,7 @@ void cfg_load() g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); + g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); @@ -353,6 +354,7 @@ static void cfg_create_ini() "novidmem=false\n" "fixnotresponding=false\n" "locktopleft=false\n" + "lock_surfaces=false\n" "releasealt=false\n" "gdilinear=false\n" "allow_wmactivate=false\n" @@ -954,6 +956,7 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" + "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" "\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 32f6718..a3a4514 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -728,6 +728,9 @@ HRESULT dds_Lock( DWORD dwFlags, HANDLE hEvent) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&This->cs); + dbg_dump_dds_lock_flags(dwFlags); if (g_ddraw && g_ddraw->fixnotresponding) @@ -942,6 +945,9 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&This->cs); + return DD_OK; } @@ -995,6 +1001,8 @@ HRESULT dd_CreateSurface( lpDDSurfaceDesc->dwFlags |= DDSD_CAPS; + InitializeCriticalSection(&dst_surface->cs); + dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp; dst_surface->flags = lpDDSurfaceDesc->dwFlags; dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 16ceae4..2b19f7e 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -374,6 +374,9 @@ DWORD WINAPI d3d9_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) @@ -455,6 +458,9 @@ DWORD WINAPI d3d9_render_main(void) } } } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs); diff --git a/src/render_gdi.c b/src/render_gdi.c index ce1fc92..e4d0127 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -53,6 +53,9 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (warning_end_tick) { if (timeGetTime() < warning_end_tick) @@ -153,6 +156,9 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->primary->bmi, DIB_RGB_COLORS); } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs); diff --git a/src/render_ogl.c b/src/render_ogl.c index 2b7948e..d217e58 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -600,6 +600,9 @@ static void ogl_render() g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) @@ -703,6 +706,9 @@ static void ogl_render() } } } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs); From 4d2976249e761897107369af2da0b9900baf6a05 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 13:49:21 +0200 Subject: [PATCH 0126/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e8e45a9..046f614 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From cbae2db055dcf8761f8ae3d8306fb8d335cf7607 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Sep 2022 09:25:49 +0200 Subject: [PATCH 0127/1724] fix param --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index a3a4514..a485672 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1117,7 +1117,7 @@ HRESULT dd_CreateSurface( if (dst_surface->surface_mapping) { - LPVOID data = MapViewOfFile(dst_surface->surface_mapping, FILE_MAP_READ, 0, 0, 0); + LPVOID data = MapViewOfFile(dst_surface->surface_mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (data) { while (((DWORD)data + map_offset) % 128) map_offset++; From a1b58749a24d2ec4afcc54e9d5027878965a9249 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Sep 2022 10:41:27 +0200 Subject: [PATCH 0128/1724] make guard lines easier to adjust --- src/ddsurface.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index a485672..913e5d0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1056,15 +1056,16 @@ HRESULT dd_CreateSurface( dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; dst_surface->size = dst_surface->l_pitch * dst_surface->height; + int guard_lines = 200; DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; - DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + 200); + DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + guard_lines); dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; From e8acc35f0de89f4371015fbdf3e7b8e9880d5f33 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Sep 2022 19:02:15 +0200 Subject: [PATCH 0129/1724] add AVX test code --- inc/blt.h | 5 +++++ src/blt.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/inc/blt.h b/inc/blt.h index 220a580..641c4d3 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -5,6 +5,11 @@ #include +void blt_copy( + unsigned char* dst, + unsigned char* src, + size_t size); + void blt_clean( unsigned char* dst, int dst_x, diff --git a/src/blt.c b/src/blt.c index f69451c..b3b191f 100644 --- a/src/blt.c +++ b/src/blt.c @@ -4,6 +4,59 @@ #include "blt.h" +void blt_copy( + unsigned char* dst, + unsigned char* src, + size_t size) +{ +#ifdef __AVX__ + if (size >= 1024 * 1536 && !((DWORD)dst % 32) && !((DWORD)src % 32)) + { + while (size >= 256) + { + __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); + __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); + __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); + __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); + + _mm256_stream_si256((((__m256i*)dst) + 0), c0); + _mm256_stream_si256((((__m256i*)dst) + 1), c1); + _mm256_stream_si256((((__m256i*)dst) + 2), c2); + _mm256_stream_si256((((__m256i*)dst) + 3), c3); + + c0 = _mm256_load_si256(((const __m256i*)src) + 4); + c1 = _mm256_load_si256(((const __m256i*)src) + 5); + c2 = _mm256_load_si256(((const __m256i*)src) + 6); + c3 = _mm256_load_si256(((const __m256i*)src) + 7); + + _mm256_stream_si256((((__m256i*)dst) + 4), c0); + _mm256_stream_si256((((__m256i*)dst) + 5), c1); + _mm256_stream_si256((((__m256i*)dst) + 6), c2); + _mm256_stream_si256((((__m256i*)dst) + 7), c3); + + src += 256; + dst += 256; + size -= 256; + } + + if (size > 0) + { + memcpy(dst, src, size); + } + return; + } +#endif + + if (size >= 1024 * 100) + { + __movsb(dst, src, size); + } + else + { + memcpy(dst, src, size); + } +} + void blt_clean( unsigned char* dst, int dst_x, From 537b8605b06e56fcc4fac4e159aeb91ad295fce6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Sep 2022 20:27:46 +0200 Subject: [PATCH 0130/1724] use blt_copy --- src/blt.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/blt.c b/src/blt.c index b3b191f..dfd3912 100644 --- a/src/blt.c +++ b/src/blt.c @@ -79,16 +79,7 @@ void blt_clean( if (size == dst_p && dst_p == src_p) { - size_t s = dst_p * dst_h; - - if (s >= 1024 * 100) - { - __movsb(dst, src, s); - } - else - { - memcpy(dst, src, s); - } + blt_copy(dst, src, dst_p * dst_h); } else { From f4ee6128c4f17bbb5fad368a0497fcab91477fd1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Sep 2022 13:13:34 +0200 Subject: [PATCH 0131/1724] detect if AVX is supported --- inc/blt.h | 2 ++ inc/utils.h | 1 + src/blt.c | 6 ++++-- src/dd.c | 1 + src/utils.c | 17 +++++++++++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/inc/blt.h b/inc/blt.h index 641c4d3..1cd2a3f 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -5,6 +5,8 @@ #include +extern BOOL g_blt_use_avx; + void blt_copy( unsigned char* dst, unsigned char* src, diff --git a/inc/utils.h b/inc/utils.h index 1f8c54a..98b51fc 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +BOOL util_is_avx_supported(); void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); BOOL util_get_lowest_resolution(float ratio, SIZE* outRes, DWORD minWidth, DWORD minHeight, DWORD maxWidth, DWORD maxHeight); diff --git a/src/blt.c b/src/blt.c index dfd3912..846f034 100644 --- a/src/blt.c +++ b/src/blt.c @@ -4,13 +4,15 @@ #include "blt.h" +BOOL g_blt_use_avx; + void blt_copy( unsigned char* dst, unsigned char* src, size_t size) { #ifdef __AVX__ - if (size >= 1024 * 1536 && !((DWORD)dst % 32) && !((DWORD)src % 32)) + if (size >= 1024 * 4096 && g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) { while (size >= 256) { @@ -45,7 +47,7 @@ void blt_copy( } return; } -#endif +#endif // __AVX__ if (size >= 1024 * 100) { diff --git a/src/dd.c b/src/dd.c index d8fe35e..ff43bf5 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1096,6 +1096,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + g_blt_use_avx = util_is_avx_supported(); cfg_load(); g_ddraw->ref--; diff --git a/src/utils.c b/src/utils.c index 76fc56b..ed078c7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,4 +1,5 @@ #include +#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -10,6 +11,22 @@ #include "config.h" +BOOL util_is_avx_supported() +{ + unsigned int xcr0 = 0; + +#if defined(_MSC_VER) + xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); +#else + __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); +#endif + + int info[4] = { 0 }; + __cpuid(info, 1); + + return (info[2] & (1 << 27)) && (info[2] & (1 << 28)) && (xcr0 & 6); +} + void util_limit_game_ticks() { if (g_ddraw->ticks_limiter.htimer) From edec5da87ca9cb27a9bc4cdd1eca7c28544fef3b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Sep 2022 13:59:02 +0200 Subject: [PATCH 0132/1724] tweak avx copy --- src/blt.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/blt.c b/src/blt.c index 846f034..395bb4a 100644 --- a/src/blt.c +++ b/src/blt.c @@ -14,27 +14,29 @@ void blt_copy( #ifdef __AVX__ if (size >= 1024 * 4096 && g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) { + _mm_prefetch((const char*)(src), _MM_HINT_NTA); + while (size >= 256) { __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); + __m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4); + __m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5); + __m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6); + __m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7); + + _mm_prefetch((const char*)(src + 512), _MM_HINT_NTA); _mm256_stream_si256((((__m256i*)dst) + 0), c0); _mm256_stream_si256((((__m256i*)dst) + 1), c1); _mm256_stream_si256((((__m256i*)dst) + 2), c2); _mm256_stream_si256((((__m256i*)dst) + 3), c3); - - c0 = _mm256_load_si256(((const __m256i*)src) + 4); - c1 = _mm256_load_si256(((const __m256i*)src) + 5); - c2 = _mm256_load_si256(((const __m256i*)src) + 6); - c3 = _mm256_load_si256(((const __m256i*)src) + 7); - - _mm256_stream_si256((((__m256i*)dst) + 4), c0); - _mm256_stream_si256((((__m256i*)dst) + 5), c1); - _mm256_stream_si256((((__m256i*)dst) + 6), c2); - _mm256_stream_si256((((__m256i*)dst) + 7), c3); + _mm256_stream_si256((((__m256i*)dst) + 4), c4); + _mm256_stream_si256((((__m256i*)dst) + 5), c5); + _mm256_stream_si256((((__m256i*)dst) + 6), c6); + _mm256_stream_si256((((__m256i*)dst) + 7), c7); src += 256; dst += 256; From a55a348cd6a852619e0d03d0774ea572b6d081f1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Sep 2022 14:06:55 +0200 Subject: [PATCH 0133/1724] tweak avx memcpy --- src/blt.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/blt.c b/src/blt.c index 395bb4a..0aede58 100644 --- a/src/blt.c +++ b/src/blt.c @@ -43,6 +43,9 @@ void blt_copy( size -= 256; } + _mm_sfence(); + _mm256_zeroupper(); + if (size > 0) { memcpy(dst, src, size); From 5a10fe5c64e24d11b63611af9e5d5dea783aa49f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Sep 2022 14:29:34 +0200 Subject: [PATCH 0134/1724] add preset for TA beta replay viewer --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index a6352ec..3121646 100644 --- a/src/config.c +++ b/src/config.c @@ -960,6 +960,12 @@ static void cfg_create_ini() "singlecpu=false\n" "fixwndprochook=true\n" "\n" + "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" + "[Viewer]\n" + "lock_surfaces=true\n" + "singlecpu=false\n" + "fixwndprochook=true\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From b98ced6d1ef0d4b54417ef0890ce00b013e14601 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Sep 2022 14:29:55 +0200 Subject: [PATCH 0135/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 046f614..23c8f9a 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 234448ebeea8480b5009760c8d9d07b3cded88a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 00:39:02 +0200 Subject: [PATCH 0136/1724] use AVX for less than 100kb --- src/blt.c | 84 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/src/blt.c b/src/blt.c index 0aede58..b6a7aa6 100644 --- a/src/blt.c +++ b/src/blt.c @@ -12,47 +12,65 @@ void blt_copy( size_t size) { #ifdef __AVX__ - if (size >= 1024 * 4096 && g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) + if (g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) { - _mm_prefetch((const char*)(src), _MM_HINT_NTA); - - while (size >= 256) + if (size >= 1024 * 4096) { - __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); - __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); - __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); - __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); - __m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4); - __m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5); - __m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6); - __m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7); + _mm_prefetch((const char*)(src), _MM_HINT_NTA); - _mm_prefetch((const char*)(src + 512), _MM_HINT_NTA); + while (size >= 256) + { + __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); + __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); + __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); + __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); + __m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4); + __m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5); + __m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6); + __m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7); - _mm256_stream_si256((((__m256i*)dst) + 0), c0); - _mm256_stream_si256((((__m256i*)dst) + 1), c1); - _mm256_stream_si256((((__m256i*)dst) + 2), c2); - _mm256_stream_si256((((__m256i*)dst) + 3), c3); - _mm256_stream_si256((((__m256i*)dst) + 4), c4); - _mm256_stream_si256((((__m256i*)dst) + 5), c5); - _mm256_stream_si256((((__m256i*)dst) + 6), c6); - _mm256_stream_si256((((__m256i*)dst) + 7), c7); + _mm_prefetch((const char*)(src + 512), _MM_HINT_NTA); - src += 256; - dst += 256; - size -= 256; + _mm256_stream_si256((((__m256i*)dst) + 0), c0); + _mm256_stream_si256((((__m256i*)dst) + 1), c1); + _mm256_stream_si256((((__m256i*)dst) + 2), c2); + _mm256_stream_si256((((__m256i*)dst) + 3), c3); + _mm256_stream_si256((((__m256i*)dst) + 4), c4); + _mm256_stream_si256((((__m256i*)dst) + 5), c5); + _mm256_stream_si256((((__m256i*)dst) + 6), c6); + _mm256_stream_si256((((__m256i*)dst) + 7), c7); + + src += 256; + dst += 256; + size -= 256; + } + + _mm_sfence(); + _mm256_zeroupper(); + } + else if (size < 1024 * 100) + { + while (size >= 128) + { + __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); + __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); + __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); + __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); + + _mm256_store_si256((((__m256i*)dst) + 0), c0); + _mm256_store_si256((((__m256i*)dst) + 1), c1); + _mm256_store_si256((((__m256i*)dst) + 2), c2); + _mm256_store_si256((((__m256i*)dst) + 3), c3); + + src += 128; + dst += 128; + size -= 128; + } } - _mm_sfence(); - _mm256_zeroupper(); - - if (size > 0) - { - memcpy(dst, src, size); - } - return; + /* memcpy below handles the remainder */ } -#endif // __AVX__ +#endif if (size >= 1024 * 100) { From c279682408e615d6387802cb7b43fc2b73dc5676 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 00:54:19 +0200 Subject: [PATCH 0137/1724] replace memcpy with blt_copy + enable AVX code --- src/blt.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/blt.c b/src/blt.c index b6a7aa6..9d10f86 100644 --- a/src/blt.c +++ b/src/blt.c @@ -11,7 +11,7 @@ void blt_copy( unsigned char* src, size_t size) { -#ifdef __AVX__ +#ifdef _MSC_VER if (g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) { if (size >= 1024 * 4096) @@ -110,7 +110,7 @@ void blt_clean( { for (int i = 0; i < dst_h; i++) { - memcpy(dst, src, size); + blt_copy(dst, src, size); src += src_p; dst += dst_p; @@ -530,7 +530,7 @@ void blt_colorfill( for (int i = 1; i < dst_h; i++) { dst += dst_p; - memcpy(dst, first_row, size); + blt_copy(dst, first_row, size); } } else if (bpp == 32) @@ -545,7 +545,7 @@ void blt_colorfill( for (int i = 1; i < dst_h; i++) { dst += dst_p; - memcpy(dst, first_row, size); + blt_copy(dst, first_row, size); } } } @@ -662,7 +662,7 @@ void blt_stretch( if (scaled_y == last_y) { - memcpy(&d[dst_row], &d[last_row], size); + blt_copy(&d[dst_row], &d[last_row], size); continue; } @@ -691,7 +691,7 @@ void blt_stretch( if (scaled_y == last_y) { - memcpy(&d[dst_row], &d[last_row], size); + blt_copy(&d[dst_row], &d[last_row], size); continue; } @@ -720,7 +720,7 @@ void blt_stretch( if (scaled_y == last_y) { - memcpy(&d[dst_row], &d[last_row], size); + blt_copy(&d[dst_row], &d[last_row], size); continue; } From 278517fec43d0aa12dda91374d0782f1d89e6464 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 01:29:24 +0200 Subject: [PATCH 0138/1724] fix warnings --- src/blt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/blt.c b/src/blt.c index 9d10f86..381af6e 100644 --- a/src/blt.c +++ b/src/blt.c @@ -530,7 +530,7 @@ void blt_colorfill( for (int i = 1; i < dst_h; i++) { dst += dst_p; - blt_copy(dst, first_row, size); + blt_copy(dst, (void*)first_row, size); } } else if (bpp == 32) @@ -545,7 +545,7 @@ void blt_colorfill( for (int i = 1; i < dst_h; i++) { dst += dst_p; - blt_copy(dst, first_row, size); + blt_copy(dst, (void*)first_row, size); } } } @@ -691,7 +691,7 @@ void blt_stretch( if (scaled_y == last_y) { - blt_copy(&d[dst_row], &d[last_row], size); + blt_copy((void*)&d[dst_row], (void*)&d[last_row], size); continue; } @@ -720,7 +720,7 @@ void blt_stretch( if (scaled_y == last_y) { - blt_copy(&d[dst_row], &d[last_row], size); + blt_copy((void*)&d[dst_row], (void*)&d[last_row], size); continue; } From fee61f7b4ac64e38914e16fcd3a1cbaa73cb63d6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 01:34:10 +0200 Subject: [PATCH 0139/1724] add zeroupper --- src/blt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/blt.c b/src/blt.c index 381af6e..59549c9 100644 --- a/src/blt.c +++ b/src/blt.c @@ -66,6 +66,8 @@ void blt_copy( dst += 128; size -= 128; } + + _mm256_zeroupper(); } /* memcpy below handles the remainder */ From 6372dc688466efec867dcfe2186d668fda4efe0b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 02:27:01 +0200 Subject: [PATCH 0140/1724] add AVX memset --- inc/blt.h | 1 + src/blt.c | 44 +++++++++++++++++++++++++++++--------------- src/ddsurface.c | 2 +- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/inc/blt.h b/inc/blt.h index 1cd2a3f..76f3bf5 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -74,6 +74,7 @@ void blt_colorkey_mirror_stretch( void blt_clear( unsigned char* dst, + char color, size_t size); void blt_colorfill( diff --git a/src/blt.c b/src/blt.c index 59549c9..028329a 100644 --- a/src/blt.c +++ b/src/blt.c @@ -461,16 +461,39 @@ void blt_colorkey_mirror_stretch( } void blt_clear( - unsigned char* dst, + unsigned char* dst, + char color, size_t size) { - if (size >= 1024 * 200) +#ifdef _MSC_VER + if (size < 1024 * 100 && g_blt_use_avx && !((DWORD)dst % 32)) { - __stosb(dst, 0, size); + while (size >= 128) + { + __m256i c0 = _mm256_set1_epi8(color); + + _mm256_store_si256((((__m256i*)dst) + 0), c0); + _mm256_store_si256((((__m256i*)dst) + 1), c0); + _mm256_store_si256((((__m256i*)dst) + 2), c0); + _mm256_store_si256((((__m256i*)dst) + 3), c0); + + dst += 128; + size -= 128; + } + + _mm256_zeroupper(); + + /* memset below handles the remainder */ + } +#endif + + if (size >= 1024 * 100) + { + __stosb(dst, color, size); } else { - memset(dst, 0, size); + memset(dst, color, size); } } @@ -500,22 +523,13 @@ void blt_colorfill( { if (size == dst_p) { - size_t s = dst_p * dst_h; - - if (s >= 1024 * 200) - { - __stosb(dst, color, s); - } - else - { - memset(dst, color, s); - } + blt_clear(dst, color, dst_p * dst_h); } else { for (int i = 0; i < dst_h; i++) { - memset(dst, color, size); + blt_clear(dst, color, size); dst += dst_p; } } diff --git a/src/ddsurface.c b/src/ddsurface.c index 913e5d0..7fdbf26 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -551,7 +551,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (g_ddraw->flipclear) { - blt_clear(buf, backbuffer->size); + blt_clear(buf, 0, backbuffer->size); } LeaveCriticalSection(&g_ddraw->cs); From c6701a8cd6952853d2a756d0c577290409e15cdf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 02:28:33 +0200 Subject: [PATCH 0141/1724] set value outside of loop --- src/blt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blt.c b/src/blt.c index 028329a..5ad5a9c 100644 --- a/src/blt.c +++ b/src/blt.c @@ -468,10 +468,10 @@ void blt_clear( #ifdef _MSC_VER if (size < 1024 * 100 && g_blt_use_avx && !((DWORD)dst % 32)) { + __m256i c0 = _mm256_set1_epi8(color); + while (size >= 128) { - __m256i c0 = _mm256_set1_epi8(color); - _mm256_store_si256((((__m256i*)dst) + 0), c0); _mm256_store_si256((((__m256i*)dst) + 1), c0); _mm256_store_si256((((__m256i*)dst) + 2), c0); From 1b791fb2cbe395f60e1c58294aba5a3b83b24351 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 08:59:36 +0200 Subject: [PATCH 0142/1724] only lock cursor in borderless if game window is the foreground window --- inc/dd.h | 1 - inc/mouse.h | 1 + src/dd.c | 5 +++-- src/directinput.c | 7 ++++--- src/mouse.c | 11 ++++++----- src/winapi_hooks.c | 10 +++++----- src/wndproc.c | 16 ++++++++-------- 7 files changed, 27 insertions(+), 24 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index b04fac0..dee20a9 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -117,7 +117,6 @@ typedef struct CNCDDRAW HWND hwnd; WNDPROC wndproc; struct { DWORD x; DWORD y; } cursor; - BOOL locked; BOOL adjmouse; BOOL devmode; BOOL vsync; diff --git a/inc/mouse.h b/inc/mouse.h index 4457c08..1181ac2 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -5,6 +5,7 @@ void mouse_lock(); void mouse_unlock(); LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); +extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; extern HOOKPROC g_mouse_proc; diff --git a/src/dd.c b/src/dd.c index ff43bf5..b6d8d40 100644 --- a/src/dd.c +++ b/src/dd.c @@ -502,7 +502,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.run = TRUE; - BOOL lock_mouse = (g_ddraw->locked || g_ddraw->fullscreen) && !(dwFlags & SDM_LEAVE_FULLSCREEN); + BOOL lock_mouse = g_mouse_locked; + mouse_unlock(); memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); @@ -722,7 +723,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (lock_mouse) + if (lock_mouse || (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd)) mouse_lock(); } else diff --git a/src/directinput.c b/src/directinput.c index d433c1c..e320828 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -5,6 +5,7 @@ #include "debug.h" #include "hook.h" #include "dd.h" +#include "mouse.h" DIRECTINPUTCREATEAPROC real_DirectInputCreateA; @@ -41,7 +42,7 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) { - if (g_ddraw->locked || g_ddraw->devmode) + if (g_mouse_locked || g_ddraw->devmode) { while (real_ShowCursor(FALSE) >= 0); } @@ -63,7 +64,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) + if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) { if (pdwInOut) { @@ -85,7 +86,7 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) + if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) { if (cbData > 0 && lpvData) { diff --git a/src/mouse.c b/src/mouse.c index 9b43aa7..d2ead61 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -5,6 +5,7 @@ #include "hook.h" +BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; @@ -13,7 +14,7 @@ void mouse_lock() if (g_ddraw->devmode || g_ddraw->bnet_active) return; - if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd)) + if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd)) { int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; @@ -46,7 +47,7 @@ void mouse_lock() real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_ClipCursor(&rc); - g_ddraw->locked = TRUE; + g_mouse_locked = TRUE; } } @@ -55,9 +56,9 @@ void mouse_unlock() if (g_ddraw->devmode || !g_hook_active) return; - if (g_ddraw->locked) + if (g_mouse_locked) { - g_ddraw->locked = FALSE; + g_mouse_locked = FALSE; real_ClipCursor(NULL); @@ -82,7 +83,7 @@ LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) if (!g_ddraw) return g_mouse_proc(Code, wParam, lParam); - if (Code < 0 || (!g_ddraw->devmode && !g_ddraw->locked)) + if (Code < 0 || (!g_ddraw->devmode && !g_mouse_locked)) return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a0821b9..1d2ec5e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -23,7 +23,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) realpt.x = pt.x; realpt.y = pt.y; - if (g_ddraw->locked && (!g_ddraw->windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) + if (g_mouse_locked && (!g_ddraw->windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) { /* fallback solution for possible ClipCursor failure */ int diffx = 0, diffy = 0; @@ -152,7 +152,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) CopyRect(&g_ddraw->mouse.rc, &dst_rc); - if (g_ddraw->locked) + if (g_mouse_locked) { real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); @@ -167,7 +167,7 @@ int WINAPI fake_ShowCursor(BOOL bShow) { if (g_ddraw) { - if (g_ddraw->locked || g_ddraw->devmode) + if (g_mouse_locked || g_ddraw->devmode) { int count = real_ShowCursor(bShow); InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); @@ -190,7 +190,7 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); - if (!g_ddraw->locked && !g_ddraw->devmode) + if (!g_mouse_locked && !g_ddraw->devmode) return cursor; } @@ -265,7 +265,7 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) BOOL WINAPI fake_SetCursorPos(int X, int Y) { - if (g_ddraw && !g_ddraw->locked && !g_ddraw->devmode) + if (g_ddraw && !g_mouse_locked && !g_ddraw->devmode) return TRUE; POINT pt = { X, Y }; diff --git a/src/wndproc.c b/src/wndproc.c index eee7eff..b16fcd5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -105,7 +105,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case HTTOPRIGHT: return DefWindowProc(hWnd, uMsg, wParam, lParam); case HTCLIENT: - if (!g_ddraw->locked && !g_ddraw->devmode) + if (!g_mouse_locked && !g_ddraw->devmode) { real_SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; @@ -476,7 +476,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_WINDOWPOSCHANGING: { /* workaround for a bug where sometimes a background window steals the focus */ - if (g_ddraw->locked) + if (g_mouse_locked) { WINDOWPOS* pos = (WINDOWPOS*)lParam; @@ -486,8 +486,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (GetForegroundWindow() == g_ddraw->hwnd) mouse_lock(); + } } - } break; } case WM_MOUSELEAVE: @@ -523,14 +523,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_lock(); } } - else if (g_ddraw->fullscreen) + else if (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd) { mouse_lock(); } } else { - if (!g_ddraw->windowed && !g_ddraw->locked && g_ddraw->noactivateapp && !g_ddraw->devmode) + if (!g_ddraw->windowed && !g_mouse_locked && g_ddraw->noactivateapp && !g_ddraw->devmode) return 0; mouse_unlock(); @@ -677,7 +677,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_ddraw->devmode && !g_ddraw->locked) + if (!g_ddraw->devmode && !g_mouse_locked) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); @@ -718,7 +718,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_ddraw->devmode && !g_ddraw->locked) + if (!g_ddraw->devmode && !g_mouse_locked) { return 0; } @@ -765,7 +765,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONDOWN: case WM_XBUTTONDOWN: { - if (!g_ddraw->devmode && !g_ddraw->locked) + if (!g_ddraw->devmode && !g_mouse_locked) { int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); From 9ac9aa3c6a68d1b95c91882cc1de619e85e07f51 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 09:17:57 +0200 Subject: [PATCH 0143/1724] bump version --- ddraw.rc | 2 +- src/wndproc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 23c8f9a..3947b99 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 9 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/wndproc.c b/src/wndproc.c index b16fcd5..4b37c0d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -486,8 +486,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (GetForegroundWindow() == g_ddraw->hwnd) mouse_lock(); - } } + } break; } case WM_MOUSELEAVE: From 5616af006b14df2b2e3a683c988de7f66371f188 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 11:21:32 +0200 Subject: [PATCH 0144/1724] add option to enable direct3d 12 renderer (via MS 9on12) --- inc/dd.h | 1 + inc/render_d3d9.h | 11 +++++++++++ src/config.c | 6 ++++-- src/render_d3d9.c | 17 ++++++++++++++--- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index dee20a9..ac31d23 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -149,6 +149,7 @@ typedef struct CNCDDRAW BOOL lock_surfaces; BOOL d3d9linear; BOOL gdilinear; + BOOL d3d9on12; int resolutions; BOOL armadahack; BOOL tshack; diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index 0e653cb..29b8552 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -27,6 +27,17 @@ typedef struct D3D9RENDERER int tex_height; } D3D9RENDERER; +#define MAX_D3D9ON12_QUEUES 2 + +typedef struct _D3D9ON12_ARGS +{ + BOOL Enable9On12; + IUnknown* pD3D12Device; + IUnknown* ppD3D12Queues[MAX_D3D9ON12_QUEUES]; + UINT NumQueues; + UINT NodeMask; +} D3D9ON12_ARGS; + BOOL d3d9_is_available(); DWORD WINAPI d3d9_render_main(void); BOOL d3d9_create(); diff --git a/src/config.c b/src/config.c index 3121646..0fd22b3 100644 --- a/src/config.c +++ b/src/config.c @@ -46,6 +46,7 @@ void cfg_load() g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); + g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); @@ -154,7 +155,7 @@ void cfg_load() { g_ddraw->renderer = gdi_render_main; } - else if (tolower(tmp[0]) == 'd') /* direct3d9 */ + else if (tolower(tmp[0]) == 'd' || g_ddraw->d3d9on12) /* direct3d9 */ { g_ddraw->renderer = d3d9_render_main; } @@ -347,7 +348,8 @@ static void cfg_create_ini() "fpupreserve=false\n" "\n" "\n" - "; Undocumented compatibility settings\n" + "; Undocumented settings\n" + "d3d9on12=false\n" "accuratetimers=false\n" "fixpitch=true\n" "fixwndprochook=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 2b19f7e..d1b32dc 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -53,10 +53,21 @@ BOOL d3d9_create() d3d9_enable_shim(TRUE); } - IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + D3D9ON12_ARGS args; + memset(&args, 0, sizeof(args)); + args.Enable9On12 = TRUE; - if (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION))) + IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; + + if (g_ddraw->d3d9on12) + { + d3d_create9on12 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + } + + IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + + if ((d3d_create9on12 && (g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || + (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; From 8bea6fd369d487f96e6c714f9f205b6653bfd59b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 11:29:00 +0200 Subject: [PATCH 0145/1724] make GameHandlesClose an ini setting --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0fd22b3..23e6ca3 100644 --- a/src/config.c +++ b/src/config.c @@ -58,7 +58,7 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - if ((g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE))) + if (cfg_get_bool("game_handles_close", FALSE) || (g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE))) { GameHandlesClose = TRUE; } @@ -350,6 +350,7 @@ static void cfg_create_ini() "\n" "; Undocumented settings\n" "d3d9on12=false\n" + "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" "fixwndprochook=false\n" From 8c23af938d03fe149bb018aef39347ab78fbcb5a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 12:16:10 +0200 Subject: [PATCH 0146/1724] switch to gdi renderer if d3d12 fails --- src/render_d3d9.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d1b32dc..d0bdfb5 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -58,11 +58,16 @@ BOOL d3d9_create() args.Enable9On12 = TRUE; IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; + IDirect3D9* (WINAPI * d3d_create9)(UINT) = NULL; if (g_ddraw->d3d9on12) { d3d_create9on12 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); } + else + { + d3d_create9 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + } IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); From 15b7684f7c3972c66c6307a0c8a5e937ed32573e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 12:16:45 +0200 Subject: [PATCH 0147/1724] fix for last commit --- src/render_d3d9.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d0bdfb5..38c468c 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -69,8 +69,6 @@ BOOL d3d9_create() d3d_create9 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); } - IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - if ((d3d_create9on12 && (g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { From 04d8b2e8f8c9e1d63feeefaa3f46139f15131da1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 23:43:52 +0200 Subject: [PATCH 0148/1724] bump version --- ddraw.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 3947b99..6869f32 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 4 -#define VERSION_MINOR 4 -#define VERSION_BUILD 9 -#define VERSION_REVISION 6 +#define VERSION_MINOR 5 +#define VERSION_BUILD 0 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 4a45d7942bdeaa607b6e3f198bf4be2b62695ecf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 16:06:17 +0200 Subject: [PATCH 0149/1724] filter WM_TIMER --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 4b37c0d..4d10469 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -19,7 +19,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam #ifdef _DEBUG_X if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && - uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP) + uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER) { TRACE_EXT( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", From d18df5faf16b41c7bd8ec054f05ccddf4cb113bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 16:07:32 +0200 Subject: [PATCH 0150/1724] #172 Add support for SetSurfaceDesc (Nancy Drew: Stay Tuned For Danger) --- inc/ddsurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 6 +-- src/ddsurface.c | 73 ++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index f641118..b27bf4f 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -31,6 +31,7 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette); HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); +HRESULT dds__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 30f6f6a..7829280 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -501,9 +501,9 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_UNSUPPORTED; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSD, dwFlags); + HRESULT ret = dds__SetSurfaceDesc(This, lpDDSD, dwFlags); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 7fdbf26..10fa487 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -962,6 +962,79 @@ HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) return DD_OK; } +HRESULT dds__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) +{ + dbg_dump_dds_flags(lpDDSD->dwFlags); + dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps); + + DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + + if ((lpDDSD->dwFlags & req_flags) != req_flags) + return DDERR_UNSUPPORTED; + + + if (This->bitmap) + { + DeleteObject(This->bitmap); + This->bitmap = NULL; + } + else if (This->surface && !This->custom_surface) + { + HeapFree(GetProcessHeap(), 0, This->surface); + This->surface = NULL; + } + + if (This->hdc) + { + DeleteDC(This->hdc); + This->hdc = NULL; + } + + if (This->bmi) + { + HeapFree(GetProcessHeap(), 0, This->bmi); + This->bmi = NULL; + } + + if (This->surface_mapping) + { + CloseHandle(This->surface_mapping); + This->surface_mapping = NULL; + } + + + switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) + { + case 8: + This->bpp = 8; + break; + case 15: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 16: + This->bpp = 16; + break; + case 24: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 32: + This->bpp = 32; + break; + default: + This->bpp = 8; + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + break; + } + + This->width = lpDDSD->dwWidth; + This->height = lpDDSD->dwHeight; + This->surface = lpDDSD->lpSurface; + This->l_pitch = lpDDSD->lPitch; + This->lx_pitch = This->bpp / 8; + This->size = This->l_pitch * This->height; + This->custom_surface = TRUE; + + return DD_OK; +} + void* dds_GetBuffer(IDirectDrawSurfaceImpl* This) { if (!This) From 16d98d1719376a633462cdf7c66cc260cea57536 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 16:34:52 +0200 Subject: [PATCH 0151/1724] #172 return DD_OK on GetGDISurface for now --- src/IDirectDraw/IDirectDraw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 91609f1..287500b 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -339,7 +339,7 @@ HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpN HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAWSURFACE7* lplpGDIDDSurface) { TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_NOTFOUND; + HRESULT ret = DD_OK; *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; From bd697e7b7a1620ff7e3c201e41c9c4f657ecc773 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 16:37:13 +0200 Subject: [PATCH 0152/1724] fix function name --- inc/ddsurface.h | 2 +- src/IDirectDraw/IDirectDrawSurface.c | 2 +- src/ddsurface.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index b27bf4f..b5ab814 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -31,7 +31,7 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette); HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); -HRESULT dds__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags); +HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 7829280..2cd4b50 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -502,7 +502,7 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSD, dwFlags); - HRESULT ret = dds__SetSurfaceDesc(This, lpDDSD, dwFlags); + HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 10fa487..fb4c6fb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -962,7 +962,7 @@ HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) return DD_OK; } -HRESULT dds__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) +HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { dbg_dump_dds_flags(lpDDSD->dwFlags); dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps); From 2194583a032525f13a0e2b95a713ee0f63bd747c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 17:24:09 +0200 Subject: [PATCH 0153/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 6869f32..b2af42d 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 57678ce9f828aa1c1e4af9046221ef16e21300ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 21:13:08 +0200 Subject: [PATCH 0154/1724] use AdjustWindowRectEx --- src/dd.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index b6d8d40..71b5a3c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -705,9 +705,17 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; - AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), GetMenu(g_ddraw->hwnd) != NULL); - real_SetWindowPos(g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - real_MoveWindow(g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); + LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG exstyle = GetWindowLong(g_ddraw->hwnd, GWL_EXSTYLE); + + AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); + + real_SetWindowPos( + g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); + + real_MoveWindow( + g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); + BOOL d3d9_active = FALSE; From 2d76b4916d30d10c1bfd2b0c07856b9469a015c3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Sep 2022 21:24:04 +0200 Subject: [PATCH 0155/1724] use real function and not the hooked one --- src/dd.c | 20 ++++++++++++-------- src/utils.c | 8 ++++---- src/wndproc.c | 16 ++++++++-------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/dd.c b/src/dd.c index 71b5a3c..7640560 100644 --- a/src/dd.c +++ b/src/dd.c @@ -678,15 +678,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw->hwnd, GWL_STYLE, - GetWindowLong( - g_ddraw->hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); + real_GetWindowLongA( + g_ddraw->hwnd, + GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } else { real_SetWindowLongA( g_ddraw->hwnd, GWL_STYLE, - (GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); + (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); } if (g_ddraw->wine) @@ -694,7 +695,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw->hwnd, GWL_STYLE, - (GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); } /* center the window with correct dimensions */ @@ -705,8 +706,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); - LONG exstyle = GetWindowLong(g_ddraw->hwnd, GWL_EXSTYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); @@ -736,7 +737,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); if ((style & WS_CAPTION)) { @@ -769,7 +770,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->wine) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); + real_SetWindowLongA( + g_ddraw->hwnd, + GWL_STYLE, + real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } real_SetWindowPos( diff --git a/src/utils.c b/src/utils.c index ed078c7..e789703 100644 --- a/src/utils.c +++ b/src/utils.c @@ -214,8 +214,8 @@ void util_toggle_maximize() RECT client_rc; RECT dst_rc; - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); - LONG exstyle = GetWindowLong(g_ddraw->hwnd, GWL_EXSTYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL; if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) @@ -302,7 +302,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.window_state = g_ddraw->windowed = FALSE; - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); real_SetWindowLongA( g_ddraw->hwnd, @@ -402,7 +402,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) { - LONG style = GetWindowLong(hwnd, GWL_EXSTYLE); + LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); if (!(style & WS_EX_TRANSPARENT)) { diff --git a/src/wndproc.c b/src/wndproc.c index 4d10469..2ad8151 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -259,9 +259,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam CopyRect(&clientrc, windowrc) && util_unadjust_window_rect( &clientrc, - GetWindowLong(hWnd, GWL_STYLE), + real_GetWindowLongA(hWnd, GWL_STYLE), GetMenu(hWnd) != NULL, - GetWindowLong(hWnd, GWL_EXSTYLE)) && + real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { float scaleH = (float)g_ddraw->height / g_ddraw->width; @@ -296,9 +296,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (CopyRect(&clientrc, windowrc) && util_unadjust_window_rect( &clientrc, - GetWindowLong(hWnd, GWL_STYLE), + real_GetWindowLongA(hWnd, GWL_STYLE), GetMenu(hWnd) != NULL, - GetWindowLong(hWnd, GWL_EXSTYLE)) && + real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { if (clientrc.right < g_ddraw->width) @@ -352,9 +352,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (CopyRect(&clientrc, windowrc) && util_unadjust_window_rect( &clientrc, - GetWindowLong(hWnd, GWL_STYLE), + real_GetWindowLongA(hWnd, GWL_STYLE), GetMenu(hWnd) != NULL, - GetWindowLong(hWnd, GWL_EXSTYLE))) + real_GetWindowLongA(hWnd, GWL_EXSTYLE))) { g_config.window_rect.left = clientrc.left; g_config.window_rect.top = clientrc.top; @@ -429,7 +429,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_ddraw->wine) /* hack: disable aero snap */ { - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); if (!(style & WS_MAXIMIZEBOX)) { @@ -442,7 +442,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ { - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); if ((style & WS_MAXIMIZEBOX)) { From 84aa333ca89b43fe9497f17d73e33704da40f20b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Sep 2022 09:56:28 +0200 Subject: [PATCH 0156/1724] adjust American Conquest preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 23e6ca3..10daa00 100644 --- a/src/config.c +++ b/src/config.c @@ -432,6 +432,7 @@ static void cfg_create_ini() "\n" "; American Conquest\n" "[DMCR]\n" + "resolutions=2\n" "minfps=-2\n" "\n" "; Age of Wonders\n" From 30dc604286148989550b360d6ca0b9d83dd47715 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Sep 2022 10:43:08 +0200 Subject: [PATCH 0157/1724] add Cossacks hint --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 10daa00..c42ad23 100644 --- a/src/config.c +++ b/src/config.c @@ -430,7 +430,7 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; American Conquest\n" + "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" "minfps=-2\n" From bcf10cb89948bdeca533d23e58fa514f3ecb5b17 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Sep 2022 19:28:35 +0200 Subject: [PATCH 0158/1724] tweak avx supported check --- src/utils.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index e789703..b85bdd6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -13,18 +13,51 @@ BOOL util_is_avx_supported() { - unsigned int xcr0 = 0; + const DWORD XMM_STATE_BIT = 1 << 1; + const DWORD YMM_STATE_BIT = 1 << 2; + const DWORD OS_AVX_BITS = XMM_STATE_BIT | YMM_STATE_BIT; -#if defined(_MSC_VER) - xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); -#else - __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); + const DWORD AVX_BIT = 1 << 28; + const DWORD OSXSAVE_BIT = 1 << 27; + const DWORD XSAVE_BIT = 1 << 26; + const DWORD CPU_AVX_BITS = AVX_BIT | OSXSAVE_BIT | XSAVE_BIT; + + BOOL result = FALSE; + +#ifdef _MSC_VER + __try + { #endif int info[4] = { 0 }; - __cpuid(info, 1); + __cpuid(info, 0); - return (info[2] & (1 << 27)) && (info[2] & (1 << 28)) && (xcr0 & 6); + if (info[0] >= 1) + { + __cpuid(info, 1); + + if ((info[2] & CPU_AVX_BITS) == CPU_AVX_BITS) + { + unsigned int xcr0 = 0; + +#if defined(_MSC_VER) + xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); +#else + __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); +#endif + + result = (xcr0 & OS_AVX_BITS) == OS_AVX_BITS; + } + } + +#ifdef _MSC_VER + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } +#endif + + return result; } void util_limit_game_ticks() From 4f1717989ed58d24c9a81b966f4678f56cadfaa2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Sep 2022 19:28:44 +0200 Subject: [PATCH 0159/1724] update makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6211c58..3fcfb52 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ -include config.mk WINDRES ?= windres -LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -O3 -CFLAGS = -std=c99 +LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s +CFLAGS = -std=c99 -O3 -march=pentium4 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From 82140e35e55fd72e111d101e1afd99b7286ef646 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Sep 2022 20:27:56 +0200 Subject: [PATCH 0160/1724] allow AVX build via GCC as well --- src/blt.c | 4 ++-- src/utils.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/blt.c b/src/blt.c index 5ad5a9c..2c552fc 100644 --- a/src/blt.c +++ b/src/blt.c @@ -11,7 +11,7 @@ void blt_copy( unsigned char* src, size_t size) { -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(__AVX__) if (g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) { if (size >= 1024 * 4096) @@ -465,7 +465,7 @@ void blt_clear( char color, size_t size) { -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(__AVX__) if (size < 1024 * 100 && g_blt_use_avx && !((DWORD)dst % 32)) { __m256i c0 = _mm256_set1_epi8(color); diff --git a/src/utils.c b/src/utils.c index b85bdd6..f219806 100644 --- a/src/utils.c +++ b/src/utils.c @@ -40,9 +40,9 @@ BOOL util_is_avx_supported() { unsigned int xcr0 = 0; -#if defined(_MSC_VER) +#ifdef _MSC_VER xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); -#else +#elif __AVX__ __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); #endif From 9025a211e1bd91ba6a18de71f482032d77a72d4f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 00:26:43 +0200 Subject: [PATCH 0161/1724] #173 early hook ClipCursor for NexusTk --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index a6fb2a5..b4b3355 100644 --- a/src/hook.c +++ b/src/hook.c @@ -565,6 +565,7 @@ void hook_early_init() hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 + hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } @@ -621,6 +622,7 @@ void hook_exit() hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 + hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } From 9f134dc6edc95c4f7c8174dd3388040acf9b6806 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 00:47:59 +0200 Subject: [PATCH 0162/1724] Make sure window is not minimized while locking the cursor --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1d2ec5e..c15e77c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -152,7 +152,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) CopyRect(&g_ddraw->mouse.rc, &dst_rc); - if (g_mouse_locked) + if (g_mouse_locked && !IsIconic(g_ddraw->hwnd)) { real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); From 415f74887faba9742fddbab1a155b060f16594f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 02:17:33 +0200 Subject: [PATCH 0163/1724] try to avoid d3d9_release to workaround nvidia bug --- inc/render_d3d9.h | 4 +++- src/dd.c | 2 +- src/render_d3d9.c | 37 +++++++++++++++++++++++++++++-------- src/utils.c | 2 +- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index 29b8552..d95aad6 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -13,6 +13,7 @@ typedef struct D3D9RENDERER { HMODULE hmodule; D3DPRESENT_PARAMETERS params; + HWND hwnd; LPDIRECT3D9 instance; LPDIRECT3DDEVICE9 device; LPDIRECT3DVERTEXBUFFER9 vertex_buf; @@ -41,7 +42,8 @@ typedef struct _D3D9ON12_ARGS BOOL d3d9_is_available(); DWORD WINAPI d3d9_render_main(void); BOOL d3d9_create(); -BOOL d3d9_reset(); +BOOL d3d9_reset(BOOL windowed); +BOOL d3d9_release_resources(); BOOL d3d9_release(); BOOL d3d9_on_device_lost(); diff --git a/src/dd.c b/src/dd.c index 7640560..00a935e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -395,7 +395,7 @@ HRESULT dd_RestoreDisplayMode() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_release(); + d3d9_reset(TRUE); } } diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 38c468c..12894df 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -36,8 +36,18 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (!d3d9_release()) - return FALSE; + if (g_d3d9.hwnd != g_ddraw->hwnd) + { + d3d9_release(); + } + else if (d3d9_release_resources() && d3d9_create_resouces() && d3d9_reset(g_ddraw->windowed)) + { + return TRUE; + } + else + { + d3d9_release(); + } if (!g_d3d9.hmodule) g_d3d9.hmodule = LoadLibrary("d3d9.dll"); @@ -73,6 +83,7 @@ BOOL d3d9_create() (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; + g_d3d9.hwnd = g_ddraw->hwnd; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); @@ -116,17 +127,17 @@ BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) { - return d3d9_reset(); + return d3d9_reset(g_ddraw->windowed); } return FALSE; } -BOOL d3d9_reset() +BOOL d3d9_reset(BOOL windowed) { - g_d3d9.params.Windowed = g_ddraw->windowed; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.Windowed = windowed; + g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) @@ -146,7 +157,7 @@ BOOL d3d9_reset() return FALSE; } -BOOL d3d9_release() +BOOL d3d9_release_resources() { if (g_d3d9.pixel_shader) { @@ -181,6 +192,13 @@ BOOL d3d9_release() g_d3d9.vertex_buf = NULL; } + return TRUE; +} + +BOOL d3d9_release() +{ + d3d9_release_resources(); + if (g_d3d9.device) { while (IDirect3DDevice9_Release(g_d3d9.device)); @@ -198,6 +216,9 @@ BOOL d3d9_release() static BOOL d3d9_create_resouces() { + if (!g_d3d9.device) + return FALSE; + BOOL err = FALSE; int width = g_ddraw->width; diff --git a/src/utils.c b/src/utils.c index f219806..8e56337 100644 --- a/src/utils.c +++ b/src/utils.c @@ -354,7 +354,7 @@ void util_toggle_fullscreen() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_reset(); + d3d9_reset(g_ddraw->windowed); } else { From 30c15e761a501fd2baf04e5669df831d37a6ee7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 02:45:59 +0200 Subject: [PATCH 0164/1724] release d3d9 in case reset fails --- src/dd.c | 6 ++++-- src/render_d3d9.c | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 00a935e..74b2271 100644 --- a/src/dd.c +++ b/src/dd.c @@ -395,7 +395,8 @@ HRESULT dd_RestoreDisplayMode() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_reset(TRUE); + if (!d3d9_reset(TRUE)) + d3d9_release(); } } @@ -1008,7 +1009,8 @@ ULONG dd_Release() if (g_ddraw->renderer == d3d9_render_main) { - d3d9_release(); + if (!d3d9_reset(TRUE)) + d3d9_release(); } else if (!g_ddraw->windowed) { diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 12894df..25d4473 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -12,7 +12,7 @@ #include "debug.h" -static BOOL d3d9_create_resouces(); +static BOOL d3d9_create_resources(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -40,7 +40,7 @@ BOOL d3d9_create() { d3d9_release(); } - else if (d3d9_release_resources() && d3d9_create_resouces() && d3d9_reset(g_ddraw->windowed)) + else if (d3d9_release_resources() && d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) { return TRUE; } @@ -115,7 +115,7 @@ BOOL d3d9_create() behavior_flags[i] | (g_ddraw->fpupreserve ? D3DCREATE_FPU_PRESERVE : 0), &g_d3d9.params, &g_d3d9.device))) - return g_d3d9.device && d3d9_create_resouces() && d3d9_set_states(); + return g_d3d9.device && d3d9_create_resources() && d3d9_set_states(); } } } @@ -214,7 +214,7 @@ BOOL d3d9_release() return TRUE; } -static BOOL d3d9_create_resouces() +static BOOL d3d9_create_resources() { if (!g_d3d9.device) return FALSE; From 6e93df0580c419c15125e85b6454b1e0e3878dd8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 02:59:02 +0200 Subject: [PATCH 0165/1724] only reset d3d9 if not windowed already --- src/dd.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/dd.c b/src/dd.c index 74b2271..b122037 100644 --- a/src/dd.c +++ b/src/dd.c @@ -392,17 +392,16 @@ HRESULT dd_RestoreDisplayMode() WaitForSingleObject(g_ddraw->render.thread, INFINITE); g_ddraw->render.thread = NULL; } + } + if (!g_ddraw->windowed) + { if (g_ddraw->renderer == d3d9_render_main) { if (!d3d9_reset(TRUE)) d3d9_release(); } - } - - if (!g_ddraw->windowed) - { - if (g_ddraw->renderer != d3d9_render_main) + else { ChangeDisplaySettings(NULL, 0); } @@ -1007,14 +1006,17 @@ ULONG dd_Release() g_ddraw->render.thread = NULL; } - if (g_ddraw->renderer == d3d9_render_main) + if (!g_ddraw->windowed) { - if (!d3d9_reset(TRUE)) - d3d9_release(); - } - else if (!g_ddraw->windowed) - { - ChangeDisplaySettings(NULL, 0); + if (g_ddraw->renderer == d3d9_render_main) + { + if (!d3d9_reset(TRUE)) + d3d9_release(); + } + else + { + ChangeDisplaySettings(NULL, 0); + } } } From bb85c86a80f9aad98c06228bff848da6d3130ff8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 03:00:36 +0200 Subject: [PATCH 0166/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index b2af42d..4ce4cd4 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 12ffeccc4c07874419b3c309a1da9ebf34dc7aa3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 03:53:27 +0200 Subject: [PATCH 0167/1724] always release resources before creating new ones --- src/render_d3d9.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 25d4473..ca7ce39 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -40,7 +40,7 @@ BOOL d3d9_create() { d3d9_release(); } - else if (d3d9_release_resources() && d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) + else if (d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) { return TRUE; } @@ -219,6 +219,8 @@ static BOOL d3d9_create_resources() if (!g_d3d9.device) return FALSE; + d3d9_release_resources(); + BOOL err = FALSE; int width = g_ddraw->width; From 43bde3fabc655f85f0b1b7e5f8748a556dde073d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 04:14:09 +0200 Subject: [PATCH 0168/1724] remove redundant code --- src/utils.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8e56337..238a5c7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -335,13 +335,6 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.window_state = g_ddraw->windowed = FALSE; - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - - real_SetWindowLongA( - g_ddraw->hwnd, - GWL_STYLE, - style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); From 250e82855e8dd33e8d63371c20f830b5b6566e35 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 05:07:54 +0200 Subject: [PATCH 0169/1724] fix infantry hack bug --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index c42ad23..6d87ab8 100644 --- a/src/config.c +++ b/src/config.c @@ -57,8 +57,9 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); + g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); - if (cfg_get_bool("game_handles_close", FALSE) || (g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE))) + if (cfg_get_bool("game_handles_close", FALSE) || g_ddraw->infantryhack) { GameHandlesClose = TRUE; } From e35c3cf5df9a12fd05a31b3d0ab87ca8c44415cf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 20:58:06 +0200 Subject: [PATCH 0170/1724] simplify --- src/render_d3d9.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index ca7ce39..9ac3fe1 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -36,18 +36,12 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (g_d3d9.hwnd != g_ddraw->hwnd) - { - d3d9_release(); - } - else if (d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) + if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) { return TRUE; } - else - { - d3d9_release(); - } + + d3d9_release(); if (!g_d3d9.hmodule) g_d3d9.hmodule = LoadLibrary("d3d9.dll"); From 9551a5c3f00a8185f26f227a431f43ef1a0c5865 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 23 Sep 2022 23:59:25 +0200 Subject: [PATCH 0171/1724] log exceptions to cnc-ddraw.log as well --- src/debug.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/debug.c b/src/debug.c index f418d72..990fe50 100644 --- a/src/debug.c +++ b/src/debug.c @@ -46,6 +46,11 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) CloseHandle(dmp); } + dbg_printf( + "Exception at %p (%08X)\n", + exception->ExceptionRecord->ExceptionAddress, + exception->ExceptionRecord->ExceptionCode); + return EXCEPTION_EXECUTE_HANDLER; } #endif From f912b23877efcb0582a08a614877e2308fc44df9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:08:32 +0200 Subject: [PATCH 0172/1724] log adapter identifier --- src/render_d3d9.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 9ac3fe1..2db1336 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -76,6 +76,27 @@ BOOL d3d9_create() if ((d3d_create9on12 && (g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { +#if _DEBUG + D3DADAPTER_IDENTIFIER9 ai = {0}; + const HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, 0, 0, &ai); + + if (SUCCEEDED(hr)) + { + TRACE("+--Direct 3D 9-----------------------------------\n"); + TRACE("| VendorId: 0x%x\n", ai.VendorId); + TRACE("| DeviceId: 0x%x\n", ai.DeviceId); + TRACE("| Revision: 0x%x\n", ai.Revision); + TRACE("| SubSysId: 0x%x\n", ai.SubSysId); + TRACE("| Product: %hu\n", HIWORD(ai.DriverVersion.HighPart)); + TRACE("| Version: %hu\n", LOWORD(ai.DriverVersion.HighPart)); + TRACE("| Sub version: %hu\n", HIWORD(ai.DriverVersion.LowPart)); + TRACE("| Build: %hu\n", LOWORD(ai.DriverVersion.LowPart)); + TRACE("| Driver: %s\n", ai.Driver); + TRACE("| Description: %s\n", ai.Description); + TRACE("+------------------------------------------------\n"); + } +#endif + g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; g_d3d9.hwnd = g_ddraw->hwnd; From d54011973f61ffa095198ce6a43552d3db3674e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:12:53 +0200 Subject: [PATCH 0173/1724] add option to change d3d9 adapter --- inc/dd.h | 1 + src/config.c | 2 ++ src/render_d3d9.c | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index ac31d23..6742a3e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -138,6 +138,7 @@ typedef struct CNCDDRAW BOOL novidmem; BOOL fpupreserve; BOOL allow_wmactivate; + int d3d9_adapter; BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index 6d87ab8..19f7a5f 100644 --- a/src/config.c +++ b/src/config.c @@ -50,6 +50,7 @@ void cfg_load() g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); + g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -350,6 +351,7 @@ static void cfg_create_ini() "\n" "\n" "; Undocumented settings\n" + "d3d9_adapter=0\n" "d3d9on12=false\n" "game_handles_close=false\n" "accuratetimers=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 2db1336..01c1b5a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -78,7 +78,7 @@ BOOL d3d9_create() { #if _DEBUG D3DADAPTER_IDENTIFIER9 ai = {0}; - const HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, 0, 0, &ai); + const HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, g_ddraw->d3d9_adapter, 0, &ai); if (SUCCEEDED(hr)) { @@ -124,7 +124,7 @@ BOOL d3d9_create() if (SUCCEEDED( IDirect3D9_CreateDevice( g_d3d9.instance, - D3DADAPTER_DEFAULT, + g_ddraw->d3d9_adapter, D3DDEVTYPE_HAL, g_ddraw->hwnd, behavior_flags[i] | (g_ddraw->fpupreserve ? D3DCREATE_FPU_PRESERVE : 0), From 240f208d36ef768b56c2be68de63cc0722f7d9d8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:28:02 +0200 Subject: [PATCH 0174/1724] log opengl adapter info --- src/render_ogl.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index d217e58..377d434 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -35,6 +35,15 @@ DWORD WINAPI ogl_render_main(void) { oglu_init(); +#if _DEBUG + TRACE("+--OpenGL-----------------------------------------\n"); + TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); + TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + TRACE("+------------------------------------------------\n"); +#endif + g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT) From 79d4c76c9f4f956eebfa52f880ac4d1bcb4173c1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:30:10 +0200 Subject: [PATCH 0175/1724] log core context --- src/render_ogl.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 377d434..4cf30ec 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -94,6 +94,16 @@ static HGLRC ogl_create_core_context(HDC hdc) { xwglDeleteContext(g_ogl.context); oglu_init(); + +#if _DEBUG + TRACE("+--OpenGL Core-----------------------------------\n"); + TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); + TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + TRACE("+------------------------------------------------\n"); +#endif + return context; } else if (context) From 3b69255158c08713ad6fb9c5646b716cb2f23a26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:33:26 +0200 Subject: [PATCH 0176/1724] remove #if --- src/render_ogl.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4cf30ec..9515d01 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -35,14 +35,12 @@ DWORD WINAPI ogl_render_main(void) { oglu_init(); -#if _DEBUG TRACE("+--OpenGL-----------------------------------------\n"); TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); -#endif g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); @@ -95,14 +93,12 @@ static HGLRC ogl_create_core_context(HDC hdc) xwglDeleteContext(g_ogl.context); oglu_init(); -#if _DEBUG TRACE("+--OpenGL Core-----------------------------------\n"); TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); -#endif return context; } From 1186c9cc00f001e1215e6c87d0f20a84e3902e5c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 01:41:18 +0200 Subject: [PATCH 0177/1724] add option to create opengl core context --- inc/dd.h | 1 + src/config.c | 2 ++ src/opengl_utils.c | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 6742a3e..577f880 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -139,6 +139,7 @@ typedef struct CNCDDRAW BOOL fpupreserve; BOOL allow_wmactivate; int d3d9_adapter; + BOOL opengl_core; BOOL accurate_timers; BOOL resizable; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index 19f7a5f..1d2ba95 100644 --- a/src/config.c +++ b/src/config.c @@ -51,6 +51,7 @@ void cfg_load() g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); + g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -352,6 +353,7 @@ static void cfg_create_ini() "\n" "; Undocumented settings\n" "d3d9_adapter=0\n" + "opengl_core=false\n" "d3d9on12=false\n" "game_handles_close=false\n" "accuratetimers=false\n" diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 0f8dc63..901383f 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -214,6 +214,11 @@ void oglu_init() g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } + + if (g_ddraw->opengl_core) + { + wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); + } } BOOL oglu_ext_exists(char* ext, HDC hdc) From 620e700d72abb2fa3f1ff93cc180b1b2d2f4e600 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Sep 2022 23:37:14 +0200 Subject: [PATCH 0178/1724] target pentium2 on gcc build to workaround SSE crashes on gcc 4.8.3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3fcfb52..c2d9339 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O3 -march=pentium4 +CFLAGS = -std=c99 -O3 -march=pentium2 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From c39280deb2091587553687b3a3eb5a9891d5e46f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 11:26:31 +0200 Subject: [PATCH 0179/1724] only use __movsb if src and dst are aligned --- src/blt.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/blt.c b/src/blt.c index 2c552fc..e535dc3 100644 --- a/src/blt.c +++ b/src/blt.c @@ -12,9 +12,9 @@ void blt_copy( size_t size) { #if defined(_MSC_VER) || defined(__AVX__) - if (g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) + if (!((DWORD)dst % 32) && !((DWORD)src % 32)) { - if (size >= 1024 * 4096) + if (size >= 1024 * 4096 && g_blt_use_avx) { _mm_prefetch((const char*)(src), _MM_HINT_NTA); @@ -48,7 +48,7 @@ void blt_copy( _mm_sfence(); _mm256_zeroupper(); } - else if (size < 1024 * 100) + else if (size < 1024 * 100 && g_blt_use_avx) { while (size >= 128) { @@ -69,16 +69,18 @@ void blt_copy( _mm256_zeroupper(); } + else if (size >= 1024 * 100) + { + __movsb(dst, src, size); + + size = 0; + } /* memcpy below handles the remainder */ } #endif - - if (size >= 1024 * 100) - { - __movsb(dst, src, size); - } - else + + if (size > 0) { memcpy(dst, src, size); } From ecd2b08e495e2cfa524a48c746f7625dc7a26843 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 11:56:15 +0200 Subject: [PATCH 0180/1724] use 64byte alignement --- src/blt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blt.c b/src/blt.c index e535dc3..29db529 100644 --- a/src/blt.c +++ b/src/blt.c @@ -12,7 +12,7 @@ void blt_copy( size_t size) { #if defined(_MSC_VER) || defined(__AVX__) - if (!((DWORD)dst % 32) && !((DWORD)src % 32)) + if (!((DWORD)dst % 64) && !((DWORD)src % 64)) { if (size >= 1024 * 4096 && g_blt_use_avx) { From d854bf07def9e33c0735e6232f6dfcb67dd79f1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 12:28:04 +0200 Subject: [PATCH 0181/1724] set 300 maxgameticks for TA --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 1d2ba95..8830c0d 100644 --- a/src/config.c +++ b/src/config.c @@ -965,12 +965,14 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" + "maxgameticks=300\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" + "maxgameticks=300\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" From 3e0c93443ec1827854f04f35df3a39aba5ef3912 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 12:39:11 +0200 Subject: [PATCH 0182/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 4ce4cd4..e29bc1a 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 39f93832417b4ebedb6dcae7cea277502af45a84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 15:12:13 +0200 Subject: [PATCH 0183/1724] add NULL checks to exception handler --- src/debug.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/debug.c b/src/debug.c index 990fe50..93197cf 100644 --- a/src/debug.c +++ b/src/debug.c @@ -46,10 +46,13 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) CloseHandle(dmp); } - dbg_printf( - "Exception at %p (%08X)\n", - exception->ExceptionRecord->ExceptionAddress, - exception->ExceptionRecord->ExceptionCode); + if (exception && ExceptionRecord) + { + dbg_printf( + "Exception at %p (%08X)\n", + exception->ExceptionRecord->ExceptionAddress, + exception->ExceptionRecord->ExceptionCode); + } return EXCEPTION_EXECUTE_HANDLER; } From cec59cd3412f224afef11a725b3b79754fcd520b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Sep 2022 15:13:09 +0200 Subject: [PATCH 0184/1724] fix for last commit --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 93197cf..6b9d12d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -46,7 +46,7 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) CloseHandle(dmp); } - if (exception && ExceptionRecord) + if (exception && exception->ExceptionRecord) { dbg_printf( "Exception at %p (%08X)\n", From 0798408ba463caf104117fec10d8458ecec20342 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Sep 2022 14:06:53 +0200 Subject: [PATCH 0185/1724] tweak dd_release --- src/dd.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dd.c b/src/dd.c index b122037..98f4f6b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1005,18 +1005,18 @@ ULONG dd_Release() WaitForSingleObject(g_ddraw->render.thread, INFINITE); g_ddraw->render.thread = NULL; } + } - if (!g_ddraw->windowed) + if (!g_ddraw->windowed) + { + if (g_ddraw->renderer == d3d9_render_main) { - if (g_ddraw->renderer == d3d9_render_main) - { - if (!d3d9_reset(TRUE)) - d3d9_release(); - } - else - { - ChangeDisplaySettings(NULL, 0); - } + if (!d3d9_reset(TRUE)) + d3d9_release(); + } + else + { + ChangeDisplaySettings(NULL, 0); } } From 60a956e71598931ff1049b4e07b23672a87858a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Sep 2022 14:19:17 +0200 Subject: [PATCH 0186/1724] force d3d9on12 if enabled --- src/config.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 8830c0d..7255755 100644 --- a/src/config.c +++ b/src/config.c @@ -154,14 +154,14 @@ void cfg_load() cfg_get_string("renderer", "auto", tmp, sizeof(tmp)); TRACE(" Using %s renderer\n", tmp); - if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') /* gdi */ - { - g_ddraw->renderer = gdi_render_main; - } - else if (tolower(tmp[0]) == 'd' || g_ddraw->d3d9on12) /* direct3d9 */ + if (tolower(tmp[0]) == 'd' || g_ddraw->d3d9on12) /* direct3d9 */ { g_ddraw->renderer = d3d9_render_main; } + else if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') /* gdi */ + { + g_ddraw->renderer = gdi_render_main; + } else if (tolower(tmp[0]) == 'o') /* opengl */ { if (oglu_load_dll()) From a8b3b1c7362634502f6062bdac4798c985056128 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Sep 2022 22:22:15 +0200 Subject: [PATCH 0187/1724] add GetHWnd and SetHWnd clipper functions --- inc/IDirectDrawClipper.h | 1 + inc/ddclipper.h | 2 ++ src/IDirectDraw/IDirectDrawClipper.c | 24 ++++++++++++++++-------- src/ddclipper.c | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/inc/IDirectDrawClipper.h b/inc/IDirectDrawClipper.h index c51648b..a1ae9bc 100644 --- a/inc/IDirectDrawClipper.h +++ b/inc/IDirectDrawClipper.h @@ -14,6 +14,7 @@ typedef struct IDirectDrawClipperImpl struct IDirectDrawClipperImplVtbl* lpVtbl; ULONG ref; + HWND hwnd; } IDirectDrawClipperImpl; diff --git a/inc/ddclipper.h b/inc/ddclipper.h index 355e446..11ecc39 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -7,6 +7,8 @@ #include "IDirectDrawClipper.h" +HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); +HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); #endif diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 304cf69..9b7e32a 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -41,17 +41,25 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPRGNDATA lpClipList, LPDWORD lpdwSiz) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + __FUNCTION__, + This, + lpRect, + lpClipList, + lpdwSiz); + HRESULT ret = DDERR_NOCLIPLIST; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_INVALIDOBJECT; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("-> %s(This=%p, lphWnd=%p)\n", __FUNCTION__, This, lphWnd); + HRESULT ret = ddc_GetHWnd(This, lphWnd); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -73,7 +81,7 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -81,9 +89,9 @@ HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); + HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index b09e880..cf80077 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -5,6 +5,23 @@ #include "debug.h" +HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) +{ + if (!lphWnd) + return DDERR_INVALIDPARAMS; + + *lphWnd = This->hwnd; + + return DD_OK; +} + +HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) +{ + This->hwnd = hWnd; + + return DD_OK; +} + HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter) { if (!lplpDDClipper) From 73e13dbe8ca1370a644512fd6c84101fd6288a4a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Sep 2022 22:57:34 +0200 Subject: [PATCH 0188/1724] keep NOT_IMPLEMENTED debug string for SetHWnd --- src/IDirectDraw/IDirectDrawClipper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 9b7e32a..d8d32cf 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -89,9 +89,9 @@ HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 24f6a020d5c2e2a63b1b70d20318da6debbd08d6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 13:56:36 +0200 Subject: [PATCH 0189/1724] #177 support 2 more clipper functions - GetClipList and SetClipList - clipping not supported yet in dd_blt! --- inc/IDirectDrawClipper.h | 1 + inc/ddclipper.h | 2 + src/IDirectDraw/IDirectDrawClipper.c | 16 ++++---- src/ddclipper.c | 59 ++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/inc/IDirectDrawClipper.h b/inc/IDirectDrawClipper.h index a1ae9bc..7e5161f 100644 --- a/inc/IDirectDrawClipper.h +++ b/inc/IDirectDrawClipper.h @@ -15,6 +15,7 @@ typedef struct IDirectDrawClipperImpl ULONG ref; HWND hwnd; + HRGN region; } IDirectDrawClipperImpl; diff --git a/inc/ddclipper.h b/inc/ddclipper.h index 11ecc39..0f5ba55 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -7,7 +7,9 @@ #include "IDirectDrawClipper.h" +HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz); HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); +HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags); HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index d8d32cf..4265784 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -42,16 +42,16 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, lpClipList, lpdwSiz); - HRESULT ret = DDERR_NOCLIPLIST; + HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -65,9 +65,9 @@ HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -81,9 +81,9 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); - HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index cf80077..1d3bcda 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -5,6 +5,42 @@ #include "debug.h" +HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) +{ + if (!This->region) + return DDERR_NOCLIPLIST; + + if (!lpdwSiz) + return DDERR_INVALIDPARAMS; + + HRGN region = NULL; + + if (lpRect) + { + region = CreateRectRgnIndirect(lpRect); + + if (!region) + return DDERR_INVALIDPARAMS; + + if (CombineRgn(region, This->region, region, RGN_AND) == ERROR) + { + DeleteObject(region); + return DDERR_GENERIC; + } + } + else + { + region = This->region; + } + + *lpdwSiz = GetRegionData(region, *lpdwSiz, lpClipList); + + if (lpRect) + DeleteObject(region); + + return DD_OK; +} + HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { if (!lphWnd) @@ -15,6 +51,29 @@ HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) return DD_OK; } +HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) +{ + if (This->hwnd) + return DDERR_CLIPPERISUSINGHWND; + + if (This->region) + DeleteObject(This->region); + + if (lpClipList) + { + This->region = ExtCreateRegion(NULL, 0, lpClipList); + + if (!This->region) + return DDERR_INVALIDCLIPLIST; + } + else + { + This->region = NULL; + } + + return DD_OK; +} + HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { This->hwnd = hWnd; From 2ddc0b5ceb8015df4ad9c96de4dcdc571eac5fcb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 14:05:31 +0200 Subject: [PATCH 0190/1724] delete region on release --- src/IDirectDraw/IDirectDrawClipper.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 4265784..77792f5 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -28,6 +28,9 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) { TRACE(" Released (%p)\n", This); + if (This->region) + DeleteObject(This->region); + HeapFree(GetProcessHeap(), 0, This); } From 11801618dffd9be27a45bd81a247e9a890a61403 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 15:28:57 +0200 Subject: [PATCH 0191/1724] add (commented out) clipper support to dds_blt --- inc/ddsurface.h | 2 ++ src/ddsurface.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index b5ab814..8a3583c 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -7,6 +7,8 @@ #include "IDirectDrawSurface.h" #include "IDirectDraw.h" +#define DDBLT_NO_CLIP (1 << 31) + /* enables redraw via blt/unlock if there wasn't any flip for X ms */ #define FLIP_REDRAW_TIMEOUT 1000 / 10 diff --git a/src/ddsurface.c b/src/ddsurface.c index fb4c6fb..f960be5 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -20,8 +20,8 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI if (!This->backbuffer) { - lpDDSurface->caps |= DDSCAPS_BACKBUFFER; - This->backbuffer = lpDDSurface; +lpDDSurface->caps |= DDSCAPS_BACKBUFFER; +This->backbuffer = lpDDSurface; } } @@ -140,6 +140,45 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); + /* keep this commented out until tested and confirmed working + if (This->clipper && !(dwFlags & DDBLT_NO_CLIP)) + { + DWORD size = 0; + + if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size)) && size > 0) + { + RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + + if (list) + { + if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) + { + float scale_w = (float)src_w / dst_w; + float scale_h = (float)src_h / dst_h; + + RECT* dst_c_rect = (RECT*)list->Buffer; + + for (int i = 0; i < list->rdh.nCount; ++i) + { + RECT src_c_rect = src_rect; + + src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); + src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); + src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); + src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); + + dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); + } + } + + HeapFree(GetProcessHeap(), 0, list); + + return DD_OK; + } + } + } + */ + if (This->bpp != src_surface->bpp) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); From e012b5c01a6a01bd2a49deffadb1fd5d7676d743 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 15:31:03 +0200 Subject: [PATCH 0192/1724] align --- src/ddsurface.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index f960be5..2d891a6 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -20,8 +20,8 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI if (!This->backbuffer) { -lpDDSurface->caps |= DDSCAPS_BACKBUFFER; -This->backbuffer = lpDDSurface; + lpDDSurface->caps |= DDSCAPS_BACKBUFFER; + This->backbuffer = lpDDSurface; } } @@ -124,13 +124,13 @@ HRESULT dds_Blt( if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) { blt_colorfill( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->l_pitch, - lpDDBltFx->dwFillColor, + dst_buf, + dst_x, + dst_y, + dst_w, + dst_h, + This->l_pitch, + lpDDBltFx->dwFillColor, This->bpp); } From a0d28a0e6e5d5a43f238ef55210510ac8123b659 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 15:38:19 +0200 Subject: [PATCH 0193/1724] log NOT_IMPLEMENTED for clipper functions --- src/IDirectDraw/IDirectDrawClipper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 77792f5..70a2cc6 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -45,7 +45,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, @@ -54,7 +54,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } @@ -84,9 +84,9 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 228063839a99fa896427b763e3eca4c5c434cb45 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 27 Sep 2022 22:45:13 +0200 Subject: [PATCH 0194/1724] #177 fix for blitter with negative coords --- src/ddsurface.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 2d891a6..30aabae 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -91,10 +91,24 @@ HRESULT dds_Blt( } if (dst_rect.left < 0) + { + src_rect.left += abs(dst_rect.left); + + if (src_rect.left > src_rect.right) + src_rect.left = src_rect.right; + dst_rect.left = 0; + } if (dst_rect.top < 0) + { + src_rect.top += abs(dst_rect.top); + + if (src_rect.top > src_rect.bottom) + src_rect.top = src_rect.bottom; + dst_rect.top = 0; + } if (dst_rect.right > This->width) dst_rect.right = This->width; @@ -213,14 +227,14 @@ HRESULT dds_Blt( color_key.dwColorSpaceHighValue = color_key.dwColorSpaceLowValue; } - if (src_w == dst_w && src_h == dst_h && !mirror_left_right && !mirror_up_down) + if (!is_stretch_blt && !mirror_left_right && !mirror_up_down) { blt_colorkey( dst_buf, dst_x, dst_y, - dst_w, - dst_h, + min(dst_w, src_w), + min(dst_h, src_h), This->l_pitch, src_buf, src_x, @@ -252,7 +266,7 @@ HRESULT dds_Blt( This->bpp); } } - else if (is_stretch_blt) + else if (is_stretch_blt && (src_w != dst_w || src_h != dst_h)) { blt_stretch( dst_buf, From c8d7719d041d0c175446b81f4bd259c4747549dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 00:52:32 +0200 Subject: [PATCH 0195/1724] move clipper test code up --- src/ddsurface.c | 98 ++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 30aabae..4920e3c 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -64,10 +64,53 @@ HRESULT dds_Blt( if (lpDestRect) memcpy(&dst_rect, lpDestRect, sizeof(dst_rect)); + int src_w = src_rect.right - src_rect.left; + int src_h = src_rect.bottom - src_rect.top; + + int dst_w = dst_rect.right - dst_rect.left; + int dst_h = dst_rect.bottom - dst_rect.top; + /* stretch or clip? */ - BOOL is_stretch_blt = - ((src_rect.right - src_rect.left) != (dst_rect.right - dst_rect.left)) || - ((src_rect.bottom - src_rect.top) != (dst_rect.bottom - dst_rect.top)); + BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; + + /* keep this commented out until tested and confirmed working + if (This->clipper && src_surface && !(dwFlags & DDBLT_NO_CLIP) && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) + { + DWORD size = 0; + + if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size)) && size > 0) + { + RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + + if (list) + { + if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) + { + float scale_w = (float)src_w / dst_w; + float scale_h = (float)src_h / dst_h; + + RECT* dst_c_rect = (RECT*)list->Buffer; + + for (int i = 0; i < list->rdh.nCount; ++i) + { + RECT src_c_rect = src_rect; + + src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); + src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); + src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); + src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); + + dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); + } + } + + HeapFree(GetProcessHeap(), 0, list); + + return DD_OK; + } + } + } + */ if (src_surface) { @@ -122,13 +165,15 @@ HRESULT dds_Blt( if (dst_rect.top > dst_rect.bottom) dst_rect.top = dst_rect.bottom; - int src_w = src_rect.right - src_rect.left; - int src_h = src_rect.bottom - src_rect.top; + src_w = src_rect.right - src_rect.left; + src_h = src_rect.bottom - src_rect.top; + int src_x = src_rect.left; int src_y = src_rect.top; - int dst_w = dst_rect.right - dst_rect.left; - int dst_h = dst_rect.bottom - dst_rect.top; + dst_w = dst_rect.right - dst_rect.left; + dst_h = dst_rect.bottom - dst_rect.top; + int dst_x = dst_rect.left; int dst_y = dst_rect.top; @@ -154,45 +199,6 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - /* keep this commented out until tested and confirmed working - if (This->clipper && !(dwFlags & DDBLT_NO_CLIP)) - { - DWORD size = 0; - - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size)) && size > 0) - { - RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); - - if (list) - { - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) - { - float scale_w = (float)src_w / dst_w; - float scale_h = (float)src_h / dst_h; - - RECT* dst_c_rect = (RECT*)list->Buffer; - - for (int i = 0; i < list->rdh.nCount; ++i) - { - RECT src_c_rect = src_rect; - - src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); - src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); - src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); - src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); - - dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); - } - } - - HeapFree(GetProcessHeap(), 0, list); - - return DD_OK; - } - } - } - */ - if (This->bpp != src_surface->bpp) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); From 7f7f90182f9db27d161467d97232f978a969072b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 01:59:12 +0200 Subject: [PATCH 0196/1724] add some testing code to blitter functions --- src/ddsurface.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 4920e3c..de221e0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -210,6 +210,20 @@ HRESULT dds_Blt( dds_GetDC(src_surface, &src_dc); StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); + /* + StretchBlt( + dst_dc, + lpDestRect->left, + lpDestRect->top, + lpDestRect->right - lpDestRect->left, + lpDestRect->bottom - lpDestRect->top, + src_dc, + lpSrcRect->left, + lpSrcRect->top, + lpSrcRect->right - lpSrcRect->left, + lpSrcRect->bottom - lpSrcRect->top, + SRCCOPY); + */ } else if ( (dwFlags & DDBLT_KEYSRC) || @@ -447,6 +461,18 @@ HRESULT dds_BltFast( dds_GetDC(src_surface, &src_dc); BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + /* + BitBlt( + dst_dc, + dwX, + dwY, + lpSrcRect->right - lpSrcRect->left, + lpSrcRect->bottom - lpSrcRect->top, + src_dc, + lpSrcRect->left, + lpSrcRect->top, + SRCCOPY); + */ } else if (dwFlags & DDBLTFAST_SRCCOLORKEY) { From 7683e52f21f4cde94ba33f29e40da90fa3f77393 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 02:25:50 +0200 Subject: [PATCH 0197/1724] align --- src/ddsurface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index de221e0..f8c4da8 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -442,6 +442,7 @@ HRESULT dds_BltFast( dst_x = dst_rect.left; dst_y = dst_rect.top; + int dst_w = dst_rect.right - dst_rect.left; int dst_h = dst_rect.bottom - dst_rect.top; From 8ea545ec96c4b66b9bcfe5f8dbb7bcaa4bc34918 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 03:20:29 +0200 Subject: [PATCH 0198/1724] #177 fix text drawing --- src/ddsurface.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index f8c4da8..a64ce28 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1224,7 +1224,7 @@ HRESULT dd_CreateSurface( dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1292,6 +1292,11 @@ HRESULT dd_CreateSurface( } } + if (!dst_surface->surface_mapping) + { + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); + } + dst_surface->bitmap = CreateDIBSection( dst_surface->hdc, From 5b00653cc509ff1a9aa588cde5f60daed1f5b864 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 03:55:49 +0200 Subject: [PATCH 0199/1724] Revert "#177 fix text drawing" This reverts commit 8ea545ec96c4b66b9bcfe5f8dbb7bcaa4bc34918. --- src/ddsurface.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index a64ce28..f8c4da8 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1224,7 +1224,7 @@ HRESULT dd_CreateSurface( dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1292,11 +1292,6 @@ HRESULT dd_CreateSurface( } } - if (!dst_surface->surface_mapping) - { - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); - } - dst_surface->bitmap = CreateDIBSection( dst_surface->hdc, From 11f1422acfa934abb1df86426b2cc43abd638231 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 04:19:09 +0200 Subject: [PATCH 0200/1724] #177 add preset for Fairy Tale About Father Frost, Ivan and Nastya --- inc/dd.h | 1 + src/config.c | 6 ++++++ src/ddsurface.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 577f880..c9007af 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -152,6 +152,7 @@ typedef struct CNCDDRAW BOOL d3d9linear; BOOL gdilinear; BOOL d3d9on12; + BOOL no_guard_lines; int resolutions; BOOL armadahack; BOOL tshack; diff --git a/src/config.c b/src/config.c index 7255755..fa3ec6f 100644 --- a/src/config.c +++ b/src/config.c @@ -51,6 +51,7 @@ void cfg_load() g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); + g_ddraw->no_guard_lines = cfg_get_bool("no_guard_lines", FALSE); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -355,6 +356,7 @@ static void cfg_create_ini() "d3d9_adapter=0\n" "opengl_core=false\n" "d3d9on12=false\n" + "no_guard_lines=false\n" "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" @@ -735,6 +737,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" + "; Fairy Tale About Father Frost, Ivan and Nastya\n" + "[mrazik]\n" + "no_guard_lines=true\n" + "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "adjmouse=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index f8c4da8..357f782 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1215,7 +1215,7 @@ HRESULT dd_CreateSurface( dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; dst_surface->size = dst_surface->l_pitch * dst_surface->height; - int guard_lines = 200; + int guard_lines = g_ddraw->no_guard_lines ? 0 : 200; DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; From b609fadfb3bd720abd49b26b2bb99b02af587059 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 13:11:47 +0200 Subject: [PATCH 0201/1724] log max texture width/height and shader verions --- src/render_d3d9.c | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 01c1b5a..5245331 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -10,6 +10,7 @@ #include "wndproc.h" #include "blt.h" #include "debug.h" +#include "D3d9types.h" static BOOL d3d9_create_resources(); @@ -78,21 +79,39 @@ BOOL d3d9_create() { #if _DEBUG D3DADAPTER_IDENTIFIER9 ai = {0}; - const HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, g_ddraw->d3d9_adapter, 0, &ai); + D3DCAPS9 caps = { 0 }; + HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, g_ddraw->d3d9_adapter, 0, &ai); + HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, g_ddraw->d3d9_adapter, D3DDEVTYPE_HAL, &caps); if (SUCCEEDED(hr)) { - TRACE("+--Direct 3D 9-----------------------------------\n"); - TRACE("| VendorId: 0x%x\n", ai.VendorId); - TRACE("| DeviceId: 0x%x\n", ai.DeviceId); - TRACE("| Revision: 0x%x\n", ai.Revision); - TRACE("| SubSysId: 0x%x\n", ai.SubSysId); - TRACE("| Product: %hu\n", HIWORD(ai.DriverVersion.HighPart)); - TRACE("| Version: %hu\n", LOWORD(ai.DriverVersion.HighPart)); - TRACE("| Sub version: %hu\n", HIWORD(ai.DriverVersion.LowPart)); - TRACE("| Build: %hu\n", LOWORD(ai.DriverVersion.LowPart)); - TRACE("| Driver: %s\n", ai.Driver); - TRACE("| Description: %s\n", ai.Description); + TRACE("+--Direct3D9-------------------------------------\n"); + TRACE("| VendorId: 0x%x\n", ai.VendorId); + TRACE("| DeviceId: 0x%x\n", ai.DeviceId); + TRACE("| Revision: 0x%x\n", ai.Revision); + TRACE("| SubSysId: 0x%x\n", ai.SubSysId); + TRACE("| Version: %hu.%hu.%hu.%hu\n", + HIWORD(ai.DriverVersion.HighPart), + LOWORD(ai.DriverVersion.HighPart), + HIWORD(ai.DriverVersion.LowPart), + LOWORD(ai.DriverVersion.LowPart)); + + TRACE("| Driver: %s\n", ai.Driver); + TRACE("| Description: %s\n", ai.Description); + + if (SUCCEEDED(hr2)) + { + TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth); + TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight); + + TRACE("| VertexShaderVersion: %d.%d\n", + (caps.VertexShaderVersion >> 8) & 0xFF, + caps.VertexShaderVersion & 0xFF); + + TRACE("| PixelShaderVersion: %d.%d\n", + (caps.PixelShaderVersion >> 8) & 0xFF, + caps.PixelShaderVersion & 0xFF); + } TRACE("+------------------------------------------------\n"); } #endif From b8e7c857eee9a2e024b5260b80952e669840119a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 21:07:06 +0200 Subject: [PATCH 0202/1724] #174 only send SWP_FRAMECHANGED when frame was actually changed --- src/dd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 98f4f6b..969bbee 100644 --- a/src/dd.c +++ b/src/dd.c @@ -739,8 +739,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + DWORD swp_flags = SWP_SHOWWINDOW; + if ((style & WS_CAPTION)) { + swp_flags |= SWP_FRAMECHANGED; + real_SetWindowLongA( g_ddraw->hwnd, GWL_STYLE, @@ -783,7 +787,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl 0, g_ddraw->render.width, g_ddraw->render.height, - SWP_SHOWWINDOW | SWP_FRAMECHANGED); + swp_flags); g_ddraw->last_set_window_pos_tick = timeGetTime(); From 8d12eb21e422613ce2ba2e030970fb1d212c4e4a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 21:35:25 +0200 Subject: [PATCH 0203/1724] improve debug logs --- src/render_d3d9.c | 4 +++- src/render_gdi.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5245331..42fcb3d 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -58,6 +58,7 @@ BOOL d3d9_create() d3d9_enable_shim(TRUE); } + LPDIRECT3D9 d3d9on12 = NULL; D3D9ON12_ARGS args; memset(&args, 0, sizeof(args)); args.Enable9On12 = TRUE; @@ -74,7 +75,7 @@ BOOL d3d9_create() d3d_create9 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); } - if ((d3d_create9on12 && (g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || + if ((d3d_create9on12 && (d3d9on12 = g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { #if _DEBUG @@ -86,6 +87,7 @@ BOOL d3d9_create() if (SUCCEEDED(hr)) { TRACE("+--Direct3D9-------------------------------------\n"); + TRACE("| D3D9On12: %s\n", d3d9on12 != NULL ? "True" : "False"); TRACE("| VendorId: 0x%x\n", ai.VendorId); TRACE("| DeviceId: 0x%x\n", ai.DeviceId); TRACE("| Revision: 0x%x\n", ai.Revision); diff --git a/src/render_gdi.c b/src/render_gdi.c index e4d0127..d65f9f2 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -16,6 +16,8 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->show_driver_warning) { + TRACE(" Switched to GDI renderer\n"); + g_ddraw->show_driver_warning = FALSE; warning_end_tick = timeGetTime() + (15 * 1000); From 2d2b8c7be6d4bd595d60fa470a8cba75070eb08e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Sep 2022 21:36:28 +0200 Subject: [PATCH 0204/1724] move log down --- src/render_gdi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index d65f9f2..4e6cf70 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -16,10 +16,10 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->show_driver_warning) { - TRACE(" Switched to GDI renderer\n"); - g_ddraw->show_driver_warning = FALSE; + TRACE(" Switched to GDI renderer\n"); + warning_end_tick = timeGetTime() + (15 * 1000); if (!g_ddraw->windowed) From 6dd5174cb8fba08c2d19f04341a5d624c21672b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 00:17:07 +0200 Subject: [PATCH 0205/1724] #177 fix 32bit colorkey blitter --- src/blt.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/blt.c b/src/blt.c index 29db529..0f8d78e 100644 --- a/src/blt.c +++ b/src/blt.c @@ -291,8 +291,8 @@ void blt_colorkey( } else if (bpp == 32) { - unsigned int key_l = (unsigned int)key_low; - unsigned int key_h = (unsigned int)key_high; + unsigned int key_l = key_low & 0xFFFFFF; + unsigned int key_h = key_high & 0xFFFFFF; unsigned int* d = (unsigned int*)dst; unsigned int* s = (unsigned int*)src; @@ -305,7 +305,7 @@ void blt_colorkey( { unsigned int c = *s++; - if (c != key_l) + if ((c & 0xFFFFFF) != key_l) { *d = c; } @@ -325,7 +325,7 @@ void blt_colorkey( { unsigned int c = *s++; - if (c < key_l || c > key_h) + if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h) { *d = c; } @@ -431,8 +431,8 @@ void blt_colorkey_mirror_stretch( } else if (bpp == 32) { - unsigned int key_l = (unsigned int)key_low; - unsigned int key_h = (unsigned int)key_high; + unsigned int key_l = key_low & 0xFFFFFF; + unsigned int key_h = key_high & 0xFFFFFF; for (int y = 0; y < dst_h; y++) { @@ -453,7 +453,7 @@ void blt_colorkey_mirror_stretch( unsigned int c = ((unsigned int*)src)[scaled_x + src_row]; - if (c < key_l || c > key_h) + if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h) { ((unsigned int*)dst)[x + dst_row] = c; } From 86996a15be0ace6480977cd10e05943233b34f39 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 00:19:48 +0200 Subject: [PATCH 0206/1724] #177 add support for transparent color conversion blt --- src/ddsurface.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 357f782..3e7b52b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -209,7 +209,48 @@ HRESULT dds_Blt( HDC src_dc; dds_GetDC(src_surface, &src_dc); - StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); + if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) + { + UINT color = + (dwFlags & DDBLT_KEYSRCOVERRIDE) ? + lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; + + if (src_surface->bpp == 32) + { + color = color & 0xFFFFFF; + } + else if (src_surface->bpp == 16) + { + unsigned short c = (unsigned short)color; + + BYTE r = ((c & 0xF800) >> 11) << 3; + BYTE g = ((c & 0x07E0) >> 5) << 2; + BYTE b = ((c & 0x001F)) << 3; + + color = RGB(r, g, b); + } + else if (src_surface->bpp == 8) + { + RGBQUAD* quad = + src_surface->palette ? src_surface->palette->data_rgb : + g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + NULL; + + if (quad) + { + unsigned char i = (unsigned char)color; + + color = RGB(quad[i].rgbRed, quad[i].rgbGreen, quad[i].rgbBlue); + } + } + + GdiTransparentBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, color); + } + else + { + StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); + } + /* StretchBlt( dst_dc, @@ -461,7 +502,46 @@ HRESULT dds_BltFast( HDC src_dc; dds_GetDC(src_surface, &src_dc); - BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + if (dwFlags & DDBLTFAST_SRCCOLORKEY) + { + UINT color = src_surface->color_key.dwColorSpaceLowValue; + + if (src_surface->bpp == 32) + { + color = color & 0xFFFFFF; + } + else if (src_surface->bpp == 16) + { + unsigned short c = (unsigned short)color; + + BYTE r = ((c & 0xF800) >> 11) << 3; + BYTE g = ((c & 0x07E0) >> 5) << 2; + BYTE b = ((c & 0x001F)) << 3; + + color = RGB(r, g, b); + } + else if (src_surface->bpp == 8) + { + RGBQUAD* quad = + src_surface->palette ? src_surface->palette->data_rgb : + g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + NULL; + + if (quad) + { + unsigned char i = (unsigned char)color; + + color = RGB(quad[i].rgbRed, quad[i].rgbGreen, quad[i].rgbBlue); + } + } + + GdiTransparentBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, dst_w, dst_h, color); + } + else + { + BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + } + /* BitBlt( dst_dc, From 0ec983829d05e2de204d796fe91c764313b53031 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 00:23:09 +0200 Subject: [PATCH 0207/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e29bc1a..64c9d33 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 606a7460eec7ada0aaee125a2948d5a3ea111ae2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 12:55:16 +0200 Subject: [PATCH 0208/1724] fix blitter clipping --- src/ddsurface.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 3e7b52b..fd60ea4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -177,6 +177,12 @@ HRESULT dds_Blt( int dst_x = dst_rect.left; int dst_y = dst_rect.top; + if (!is_stretch_blt) + { + src_w = dst_w = min(src_w, dst_w); + src_h = dst_h = min(src_h, dst_h); + } + void* dst_buf = dds_GetBuffer(This); void* src_buf = dds_GetBuffer(src_surface); @@ -294,8 +300,8 @@ HRESULT dds_Blt( dst_buf, dst_x, dst_y, - min(dst_w, src_w), - min(dst_h, src_h), + dst_w, + dst_h, This->l_pitch, src_buf, src_x, @@ -350,8 +356,8 @@ HRESULT dds_Blt( dst_buf, dst_x, dst_y, - min(dst_w, src_w), - min(dst_h, src_h), + dst_w, + dst_h, This->l_pitch, src_buf, src_x, @@ -365,8 +371,8 @@ HRESULT dds_Blt( dst_buf, dst_x, dst_y, - min(dst_w, src_w), - min(dst_h, src_h), + dst_w, + dst_h, This->l_pitch, src_buf, src_x, From c7f971c0be59c20f26ce19578dee8601f2af8903 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 13:44:25 +0200 Subject: [PATCH 0209/1724] add some more debug logging --- inc/debug.h | 1 + src/ddsurface.c | 7 ++++++- src/debug.c | 24 +++++++++++++++++++++--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 84a269a..a585da4 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -8,6 +8,7 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); +void dbg_print_rect(char* info, LPRECT rect); void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); int dbg_printf(const char* fmt, ...); diff --git a/src/ddsurface.c b/src/ddsurface.c index fd60ea4..9dff430 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -73,7 +73,7 @@ HRESULT dds_Blt( /* stretch or clip? */ BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - /* keep this commented out until tested and confirmed working + /* keep this commented out until tested and confirmed working if (This->clipper && src_surface && !(dwFlags & DDBLT_NO_CLIP) && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) { DWORD size = 0; @@ -100,6 +100,11 @@ HRESULT dds_Blt( src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); + dbg_print_rect("src_rect ", &src_rect); + dbg_print_rect("src_c_rect ", &src_c_rect); + dbg_print_rect("dst_rect ", &dst_rect); + dbg_print_rect("dst_c_rect[i]", &dst_c_rect[i]); + dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); } } diff --git a/src/debug.c b/src/debug.c index 6b9d12d..cac7a1b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -48,7 +48,7 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) if (exception && exception->ExceptionRecord) { - dbg_printf( + TRACE( "Exception at %p (%08X)\n", exception->ExceptionRecord->ExceptionAddress, exception->ExceptionRecord->ExceptionCode); @@ -83,13 +83,13 @@ void dbg_init() DWORD build_size = sizeof(build); RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - dbg_printf("%s (%s)\n", name, build); + TRACE("%s (%s)\n", name, build); const char* (CDECL * wine_get_version)() = (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); if (wine_get_version) - dbg_printf("Wine version = %s\n", wine_get_version()); + TRACE("Wine version = %s\n", wine_get_version()); } } } @@ -158,6 +158,24 @@ int dbg_printf(const char* fmt, ...) return ret; } +void dbg_print_rect(char* info, LPRECT rect) +{ +#ifdef _DEBUG_X + if (rect) + { + TRACE( + " %s: l=%d, t=%d, r=%d, b=%d (%dx%d)\n", + info, + rect->left, + rect->top, + rect->right, + rect->bottom, + rect->right - rect->left, + rect->bottom - rect->top); + } +#endif +} + void dbg_draw_frame_info_start() { static DWORD tick_fps = 0; From 31a3118de64c317ffa688174724ec3e11be3da00 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 17:21:23 +0200 Subject: [PATCH 0210/1724] enable clipper in dds_Blt --- src/IDirectDraw/IDirectDrawClipper.c | 8 +-- src/ddclipper.c | 1 + src/ddsurface.c | 95 ++++++++++++---------------- 3 files changed, 46 insertions(+), 58 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 70a2cc6..77792f5 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -45,7 +45,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, @@ -54,7 +54,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -84,9 +84,9 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index 1d3bcda..ecbb56e 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -76,6 +76,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { + /* FIXME: need to set up This->region here (from hwnd region) */ This->hwnd = hWnd; return DD_OK; diff --git a/src/ddsurface.c b/src/ddsurface.c index 9dff430..2d4c21a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -70,11 +70,12 @@ HRESULT dds_Blt( int dst_w = dst_rect.right - dst_rect.left; int dst_h = dst_rect.bottom - dst_rect.top; - /* stretch or clip? */ + float scale_w = (src_w > 0 && dst_w > 0) ? (float)src_w / dst_w : 1.0f; + float scale_h = (src_h > 0 && dst_h > 0) ? (float)src_h / dst_h : 1.0f; + BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - /* keep this commented out until tested and confirmed working - if (This->clipper && src_surface && !(dwFlags & DDBLT_NO_CLIP) && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) + if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; @@ -86,24 +87,19 @@ HRESULT dds_Blt( { if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) { - float scale_w = (float)src_w / dst_w; - float scale_h = (float)src_h / dst_h; - RECT* dst_c_rect = (RECT*)list->Buffer; for (int i = 0; i < list->rdh.nCount; ++i) { RECT src_c_rect = src_rect; - src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); - src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); - src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); - src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); - - dbg_print_rect("src_rect ", &src_rect); - dbg_print_rect("src_c_rect ", &src_c_rect); - dbg_print_rect("dst_rect ", &dst_rect); - dbg_print_rect("dst_c_rect[i]", &dst_c_rect[i]); + if (src_surface) + { + src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); + src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); + src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); + src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); + } dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); } @@ -115,7 +111,30 @@ HRESULT dds_Blt( } } } - */ + + if (dst_rect.left < 0) + { + src_rect.left += abs(dst_rect.left); + dst_rect.left = 0; + } + + if (dst_rect.top < 0) + { + src_rect.top += abs(dst_rect.top); + dst_rect.top = 0; + } + + if (dst_rect.right > This->width) + dst_rect.right = This->width; + + if (dst_rect.left > dst_rect.right) + dst_rect.left = dst_rect.right; + + if (dst_rect.bottom > This->height) + dst_rect.bottom = This->height; + + if (dst_rect.top > dst_rect.bottom) + dst_rect.top = dst_rect.bottom; if (src_surface) { @@ -138,38 +157,6 @@ HRESULT dds_Blt( src_rect.top = src_rect.bottom; } - if (dst_rect.left < 0) - { - src_rect.left += abs(dst_rect.left); - - if (src_rect.left > src_rect.right) - src_rect.left = src_rect.right; - - dst_rect.left = 0; - } - - if (dst_rect.top < 0) - { - src_rect.top += abs(dst_rect.top); - - if (src_rect.top > src_rect.bottom) - src_rect.top = src_rect.bottom; - - dst_rect.top = 0; - } - - if (dst_rect.right > This->width) - dst_rect.right = This->width; - - if (dst_rect.left > dst_rect.right) - dst_rect.left = dst_rect.right; - - if (dst_rect.bottom > This->height) - dst_rect.bottom = This->height; - - if (dst_rect.top > dst_rect.bottom) - dst_rect.top = dst_rect.bottom; - src_w = src_rect.right - src_rect.left; src_h = src_rect.bottom - src_rect.top; @@ -182,12 +169,6 @@ HRESULT dds_Blt( int dst_x = dst_rect.left; int dst_y = dst_rect.top; - if (!is_stretch_blt) - { - src_w = dst_w = min(src_w, dst_w); - src_h = dst_h = min(src_h, dst_h); - } - void* dst_buf = dds_GetBuffer(This); void* src_buf = dds_GetBuffer(src_surface); @@ -206,6 +187,12 @@ HRESULT dds_Blt( if (src_surface && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) { + if (!is_stretch_blt) + { + src_w = dst_w = min(src_w, dst_w); + src_h = dst_h = min(src_h, dst_h); + } + BOOL got_fx = (dwFlags & DDBLT_DDFX) && lpDDBltFx; BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); From 3562c2bd7ab0408a7656201ee8992ab619480c4c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 17:49:20 +0200 Subject: [PATCH 0211/1724] add some more error checking --- src/ddclipper.c | 3 +++ src/ddsurface.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index ecbb56e..a3bc388 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -38,6 +38,9 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l if (lpRect) DeleteObject(region); + if (*lpdwSiz == 0) + return DDERR_REGIONTOOSMALL; + return DD_OK; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 2d4c21a..c668155 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -79,7 +79,7 @@ HRESULT dds_Blt( { DWORD size = 0; - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size)) && size > 0) + if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size))) { RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); From 1bd19be3b83c7cb091c9b6d50f6ed6ea85e915a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 18:06:51 +0200 Subject: [PATCH 0212/1724] improve debug dds debug logs --- src/ddsurface.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c668155..6b83240 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -772,7 +772,11 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps HRESULT dds_GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDDSCaps) { + if (!lpDDSCaps) + return DDERR_INVALIDPARAMS; + lpDDSCaps->dwCaps = This->caps; + return DD_OK; } @@ -796,6 +800,11 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { + if (dwFlags != DDCKEY_SRCBLT) + { + TRACE_EXT(" NOT_IMPLEMENTED dwFlags=%08X\n", dwFlags); + } + if (lpColorKey) { lpColorKey->dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue; @@ -957,11 +966,13 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpC HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { + if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) + { + TRACE_EXT(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); + } + if (lpColorKey) { - TRACE_EXT(" dwColorSpaceHighValue=%d\n", lpColorKey->dwColorSpaceHighValue); - TRACE_EXT(" dwColorSpaceLowValue=%d\n", lpColorKey->dwColorSpaceLowValue); - This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; } From 8ae5ef0c7e36af94d063a8bad9fa0e48c500aca3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 18:14:01 +0200 Subject: [PATCH 0213/1724] fix trace --- src/debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/debug.c b/src/debug.c index cac7a1b..2d9647a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -89,7 +89,9 @@ void dbg_init() (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); if (wine_get_version) + { TRACE("Wine version = %s\n", wine_get_version()); + } } } } From 4326703c71bd2fd2be8c70315eb569b2ea362747 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 20:41:14 +0200 Subject: [PATCH 0214/1724] disable clipper functions (needs more testing) --- src/IDirectDraw/IDirectDrawClipper.c | 14 ++++++++------ src/ddsurface.c | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 77792f5..1de1471 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -45,16 +45,17 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, lpClipList, lpdwSiz); - HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); + HRESULT ret = DDERR_NOCLIPLIST; + //HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } @@ -84,9 +85,10 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); - HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + //HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); + HRESULT ret = DD_OK; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 6b83240..47b5804 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -75,6 +75,7 @@ HRESULT dds_Blt( BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; + /* Disable this for now (needs more testing) if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; @@ -111,6 +112,7 @@ HRESULT dds_Blt( } } } + */ if (dst_rect.left < 0) { From eabad7582ddbda064562d12f7f2bbc138c140cd6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 21:27:05 +0200 Subject: [PATCH 0215/1724] fix clip+stretch blts --- src/ddsurface.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 47b5804..e73078e 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -116,24 +116,30 @@ HRESULT dds_Blt( if (dst_rect.left < 0) { - src_rect.left += abs(dst_rect.left); + src_rect.left += (LONG)(abs(dst_rect.left) * scale_w); dst_rect.left = 0; } if (dst_rect.top < 0) { - src_rect.top += abs(dst_rect.top); + src_rect.top += (LONG)(abs(dst_rect.top) * scale_h); dst_rect.top = 0; } if (dst_rect.right > This->width) + { + src_rect.right -= (LONG)((dst_rect.right - This->width) * scale_w); dst_rect.right = This->width; + } if (dst_rect.left > dst_rect.right) dst_rect.left = dst_rect.right; if (dst_rect.bottom > This->height) + { + src_rect.bottom -= (LONG)((dst_rect.bottom - This->height) * scale_h); dst_rect.bottom = This->height; + } if (dst_rect.top > dst_rect.bottom) dst_rect.top = dst_rect.bottom; From 94ae5cf31fc06eb3982a025e3e88077219f3105f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 21:34:55 +0200 Subject: [PATCH 0216/1724] update bltfast clipping --- src/ddsurface.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index e73078e..b35f059 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,9 +419,25 @@ HRESULT dds_BltFast( RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 }; if (lpSrcRect && src_surface) - { memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); + int dst_x = dwX; + int dst_y = dwY; + + if (dst_x < 0) + { + src_rect.left += abs(dst_x); + dst_x = 0; + } + + if (dst_y < 0) + { + src_rect.top += abs(dst_y); + dst_y = 0; + } + + if (src_surface) + { if (src_rect.left < 0) src_rect.left = 0; @@ -441,29 +457,6 @@ HRESULT dds_BltFast( src_rect.top = src_rect.bottom; } - int dst_x = dwX; - int dst_y = dwY; - - if (dst_x < 0) - { - src_rect.left += abs(dst_x); - - if (src_rect.left > src_rect.right) - src_rect.left = src_rect.right; - - dst_x = 0; - } - - if (dst_y < 0) - { - src_rect.top += abs(dst_y); - - if (src_rect.top > src_rect.bottom) - src_rect.top = src_rect.bottom; - - dst_y = 0; - } - int src_x = src_rect.left; int src_y = src_rect.top; From 5c0dc2753d48f68160b01ffa911c12728e5f95f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 21:52:07 +0200 Subject: [PATCH 0217/1724] remove bool and make guard lines adjustable --- inc/dd.h | 2 +- src/config.c | 6 +++--- src/ddsurface.c | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index c9007af..ba8e2bf 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -152,7 +152,7 @@ typedef struct CNCDDRAW BOOL d3d9linear; BOOL gdilinear; BOOL d3d9on12; - BOOL no_guard_lines; + int guard_lines; int resolutions; BOOL armadahack; BOOL tshack; diff --git a/src/config.c b/src/config.c index fa3ec6f..53e150d 100644 --- a/src/config.c +++ b/src/config.c @@ -51,7 +51,7 @@ void cfg_load() g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); - g_ddraw->no_guard_lines = cfg_get_bool("no_guard_lines", FALSE); + g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -356,7 +356,7 @@ static void cfg_create_ini() "d3d9_adapter=0\n" "opengl_core=false\n" "d3d9on12=false\n" - "no_guard_lines=false\n" + "guard_lines=200\n" "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" @@ -739,7 +739,7 @@ static void cfg_create_ini() "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" - "no_guard_lines=true\n" + "guard_lines=0\n" "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index b35f059..817196f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1305,16 +1305,15 @@ HRESULT dd_CreateSurface( dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; dst_surface->size = dst_surface->l_pitch * dst_surface->height; - int guard_lines = g_ddraw->no_guard_lines ? 0 : 200; DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; - DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + guard_lines); + DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + g_ddraw->guard_lines); dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + guard_lines); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_ddraw->guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; From 0401afb8dda6b918d212d92221f5a99ae9b4e3da Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Sep 2022 22:02:37 +0200 Subject: [PATCH 0218/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 64c9d33..5c0e4d0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 4 -#define VERSION_MINOR 5 +#define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 72c06e75241c26229ee9b71e49cb8e77bd7631ea Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Sep 2022 14:16:20 +0200 Subject: [PATCH 0219/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 5c0e4d0..8f32235 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From a3469be07ae17b038efbadd4312d0ef9c48074a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Sep 2022 14:16:30 +0200 Subject: [PATCH 0220/1724] improve debug logs --- inc/debug.h | 3 ++ src/dd.c | 7 ++-- src/ddsurface.c | 2 ++ src/debug.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index a585da4..26d13f2 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -13,6 +13,9 @@ void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); int dbg_printf(const char* fmt, ...); void dbg_init(); +void dbg_dump_scl_flags(DWORD flags); +void dbg_dump_edm_flags(DWORD flags); +void dbg_dump_dds_flip_flags(DWORD flags); void dbg_dump_dds_blt_flags(DWORD flags); void dbg_dump_dds_blt_fx_flags(DWORD flags); void dbg_dump_dds_caps(DWORD caps); diff --git a/src/dd.c b/src/dd.c index 969bbee..917c7fa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -23,6 +23,8 @@ HRESULT dd_EnumDisplayModes( LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback) { + dbg_dump_edm_flags(dwFlags); + DWORD i = 0; DDSURFACEDESC2 s; @@ -821,7 +823,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { - PIXELFORMATDESCRIPTOR pfd; + dbg_dump_scl_flags(dwFlags); if (hwnd == NULL) { @@ -843,9 +845,10 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { g_ddraw->render.hdc = GetDC(g_ddraw->hwnd); + PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw->renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); diff --git a/src/ddsurface.c b/src/ddsurface.c index 817196f..4e001da 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -699,6 +699,8 @@ HRESULT dds_EnumAttachedSurfaces( HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfaceTargetOverride, DWORD dwFlags) { + dbg_dump_dds_flip_flags(dwFlags); + if (This->backbuffer) { EnterCriticalSection(&g_ddraw->cs); diff --git a/src/debug.c b/src/debug.c index 2d9647a..d7502cf 100644 --- a/src/debug.c +++ b/src/debug.c @@ -218,6 +218,93 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } +void dbg_dump_scl_flags(DWORD flags) +{ +#ifdef _DEBUG_X + if (flags & DDSCL_FULLSCREEN) { + TRACE(" DDSCL_FULLSCREEN\n"); + } + if (flags & DDSCL_ALLOWREBOOT) { + TRACE(" DDSCL_ALLOWREBOOT\n"); + } + if (flags & DDSCL_NOWINDOWCHANGES) { + TRACE(" DDSCL_NOWINDOWCHANGES\n"); + } + if (flags & DDSCL_NORMAL) { + TRACE(" DDSCL_NORMAL\n"); + } + if (flags & DDSCL_EXCLUSIVE) { + TRACE(" DDSCL_EXCLUSIVE\n"); + } + if (flags & DDSCL_ALLOWMODEX) { + TRACE(" DDSCL_ALLOWMODEX\n"); + } + if (flags & DDSCL_SETFOCUSWINDOW) { + TRACE(" DDSCL_SETFOCUSWINDOW\n"); + } + if (flags & DDSCL_SETDEVICEWINDOW) { + TRACE(" DDSCL_SETDEVICEWINDOW\n"); + } + if (flags & DDSCL_CREATEDEVICEWINDOW) { + TRACE(" DDSCL_CREATEDEVICEWINDOW\n"); + } + if (flags & DDSCL_MULTITHREADED) { + TRACE(" DDSCL_MULTITHREADED\n"); + } + if (flags & DDSCL_FPUSETUP) { + TRACE(" DDSCL_FPUSETUP\n"); + } + if (flags & DDSCL_FPUPRESERVE) { + TRACE(" DDSCL_FPUPRESERVE\n"); + } +#endif +} + +void dbg_dump_edm_flags(DWORD flags) +{ +#ifdef _DEBUG_X + if (flags & DDEDM_REFRESHRATES) { + TRACE(" DDEDM_REFRESHRATES\n"); + } + if (flags & DDEDM_STANDARDVGAMODES) { + TRACE(" DDEDM_STANDARDVGAMODES\n"); + } +#endif +} + +void dbg_dump_dds_flip_flags(DWORD flags) +{ +#ifdef _DEBUG_X + if (flags & DDFLIP_WAIT) { + TRACE(" DDFLIP_WAIT\n"); + } + if (flags & DDFLIP_EVEN) { + TRACE(" DDFLIP_EVEN\n"); + } + if (flags & DDFLIP_ODD) { + TRACE(" DDFLIP_ODD\n"); + } + if (flags & DDFLIP_NOVSYNC) { + TRACE(" DDFLIP_NOVSYNC\n"); + } + if (flags & DDFLIP_INTERVAL2) { + TRACE(" DDFLIP_INTERVAL2\n"); + } + if (flags & DDFLIP_INTERVAL3) { + TRACE(" DDFLIP_INTERVAL3\n"); + } + if (flags & DDFLIP_INTERVAL4) { + TRACE(" DDFLIP_INTERVAL4\n"); + } + if (flags & DDFLIP_STEREO) { + TRACE(" DDFLIP_STEREO\n"); + } + if (flags & DDFLIP_DONOTWAIT) { + TRACE(" DDFLIP_DONOTWAIT\n"); + } +#endif +} + void dbg_dump_dds_blt_flags(DWORD flags) { #ifdef _DEBUG_X From 2dfccb85cf958076f87b22caa0ed30412c28aae6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Sep 2022 14:22:11 +0200 Subject: [PATCH 0221/1724] fix for last commit --- src/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/debug.c b/src/debug.c index d7502cf..99e55ff 100644 --- a/src/debug.c +++ b/src/debug.c @@ -220,7 +220,7 @@ void dbg_draw_frame_info_end() void dbg_dump_scl_flags(DWORD flags) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (flags & DDSCL_FULLSCREEN) { TRACE(" DDSCL_FULLSCREEN\n"); } @@ -262,7 +262,7 @@ void dbg_dump_scl_flags(DWORD flags) void dbg_dump_edm_flags(DWORD flags) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (flags & DDEDM_REFRESHRATES) { TRACE(" DDEDM_REFRESHRATES\n"); } From f83d8f7bad3d20cf60e00108c7d3cd7718161797 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Sep 2022 14:27:41 +0200 Subject: [PATCH 0222/1724] add some more debug logging --- inc/debug.h | 1 + src/ddpalette.c | 2 ++ src/debug.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index 26d13f2..844bb6d 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -13,6 +13,7 @@ void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); int dbg_printf(const char* fmt, ...); void dbg_init(); +void dbg_dump_ddp_flags(DWORD flags); void dbg_dump_scl_flags(DWORD flags); void dbg_dump_edm_flags(DWORD flags); void dbg_dump_dds_flip_flags(DWORD flags); diff --git a/src/ddpalette.c b/src/ddpalette.c index 7fcf362..3cab558 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -72,6 +72,8 @@ HRESULT dd_CreatePalette( IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter) { + dbg_dump_ddp_flags(dwFlags); + if (!lpDDPalette || !lpDDColorArray) return DDERR_INVALIDPARAMS; diff --git a/src/debug.c b/src/debug.c index 99e55ff..14cf67d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -218,6 +218,45 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } +void dbg_dump_ddp_flags(DWORD flags) +{ +#ifdef _DEBUG + if (flags & DDPCAPS_4BIT) { + TRACE(" DDPCAPS_4BIT\n"); + } + if (flags & DDPCAPS_8BITENTRIES) { + TRACE(" DDPCAPS_8BITENTRIES\n"); + } + if (flags & DDPCAPS_8BIT) { + TRACE(" DDPCAPS_8BIT\n"); + } + if (flags & DDPCAPS_INITIALIZE) { + TRACE(" DDPCAPS_INITIALIZE\n"); + } + if (flags & DDPCAPS_PRIMARYSURFACE) { + TRACE(" DDPCAPS_PRIMARYSURFACE\n"); + } + if (flags & DDPCAPS_PRIMARYSURFACELEFT) { + TRACE(" DDPCAPS_PRIMARYSURFACELEFT\n"); + } + if (flags & DDPCAPS_ALLOW256) { + TRACE(" DDPCAPS_ALLOW256\n"); + } + if (flags & DDPCAPS_VSYNC) { + TRACE(" DDPCAPS_VSYNC\n"); + } + if (flags & DDPCAPS_1BIT) { + TRACE(" DDPCAPS_1BIT\n"); + } + if (flags & DDPCAPS_2BIT) { + TRACE(" DDPCAPS_2BIT\n"); + } + if (flags & DDPCAPS_ALPHA) { + TRACE(" DDPCAPS_ALPHA\n"); + } +#endif +} + void dbg_dump_scl_flags(DWORD flags) { #ifdef _DEBUG From 68faa57a1fd3ad01edeb472027e59378631bf8bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 12:19:34 +0200 Subject: [PATCH 0223/1724] log filename of faulty module --- src/debug.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/debug.c b/src/debug.c index 14cf67d..aad49ef 100644 --- a/src/debug.c +++ b/src/debug.c @@ -48,10 +48,22 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) if (exception && exception->ExceptionRecord) { - TRACE( - "Exception at %p (%08X)\n", + HMODULE mod = NULL; + char filename[MAX_PATH] = { 0 }; + + if (GetModuleHandleExA( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, - exception->ExceptionRecord->ExceptionCode); + &mod)) + { + GetModuleFileNameA(mod, filename, sizeof(filename) - 1); + } + + TRACE( + "Exception at %p (%08X) %s\n", + exception->ExceptionRecord->ExceptionAddress, + exception->ExceptionRecord->ExceptionCode, + filename); } return EXCEPTION_EXECUTE_HANDLER; From 1cbfe2d926decc77192b27517bf29dbd0de9cb21 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 14:47:46 +0200 Subject: [PATCH 0224/1724] tweak clipper function logging --- inc/ddclipper.h | 1 + src/IDirectDraw/IDirectDrawClipper.c | 16 +++++++--------- src/ddclipper.c | 22 ++++++++++++++++++++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/inc/ddclipper.h b/inc/ddclipper.h index 0f5ba55..f9c02c4 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -9,6 +9,7 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz); HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); +HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged); HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags); HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 1de1471..86aaaa6 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -52,8 +52,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( lpClipList, lpdwSiz); - HRESULT ret = DDERR_NOCLIPLIST; - //HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); + HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,26 +76,25 @@ HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, L HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_INVALIDOBJECT; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("-> %s(This=%p, lpbChanged=%p)\n", __FUNCTION__, This, lpbChanged); + HRESULT ret = ddc_IsClipListChanged(This, lpbChanged); + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); - //HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - HRESULT ret = DD_OK; + HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); + TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index a3bc388..30ba4ce 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -7,6 +7,9 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) { + return DDERR_NOCLIPLIST; + + /* Keep this commented out until we found a game that actually needs it if (!This->region) return DDERR_NOCLIPLIST; @@ -42,6 +45,7 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l return DDERR_REGIONTOOSMALL; return DD_OK; + */ } HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) @@ -54,8 +58,19 @@ HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) return DD_OK; } +HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) +{ + if (!lpbChanged) + return DDERR_INVALIDPARAMS; + + *lpbChanged = FALSE; /* Always return FALSE - See ddc_SetHWnd for remarks */ + + return DD_OK; +} + HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { + /* Keep this commented out until we found a game that actually needs it if (This->hwnd) return DDERR_CLIPPERISUSINGHWND; @@ -73,13 +88,16 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR { This->region = NULL; } - + */ return DD_OK; } HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - /* FIXME: need to set up This->region here (from hwnd region) */ + /* + We don't use the regions from the hwnd here since everything is emulated and we need the entire + emulated surface to be redrawn all the time + */ This->hwnd = hWnd; return DD_OK; From c9262a5ee981af9b40bf94220b1747a72079e47c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 18:41:06 +0200 Subject: [PATCH 0225/1724] hook stretchblt --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 12 ++++++++++++ src/ddsurface.c | 2 +- src/hook.c | 4 ++++ src/winapi_hooks.c | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 0623c07..22c64a6 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -34,6 +34,7 @@ typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); +typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -65,6 +66,7 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; +extern STRETCHBLTPROC real_StretchBlt; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3b4ca4c..9e7f82f 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -29,6 +29,18 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); +BOOL WINAPI fake_StretchBlt( + HDC hdcDest, + int xDest, + int yDest, + int wDest, + int hDest, + HDC hdcSrc, + int xSrc, + int ySrc, + int wSrc, + int hSrc, + DWORD rop); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/ddsurface.c b/src/ddsurface.c index 4e001da..ecc6d5b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -254,7 +254,7 @@ HRESULT dds_Blt( } else { - StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); + real_StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); } /* diff --git a/src/hook.c b/src/hook.c index b4b3355..17cfe3f 100644 --- a/src/hook.c +++ b/src/hook.c @@ -40,6 +40,7 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; +STRETCHBLTPROC real_StretchBlt = StretchBlt; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -82,6 +83,7 @@ static HOOKLIST g_hooks[] = { "gdi32.dll", { + { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } @@ -394,6 +396,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) continue; if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { @@ -470,6 +473,7 @@ void hook_revert(HOOKLIST* hooks) _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c15e77c..cb13502 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -11,6 +11,7 @@ #include "mouse.h" #include "wndproc.h" #include "render_gdi.h" +#include "ddsurface.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -545,6 +546,37 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return real_GetDeviceCaps(hdc, index); } +BOOL WINAPI fake_StretchBlt( + HDC hdcDest, + int xDest, + int yDest, + int wDest, + int hDest, + HDC hdcSrc, + int xSrc, + int ySrc, + int wSrc, + int hSrc, + DWORD rop) +{ + if (g_ddraw && g_ddraw->primary && WindowFromDC(hdcDest) == g_ddraw->hwnd) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + if (primary_dc) + { + BOOL result = real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); + + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + + return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); From 5595dbeff7d9ea01d60a4a196d0beeaf27e35b07 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 20:55:20 +0200 Subject: [PATCH 0226/1724] tweak StretchBlt hook --- src/config.c | 2 +- src/winapi_hooks.c | 35 +++++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/config.c b/src/config.c index 53e150d..760efb6 100644 --- a/src/config.c +++ b/src/config.c @@ -1001,7 +1001,7 @@ static void cfg_create_ini() "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" - "fixchilds=1\n" + "fixchilds=2\n" "maintas=false\n" "boxing=false\n" "\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cb13502..60c9e40 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -559,18 +559,37 @@ BOOL WINAPI fake_StretchBlt( int hSrc, DWORD rop) { - if (g_ddraw && g_ddraw->primary && WindowFromDC(hdcDest) == g_ddraw->hwnd) + if (g_ddraw && WindowFromDC(hdcDest) == g_ddraw->hwnd) { - HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); - - if (primary_dc) + if (g_ddraw->primary) { - BOOL result = real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + if (primary_dc) + { + BOOL result = + real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); - return result; + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + else if (g_ddraw->width > 0) + { + return real_StretchBlt( + hdcDest, + xDest + g_ddraw->render.viewport.x, + yDest + g_ddraw->render.viewport.y, + wDest * g_ddraw->render.scale_w, + hDest * g_ddraw->render.scale_h, + hdcSrc, + xSrc, + ySrc, + wSrc, + hSrc, + rop); } } From ae2bd58f1068e5e1203341576c274d69fc02adaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 20:56:06 +0200 Subject: [PATCH 0227/1724] revert preset change --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 760efb6..53e150d 100644 --- a/src/config.c +++ b/src/config.c @@ -1001,7 +1001,7 @@ static void cfg_create_ini() "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" - "fixchilds=2\n" + "fixchilds=1\n" "maintas=false\n" "boxing=false\n" "\n" From f068b1217b28e2954bb431a3483b948e1c55b2dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 21:07:01 +0200 Subject: [PATCH 0228/1724] fix compiler warning --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 60c9e40..06ccd0f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -582,8 +582,8 @@ BOOL WINAPI fake_StretchBlt( hdcDest, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, - wDest * g_ddraw->render.scale_w, - hDest * g_ddraw->render.scale_h, + (int)(wDest * g_ddraw->render.scale_w), + (int)(hDest * g_ddraw->render.scale_h), hdcSrc, xSrc, ySrc, From 89017d5f10e2946bc5e2595866aa31c14974a28f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Oct 2022 21:17:02 +0200 Subject: [PATCH 0229/1724] don't log initialize as NOT_IMPLEMENTED --- src/IDirectDraw/IDirectDraw.c | 4 ++-- src/IDirectDraw/IDirectDrawPalette.c | 4 ++-- src/IDirectDraw/IDirectDrawSurface.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 287500b..89659ca 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -371,9 +371,9 @@ HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPB HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 2f7ffc3..2eb313b 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -76,9 +76,9 @@ HRESULT __stdcall IDirectDrawPalette__Initialize( DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 2cd4b50..ece48f5 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -350,9 +350,9 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( LPDIRECTDRAW lpDD, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } From 707239ba61437b19a7c62b8ffb15d21cd85617a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 01:43:54 +0200 Subject: [PATCH 0230/1724] add IsChild check for fixchilds setting --- src/winapi_hooks.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 06ccd0f..1dec7f9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -559,7 +559,9 @@ BOOL WINAPI fake_StretchBlt( int hSrc, DWORD rop) { - if (g_ddraw && WindowFromDC(hdcDest) == g_ddraw->hwnd) + HWND hwnd = WindowFromDC(hdcDest); + + if (g_ddraw && (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == 3 && IsChild(g_ddraw->hwnd, hwnd)))) { if (g_ddraw->primary) { From 2a8a5f85ec865578d2c58e1519581e82e00f4a61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 12:19:15 +0200 Subject: [PATCH 0231/1724] hook SetDIBitsToDevice --- inc/hook.h | 3 +++ inc/winapi_hooks.h | 14 +++----------- src/hook.c | 2 ++ src/winapi_hooks.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 22c64a6..733deeb 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -35,6 +35,8 @@ typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); +typedef int (WINAPI* SETDIBITSTODEVICEPROC)( + HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -67,6 +69,7 @@ extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; extern STRETCHBLTPROC real_StretchBlt; +extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 9e7f82f..e97bb24 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -30,17 +30,9 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( - HDC hdcDest, - int xDest, - int yDest, - int wDest, - int hDest, - HDC hdcSrc, - int xSrc, - int ySrc, - int wSrc, - int hSrc, - DWORD rop); + HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); +int WINAPI fake_SetDIBitsToDevice( + HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/hook.c b/src/hook.c index 17cfe3f..185565b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -41,6 +41,7 @@ DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; +SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -84,6 +85,7 @@ static HOOKLIST g_hooks[] = "gdi32.dll", { { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, + { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 | SKIP_HOOK3 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1dec7f9..761f1dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,6 +598,54 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +int WINAPI fake_SetDIBitsToDevice( + HDC hdc, + int xDest, + int yDest, + DWORD w, + DWORD h, + int xSrc, + int ySrc, + UINT StartScan, + UINT cLines, + const VOID* lpvBits, + const BITMAPINFO* lpbmi, + UINT ColorUse) +{ + if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + { + if (g_ddraw->primary) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + if (primary_dc) + { + BOOL result = + real_SetDIBitsToDevice( + primary_dc, + xDest, + yDest, + w, + h, + xSrc, + ySrc, + StartScan, + cLines, + lpvBits, + lpbmi, + ColorUse); + + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + } + + return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); From f62e0a8b73a43e3fccaaf18d4619adbc994a66b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 12:41:07 +0200 Subject: [PATCH 0232/1724] remove casino empire preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 53e150d..384933f 100644 --- a/src/config.c +++ b/src/config.c @@ -492,10 +492,6 @@ static void cfg_create_ini() "checkfile=.\\SOUND.REZ\n" "noactivateapp=true\n" "\n" - "; Casino Empire\n" - "[CasinoEmpire]\n" - "hook=2\n" - "\n" "; Carmageddon\n" "[CARMA95]\n" "renderer=opengl\n" From 2241ef3340f3eb5d154c0714732bee7937d4a424 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 12:42:22 +0200 Subject: [PATCH 0233/1724] use real function --- src/render_gdi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 4e6cf70..f0f9d85 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -6,6 +6,7 @@ #include "opengl_utils.h" #include "utils.h" #include "wndproc.h" +#include "hook.h" #include "debug.h" @@ -144,7 +145,7 @@ DWORD WINAPI gdi_render_main(void) } else { - SetDIBitsToDevice( + real_SetDIBitsToDevice( g_ddraw->render.hdc, 0, 0, From 351ad8d2d4b15923f61d5ce129feb1448f1201c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 13:20:59 +0200 Subject: [PATCH 0234/1724] force window position to be 0,0 with opengl nonexclusive --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 917c7fa..291fb85 100644 --- a/src/dd.c +++ b/src/dd.c @@ -706,6 +706,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); + if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) + { + x = y = 0; + } + RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); From cd1c2f333c9890ed55529bc224f5decdb2598fe4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 13:23:22 +0200 Subject: [PATCH 0235/1724] simplify --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 291fb85..7a5f5f6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -706,7 +706,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); - if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) + if (nonexclusive) { x = y = 0; } From 6a12187122ece660329178281ec2ee1d0a9094f6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Oct 2022 13:48:06 +0200 Subject: [PATCH 0236/1724] use constant --- src/winapi_hooks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 761f1dd..29e754a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -561,7 +561,8 @@ BOOL WINAPI fake_StretchBlt( { HWND hwnd = WindowFromDC(hdcDest); - if (g_ddraw && (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == 3 && IsChild(g_ddraw->hwnd, hwnd)))) + if (g_ddraw && + (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE && IsChild(g_ddraw->hwnd, hwnd)))) { if (g_ddraw->primary) { From 1129796858b5e72a433e97e5df3e4748d27d5e1e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 15:59:43 +0200 Subject: [PATCH 0237/1724] fix old urls --- LICENSE | 2 +- README.md | 10 +++++----- ddraw.rc | 4 ++-- src/config.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LICENSE b/LICENSE index 40417c9..e15366d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 CnCNet +Copyright (c) 2022 github.com/FunkyFr3sh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 80e42f0..ee5ff8f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Instructions -1. Download [cnc-ddraw.zip](https://github.com/CnCNet/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder +1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) @@ -38,11 +38,11 @@ If you want to play in windowed mode then start the game once in fullscreen and   -**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/CnCNet/cnc-ddraw/issues/44 +**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/FunkyFr3sh/cnc-ddraw/issues/44   -Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/CnCNet/cnc-ddraw/wiki) for more details. +Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details.   @@ -60,7 +60,7 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/CnCNet/cnc-ddraw/issues/44) +**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   @@ -105,4 +105,4 @@ Some games may require additional steps before they can be used with cnc-ddraw, There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. -[![](https://img.shields.io/github/downloads/cncnet/cnc-ddraw/total)](https://github.com/CnCNet/cnc-ddraw/releases) +[![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases) diff --git a/ddraw.rc b/ddraw.rc index 8f32235..fd5a364 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -17,7 +17,7 @@ PRODUCTVERSION VERSION { BLOCK "040904B0" { - VALUE "CompanyName", "cncnet.org" + VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "ddraw" @@ -26,7 +26,7 @@ PRODUCTVERSION VERSION VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" VALUE "ProductVersion", VERSION_STRING - VALUE "Comments", "https://cncnet.org" + VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/config.c b/src/config.c index 384933f..86e1113 100644 --- a/src/config.c +++ b/src/config.c @@ -237,7 +237,7 @@ static void cfg_create_ini() if (fh) { fputs( - "; cnc-ddraw - https://github.com/CnCNet/cnc-ddraw - https://cncnet.org\n" + "; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw\n" "\n" "[ddraw]\n" "; ### Optional settings ###\n" From 6c6d46c7de63fb97fc5af6abe48b889dd0ae250f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 16:01:01 +0200 Subject: [PATCH 0238/1724] add preset for megaman x4 --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 86e1113..fad432f 100644 --- a/src/config.c +++ b/src/config.c @@ -852,6 +852,10 @@ static void cfg_create_ini() "[Lionheart]\n" "locktopleft=true\n" "\n" + "; Megaman X4\n" + "[MMX4]\n" + "fixchilds=3\n" + "\n" "; Majesty Gold\n" "[Majesty]\n" "minfps=-2\n" From 31a71c463c41e04b72b568a8cdd5e74cb928f2a2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 17:47:52 +0200 Subject: [PATCH 0239/1724] update presets --- src/config.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/config.c b/src/config.c index fad432f..89a7eb9 100644 --- a/src/config.c +++ b/src/config.c @@ -519,12 +519,6 @@ static void cfg_create_ini() "maxfps=60\n" "minfps=-1\n" "\n" - "; Command & Conquer: Sole Survivor\n" - "[SoleSurvivor]\n" - "maxgameticks=120\n" - "maxfps=60\n" - "minfps=-1\n" - "\n" "; Command & Conquer Gold - CnCNet\n" "[cnc95]\n" "maxfps=125\n" @@ -643,6 +637,7 @@ static void cfg_create_ini() "\n" "; Caesar III\n" "[c3]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" From 80bf433a2b71016bbeb9ef93491e9a0a53cbd393 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 22:33:53 +0200 Subject: [PATCH 0240/1724] hook StretchDIBits --- inc/hook.h | 3 ++ inc/winapi_hooks.h | 2 ++ src/hook.c | 2 ++ src/render_gdi.c | 4 +-- src/winapi_hooks.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 733deeb..f40aed5 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -37,6 +37,8 @@ typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); +typedef int (WINAPI* STRETCHDIBITSPROC)( + HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -70,6 +72,7 @@ extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; +extern STRETCHDIBITSPROC real_StretchDIBits; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index e97bb24..6b47029 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,8 @@ BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); int WINAPI fake_SetDIBitsToDevice( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); +int WINAPI fake_StretchDIBits( + HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/hook.c b/src/hook.c index 185565b..1c2ebf8 100644 --- a/src/hook.c +++ b/src/hook.c @@ -42,6 +42,7 @@ MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; +STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -86,6 +87,7 @@ static HOOKLIST g_hooks[] = { { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 | SKIP_HOOK3 }, + { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 | SKIP_HOOK3 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } diff --git a/src/render_gdi.c b/src/render_gdi.c index f0f9d85..9fe62a1 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -110,7 +110,7 @@ DWORD WINAPI gdi_render_main(void) } else if (upscale_hack) { - StretchDIBits( + real_StretchDIBits( g_ddraw->render.hdc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, @@ -128,7 +128,7 @@ DWORD WINAPI gdi_render_main(void) else if (!g_ddraw->child_window_exists && (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) { - StretchDIBits( + real_StretchDIBits( g_ddraw->render.hdc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 29e754a..5d38ed1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,6 +647,88 @@ int WINAPI fake_SetDIBitsToDevice( return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); } +int WINAPI fake_StretchDIBits( + HDC hdc, + int xDest, + int yDest, + int DestWidth, + int DestHeight, + int xSrc, + int ySrc, + int SrcWidth, + int SrcHeight, + const VOID* lpBits, + const BITMAPINFO* lpbmi, + UINT iUsage, + DWORD rop) +{ + if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + { + if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + if (primary_dc) + { + int result = + real_StretchDIBits( + primary_dc, + xDest, + yDest, + DestWidth, + DestHeight, + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); + + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + else if (g_ddraw->width > 0) + { + return + real_StretchDIBits( + hdc, + xDest + g_ddraw->render.viewport.x, + yDest + g_ddraw->render.viewport.y, + (int)(DestWidth * g_ddraw->render.scale_w), + (int)(DestHeight * g_ddraw->render.scale_h), + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); + } + } + + return + real_StretchDIBits( + hdc, + xDest, + yDest, + DestWidth, + DestHeight, + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); From 984febf2090cb1e6cdf7a04bbb065f21a1e430d9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 22:34:37 +0200 Subject: [PATCH 0241/1724] add some checks to old hooks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5d38ed1..71f4587 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -564,7 +564,7 @@ BOOL WINAPI fake_StretchBlt( if (g_ddraw && (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE && IsChild(g_ddraw->hwnd, hwnd)))) { - if (g_ddraw->primary) + if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { HDC primary_dc; dds_GetDC(g_ddraw->primary, &primary_dc); @@ -615,7 +615,7 @@ int WINAPI fake_SetDIBitsToDevice( { if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) { - if (g_ddraw->primary) + if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { HDC primary_dc; dds_GetDC(g_ddraw->primary, &primary_dc); From 3804787f326c94d501122916ddf21ac3f8f781a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 22:36:59 +0200 Subject: [PATCH 0242/1724] add preset for SimCopter --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 89a7eb9..fa2241c 100644 --- a/src/config.c +++ b/src/config.c @@ -905,6 +905,11 @@ static void cfg_create_ini() "[septerra]\n" "hook=2\n" "\n" + "; Sim Copter\n" + "[SimCopter]\n" + "renderer=opengl\n" + "nonexclusive=true\n" + "\n" "; Settlers 3\n" "[s3]\n" "renderer=opengl\n" From 987695a62659fed37ba3258a7c74bab83fbc85ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 23:08:14 +0200 Subject: [PATCH 0243/1724] fix return value --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 71f4587..a6fd1ae 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -622,7 +622,7 @@ int WINAPI fake_SetDIBitsToDevice( if (primary_dc) { - BOOL result = + int result = real_SetDIBitsToDevice( primary_dc, xDest, From ad8215eee884b784f19d896c180527ffb74fec6b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Oct 2022 23:33:56 +0200 Subject: [PATCH 0244/1724] make sure hwnd is not NULL --- src/winapi_hooks.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a6fd1ae..8b21404 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -561,7 +561,7 @@ BOOL WINAPI fake_StretchBlt( { HWND hwnd = WindowFromDC(hdcDest); - if (g_ddraw && + if (g_ddraw && g_ddraw->hwnd && (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE && IsChild(g_ddraw->hwnd, hwnd)))) { if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) @@ -613,7 +613,7 @@ int WINAPI fake_SetDIBitsToDevice( const BITMAPINFO* lpbmi, UINT ColorUse) { - if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) { if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { @@ -662,7 +662,7 @@ int WINAPI fake_StretchDIBits( UINT iUsage, DWORD rop) { - if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) { if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { From 053206b414666ed00dffa53b90c7d338e7e4af24 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 01:05:27 +0200 Subject: [PATCH 0245/1724] detect movie windows --- src/utils.c | 13 ++++++++++++- src/winapi_hooks.c | 29 ++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/utils.c b/src/utils.c index 238a5c7..353bf36 100644 --- a/src/utils.c +++ b/src/utils.c @@ -426,7 +426,18 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) pos.top); */ - if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) + char title[MAX_PATH] = { 0 }; + GetWindowTextA(hwnd, title, sizeof(title) - 1); + + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + + //TRACE_EXT(" AVIWINDOW class=%s, name=%s\n", class_name, title); + + if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(title, "ActiveMovie Window") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0) { LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8b21404..f90841d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -561,8 +561,19 @@ BOOL WINAPI fake_StretchBlt( { HWND hwnd = WindowFromDC(hdcDest); + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw && g_ddraw->hwnd && hwnd != g_ddraw->hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + if (g_ddraw && g_ddraw->hwnd && - (hwnd == g_ddraw->hwnd || (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE && IsChild(g_ddraw->hwnd, hwnd)))) + (hwnd == g_ddraw->hwnd || + (IsChild(g_ddraw->hwnd, hwnd) && + (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { @@ -571,7 +582,7 @@ BOOL WINAPI fake_StretchBlt( if (primary_dc) { - BOOL result = + BOOL result = real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); dds_ReleaseDC(g_ddraw->primary, primary_dc); @@ -579,19 +590,19 @@ BOOL WINAPI fake_StretchBlt( return result; } } - else if (g_ddraw->width > 0) + else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { return real_StretchBlt( - hdcDest, + g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, (int)(wDest * g_ddraw->render.scale_w), (int)(hDest * g_ddraw->render.scale_h), - hdcSrc, - xSrc, - ySrc, - wSrc, - hSrc, + hdcSrc, + xSrc, + ySrc, + wSrc, + hSrc, rop); } } From c8125b6a5802656e6763677adff308785aad1527 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 01:05:35 +0200 Subject: [PATCH 0246/1724] adjust presets --- src/config.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index fa2241c..8c59f64 100644 --- a/src/config.c +++ b/src/config.c @@ -734,8 +734,9 @@ static void cfg_create_ini() "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" + "renderer=opengl\n" + "nonexclusive=true\n" "adjmouse=true\n" - "fixchilds=3\n" "\n" "; G-Police\n" "[GPOLICE]\n" @@ -847,10 +848,6 @@ static void cfg_create_ini() "[Lionheart]\n" "locktopleft=true\n" "\n" - "; Megaman X4\n" - "[MMX4]\n" - "fixchilds=3\n" - "\n" "; Majesty Gold\n" "[Majesty]\n" "minfps=-2\n" From df76f819562788dd83e94c88a83461b042c90cf3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 01:50:04 +0200 Subject: [PATCH 0247/1724] add NULL check --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f90841d..b1f577c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -563,7 +563,7 @@ BOOL WINAPI fake_StretchBlt( char class_name[MAX_PATH] = { 0 }; - if (g_ddraw && g_ddraw->hwnd && hwnd != g_ddraw->hwnd) + if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) { GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); } From 6838d2012d14bca8d3d128f5462dfb8f0a0dae07 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 02:01:21 +0200 Subject: [PATCH 0248/1724] check class name only --- src/utils.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/utils.c b/src/utils.c index 353bf36..a2701df 100644 --- a/src/utils.c +++ b/src/utils.c @@ -426,16 +426,13 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) pos.top); */ - char title[MAX_PATH] = { 0 }; - GetWindowTextA(hwnd, title, sizeof(title) - 1); - char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //TRACE_EXT(" AVIWINDOW class=%s, name=%s\n", class_name, title); + //TRACE_EXT(" AVIWINDOW class=%s\n", class_name); if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || - strcmp(title, "ActiveMovie Window") == 0 || + strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { From 686b2c738b84e91ddc63378fb5ad20589b8b4198 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 08:13:07 +0200 Subject: [PATCH 0249/1724] don't allow to create overlay surface --- src/ddsurface.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index ecc6d5b..a684095 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1233,6 +1233,9 @@ HRESULT dd_CreateSurface( dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps); + if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY) + return DDERR_UNSUPPORTED; + if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->primary && g_ddraw->primary->width == g_ddraw->width && From 82526a9597b0a4b30903cc9f985dc6ccf0e90251 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 17:11:35 +0200 Subject: [PATCH 0250/1724] add another check to StretchBlt hook --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b1f577c..5ecb408 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -570,7 +570,7 @@ BOOL WINAPI fake_StretchBlt( if (g_ddraw && g_ddraw->hwnd && (hwnd == g_ddraw->hwnd || - (IsChild(g_ddraw->hwnd, hwnd) && + (g_ddraw->fixchilds && IsChild(g_ddraw->hwnd, hwnd) && (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) From 3e198a628ff4cd6baf93f01a02a372efd6cb4651 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Oct 2022 22:50:41 +0200 Subject: [PATCH 0251/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index fd5a364..e3b0806 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 4 -#define VERSION_MINOR 6 +#define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From befbb19a2e259ce2a37c86113c187944a7f215b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Oct 2022 13:11:29 +0200 Subject: [PATCH 0252/1724] add a few NULL checks --- src/ddpalette.c | 2 +- src/ddsurface.c | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 3cab558..3a7b52c 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -57,7 +57,7 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) + if (g_ddraw && g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); diff --git a/src/ddsurface.c b/src/ddsurface.c index a684095..591ff7e 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -39,7 +39,8 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_ddraw->iskkndx && + if (g_ddraw && + g_ddraw->iskkndx && (dwFlags & DDBLT_COLORFILL) && lpDestRect && lpDestRect->right == 640 && @@ -239,7 +240,7 @@ HRESULT dds_Blt( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : NULL; if (quad) @@ -382,7 +383,7 @@ HRESULT dds_Blt( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); @@ -523,7 +524,7 @@ HRESULT dds_BltFast( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : NULL; if (quad) @@ -603,7 +604,7 @@ HRESULT dds_BltFast( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); @@ -652,7 +653,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; - if (!g_ddraw->novidmem || (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) + if ((g_ddraw && !g_ddraw->novidmem) || (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) { lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } @@ -729,7 +730,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa } } - if (This->caps & DDSCAPS_PRIMARYSURFACE && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { This->last_flip_tick = timeGetTime(); @@ -829,7 +830,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) RGBQUAD* data = This->palette ? This->palette->data_rgb : - g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : NULL; HDC dc = This->hdc; @@ -904,7 +905,7 @@ HRESULT dds_Lock( DWORD dwFlags, HANDLE hEvent) { - if (g_ddraw->lock_surfaces) + if (g_ddraw && g_ddraw->lock_surfaces) EnterCriticalSection(&This->cs); dbg_dump_dds_lock_flags(dwFlags); @@ -938,7 +939,7 @@ HRESULT dds_Lock( HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); @@ -991,7 +992,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (This->palette) IDirectDrawPalette_Release(This->palette); - if (This->caps & DDSCAPS_PRIMARYSURFACE) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw) { EnterCriticalSection(&g_ddraw->cs); This->palette = lpDDPalette; @@ -1014,7 +1015,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { /* Hack for Warcraft II BNE and Diablo */ - HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; + HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1069,7 +1070,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } /* Hack for Star Trek Armada */ - hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + hwnd = g_ddraw && g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1107,7 +1108,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); @@ -1123,7 +1124,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } - if (g_ddraw->lock_surfaces) + if (g_ddraw && g_ddraw->lock_surfaces) LeaveCriticalSection(&This->cs); return DD_OK; From d0ee8d3979a8a72816dfa4a932e2d4bc102fa872 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Oct 2022 01:24:07 +0200 Subject: [PATCH 0253/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee5ff8f..1980331 100644 --- a/README.md +++ b/README.md @@ -105,4 +105,4 @@ Some games may require additional steps before they can be used with cnc-ddraw, There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. -[![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases) +[![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) From 6b7814debf4e6512de43cda845c17f4e8097f2a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Oct 2022 01:29:44 +0200 Subject: [PATCH 0254/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1980331..dd21ff7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Features - - Supports Windows XP, Vista, 7, 8, 10, 11 and Wine + - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS) and Virtual Machines - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode From d9a919aee2d7e766dc37c001b82913da7238d3a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Oct 2022 01:32:02 +0200 Subject: [PATCH 0255/1724] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c2d9339..d4cbe4d 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O3 -march=pentium2 +CFLAGS = -std=c99 -O3 -march=i486 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From 1fb996d8a22c0c17e075f326aa376adc2a943cd8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Oct 2022 23:13:04 +0200 Subject: [PATCH 0256/1724] limit available resolutions to avoid crashes (Infantry Online) --- inc/dd.h | 1 + src/config.c | 3 +++ src/dd.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index ba8e2bf..88b5065 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -154,6 +154,7 @@ typedef struct CNCDDRAW BOOL d3d9on12; int guard_lines; int resolutions; + int max_resolutions; BOOL armadahack; BOOL tshack; BOOL infantryhack; diff --git a/src/config.c b/src/config.c index 8c59f64..81b3732 100644 --- a/src/config.c +++ b/src/config.c @@ -52,6 +52,7 @@ void cfg_load() g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); + g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -357,6 +358,7 @@ static void cfg_create_ini() "opengl_core=false\n" "d3d9on12=false\n" "guard_lines=200\n" + "max_resolutions=0\n" "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" @@ -789,6 +791,7 @@ static void cfg_create_ini() "devmode=true\n" "resolutions=2\n" "infantryhack=true\n" + "max_resolutions=90\n" "\n" "; Jagged Alliance 2\n" "[ja2]\n" diff --git a/src/dd.c b/src/dd.c index 7a5f5f6..997d5e2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -26,6 +26,7 @@ HRESULT dd_EnumDisplayModes( dbg_dump_edm_flags(dwFlags); DWORD i = 0; + DWORD res_count = 0; DDSURFACEDESC2 s; /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ @@ -144,6 +145,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -160,6 +167,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -176,6 +189,12 @@ HRESULT dd_EnumDisplayModes( if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) { + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -233,6 +252,12 @@ HRESULT dd_EnumDisplayModes( s.dwWidth = resolutions[i].cx; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -246,6 +271,12 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x001F; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); @@ -262,6 +293,12 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x0000FF; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { TRACE(" DDENUMRET_CANCEL returned, stopping\n"); From fa9954ea9d03b17597c982ae78275efc29939953 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Oct 2022 23:13:42 +0200 Subject: [PATCH 0257/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e3b0806..875c8eb 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 0f9da22c85ca39457d62614c21850d4f70201bf3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 14 Oct 2022 22:05:41 +0200 Subject: [PATCH 0258/1724] add all custom window messages to log --- src/debug.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/debug.c b/src/debug.c index aad49ef..83eabc7 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1389,6 +1389,9 @@ char* dbg_mes_to_str(int id) case WM_DISPLAYCHANGE_DDRAW: return "WM_DISPLAYCHANGE_DDRAW"; case WM_SIZE_DDRAW: return "WM_SIZE_DDRAW"; case WM_MOVE_DDRAW: return "WM_MOVE_DDRAW"; + case WM_D3D9DEVICELOST: return "WM_D3D9DEVICELOST"; + case WM_WINEFULLSCREEN: return "WM_WINEFULLSCREEN"; + case WM_AUTORENDERER: return "WM_AUTORENDERER"; } return 0; From 58c7df35a41530e03f355bf244fefa883c4e23dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 14 Oct 2022 22:06:10 +0200 Subject: [PATCH 0259/1724] don't reset minimized window --- src/wndproc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 2ad8151..fe21794 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -135,7 +135,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) + if ((!g_ddraw->windowed || !IsIconic(g_ddraw->hwnd)) && + g_ddraw->renderer == d3d9_render_main && + d3d9_on_device_lost()) { if (!g_ddraw->windowed) mouse_lock(); From 28e15077ca8a363f3b54094bd9cab19e0b1417b9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 14 Oct 2022 22:20:14 +0200 Subject: [PATCH 0260/1724] make sure window is not minimized --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 997d5e2..4851448 100644 --- a/src/dd.c +++ b/src/dd.c @@ -748,6 +748,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl x = y = 0; } + if (IsIconic(g_ddraw->hwnd)) + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); From cd5efade5d8e4dcbe10cf115c700b782e0f41f0b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 14 Oct 2022 23:00:23 +0200 Subject: [PATCH 0261/1724] add another minimized check for fullscreen mode --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 4851448..c50359c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -827,6 +827,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } + if (IsIconic(g_ddraw->hwnd)) + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + real_SetWindowPos( g_ddraw->hwnd, HWND_TOPMOST, From fe82a8a607415d804c5d1c0cbe5b4db6bdf06748 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 05:04:19 +0200 Subject: [PATCH 0262/1724] #178 fix blt/bltfast clipping --- src/ddsurface.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 591ff7e..8c5540e 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -115,12 +115,18 @@ HRESULT dds_Blt( } */ + if (dst_rect.right < 0) + dst_rect.right = 0; + if (dst_rect.left < 0) { src_rect.left += (LONG)(abs(dst_rect.left) * scale_w); dst_rect.left = 0; } + if (dst_rect.bottom < 0) + dst_rect.bottom = 0; + if (dst_rect.top < 0) { src_rect.top += (LONG)(abs(dst_rect.top) * scale_h); @@ -147,9 +153,15 @@ HRESULT dds_Blt( if (src_surface) { + if (src_rect.right < 0) + src_rect.right = 0; + if (src_rect.left < 0) src_rect.left = 0; + if (src_rect.bottom < 0) + src_rect.bottom = 0; + if (src_rect.top < 0) src_rect.top = 0; @@ -439,9 +451,15 @@ HRESULT dds_BltFast( if (src_surface) { + if (src_rect.right < 0) + src_rect.right = 0; + if (src_rect.left < 0) src_rect.left = 0; + if (src_rect.bottom < 0) + src_rect.bottom = 0; + if (src_rect.top < 0) src_rect.top = 0; @@ -463,9 +481,15 @@ HRESULT dds_BltFast( RECT dst_rect = { dst_x, dst_y, (src_rect.right - src_rect.left) + dst_x, (src_rect.bottom - src_rect.top) + dst_y }; + if (dst_rect.right < 0) + dst_rect.right = 0; + if (dst_rect.left < 0) dst_rect.left = 0; + if (dst_rect.bottom < 0) + dst_rect.bottom = 0; + if (dst_rect.top < 0) dst_rect.top = 0; From c648d46f4c56d72545ae8be0ead966d598078c48 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 17:37:16 +0200 Subject: [PATCH 0263/1724] #179 enable dinput hook for fallout 1/2 --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 81b3732..b873355 100644 --- a/src/config.c +++ b/src/config.c @@ -730,6 +730,14 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" + "; Fallout\n" + "[falloutw]\n" + "dinputhook=true\n" + "\n" + "; Fallout 2\n" + "[FALLOUT2]\n" + "dinputhook=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" From 1170d0dd123ed0d7db4a23616285596106cd6766 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 18:28:23 +0200 Subject: [PATCH 0264/1724] #179 hook GetDiskFreeSpaceA --- inc/hook.h | 5 +++++ inc/winapi_hooks.h | 13 +++++++++++++ src/config.c | 4 ++++ src/hook.c | 3 +++ src/winapi_hooks.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index f40aed5..725ad40 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -35,16 +35,20 @@ typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); + typedef int (WINAPI* SETDIBITSTODEVICEPROC)( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); + typedef int (WINAPI* STRETCHDIBITSPROC)( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); + typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); +typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); extern GETCURSORPOSPROC real_GetCursorPos; @@ -79,6 +83,7 @@ extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; +extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern int g_hook_method; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6b47029..4dc1f93 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -29,19 +29,32 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); + BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); + int WINAPI fake_SetDIBitsToDevice( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); + int WINAPI fake_StretchDIBits( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); + +BOOL WINAPI fake_GetDiskFreeSpaceA( + LPCSTR lpRootPathName, + LPDWORD lpSectorsPerCluster, + LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, + LPDWORD lpTotalNumberOfClusters); + HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); + HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); diff --git a/src/config.c b/src/config.c index b873355..ec25a0b 100644 --- a/src/config.c +++ b/src/config.c @@ -372,6 +372,8 @@ static void cfg_create_ini() "allow_wmactivate=false\n" "dinputhook=false\n" "flipclear=false\n" + "limit_disk_space=false\n" + "fixmousehook=false\n" "bpp=0\n" "\n" "\n" @@ -733,10 +735,12 @@ static void cfg_create_ini() "; Fallout\n" "[falloutw]\n" "dinputhook=true\n" + "limit_disk_space=true\n" "\n" "; Fallout 2\n" "[FALLOUT2]\n" "dinputhook=true\n" + "limit_disk_space=true\n" "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" diff --git a/src/hook.c b/src/hook.c index 1c2ebf8..a958b42 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,7 @@ LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; +GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; static HOOKLIST g_hooks[] = @@ -576,6 +577,7 @@ void hook_early_init() hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); } void hook_exit() @@ -633,4 +635,5 @@ void hook_exit() hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5ecb408..935a461 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -776,6 +776,39 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw return hmod; } +BOOL WINAPI fake_GetDiskFreeSpaceA( + LPCSTR lpRootPathName, + LPDWORD lpSectorsPerCluster, + LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, + LPDWORD lpTotalNumberOfClusters) +{ + BOOL result = + real_GetDiskFreeSpaceA( + lpRootPathName, + lpSectorsPerCluster, + lpBytesPerSector, + lpNumberOfFreeClusters, + lpTotalNumberOfClusters); + + if (cfg_get_bool("limit_disk_space", FALSE)) + { + if (lpSectorsPerCluster) + *lpSectorsPerCluster = 0x00000040; + + if (lpBytesPerSector) + *lpBytesPerSector = 0x00000200; + + if (lpNumberOfFreeClusters) + *lpNumberOfFreeClusters = 0x0000FFF6; + + if (lpTotalNumberOfClusters) + *lpTotalNumberOfClusters = 0x0000FFF6; + } + + return result; +} + BOOL WINAPI fake_DestroyWindow(HWND hWnd) { BOOL result = real_DestroyWindow(hWnd); From 0866feb1ceb8fb5b197818d087617fe1d460ba80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 18:30:00 +0200 Subject: [PATCH 0265/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 875c8eb..70863fd 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From bbf4674b82240aa6357694d33ffcb973c061f242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 18:36:54 +0200 Subject: [PATCH 0266/1724] fix fallout 2 preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index ec25a0b..1a70d8e 100644 --- a/src/config.c +++ b/src/config.c @@ -740,7 +740,6 @@ static void cfg_create_ini() "; Fallout 2\n" "[FALLOUT2]\n" "dinputhook=true\n" - "limit_disk_space=true\n" "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" From c22232a069e8a915be8f2d6215c972a81e3dc69c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 20:05:44 +0200 Subject: [PATCH 0267/1724] #180 add preset for Baldur's Gate II --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 1a70d8e..f380399 100644 --- a/src/config.c +++ b/src/config.c @@ -486,6 +486,10 @@ static void cfg_create_ini() "[AT]\n" "fixchilds=0\n" "\n" + "; Baldur's Gate II\n" + "[BGMain]\n" + "resolutions=2\n" + "\n" "; Blade & Sword\n" "[comeon]\n" "maxgameticks=62\n" From 691b5eaa259bf5765bf49704cceee9364e655192 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 20:06:09 +0200 Subject: [PATCH 0268/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 70863fd..69b4d3e 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 79f2feace0005f4e6714f7c7ef2b66a57c3d9142 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 20:11:43 +0200 Subject: [PATCH 0269/1724] add comments for Baldur's Gate II --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index f380399..339a554 100644 --- a/src/config.c +++ b/src/config.c @@ -487,6 +487,7 @@ static void cfg_create_ini() "fixchilds=0\n" "\n" "; Baldur's Gate II\n" + "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" "resolutions=2\n" "\n" From 48064d4ad3bca09e4bfa4ab0f7445758e18f91f1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 20:33:06 +0200 Subject: [PATCH 0270/1724] #180 add high resolutions for Baldur's Gate II --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index c50359c..eda3a6a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -53,8 +53,10 @@ HRESULT dd_EnumDisplayModes( { 640, 480 }, { 800, 600 }, { 1024, 768 }, + { g_ddraw->resolutions == RESLIST_FULL ? 1280 : 0, g_ddraw->resolutions == RESLIST_FULL ? 960 : 0 }, { 1280, 1024 }, { 1600, 1200 }, + { g_ddraw->resolutions == RESLIST_FULL ? 2048 : 0, g_ddraw->resolutions == RESLIST_FULL ? 1536 : 0 }, { 1280, 720 }, { max_w, max_h }, }; From e4d6f712a4ac4a75a14f352da76d5baf31825c3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Oct 2022 21:30:14 +0200 Subject: [PATCH 0271/1724] set catmull-rom-bilinear as the new default shader --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 339a554..20d5436 100644 --- a/src/config.c +++ b/src/config.c @@ -151,7 +151,7 @@ void cfg_load() } /* to do: read .glslp config file instead of the shader and apply the correct settings */ - cfg_get_string("shader", "", g_ddraw->shader, sizeof(g_ddraw->shader)); + cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_ddraw->shader, sizeof(g_ddraw->shader)); cfg_get_string("renderer", "auto", tmp, sizeof(tmp)); TRACE(" Using %s renderer\n", tmp); @@ -276,7 +276,7 @@ static void cfg_create_ini() "\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" - "shader=Shaders\\interpolation\\bilinear.glsl\n" + "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" "posX=-32000\n" From 7abd1f743cfec40a6431e129b9080256d785276c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Oct 2022 00:02:43 +0200 Subject: [PATCH 0272/1724] always enable GetDiskFreeSpace patch --- src/config.c | 2 -- src/winapi_hooks.c | 16 ++++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index 20d5436..e9fa4fe 100644 --- a/src/config.c +++ b/src/config.c @@ -372,7 +372,6 @@ static void cfg_create_ini() "allow_wmactivate=false\n" "dinputhook=false\n" "flipclear=false\n" - "limit_disk_space=false\n" "fixmousehook=false\n" "bpp=0\n" "\n" @@ -740,7 +739,6 @@ static void cfg_create_ini() "; Fallout\n" "[falloutw]\n" "dinputhook=true\n" - "limit_disk_space=true\n" "\n" "; Fallout 2\n" "[FALLOUT2]\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 935a461..fcd8143 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -791,19 +791,19 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( lpNumberOfFreeClusters, lpTotalNumberOfClusters); - if (cfg_get_bool("limit_disk_space", FALSE)) + if (result && lpSectorsPerCluster && lpBytesPerSector && lpNumberOfFreeClusters) { - if (lpSectorsPerCluster) + long long int free_bytes = (long long int)*lpNumberOfFreeClusters * *lpSectorsPerCluster * *lpBytesPerSector; + + if (free_bytes >= 2147155968) + { *lpSectorsPerCluster = 0x00000040; - - if (lpBytesPerSector) *lpBytesPerSector = 0x00000200; - - if (lpNumberOfFreeClusters) *lpNumberOfFreeClusters = 0x0000FFF6; - if (lpTotalNumberOfClusters) - *lpTotalNumberOfClusters = 0x0000FFF6; + if (lpTotalNumberOfClusters) + *lpTotalNumberOfClusters = 0x0000FFF6; + } } return result; From 6eeb53e5465570673fac5310689e08c40afa6951 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 17 Oct 2022 00:59:20 +0200 Subject: [PATCH 0273/1724] allow to use small resolution list for all games --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index eda3a6a..886f672 100644 --- a/src/dd.c +++ b/src/dd.c @@ -70,7 +70,7 @@ HRESULT dd_EnumDisplayModes( } } - if (g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) + if ((g_ddraw->bpp && g_ddraw->resolutions == RESLIST_NORMAL) || g_ddraw->resolutions == RESLIST_FULL) { TRACE(" g_ddraw->bpp=%u\n", g_ddraw->bpp); @@ -220,7 +220,7 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) + if (!g_ddraw->bpp || g_ddraw->resolutions != RESLIST_NORMAL) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { From 81f5a0ac000e2b78c7be020b0b765a5ac62a7968 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 17 Oct 2022 01:29:20 +0200 Subject: [PATCH 0274/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 69b4d3e..a2fc3d7 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 4 -#define VERSION_MINOR 7 +#define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 9b634560e2f8aa1b425020d7fff2aeb2e3f64158 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 18:10:34 +0200 Subject: [PATCH 0275/1724] update moorhun preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index e9fa4fe..8ae3577 100644 --- a/src/config.c +++ b/src/config.c @@ -884,7 +884,6 @@ static void cfg_create_ini() "\n" "; Moorhuhn\n" "[Moorhuhn]\n" - "renderer=opengl\n" "dinputhook=true\n" "\n" "; Moorhuhn 2\n" From df9781d77476d8dc5f2bb1148237862ef85eff49 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 18:31:44 +0200 Subject: [PATCH 0276/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index a2fc3d7..5670f78 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 9a63cb58bd6bf8fd2613868b41def5bcd9747caa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 18:34:47 +0200 Subject: [PATCH 0277/1724] add some testing code for dinput games --- src/wndproc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index fe21794..6741301 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -559,6 +559,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ip.ki.wVk = VK_MENU; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); + + /* For DirectInput + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = 56; // LeftAlt + ip.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; + SendInput(1, &ip, sizeof(ip)); + */ } if (g_ddraw->windowed || g_ddraw->noactivateapp) From f9f2dd9044d9a4fab0984ee18db4b786579a5712 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 18:45:15 +0200 Subject: [PATCH 0278/1724] enable patch for dinuthook --- src/wndproc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 6741301..29be4a4 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -560,12 +560,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); - /* For DirectInput - ip.type = INPUT_KEYBOARD; - ip.ki.wScan = 56; // LeftAlt - ip.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; - SendInput(1, &ip, sizeof(ip)); - */ + if (g_hook_dinput) + { + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = 56; // LeftAlt + ip.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; + SendInput(1, &ip, sizeof(ip)); + } } if (g_ddraw->windowed || g_ddraw->noactivateapp) From 2ccda7875d08d7f1b1613c30b043472dcd019461 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 19:42:37 +0200 Subject: [PATCH 0279/1724] log __COMPAT_LAYER --- src/dllmain.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index e33135a..65be2d6 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -36,6 +36,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) { + TRACE("__COMPAT_LAYER = %s\n", buf); + char* s = strtok(buf, " "); while (s) From ab773f6469eec19ce8da1f8d62a24ce7b6893e55 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Oct 2022 22:21:42 +0200 Subject: [PATCH 0280/1724] hook GetTopWindow --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 725ad40..f7718b2 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[24]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -34,6 +34,7 @@ typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); +typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( @@ -74,6 +75,7 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; +extern GETTOPWINDOWPROC real_GetTopWindow; extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 4dc1f93..074b521 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -27,6 +27,7 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); +HWND WINAPI fake_GetTopWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index a958b42..e29af3a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -40,6 +40,7 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; +GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; @@ -80,6 +81,7 @@ static HOOKLIST g_hooks[] = { "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 }, { "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 }, { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, + { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fcd8143..efe1f3f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -517,6 +517,16 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) return real_ShowWindow(hWnd, nCmdShow); } +HWND WINAPI fake_GetTopWindow(HWND hWnd) +{ + if (g_ddraw && g_ddraw->windowed && g_ddraw->hwnd && !hWnd) + { + return g_ddraw->hwnd; + } + + return real_GetTopWindow(hWnd); +} + HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) From 876160cbb6bfec38f09ef15b82e1705b147f093a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 19 Oct 2022 03:20:31 +0200 Subject: [PATCH 0281/1724] rename some vars --- inc/IDirectDrawSurface.h | 8 +-- src/IDirectDraw/IDirectDrawSurface.c | 6 +- src/ddsurface.c | 88 ++++++++++++++-------------- src/render_d3d9.c | 2 +- src/render_ogl.c | 2 +- src/screenshot.c | 6 +- src/utils.c | 2 +- 7 files changed, 57 insertions(+), 57 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 5cef293..59d58fc 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -30,10 +30,10 @@ typedef struct IDirectDrawSurfaceImpl IDirectDrawPaletteImpl* palette; void* surface; - HANDLE surface_mapping; - DWORD l_pitch; - DWORD lx_pitch; - BOOL custom_surface; + HANDLE mapping; + DWORD pitch; + DWORD bytes_pp; + BOOL custom_buf; PBITMAPINFO bmi; HBITMAP bitmap; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index ece48f5..8339a2b 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -85,7 +85,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { DeleteObject(This->bitmap); } - else if (This->surface && !This->custom_surface) + else if (This->surface && !This->custom_buf) { HeapFree(GetProcessHeap(), 0, This->surface); } @@ -96,8 +96,8 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->bmi) HeapFree(GetProcessHeap(), 0, This->bmi); - if (This->surface_mapping) - CloseHandle(This->surface_mapping); + if (This->mapping) + CloseHandle(This->mapping); if (This->backbuffer) IDirectDrawSurface_Release(This->backbuffer); diff --git a/src/ddsurface.c b/src/ddsurface.c index 8c5540e..dea3c2b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -201,7 +201,7 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, lpDDBltFx->dwFillColor, This->bpp); } @@ -315,11 +315,11 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, color_key.dwColorSpaceLowValue, color_key.dwColorSpaceHighValue, This->bpp); @@ -332,13 +332,13 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, src_w, src_h, - src_surface->l_pitch, + src_surface->pitch, color_key.dwColorSpaceLowValue, color_key.dwColorSpaceHighValue, mirror_up_down, @@ -354,13 +354,13 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, src_w, src_h, - src_surface->l_pitch, + src_surface->pitch, This->bpp); } else if (This == src_surface) @@ -371,11 +371,11 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, This->bpp); } else @@ -386,11 +386,11 @@ HRESULT dds_Blt( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, This->bpp); } } @@ -587,11 +587,11 @@ HRESULT dds_BltFast( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, src_surface->color_key.dwColorSpaceLowValue, src_surface->color_key.dwColorSpaceHighValue, This->bpp); @@ -604,11 +604,11 @@ HRESULT dds_BltFast( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, This->bpp); } else @@ -619,11 +619,11 @@ HRESULT dds_BltFast( dst_y, dst_w, dst_h, - This->l_pitch, + This->pitch, src_buf, src_x, src_y, - src_surface->l_pitch, + src_surface->pitch, This->bpp); } } @@ -669,7 +669,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_BACKBUFFERCOUNT; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; - lpDDSurfaceDesc->lPitch = This->l_pitch; + lpDDSurfaceDesc->lPitch = This->pitch; lpDDSurfaceDesc->lpSurface = dds_GetBuffer(This); lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; @@ -734,12 +734,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap); HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc); - HANDLE map = (HANDLE)InterlockedExchangePointer(&This->surface_mapping, backbuffer->surface_mapping); + HANDLE map = (HANDLE)InterlockedExchangePointer(&This->mapping, backbuffer->mapping); InterlockedExchangePointer(&backbuffer->surface, buf); InterlockedExchangePointer(&backbuffer->bitmap, bitmap); InterlockedExchangePointer(&backbuffer->hdc, dc); - InterlockedExchangePointer(&backbuffer->surface_mapping, map); + InterlockedExchangePointer(&backbuffer->mapping, map); if (g_ddraw->flipclear) { @@ -955,7 +955,7 @@ HRESULT dds_Lock( } lpDDSurfaceDesc->lpSurface = - (char*)dds_GetBuffer(This) + (lpDestRect->left * This->lx_pitch) + (lpDestRect->top * This->l_pitch); + (char*)dds_GetBuffer(This) + (lpDestRect->left * This->bytes_pp) + (lpDestRect->top * This->pitch); } return ret; @@ -1181,7 +1181,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD DeleteObject(This->bitmap); This->bitmap = NULL; } - else if (This->surface && !This->custom_surface) + else if (This->surface && !This->custom_buf) { HeapFree(GetProcessHeap(), 0, This->surface); This->surface = NULL; @@ -1199,10 +1199,10 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->bmi = NULL; } - if (This->surface_mapping) + if (This->mapping) { - CloseHandle(This->surface_mapping); - This->surface_mapping = NULL; + CloseHandle(This->mapping); + This->mapping = NULL; } @@ -1230,10 +1230,10 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->width = lpDDSD->dwWidth; This->height = lpDDSD->dwHeight; This->surface = lpDDSD->lpSurface; - This->l_pitch = lpDDSD->lPitch; - This->lx_pitch = This->bpp / 8; - This->size = This->l_pitch * This->height; - This->custom_surface = TRUE; + This->pitch = lpDDSD->lPitch; + This->bytes_pp = This->bpp / 8; + This->size = This->pitch * This->height; + This->custom_buf = TRUE; return DD_OK; } @@ -1324,21 +1324,21 @@ HRESULT dd_CreateSurface( if ((dst_surface->flags & DDSD_LPSURFACE) && (dst_surface->flags & DDSD_PITCH)) { dst_surface->surface = lpDDSurfaceDesc->lpSurface; - dst_surface->l_pitch = lpDDSurfaceDesc->lPitch; - dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->size = dst_surface->l_pitch * dst_surface->height; - dst_surface->custom_surface = TRUE; + dst_surface->pitch = lpDDSurfaceDesc->lPitch; + dst_surface->bytes_pp = dst_surface->bpp / 8; + dst_surface->size = dst_surface->pitch * dst_surface->height; + dst_surface->custom_buf = TRUE; } else if (dst_surface->width && dst_surface->height) { - dst_surface->lx_pitch = dst_surface->bpp / 8; - dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; - dst_surface->size = dst_surface->l_pitch * dst_surface->height; + dst_surface->bytes_pp = dst_surface->bpp / 8; + dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; + dst_surface->size = dst_surface->pitch * dst_surface->height; - DWORD aligned_width = dst_surface->l_pitch / dst_surface->lx_pitch; + DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; - DWORD bmp_size = dst_surface->l_pitch * (dst_surface->height + g_ddraw->guard_lines); + DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_ddraw->guard_lines); dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -1383,7 +1383,7 @@ HRESULT dd_CreateSurface( dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); - dst_surface->surface_mapping = + dst_surface->mapping = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, @@ -1394,9 +1394,9 @@ HRESULT dd_CreateSurface( DWORD map_offset = 0; - if (dst_surface->surface_mapping) + if (dst_surface->mapping) { - LPVOID data = MapViewOfFile(dst_surface->surface_mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); + LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (data) { while (((DWORD)data + map_offset) % 128) map_offset++; @@ -1406,8 +1406,8 @@ HRESULT dd_CreateSurface( if (!data || (map_offset % sizeof(DWORD))) { map_offset = 0; - CloseHandle(dst_surface->surface_mapping); - dst_surface->surface_mapping = NULL; + CloseHandle(dst_surface->mapping); + dst_surface->mapping = NULL; } } @@ -1417,7 +1417,7 @@ HRESULT dd_CreateSurface( dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, - dst_surface->surface_mapping, + dst_surface->mapping, map_offset); dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 42fcb3d..a76f45f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -486,7 +486,7 @@ DWORD WINAPI d3d9_render_main(void) g_ddraw->primary->surface, 0, 0, - g_ddraw->primary->l_pitch, + g_ddraw->primary->pitch, g_ddraw->primary->bpp); IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); diff --git a/src/render_ogl.c b/src/render_ogl.c index 9515d01..419623e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -662,7 +662,7 @@ static void ogl_render() glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - DWORD row_len = g_ddraw->primary->l_pitch ? g_ddraw->primary->l_pitch / g_ddraw->primary->lx_pitch : 0; + DWORD row_len = g_ddraw->primary->pitch ? g_ddraw->primary->pitch / g_ddraw->primary->bytes_pp : 0; if (row_len != g_ddraw->primary->width) glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len); diff --git a/src/screenshot.c b/src/screenshot.c index 457afb9..d6a3578 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -36,7 +36,7 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) &dst_buf, &dst_buf_size, dds_GetBuffer(src), - src->l_pitch / src->lx_pitch, /* can't specify pitch so we use bitmap real width */ + src->pitch / src->bytes_pp, /* can't specify pitch so we use bitmap real width */ src->height, &state); @@ -68,7 +68,7 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) dds_GetBuffer(src), 0, 0, - src->l_pitch); + src->pitch); error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); @@ -95,7 +95,7 @@ static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) dds_GetBuffer(src), 0, 0, - src->l_pitch); + src->pitch); error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); diff --git a/src/utils.c b/src/utils.c index a2701df..b2f7f87 100644 --- a/src/utils.c +++ b/src/utils.c @@ -479,7 +479,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) static unsigned char util_get_pixel(int x, int y) { return ((unsigned char*)dds_GetBuffer( - g_ddraw->primary))[y * g_ddraw->primary->l_pitch + x * g_ddraw->primary->lx_pitch]; + g_ddraw->primary))[y * g_ddraw->primary->pitch + x * g_ddraw->primary->bytes_pp]; } BOOL util_detect_low_res_screen() From 24d66d8a30700ec69b5c9feb7d0de64d572156c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 19 Oct 2022 05:08:22 +0200 Subject: [PATCH 0282/1724] hook GetForegroundWindow --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/dd.c | 2 +- src/hook.c | 2 ++ src/winapi_hooks.c | 10 ++++++++++ src/wndproc.c | 4 ++-- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index f7718b2..21a8393 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[26]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -35,6 +35,7 @@ typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND); +typedef HWND(WINAPI* GETFOREGROUNDWINDOWPROC)(); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( @@ -76,6 +77,7 @@ extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; extern GETTOPWINDOWPROC real_GetTopWindow; +extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow; extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 074b521..686e446 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -28,6 +28,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HWND WINAPI fake_GetTopWindow(HWND hWnd); +HWND WINAPI fake_GetForegroundWindow(void); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/dd.c b/src/dd.c index 886f672..0aeff1c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -781,7 +781,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (lock_mouse || (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd)) + if (lock_mouse || (g_ddraw->fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)) mouse_lock(); } else diff --git a/src/hook.c b/src/hook.c index e29af3a..d3f304a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -41,6 +41,7 @@ DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow; +GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; @@ -82,6 +83,7 @@ static HOOKLIST g_hooks[] = { "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 }, { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, + { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index efe1f3f..e82c09b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -527,6 +527,16 @@ HWND WINAPI fake_GetTopWindow(HWND hWnd) return real_GetTopWindow(hWnd); } +HWND WINAPI fake_GetForegroundWindow() +{ + if (g_ddraw && g_ddraw->windowed && g_ddraw->hwnd) + { + return g_ddraw->hwnd; + } + + return real_GetForegroundWindow(); +} + HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) diff --git a/src/wndproc.c b/src/wndproc.c index 29be4a4..4a30073 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -486,7 +486,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { mouse_unlock(); - if (GetForegroundWindow() == g_ddraw->hwnd) + if (real_GetForegroundWindow() == g_ddraw->hwnd) mouse_lock(); } } @@ -525,7 +525,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_lock(); } } - else if (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd) + else if (g_ddraw->fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd) { mouse_lock(); } From 0345cbdda3cf4c7a38e56379dd20f6eac31d0184 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 19 Oct 2022 23:48:20 +0200 Subject: [PATCH 0283/1724] only limit ticks in gui thread --- inc/dd.h | 1 + src/dd.c | 1 + src/utils.c | 3 +++ 3 files changed, 5 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 88b5065..d77962f 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -173,6 +173,7 @@ typedef struct CNCDDRAW BOOL show_driver_warning; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; + DWORD gui_thread; } CNCDDRAW; diff --git a/src/dd.c b/src/dd.c index 0aeff1c..b118b7f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -890,6 +890,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) hook_init(); g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + g_ddraw->gui_thread = GetWindowThreadProcessId(hwnd, NULL); if (!g_ddraw->render.hdc) { diff --git a/src/utils.c b/src/utils.c index b2f7f87..40937d7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -62,6 +62,9 @@ BOOL util_is_avx_supported() void util_limit_game_ticks() { + if (GetCurrentThreadId() != g_ddraw->gui_thread) + return; + if (g_ddraw->ticks_limiter.htimer) { FILETIME ft = { 0 }; From 141e67395195aac6dbf781d94b1e4fcbd366a0b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 20 Oct 2022 00:13:21 +0200 Subject: [PATCH 0284/1724] update Moorhuhn 2 preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 8ae3577..9fdd2ba 100644 --- a/src/config.c +++ b/src/config.c @@ -889,6 +889,7 @@ static void cfg_create_ini() "; Moorhuhn 2\n" "[Moorhuhn2]\n" "dinputhook=true\n" + "releasealt=true\n" "\n" "; Outlaws\n" "[olwin]\n" From f6bc942f9a140a89c331ebad10f8f52c2a759d76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 20 Oct 2022 02:43:33 +0200 Subject: [PATCH 0285/1724] use g_ddraw->hwnd --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index b118b7f..fbe90ec 100644 --- a/src/dd.c +++ b/src/dd.c @@ -890,7 +890,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) hook_init(); g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); - g_ddraw->gui_thread = GetWindowThreadProcessId(hwnd, NULL); + g_ddraw->gui_thread = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); if (!g_ddraw->render.hdc) { From 0a5cfc59894d37f4823f91ae361c05c39bdf7577 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 20 Oct 2022 02:53:17 +0200 Subject: [PATCH 0286/1724] adjust Total Annihilation presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 9fdd2ba..9648a67 100644 --- a/src/config.c +++ b/src/config.c @@ -985,14 +985,14 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" - "maxgameticks=300\n" + "maxgameticks=200\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" - "maxgameticks=300\n" + "maxgameticks=200\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" From 8566355e0dce0e18340b879a7e86be91a3685862 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 20 Oct 2022 03:13:09 +0200 Subject: [PATCH 0287/1724] rename var --- inc/dd.h | 2 +- src/dd.c | 2 +- src/utils.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index d77962f..cb0ffc5 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -173,7 +173,7 @@ typedef struct CNCDDRAW BOOL show_driver_warning; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; - DWORD gui_thread; + DWORD gui_thread_id; } CNCDDRAW; diff --git a/src/dd.c b/src/dd.c index fbe90ec..81e7bac 100644 --- a/src/dd.c +++ b/src/dd.c @@ -890,7 +890,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) hook_init(); g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); - g_ddraw->gui_thread = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); + g_ddraw->gui_thread_id = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); if (!g_ddraw->render.hdc) { diff --git a/src/utils.c b/src/utils.c index 40937d7..4aef256 100644 --- a/src/utils.c +++ b/src/utils.c @@ -62,7 +62,7 @@ BOOL util_is_avx_supported() void util_limit_game_ticks() { - if (GetCurrentThreadId() != g_ddraw->gui_thread) + if (GetCurrentThreadId() != g_ddraw->gui_thread_id) return; if (g_ddraw->ticks_limiter.htimer) From a80ffeb7aa350aea2ef45f3382bdefa1c2836a36 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 22 Oct 2022 02:52:58 +0200 Subject: [PATCH 0288/1724] always enable fixnotresponding patch --- inc/dd.h | 1 - src/config.c | 3 --- src/dd.c | 8 ++++++-- src/ddsurface.c | 5 +++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index cb0ffc5..485e6ce 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -145,7 +145,6 @@ typedef struct CNCDDRAW BOOL nonexclusive; int fixchilds; BOOL fixwndprochook; - BOOL fixnotresponding; BOOL flipclear; BOOL locktopleft; BOOL lock_surfaces; diff --git a/src/config.c b/src/config.c index 9648a67..dae1a05 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,6 @@ void cfg_load() g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); - g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); @@ -364,7 +363,6 @@ static void cfg_create_ini() "fixpitch=true\n" "fixwndprochook=false\n" "novidmem=false\n" - "fixnotresponding=false\n" "locktopleft=false\n" "lock_surfaces=false\n" "releasealt=false\n" @@ -734,7 +732,6 @@ static void cfg_create_ini() "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" - "fixnotresponding=true\n" "\n" "; Fallout\n" "[falloutw]\n" diff --git a/src/dd.c b/src/dd.c index 81e7bac..87a9558 100644 --- a/src/dd.c +++ b/src/dd.c @@ -711,8 +711,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->windowed) { - MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + /* workaround for "Not Responding" window problem in cnc games */ + if (GetCurrentThreadId() == g_ddraw->gui_thread_id) + { + MSG msg; + PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + } if (!border) { diff --git a/src/ddsurface.c b/src/ddsurface.c index dea3c2b..9ddbe48 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -934,9 +934,10 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_ddraw->fixnotresponding) + /* workaround for "Not Responding" window problem */ + if (g_ddraw && g_ddraw->windowed && GetCurrentThreadId() == g_ddraw->gui_thread_id) { - MSG msg; /* workaround for "Not Responding" window problem */ + MSG msg; PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); } From 80b213a41b4bb8f2638cf2d3c8e0624021062081 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Oct 2022 02:00:58 +0200 Subject: [PATCH 0289/1724] update total annihilation preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index dae1a05..0655c1e 100644 --- a/src/config.c +++ b/src/config.c @@ -982,14 +982,12 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" - "maxgameticks=200\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" - "maxgameticks=200\n" "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" From 56299662aacb7b271d571aa08b71c22850057e89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Oct 2022 02:54:40 +0100 Subject: [PATCH 0290/1724] add new option to limit game ticks via bltfast --- inc/dd.h | 1 + src/config.c | 4 ++++ src/ddsurface.c | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 485e6ce..a1778c8 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -154,6 +154,7 @@ typedef struct CNCDDRAW int guard_lines; int resolutions; int max_resolutions; + BOOL limit_bltfast; BOOL armadahack; BOOL tshack; BOOL infantryhack; diff --git a/src/config.c b/src/config.c index 0655c1e..98a027c 100644 --- a/src/config.c +++ b/src/config.c @@ -52,6 +52,7 @@ void cfg_load() g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); + g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -358,6 +359,7 @@ static void cfg_create_ini() "d3d9on12=false\n" "guard_lines=200\n" "max_resolutions=0\n" + "limit_bltfast=false\n" "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" @@ -711,6 +713,7 @@ static void cfg_create_ini() "[AdSanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" + "limit_bltfast=true\n" "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" @@ -996,6 +999,7 @@ static void cfg_create_ini() "[sanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" + "limit_bltfast=true\n" "\n" "; Twisted Metal\n" "[TWISTED]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 9ddbe48..46251e3 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -638,6 +638,12 @@ HRESULT dds_BltFast( (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + + if (g_ddraw->limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0) + { + g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + util_limit_game_ticks(); + } } } From a6399216d0bd113047d55eea8f70aa889245da6b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Oct 2022 23:48:33 +0100 Subject: [PATCH 0291/1724] detect common upscaling shaders and disable them if no upscaling is required --- src/render_ogl.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 419623e..cb3cc54 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -165,6 +165,24 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader); } + if (GetFileAttributes(shader_path) != INVALID_FILE_ATTRIBUTES) + { + /* detect common upscaling shaders and disable them if no upscaling is required */ + + BOOL is_upscaler = + strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || + strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || + strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; + + if (is_upscaler && + g_ddraw->render.viewport.width == g_ddraw->width && + g_ddraw->render.viewport.height == g_ddraw->height) + { + shader_path[0] = 0; + } + } + g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); } else @@ -172,7 +190,7 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } - g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != 0; + g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != NULL; } if (g_oglu_got_version2 && !g_ogl.main_program) From 6540ce6b8b185932017676d4b680e39ee71bdcba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Nov 2022 17:04:54 +0100 Subject: [PATCH 0292/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 5670f78..f0e989f 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 4 -#define VERSION_MINOR 8 +#define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 3333539e3445bd594974138672834ae1858c2100 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Nov 2022 01:43:10 +0100 Subject: [PATCH 0293/1724] add Theme Park World preset --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 98a027c..334deee 100644 --- a/src/config.c +++ b/src/config.c @@ -983,6 +983,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Theme Park World\n" + "[TP]\n" + "fixwndprochook=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "lock_surfaces=true\n" From d951338af0ad2df1b115fa91a85a35c07d619489 Mon Sep 17 00:00:00 2001 From: Avinash Reddy Date: Mon, 9 Jan 2023 11:25:54 +0530 Subject: [PATCH 0294/1724] Road Rash: update game-specific config - remove `adjmouse=true` (as it is globally default anyway) - add `fixchilds=1` (fixes #190) --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 334deee..119767b 100644 --- a/src/config.c +++ b/src/config.c @@ -913,7 +913,7 @@ static void cfg_create_ini() "\n" "; ROAD RASH\n" "[RoadRash]\n" - "adjmouse=true\n" + "fixchilds=1\n" "\n" "; Septerra Core\n" "[septerra]\n" From 56488f9dac2dcc79512059fd89f7e61b3a38013f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Jan 2023 04:46:24 +0100 Subject: [PATCH 0295/1724] Revert "always enable fixnotresponding patch" This reverts commit a80ffeb7aa350aea2ef45f3382bdefa1c2836a36. --- inc/dd.h | 1 + src/config.c | 3 +++ src/dd.c | 8 ++------ src/ddsurface.c | 5 ++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index a1778c8..01a0826 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -145,6 +145,7 @@ typedef struct CNCDDRAW BOOL nonexclusive; int fixchilds; BOOL fixwndprochook; + BOOL fixnotresponding; BOOL flipclear; BOOL locktopleft; BOOL lock_surfaces; diff --git a/src/config.c b/src/config.c index 334deee..b020396 100644 --- a/src/config.c +++ b/src/config.c @@ -40,6 +40,7 @@ void cfg_load() g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); + g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); @@ -365,6 +366,7 @@ static void cfg_create_ini() "fixpitch=true\n" "fixwndprochook=false\n" "novidmem=false\n" + "fixnotresponding=false\n" "locktopleft=false\n" "lock_surfaces=false\n" "releasealt=false\n" @@ -735,6 +737,7 @@ static void cfg_create_ini() "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" + "fixnotresponding=true\n" "\n" "; Fallout\n" "[falloutw]\n" diff --git a/src/dd.c b/src/dd.c index 87a9558..81e7bac 100644 --- a/src/dd.c +++ b/src/dd.c @@ -711,12 +711,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->windowed) { - /* workaround for "Not Responding" window problem in cnc games */ - if (GetCurrentThreadId() == g_ddraw->gui_thread_id) - { - MSG msg; - PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); - } + MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); if (!border) { diff --git a/src/ddsurface.c b/src/ddsurface.c index 46251e3..bd89a5c 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -940,10 +940,9 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - /* workaround for "Not Responding" window problem */ - if (g_ddraw && g_ddraw->windowed && GetCurrentThreadId() == g_ddraw->gui_thread_id) + if (g_ddraw && g_ddraw->fixnotresponding) { - MSG msg; + MSG msg; /* workaround for "Not Responding" window problem */ PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); } From 0e7edc7bd89d387c2a5c244188f80e918aace0dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Jan 2023 04:51:35 +0100 Subject: [PATCH 0296/1724] #188 always clear with opengl/d3d9 renderers --- src/render_d3d9.c | 10 +--------- src/render_ogl.c | 14 +------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index a76f45f..57d55ce 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -421,7 +421,6 @@ DWORD WINAPI d3d9_render_main(void) fpsl_init(); BOOL needs_update = FALSE; - LONG clear_count = 0; DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : 200; @@ -434,9 +433,6 @@ DWORD WINAPI d3d9_render_main(void) static int tex_index = 0, pal_index = 0; - if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) - clear_count = 10; - fpsl_frame_start(); EnterCriticalSection(&g_ddraw->cs); @@ -538,11 +534,7 @@ DWORD WINAPI d3d9_render_main(void) LeaveCriticalSection(&g_ddraw->cs); - if (clear_count > 0) - { - clear_count--; - IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - } + IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); IDirect3DDevice9_BeginScene(g_d3d9.device); IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); diff --git a/src/render_ogl.c b/src/render_ogl.c index cb3cc54..6fb17b5 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -589,7 +589,6 @@ static void ogl_init_scale_program() static void ogl_render() { BOOL needs_update = FALSE; - LONG clear_count = 0; glViewport( g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, @@ -620,9 +619,6 @@ static void ogl_render() BOOL scale_changed = FALSE; - if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) - clear_count = 10; - fpsl_frame_start(); EnterCriticalSection(&g_ddraw->cs); @@ -746,15 +742,7 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw->wine) - { - glClear(GL_COLOR_BUFFER_BIT); - } - else if (clear_count > 0) - { - clear_count--; - glClear(GL_COLOR_BUFFER_BIT); - } + glClear(GL_COLOR_BUFFER_BIT); if (scale_changed) { From 03b8e82d34e6a2661becaaef3052922f704d96ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Jan 2023 04:54:07 +0100 Subject: [PATCH 0297/1724] keep "adjmouse=true" for Road Rash just to be sure the user doesn't disable it by accident via the config tool --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 5803e47..c0f4291 100644 --- a/src/config.c +++ b/src/config.c @@ -916,6 +916,7 @@ static void cfg_create_ini() "\n" "; ROAD RASH\n" "[RoadRash]\n" + "adjmouse=true\n" "fixchilds=1\n" "\n" "; Septerra Core\n" From d9d98e0ab14a4b6bb07921e4b3bc1bb0b807cf63 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Jan 2023 05:16:14 +0100 Subject: [PATCH 0298/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index f0e989f..5c5f652 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -1,8 +1,8 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) -#define VERSION_MAJOR 4 -#define VERSION_MINOR 9 +#define VERSION_MAJOR 5 +#define VERSION_MINOR 0 #define VERSION_BUILD 0 #define VERSION_REVISION 0 From 8cd776abf70a3f4f42da9481b3e6632c22b24975 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Thu, 16 Feb 2023 16:24:43 -0800 Subject: [PATCH 0299/1724] OpenGL rgb555 support --- inc/dd.h | 1 + src/config.c | 2 ++ src/ddsurface.c | 6 ++++++ src/render_ogl.c | 13 +++++++++++++ 4 files changed, 22 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 01a0826..0607d42 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -175,6 +175,7 @@ typedef struct CNCDDRAW SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; DWORD gui_thread_id; + BOOL rgb555; } CNCDDRAW; diff --git a/src/config.c b/src/config.c index c0f4291..ce6f87e 100644 --- a/src/config.c +++ b/src/config.c @@ -55,6 +55,7 @@ void cfg_load() g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); + g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -376,6 +377,7 @@ static void cfg_create_ini() "flipclear=false\n" "fixmousehook=false\n" "bpp=0\n" + "rgb555=false\n" "\n" "\n" "\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index bd89a5c..34de913 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1374,6 +1374,12 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiColors[i].rgbReserved = 0; } } + else if (dst_surface->bpp == 16 && g_ddraw->rgb555) + { + ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0x7C00; + ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x03E0; + ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; + } else if (dst_surface->bpp == 16) { ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xF800; diff --git a/src/render_ogl.c b/src/render_ogl.c index 6fb17b5..3db579f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -245,6 +245,19 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } + else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) + { + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGB5_A1, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + g_ogl.surface_format = GL_BGRA, + g_ogl.surface_type = GL_UNSIGNED_SHORT_1_5_5_5_REV, + 0); + } else if (g_ddraw->bpp == 16) { glTexImage2D( From 715a129fa47e8e75e794a8524030664d50257bc6 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Fri, 17 Feb 2023 11:52:10 -0800 Subject: [PATCH 0300/1724] Direct3D9 rgb555 suppport --- src/render_d3d9.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 57d55ce..f52ceca 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -129,7 +129,7 @@ BOOL d3d9_create() g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { @@ -174,7 +174,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.Windowed = windowed; g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { @@ -293,7 +293,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + g_ddraw->bpp == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); From d213243610eb1c96bcb1a1c1cbe14e52a55836ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Feb 2023 21:37:13 +0100 Subject: [PATCH 0301/1724] #187 Add preset for Starcraft --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ce6f87e..5e55c6d 100644 --- a/src/config.c +++ b/src/config.c @@ -956,6 +956,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Starcraft\n" + "[StarCraft]\n" + "game_handles_close=true\n" + "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" "adjmouse=true\n" From a179033b810f85a554db6ef432f3cda3b07f8992 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Feb 2023 21:38:41 +0100 Subject: [PATCH 0302/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 5c5f652..0917e01 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -3,7 +3,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_BUILD 0 +#define VERSION_BUILD 1 #define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION @@ -21,7 +21,7 @@ PRODUCTVERSION VERSION VALUE "FileDescription", "DirectDraw replacement" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "ddraw" - VALUE "LegalCopyright", "Copyright (c) 2010-2022" + VALUE "LegalCopyright", "Copyright (c) 2010-2023" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" From 1cfce3f32121d6044950f2b04eeeae657b05a39a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Feb 2023 17:02:20 +0100 Subject: [PATCH 0303/1724] always output rgb565 --- src/render_d3d9.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index f52ceca..84d6632 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -129,7 +129,7 @@ BOOL d3d9_create() g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { @@ -174,7 +174,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.Windowed = windowed; g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { From a62ebdc203c55598a8a886097c99b3d273f807af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Feb 2023 17:08:09 +0100 Subject: [PATCH 0304/1724] only clear if needed --- src/render_d3d9.c | 5 ++++- src/render_ogl.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 84d6632..ade0ae6 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -534,7 +534,10 @@ DWORD WINAPI d3d9_render_main(void) LeaveCriticalSection(&g_ddraw->cs); - IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + { + IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + } IDirect3DDevice9_BeginScene(g_d3d9.device); IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); diff --git a/src/render_ogl.c b/src/render_ogl.c index 3db579f..652b2c9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -755,7 +755,10 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - glClear(GL_COLOR_BUFFER_BIT); + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + { + glClear(GL_COLOR_BUFFER_BIT); + } if (scale_changed) { From d2cc1acdc028f94c81d14584ebaecde4aed588c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Feb 2023 20:20:21 +0100 Subject: [PATCH 0305/1724] #189 hook XIIIGame.dll for hooligans --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index d3f304a..5c57dc0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -573,6 +573,7 @@ void hook_early_init() */ hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); @@ -631,6 +632,7 @@ void hook_exit() } hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); From 629af6a89d2ca19b9f0d26e4827595c4bcd4461a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Feb 2023 20:25:58 +0100 Subject: [PATCH 0306/1724] add comments --- src/hook.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index 5c57dc0..2a2a8d5 100644 --- a/src/hook.c +++ b/src/hook.c @@ -573,7 +573,7 @@ void hook_early_init() */ hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); - hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); @@ -632,7 +632,7 @@ void hook_exit() } hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); - hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); From 73c76362a39eed3c3457c50d58aa6dbe47173329 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 27 Feb 2023 20:45:08 +1300 Subject: [PATCH 0307/1724] EV Nova preset --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 5e55c6d..ebc1f16 100644 --- a/src/config.c +++ b/src/config.c @@ -736,6 +736,14 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Escape Velocity Nova\n" + "[EV Nova]\n" + "renderer=opengl\n" + "devmode=true\n" + "resizable=false\n" + "rgb555=true\n" + "keytogglefullscreen=0x46\n" + "\n" "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" From 86e3de4ad695e10a9169699ab02dfdcf5dc6b2c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 Feb 2023 18:25:28 +0100 Subject: [PATCH 0308/1724] hook PeekMessageA for EV Nova --- inc/dd.h | 1 + inc/hook.h | 6 ++- inc/winapi_hooks.h | 1 + src/config.c | 4 +- src/hook.c | 2 + src/winapi_hooks.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 108 insertions(+), 2 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 0607d42..b164176 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,6 +176,7 @@ typedef struct CNCDDRAW SPEEDLIMITER flip_limiter; DWORD gui_thread_id; BOOL rgb555; + BOOL hook_peekmessage; } CNCDDRAW; diff --git a/inc/hook.h b/inc/hook.h index 21a8393..c9c4400 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[26]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[27]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -45,6 +45,9 @@ typedef int (WINAPI* STRETCHDIBITSPROC)( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); +typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); + + typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -82,6 +85,7 @@ extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; +extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 686e446..f84cf40 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -30,6 +30,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HWND WINAPI fake_GetTopWindow(HWND hWnd); HWND WINAPI fake_GetForegroundWindow(void); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); +BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( diff --git a/src/config.c b/src/config.c index ebc1f16..d3ff152 100644 --- a/src/config.c +++ b/src/config.c @@ -56,6 +56,7 @@ void cfg_load() g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); + g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -378,6 +379,7 @@ static void cfg_create_ini() "fixmousehook=false\n" "bpp=0\n" "rgb555=false\n" + "hook_peekmessage=false\n" "\n" "\n" "\n" @@ -740,7 +742,7 @@ static void cfg_create_ini() "[EV Nova]\n" "renderer=opengl\n" "devmode=true\n" - "resizable=false\n" + "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" "\n" diff --git a/src/hook.c b/src/hook.c index 2a2a8d5..4ce22fd 100644 --- a/src/hook.c +++ b/src/hook.c @@ -46,6 +46,7 @@ STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; +PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; @@ -84,6 +85,7 @@ static HOOKLIST g_hooks[] = { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, + { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e82c09b..daa9ebb 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -553,6 +553,102 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); } +BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +{ + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + if (result) + { + switch (lpMsg->message) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_ddraw->devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(lpMsg->lParam); + int y = GET_Y_LPARAM(lpMsg->lParam); + + if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width || + x < g_ddraw->render.viewport.x || + y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height || + y < g_ddraw->render.viewport.y) + { + x = g_ddraw->width / 2; + y = g_ddraw->height / 2; + } + else + { + x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); + y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + } + + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + + mouse_lock(); + return FALSE; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_ddraw->devmode && !g_mouse_locked) + { + return FALSE; + } + + int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw->mouse.y_adjust, 0); + + if (g_ddraw->adjmouse) + { + if (g_ddraw->vhack && !g_ddraw->devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw->render.unscale_w)); + y = (DWORD)(roundf(y * g_ddraw->render.unscale_h)); + } + } + + x = min(x, g_ddraw->width - 1); + y = min(y, g_ddraw->height - 1); + + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + + lpMsg->lParam = MAKELPARAM(x, y); + fake_GetCursorPos(&lpMsg->pt); + + break; + } + + } + } + + return result; +} + int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { if (g_ddraw && From 336eb1bdba9ab20afcae8be862e0d0cc2268f8ad Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 Feb 2023 18:27:30 +0100 Subject: [PATCH 0309/1724] add missing check --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index daa9ebb..e5b10ad 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -557,7 +557,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result) + if (result && g_ddraw->hook_peekmessage) { switch (lpMsg->message) { From 67188ea5001f979c45ce5ce06df457074ad61789 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 Feb 2023 18:30:35 +0100 Subject: [PATCH 0310/1724] add NULL check --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e5b10ad..af24df5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -557,7 +557,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_ddraw->hook_peekmessage) + if (result && g_ddraw && g_ddraw->hook_peekmessage) { switch (lpMsg->message) { From 2774006c2ff0733870de5dcc628d68b8d6eabbe0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 Feb 2023 18:43:06 +0100 Subject: [PATCH 0311/1724] force adjmouse=true for EV Nove (Hardware Cursor) --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index d3ff152..ea52853 100644 --- a/src/config.c +++ b/src/config.c @@ -745,6 +745,7 @@ static void cfg_create_ini() "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" + "adjmouse=true\n" "\n" "; Economic War\n" "[EcoW]\n" From dc57860f07e5f4b4de80f620ae900720832a5bf7 Mon Sep 17 00:00:00 2001 From: Kappa971 <62349018+Kappa971@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:06:12 +0100 Subject: [PATCH 0312/1724] Add Italian translation --- config/ConfigFormUnit.cpp | 56 +++++++++++++++++++++++++++ config/Resources/IT.png | Bin 0 -> 420 bytes config/cnc-ddraw config.cbproj | 10 +++++ config/cnc-ddraw config_resources.rc | 1 + 4 files changed, 67 insertions(+) create mode 100644 config/Resources/IT.png diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 82f9920..4d3033a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -353,6 +353,56 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); } + else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { + LanguageImg->Visible = true; + + /* -Italian - made by Kappa971 @ github */ + + ConfigForm->Caption = L"Configurazione di cnc-ddraw"; + DisplayBtn->Caption = L"Impostazioni dello schermo"; + AdvancedBtn->Caption = L"Impostazioni avanzate"; + CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; + PresentationLbl->Caption = L"Presentazione"; + MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; + VsyncLbl->Caption = L"Abilita VSync"; + AdjmouseLbl->Caption = L"Regola la sensibilità del mouse"; + DevmodeLbl->Caption = L"Cattura il cursore nella finestra / schermo"; + RendererLbl->Caption = L"Renderer"; + BorderLbl->Caption = L"Mostra i bordi della finestra in modalità finestra"; + SavesettingsLbl->Caption = L"Ricorda la posizione e le dimensioni della finestra"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Limita la frequenza dei fotogrammi (FPS)"; + BoxingLbl->Caption = L"Abilita ridimensionamento dei numeri interi"; + MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; + NoactivateappLbl->Caption = L"Risolvi il problema con Alt+Tab"; + HookLbl->Caption = L"Risolvi i problemi con la modalità finestra o il ridimensionamento"; + MinfpsLbl->Caption = L"Forza FPS elevati / Risolvi i problemi di balbuzie su Freesync/G-Sync"; + FixpitchLbl->Caption = L"Risolvi i problemi di visualizzazione mostrati in diagonale"; + NonexclusiveLbl->Caption = L"Correggi video / elementi dell'interfaccia utente invisibili"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Automatico", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Schermo Intero", NULL); + PresentationCbx->AddItem(L"Schermo Intero Ridimensionato", NULL); + PresentationCbx->AddItem(L"Senza Bordi", NULL); + PresentationCbx->AddItem(L"In Finestra", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Senza Limiti", NULL); + MaxgameticksCbx->AddItem(L"Sincronizza con la frequenza di aggiornamento dello schermo", NULL); + MaxgameticksCbx->AddItem(L"Emula uno schermo a 60Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"500 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"60 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); + } else { IsEnglish = true; @@ -393,6 +443,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_ITALIAN) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_IT"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } diff --git a/config/Resources/IT.png b/config/Resources/IT.png new file mode 100644 index 0000000000000000000000000000000000000000..89692f74f051cd43503744c3dab65c8ba773b7e2 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~o!2~3KHq6QcQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFq(O~IEGZ*N=lh=;=qSyMwWku z27eMOW_|f0uQeek^e_9g7KH|eq{JVG0^UaP2Jy4}|L^JL_3uCblfVD@mnS9t`~UCn z|MT(+KT|KOfz%~1cG~~^_2vEk{SFNQ?Cjg~|NsBWy<%2im{vp^YdeS=hk-Cyo6U`Hgs{l4FR(w#{P`G0;a3G2@YSmzI~fu(ZE1> L{an^LB{Ts58L6#6 literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 3ac67c6..3174063 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -151,6 +151,10 @@ RCDATA PngImage_HU + + RCDATA + PngImage_IT + RCDATA PngImage_RU @@ -305,6 +309,12 @@ .\ true + + + .\ + true + + diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index 15a55fd..a2ed1e5 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -3,5 +3,6 @@ PngImage_DE RCDATA "Resources\\DE.png" PngImage_ES RCDATA "Resources\\ES.png" PngImage_FR RCDATA "Resources\\fr.png" PngImage_HU RCDATA "Resources\\hu.png" +PngImage_IT RCDATA "Resources\\IT.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" From 9c270ee64f085366d2fb4b7908f9ec5176930e03 Mon Sep 17 00:00:00 2001 From: Kappa971 <62349018+Kappa971@users.noreply.github.com> Date: Wed, 1 Mar 2023 16:19:17 +0100 Subject: [PATCH 0313/1724] Minor fixes --- config/ConfigFormUnit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4d3033a..257b98a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -364,7 +364,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; PresentationLbl->Caption = L"Presentazione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; - VsyncLbl->Caption = L"Abilita VSync"; + VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; AdjmouseLbl->Caption = L"Regola la sensibilità del mouse"; DevmodeLbl->Caption = L"Cattura il cursore nella finestra / schermo"; RendererLbl->Caption = L"Renderer"; @@ -372,12 +372,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"Ricorda la posizione e le dimensioni della finestra"; ShaderLbl->Caption = L"Shader OpenGL"; MaxfpsLbl->Caption = L"Limita la frequenza dei fotogrammi (FPS)"; - BoxingLbl->Caption = L"Abilita ridimensionamento dei numeri interi"; + BoxingLbl->Caption = L"Abilita il ridimensionamento dei numeri interi"; MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; - NoactivateappLbl->Caption = L"Risolvi il problema con Alt+Tab"; + NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; HookLbl->Caption = L"Risolvi i problemi con la modalità finestra o il ridimensionamento"; - MinfpsLbl->Caption = L"Forza FPS elevati / Risolvi i problemi di balbuzie su Freesync/G-Sync"; - FixpitchLbl->Caption = L"Risolvi i problemi di visualizzazione mostrati in diagonale"; + MinfpsLbl->Caption = L"Forza FPS elevati / Correggi balbuzie su Freesync/G-Sync"; + FixpitchLbl->Caption = L"Correggi artefatti mostrati in diagonale"; NonexclusiveLbl->Caption = L"Correggi video / elementi dell'interfaccia utente invisibili"; RendererCbx->Items->Clear(); @@ -394,7 +394,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"Senza Limiti", NULL); - MaxgameticksCbx->AddItem(L"Sincronizza con la frequenza di aggiornamento dello schermo", NULL); + MaxgameticksCbx->AddItem(L"Sincronizza con la frequenza dello schermo", NULL); MaxgameticksCbx->AddItem(L"Emula uno schermo a 60Hz", NULL); MaxgameticksCbx->AddItem(L"1000 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"500 tick al secondo", NULL); From d2557c66c8d05d344adbc9ac8d8e1358e362c043 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 3 Mar 2023 22:29:35 +0100 Subject: [PATCH 0314/1724] #208 --- src/winapi_hooks.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index af24df5..b287e50 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -658,6 +658,14 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { return g_ddraw->bpp; } + + if (g_ddraw && + g_ddraw->bpp == 8 && + index == RASTERCAPS && + (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) + { + return RC_PALETTE | real_GetDeviceCaps(hdc, index); + } return real_GetDeviceCaps(hdc, index); } From e61e0d23218c307f64d12fbffa2e4a4675597e71 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 01:40:47 +0100 Subject: [PATCH 0315/1724] #209 support clipper from hwnd for New Robinson --- src/ddclipper.c | 4 ---- src/ddsurface.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index 30ba4ce..28fc283 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -7,9 +7,6 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) { - return DDERR_NOCLIPLIST; - - /* Keep this commented out until we found a game that actually needs it if (!This->region) return DDERR_NOCLIPLIST; @@ -45,7 +42,6 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l return DDERR_REGIONTOOSMALL; return DD_OK; - */ } HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) diff --git a/src/ddsurface.c b/src/ddsurface.c index 34de913..b8ff738 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -988,8 +988,20 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpClipper) { if (lpClipper) + { IDirectDrawClipper_AddRef(lpClipper); + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && lpClipper->hwnd) + { + if (lpClipper->region) + DeleteObject(lpClipper->region); + + RECT rc = { 0, 0, This->width, This->height }; + + lpClipper->region = CreateRectRgnIndirect(&rc); + } + } + if (This->clipper) IDirectDrawClipper_Release(This->clipper); From 19bf4682f1c8d8b5fa22b83fef78505f1822a33b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 01:46:52 +0100 Subject: [PATCH 0316/1724] add preset for new robinson --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ea52853..2dc0ca8 100644 --- a/src/config.c +++ b/src/config.c @@ -907,6 +907,10 @@ static void cfg_create_ini() "dinputhook=true\n" "releasealt=true\n" "\n" + "; New Robinson\n" + "[ROBY]\n" + "adjmouse=true\n" + "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" From 91cec509d46abff0b9b72c954cb7409fba2bf80d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 03:09:36 +0100 Subject: [PATCH 0317/1724] #209 force devmode=false for New Robinson (until menu is properly supported) --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 2dc0ca8..63d5383 100644 --- a/src/config.c +++ b/src/config.c @@ -910,6 +910,7 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" + "devmode=false\n" "\n" "; Outlaws\n" "[olwin]\n" From 7a40149966381da4651ac820ff91a165f16e9d6f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 03:26:06 +0100 Subject: [PATCH 0318/1724] adjust New Robinson preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 63d5383..5681705 100644 --- a/src/config.c +++ b/src/config.c @@ -910,7 +910,7 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" - "devmode=false\n" + "hook_peekmessage=true\n" "\n" "; Outlaws\n" "[olwin]\n" From 1324a9674032b631b0cc870e249ab45940e3c421 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 03:48:50 +0100 Subject: [PATCH 0319/1724] fix peekmessage hook for New Robinson --- src/winapi_hooks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b287e50..ea2082a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -608,7 +608,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { if (!g_ddraw->devmode && !g_mouse_locked) { - return FALSE; + // Does not work with 'New Robinson' + //return FALSE; } int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0); From 3ceddd151783a4edfc4c4697b489d0d1ec271253 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Mar 2023 03:55:10 +0100 Subject: [PATCH 0320/1724] tweak peekmessage hook --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ea2082a..205eba3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -588,7 +588,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); mouse_lock(); - return FALSE; + //return FALSE; } /* fall through for lParam */ } From c7358ea4883aa508d2c9523567aaddae18c29d2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Mar 2023 21:29:19 +0100 Subject: [PATCH 0321/1724] add size limit for surfaces --- src/ddsurface.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index b8ff738..a091a43 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1279,6 +1279,12 @@ HRESULT dd_CreateSurface( if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY) return DDERR_UNSUPPORTED; + if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && + (lpDDSurfaceDesc->dwWidth > 16384 || lpDDSurfaceDesc->dwHeight > 16384)) + { + return DDERR_INVALIDPARAMS; + } + if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->primary && g_ddraw->primary->width == g_ddraw->width && From dede1815fa7322e23cce847323666a751ea8a5fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Mar 2023 21:30:28 +0100 Subject: [PATCH 0322/1724] improve crash logs --- src/debug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 83eabc7..459388a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -60,8 +60,10 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) } TRACE( - "Exception at %p (%08X) %s\n", + "Exception at %p (%p+%p), Code=%08X - %s\n", exception->ExceptionRecord->ExceptionAddress, + mod, + (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, exception->ExceptionRecord->ExceptionCode, filename); } From 4dfb65f66cc3fbbfd48ddca9efc38f749130252d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Mar 2023 06:27:13 +0100 Subject: [PATCH 0323/1724] #211 adjust cossacks preset to fix intro crash --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 5681705..b076874 100644 --- a/src/config.c +++ b/src/config.c @@ -449,6 +449,7 @@ static void cfg_create_ini() "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" + "guard_lines=300\n" "minfps=-2\n" "\n" "; Age of Wonders\n" From d366559506e11337451c6ffdd8a53a1d1c410235 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Mar 2023 07:45:21 +0100 Subject: [PATCH 0324/1724] #212 add temp hack for baldr force exe --- inc/IDirectDrawSurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 59d58fc..5c1a26d 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -41,6 +41,7 @@ typedef struct IDirectDrawSurfaceImpl DDCOLORKEY color_key; DWORD last_flip_tick; DWORD last_blt_tick; + BOOL queried; struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 8339a2b..98408ff 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -23,6 +23,8 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi IDirectDrawSurface_AddRef(This); + This->queried = TRUE; /* Hack for Baldr Force exe */ + *ppvObj = This; ret = S_OK; @@ -70,6 +72,12 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) ULONG ret = --This->ref; + if (This->queried && ret == 1) /* Hack for Baldr Force exe */ + { + This->queried = FALSE; + ret = 0; + } + if (This->ref == 0) { TRACE(" Released (%p)\n", This); From 804b28fbcf30cde2324eae878b144e25147cf045 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Mar 2023 22:22:35 +0100 Subject: [PATCH 0325/1724] fix screenshots for EV Nova --- src/blt.c | 36 ++++++++++++++++++++++++++++++++++++ src/screenshot.c | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/blt.c b/src/blt.c index 0f8d78e..0c212aa 100644 --- a/src/blt.c +++ b/src/blt.c @@ -604,6 +604,42 @@ void blt_rgb565_to_rgba8888( } } +void blt_rgb555_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned short* src, + int src_x, + int src_y, + int src_p) +{ + size_t s_a = (src_p / sizeof(src[0])) - dst_w; + size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; + + src += src_x + ((src_p / sizeof(src[0])) * src_y); + dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); + + for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) + { + for (unsigned int* w_end = dst + dst_w; dst < w_end;) + { + unsigned short pixel = *src++; + + BYTE r = ((pixel & 0x7C00) >> 10) << 3; + BYTE g = ((pixel & 0x03E0) >> 5) << 3; + BYTE b = ((pixel & 0x001F)) << 3; + + *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; + } + + src += s_a; + dst += d_a; + } +} + void blt_bgra8888_to_rgba8888( unsigned int* dst, int dst_x, diff --git a/src/screenshot.c b/src/screenshot.c index d6a3578..d9623c6 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -58,17 +58,34 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) if (buf) { - blt_rgb565_to_rgba8888( - buf, - 0, - 0, - src->width, - src->height, - src->width * 4, - dds_GetBuffer(src), - 0, - 0, - src->pitch); + if (g_ddraw->rgb555) + { + blt_rgb555_to_rgba8888( + buf, + 0, + 0, + src->width, + src->height, + src->width * 4, + dds_GetBuffer(src), + 0, + 0, + src->pitch); + } + else + { + blt_rgb565_to_rgba8888( + buf, + 0, + 0, + src->width, + src->height, + src->width * 4, + dds_GetBuffer(src), + 0, + 0, + src->pitch); + } error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); From 52099528314ec538aaafdb2c518512c271c8711b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 Mar 2023 22:45:30 +0100 Subject: [PATCH 0326/1724] fix header --- inc/blt.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/inc/blt.h b/inc/blt.h index 76f3bf5..8f35696 100644 --- a/inc/blt.h +++ b/inc/blt.h @@ -99,6 +99,18 @@ void blt_rgb565_to_rgba8888( int src_y, int src_p); +void blt_rgb555_to_rgba8888( + unsigned int* dst, + int dst_x, + int dst_y, + int dst_w, + int dst_h, + int dst_p, + unsigned short* src, + int src_x, + int src_y, + int src_p); + void blt_bgra8888_to_rgba8888( unsigned int* dst, int dst_x, From 708ff015cdc29c37ef77aa28a1adc769d0b3cbae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Mar 2023 00:49:11 +0200 Subject: [PATCH 0327/1724] include catmull-rom shader and make it the default in case no shader files were found --- inc/openglshader.h | 150 +++++++++++++++++++++++++++++++++++++++++++++ src/render_ogl.c | 34 +++++----- 2 files changed, 170 insertions(+), 14 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index 58bea87..f23bfdd 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -127,4 +127,154 @@ const char PASSTHROUGH_FRAG_SHADER_CORE[] = " FragColor = texel;\n" "}\n"; +/* +// Bicubic Catmull-Rom 9 taps (Fast) - ported by Hyllian - 2020 +// The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae +// Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 +// Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. +// See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details +// ATENTION: This code only work using LINEAR filter sampling set on Retroarch! +*/ + +const char CATMULL_ROM_FRAG_SHADER[] = + "#version 130\n" + "out mediump vec4 FragColor;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "uniform sampler2D Texture;\n" + "in vec4 TEX0;\n" + "\n" + "#define Source Texture\n" + "#define vTexCoord TEX0.xy\n" + "\n" + "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" + "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" + "\n" + "#define mul(c,d) (d*c)\n" + "\n" + "void main()\n" + "{\n" + " vec2 samplePos = vTexCoord * SourceSize.xy;\n" + " vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n" + "\n" + " vec2 f = samplePos - texPos1;\n" + "\n" + " vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));\n" + " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" + " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" + " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" + " //vec2 w3 = 1.0 - w0 - w1 - w2;\n" + "\n" + " vec2 w12 = w1 + w2;\n" + " vec2 offset12 = w2 / (w1 + w2);\n" + "\n" + " vec2 texPos0 = texPos1 - 1.;\n" + " vec2 texPos3 = texPos1 + 2.;\n" + " vec2 texPos12 = texPos1 + offset12;\n" + "\n" + " texPos0 *= SourceSize.zw;\n" + " texPos3 *= SourceSize.zw;\n" + " texPos12 *= SourceSize.zw;\n" + "\n" + " vec4 c00 = texture(Source, vec2(texPos0.x, texPos0.y));\n" + " vec4 c10 = texture(Source, vec2(texPos12.x, texPos0.y));\n" + " vec4 c20 = texture(Source, vec2(texPos3.x, texPos0.y));\n" + "\n" + " vec4 c01 = texture(Source, vec2(texPos0.x, texPos12.y));\n" + " vec4 c11 = texture(Source, vec2(texPos12.x, texPos12.y));\n" + " vec4 c21 = texture(Source, vec2(texPos3.x, texPos12.y));\n" + "\n" + " vec4 c02 = texture(Source, vec2(texPos0.x, texPos3.y));\n" + " vec4 c12 = texture(Source, vec2(texPos12.x, texPos3.y));\n" + " vec4 c22 = texture(Source, vec2(texPos3.x, texPos3.y));\n" + "\n" + " vec4 c1, c2, c3, wx, wy = vec4(0.,0.,0.,0.);\n" + "\n" + " vec4 dummy = vec4(0.,0.,0.,1.);\n" + "\n" + " wx = vec4(w0.x, w12.x, w3.x, 1.0);\n" + " wy = vec4(w0.y, w12.y, w3.y, 1.0);\n" + "\n" + " c1 = vec4(mul(wx, mat4(c00, c10, c20, dummy)));\n" + " c2 = vec4(mul(wx, mat4(c01, c11, c21, dummy)));\n" + " c3 = vec4(mul(wx, mat4(c02, c12, c22, dummy)));\n" + "\n" + " FragColor = mul(wy, mat4(c1, c2, c3, dummy));\n" + "}\n"; + + +const char CATMULL_ROM_FRAG_SHADER_CORE[] = + "#version 150\n" + "out mediump vec4 FragColor;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "uniform sampler2D Texture;\n" + "in vec4 TEX0;\n" + "\n" + "#define Source Texture\n" + "#define vTexCoord TEX0.xy\n" + "\n" + "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" + "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" + "\n" + "#define mul(c,d) (d*c)\n" + "\n" + "void main()\n" + "{\n" + " vec2 samplePos = vTexCoord * SourceSize.xy;\n" + " vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n" + "\n" + " vec2 f = samplePos - texPos1;\n" + "\n" + " vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));\n" + " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" + " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" + " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" + " //vec2 w3 = 1.0 - w0 - w1 - w2;\n" + "\n" + " vec2 w12 = w1 + w2;\n" + " vec2 offset12 = w2 / (w1 + w2);\n" + "\n" + " vec2 texPos0 = texPos1 - 1.;\n" + " vec2 texPos3 = texPos1 + 2.;\n" + " vec2 texPos12 = texPos1 + offset12;\n" + "\n" + " texPos0 *= SourceSize.zw;\n" + " texPos3 *= SourceSize.zw;\n" + " texPos12 *= SourceSize.zw;\n" + "\n" + " vec4 c00 = texture(Source, vec2(texPos0.x, texPos0.y));\n" + " vec4 c10 = texture(Source, vec2(texPos12.x, texPos0.y));\n" + " vec4 c20 = texture(Source, vec2(texPos3.x, texPos0.y));\n" + "\n" + " vec4 c01 = texture(Source, vec2(texPos0.x, texPos12.y));\n" + " vec4 c11 = texture(Source, vec2(texPos12.x, texPos12.y));\n" + " vec4 c21 = texture(Source, vec2(texPos3.x, texPos12.y));\n" + "\n" + " vec4 c02 = texture(Source, vec2(texPos0.x, texPos3.y));\n" + " vec4 c12 = texture(Source, vec2(texPos12.x, texPos3.y));\n" + " vec4 c22 = texture(Source, vec2(texPos3.x, texPos3.y));\n" + "\n" + " vec4 c1, c2, c3, wx, wy = vec4(0.,0.,0.,0.);\n" + "\n" + " vec4 dummy = vec4(0.,0.,0.,1.);\n" + "\n" + " wx = vec4(w0.x, w12.x, w3.x, 1.0);\n" + " wy = vec4(w0.y, w12.y, w3.y, 1.0);\n" + "\n" + " c1 = vec4(mul(wx, mat4(c00, c10, c20, dummy)));\n" + " c2 = vec4(mul(wx, mat4(c01, c11, c21, dummy)));\n" + " c3 = vec4(mul(wx, mat4(c02, c12, c22, dummy)));\n" + "\n" + " FragColor = mul(wy, mat4(c1, c2, c3, dummy));\n" + "}\n"; + + + #endif diff --git a/src/render_ogl.c b/src/render_ogl.c index 652b2c9..19c943c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -165,25 +165,31 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader); } - if (GetFileAttributes(shader_path) != INVALID_FILE_ATTRIBUTES) + /* detect common upscaling shaders and disable them if no upscaling is required */ + + BOOL is_upscaler = + strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || + strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || + strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; + + if (!is_upscaler || + g_ddraw->render.viewport.width != g_ddraw->width || + g_ddraw->render.viewport.height != g_ddraw->height) { - /* detect common upscaling shaders and disable them if no upscaling is required */ + g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); - BOOL is_upscaler = - strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || - strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || - strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || - strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; - - if (is_upscaler && - g_ddraw->render.viewport.width == g_ddraw->width && - g_ddraw->render.viewport.height == g_ddraw->height) + if (!g_ogl.scale_program) { - shader_path[0] = 0; + g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, CATMULL_ROM_FRAG_SHADER); + + if (!g_ogl.scale_program) + { + g_ogl.scale_program = + oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, CATMULL_ROM_FRAG_SHADER_CORE); + } } } - - g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); } else { From c9afd18585681c14068bcb3904cc743b2b5c01bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Mar 2023 01:01:17 +0200 Subject: [PATCH 0328/1724] force bilinear filter for default shader --- src/render_ogl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 19c943c..21c6631 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -154,6 +154,8 @@ static void ogl_build_programs() } } + BOOL bilinear = FALSE; + if (g_ogl.main_program) { char shader_path[MAX_PATH] = { 0 }; @@ -188,6 +190,8 @@ static void ogl_build_programs() g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, CATMULL_ROM_FRAG_SHADER_CORE); } + + bilinear = TRUE; } } } @@ -196,7 +200,7 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } - g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != NULL; + g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != NULL || bilinear; } if (g_oglu_got_version2 && !g_ogl.main_program) From cd3a439a9546706c8a4cb549ce9ed1ea42302f90 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Mar 2023 01:11:45 +0200 Subject: [PATCH 0329/1724] only use catmull rom if upscaling is required --- src/render_ogl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 21c6631..b20b0d9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -181,7 +181,9 @@ static void ogl_build_programs() { g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); - if (!g_ogl.scale_program) + if (!g_ogl.scale_program && + (g_ddraw->render.viewport.width != g_ddraw->width || + g_ddraw->render.viewport.height != g_ddraw->height)) { g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, CATMULL_ROM_FRAG_SHADER); From 9568f1f96833deed07cc605bb1addd3a3aaec963 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Mar 2023 01:30:44 +0200 Subject: [PATCH 0330/1724] adjust makefile --- Makefile | 2 +- ddraw.rc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index d4cbe4d..e2e5531 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O3 -march=i486 +CFLAGS = -std=c99 -O2 -march=i486 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ diff --git a/ddraw.rc b/ddraw.rc index 0917e01..075bf4f 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,8 +2,8 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 0 -#define VERSION_BUILD 1 +#define VERSION_MINOR 1 +#define VERSION_BUILD 0 #define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION From 5fc842490b971d4b09cc6cfc9d73a30d8e6e2fe2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Mar 2023 02:04:26 +0200 Subject: [PATCH 0331/1724] add win2000 hack for newer versions of visual studio --- src/win2000.asm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/win2000.asm diff --git a/src/win2000.asm b/src/win2000.asm new file mode 100644 index 0000000..5995502 --- /dev/null +++ b/src/win2000.asm @@ -0,0 +1,15 @@ +.model flat + +.data +__imp__EncodePointer@4 dd dummy +__imp__DecodePointer@4 dd dummy +EXTERNDEF __imp__EncodePointer@4 : DWORD +EXTERNDEF __imp__DecodePointer@4 : DWORD + +.code +dummy proc +mov eax, [esp+4] +ret 4 +dummy endp + +end From 8643372afe35b45f0b3fa58e4145cf6938e09a00 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Apr 2023 19:32:24 +0200 Subject: [PATCH 0332/1724] fix for non working links in profile --- src/winapi_hooks.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1a73cd6..a37181c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -107,6 +107,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } + else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt)) + { + if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height) + { + lpPoint->x = pt.x; + lpPoint->y = pt.y; + + return TRUE; + } + } if (lpPoint) { From 50d4c0aa81ffc697094593fa9bc9fb303e64a162 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Apr 2023 20:06:51 +0200 Subject: [PATCH 0333/1724] hook SetForegroundWindow for profile links --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 5 +++++ src/wndproc.c | 4 ++-- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 0623c07..95ba179 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[24]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -34,6 +34,7 @@ typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); +typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -65,6 +66,7 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; +extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3b4ca4c..c112ec3 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -27,6 +27,7 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); +BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index a6fb2a5..3a3406a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -40,6 +40,7 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; +SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -76,6 +77,7 @@ static HOOKLIST g_hooks[] = { "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 }, { "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 }, { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, + { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a37181c..2ffeab5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -526,6 +526,11 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) return real_ShowWindow(hWnd, nCmdShow); } +BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) +{ + return TRUE; +} + HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) diff --git a/src/wndproc.c b/src/wndproc.c index 736c626..eee69fa 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -17,7 +17,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - /* + /**/ TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", dbg_mes_to_str(uMsg), @@ -26,7 +26,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam wParam, lParam, lParam); - */ + static BOOL in_size_move = FALSE; static int redraw_count = 0; From 9b028e63763d8060a251e6dd1e46bb11d1075b93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Apr 2023 20:07:43 +0200 Subject: [PATCH 0334/1724] disable debug code --- src/wndproc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index eee69fa..736c626 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -17,7 +17,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - /**/ + /* TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", dbg_mes_to_str(uMsg), @@ -26,7 +26,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam wParam, lParam, lParam); - + */ static BOOL in_size_move = FALSE; static int redraw_count = 0; From b42bc232c8546f9f76a017a0a1ea9cfed11285fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Jun 2023 00:52:21 +0200 Subject: [PATCH 0335/1724] #219 adjust filename for crash .dmp in case there are multiplayer exceptions --- src/debug.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 459388a..8c750ea 100644 --- a/src/debug.c +++ b/src/debug.c @@ -13,13 +13,19 @@ DWORD g_dbg_frame_count = 0; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; +static int g_crash_count = 0; #if _DEBUG int dbg_exception_handler(EXCEPTION_POINTERS* exception) { + g_crash_count++; + + char filename[MAX_PATH] = { 0 }; + _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_crash_count == 1 ? 1 : 2); + HANDLE dmp = CreateFile( - "cnc-ddraw.dmp", + filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, From 9cf4881aa233b3edf0f72f64bdbfb86b6c1fd194 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Jun 2023 00:56:18 +0200 Subject: [PATCH 0336/1724] use real_ function --- src/dd.c | 2 +- src/ddsurface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 81e7bac..aa597db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -712,7 +712,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->windowed) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); if (!border) { diff --git a/src/ddsurface.c b/src/ddsurface.c index a091a43..3511fa1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -943,7 +943,7 @@ HRESULT dds_Lock( if (g_ddraw && g_ddraw->fixnotresponding) { MSG msg; /* workaround for "Not Responding" window problem */ - PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); From f352aedc59ccb95682916718cdc972ad2a6c610e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Jun 2023 01:43:44 +0200 Subject: [PATCH 0337/1724] fix name --- src/debug.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/debug.c b/src/debug.c index 8c750ea..6d9ebc2 100644 --- a/src/debug.c +++ b/src/debug.c @@ -13,15 +13,15 @@ DWORD g_dbg_frame_count = 0; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; -static int g_crash_count = 0; +static int g_dbg_crash_count = 0; #if _DEBUG int dbg_exception_handler(EXCEPTION_POINTERS* exception) { - g_crash_count++; + g_dbg_crash_count++; char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_crash_count == 1 ? 1 : 2); + _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_dbg_crash_count == 1 ? 1 : 2); HANDLE dmp = CreateFile( From 087f41ce119834341714843adf7382b27bc47d47 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Jun 2023 21:13:04 +0200 Subject: [PATCH 0338/1724] hook SetUnhandledExceptionFilter for debug build --- inc/debug.h | 1 + inc/hook.h | 2 ++ inc/winapi_hooks.h | 3 +++ src/debug.c | 4 ++++ src/dllmain.c | 4 ++-- src/hook.c | 20 +++++++++++++++++--- src/winapi_hooks.c | 10 ++++++++++ 7 files changed, 39 insertions(+), 5 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 844bb6d..31d0501 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -27,6 +27,7 @@ char* dbg_mes_to_str(int id); extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; +extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; //#define _DEBUG 1 diff --git a/inc/hook.h b/inc/hook.h index c9c4400..12303d0 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -55,6 +55,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); +typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); extern GETCURSORPOSPROC real_GetCursorPos; extern CLIPCURSORPROC real_ClipCursor; @@ -93,6 +94,7 @@ extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; +extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern int g_hook_method; extern BOOL g_hook_dinput; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index f84cf40..709f53a 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -61,4 +61,7 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( + LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); + #endif diff --git a/src/debug.c b/src/debug.c index 6d9ebc2..6825342 100644 --- a/src/debug.c +++ b/src/debug.c @@ -10,6 +10,7 @@ double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; +LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; @@ -74,6 +75,9 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) filename); } + if (g_dbg_exception_filter) + return g_dbg_exception_filter(exception); + return EXCEPTION_EXECUTE_HANDLER; } #endif diff --git a/src/dllmain.c b/src/dllmain.c index 65be2d6..8a33069 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -25,10 +25,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { -#if _DEBUG +#ifdef _DEBUG dbg_init(); TRACE("cnc-ddraw = %p\n", hDll); - SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + g_dbg_exception_filter = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif g_ddraw_module = hDll; diff --git a/src/hook.c b/src/hook.c index 4ce22fd..ccc09c3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -54,6 +54,7 @@ LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; +SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; static HOOKLIST g_hooks[] = { @@ -567,12 +568,14 @@ void hook_init() void hook_early_init() { - /* +#ifdef _DEBUG && _MSC_VER + hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); + DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_CoCreateInstance, (PVOID)fake_CoCreateInstance); + DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); - */ +#endif hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans @@ -633,6 +636,17 @@ void hook_exit() hook_revert((HOOKLIST*)&g_hooks); } +#ifdef _DEBUG && _MSC_VER + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); + DetourTransactionCommit(); + + hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); + + real_SetUnhandledExceptionFilter(g_dbg_exception_filter); +#endif + hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 205eba3..25605c3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1076,3 +1076,13 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); } + +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( + LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) +{ + LPTOP_LEVEL_EXCEPTION_FILTER old = g_dbg_exception_filter; + g_dbg_exception_filter = lpTopLevelExceptionFilter; + + return old; + //return real_SetUnhandledExceptionFilter(lpTopLevelExceptionFilter); +} From 587adf81870383aa95ddb8a17855713a31abe2a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Jun 2023 21:26:11 +0200 Subject: [PATCH 0339/1724] use real function --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 8a33069..9aadbbe 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -28,7 +28,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); TRACE("cnc-ddraw = %p\n", hDll); - g_dbg_exception_filter = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif g_ddraw_module = hDll; From dd890feb700cfe3d3444c8feb664e9876b3da4ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jul 2023 17:16:47 +0200 Subject: [PATCH 0340/1724] adjust claw preset --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index b076874..f7eb59b 100644 --- a/src/config.c +++ b/src/config.c @@ -527,6 +527,9 @@ static void cfg_create_ini() "; Captain Claw\n" "[claw]\n" "noactivateapp=true\n" + "fpupreserve=true\n" + "renderer=opengl\n" + "nonexclusive=true\n" "\n" "; Command & Conquer: Sole Survivor\n" "[SOLE]\n" From e39414a477f594f6c215dfc63945d5d0a55e251c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 02:59:04 +0200 Subject: [PATCH 0341/1724] force pos 0,0 in borderless mode --- src/config.c | 5 ----- src/dd.c | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/config.c b/src/config.c index f7eb59b..6327883 100644 --- a/src/config.c +++ b/src/config.c @@ -127,11 +127,6 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } - if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE))) - { - g_config.window_rect.left = g_config.window_rect.top = -32000; - } - if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); diff --git a/src/dd.c b/src/dd.c index aa597db..db0846b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -521,9 +521,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { border = FALSE; - g_config.window_rect.left = -32000; - g_config.window_rect.top = -32000; - /* prevent OpenGL from going automatically into fullscreen exclusive mode */ if (g_ddraw->renderer == ogl_render_main) nonexclusive = TRUE; @@ -745,7 +742,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); - if (nonexclusive) + if (g_ddraw->fullscreen) { x = y = 0; } From a02c7f3e6882d7ff4aa2c8cde77a16e8328ee567 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 05:13:47 +0200 Subject: [PATCH 0342/1724] new .ini setting #toggle_borderless --- inc/config.h | 1 + inc/dd.h | 1 + src/config.c | 13 ++++++++++- src/utils.c | 64 +++++++++++++++++++++++++++++++++++---------------- src/wndproc.c | 2 +- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/inc/config.h b/inc/config.h index 71e8693..1b40a22 100644 --- a/inc/config.h +++ b/inc/config.h @@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; + int borderless_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; diff --git a/inc/dd.h b/inc/dd.h index b164176..76a1922 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -142,6 +142,7 @@ typedef struct CNCDDRAW BOOL opengl_core; BOOL accurate_timers; BOOL resizable; + BOOL toggle_borderless; BOOL nonexclusive; int fixchilds; BOOL fixwndprochook; diff --git a/src/config.c b/src/config.c index 6327883..949ed60 100644 --- a/src/config.c +++ b/src/config.c @@ -15,7 +15,7 @@ static void cfg_init(); static void cfg_create_ini(); CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; void cfg_load() { @@ -35,6 +35,7 @@ void cfg_load() g_ddraw->vhack = cfg_get_bool("vhack", FALSE); g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); + g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); @@ -127,6 +128,8 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } + g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); + if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); @@ -228,6 +231,11 @@ void cfg_save() { WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } + + if (g_config.borderless_state != -1) + { + WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + } } static void cfg_create_ini() @@ -308,6 +316,9 @@ static void cfg_create_ini() "; Where should screenshots be saved\n" "screenshotdir=.\\Screenshots\\\n" "\n" + "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_borderless=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 4aef256..30514a5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -333,32 +333,56 @@ void util_toggle_fullscreen() if (g_ddraw->bnet_active) return; - if (g_ddraw->windowed) + if (g_ddraw->toggle_borderless) { - mouse_unlock(); - - g_config.window_state = g_ddraw->windowed = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); - util_update_bnet_pos(0, 0); - - mouse_lock(); - } - else - { - mouse_unlock(); - g_config.window_state = g_ddraw->windowed = TRUE; - - if (g_ddraw->renderer == d3d9_render_main) + if (!g_ddraw->fullscreen) { - d3d9_reset(g_ddraw->windowed); + mouse_unlock(); + + g_config.borderless_state = g_ddraw->fullscreen = TRUE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + mouse_lock(); } else { - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); - } + mouse_unlock(); - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); - //mouse_lock(); + g_config.borderless_state = g_ddraw->fullscreen = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + //mouse_lock(); + } + } + else + { + if (g_ddraw->windowed) + { + mouse_unlock(); + + g_config.window_state = g_ddraw->windowed = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); + util_update_bnet_pos(0, 0); + + mouse_lock(); + } + else + { + mouse_unlock(); + g_config.window_state = g_ddraw->windowed = TRUE; + + if (g_ddraw->renderer == d3d9_render_main) + { + d3d9_reset(g_ddraw->windowed); + } + else + { + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + } + + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); + //mouse_lock(); + } } } diff --git a/src/wndproc.c b/src/wndproc.c index 4a30073..925dade 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -611,7 +611,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen && - !g_ddraw->fullscreen && + (!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) && context_code && !key_state) { From 225b5dc16973bbc7feb20fc87fa5ed60729902e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 05:55:17 +0200 Subject: [PATCH 0343/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 075bf4f..97d2f7c 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From e9a18548ed26da3127f1d6bd4a3f6c8be8f58dfe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 10:23:37 +0200 Subject: [PATCH 0344/1724] add d3d9 catmull rom shader --- inc/d3d9shader.h | 384 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 963bf6d..28b3668 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -341,4 +341,388 @@ const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = 228, 128, 255, 255, 0, 0 }; + +/* catmull rom upscaling */ + +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 10.1 +// +// Parameters: +// +// sampler2D SurfaceTex; +// float4 TextureSize; +// +// +// Registers: +// +// Name Reg Size +// ------------ ----- ---- +// TextureSize c0 1 +// SurfaceTex s0 1 +// + + ps_2_0 + def c1, -0.5, 0.5, 1, 2.5 + def c2, 1.5, -2.5, 2, 0 + dcl t0.xy + dcl_2d s0 + mov r0.w, c1.x + mad r0.xy, t0, c0, r0.w + frc r0.zw, r0.wzyx + add r0.xy, -r0.wzyx, r0 + add r0.zw, r0.wzyx, c1.y + mad r1.xy, t0, c0, -r0.wzyx + mad r1.zw, r1.wzyx, -c2.x, c2.z + mad r1.zw, r1.wzyx, r1, c1.y + mul r2.xy, r1.wzyx, r1 + mad r2.zw, r1.wzyx, c2.x, c2.y + mul r3.xy, r1, r1 + mad r2.zw, r3.wzyx, r2, c1.z + mad r1.zw, r1.wzyx, r1, r2 + rcp r4.x, r1.w + rcp r4.y, r1.z + mad r0.zw, r2.wzyx, r4.wzyx, r0 + rcp r2.x, c0.x + rcp r2.y, c0.y + mul r4.xy, r0.wzyx, r2 + mov r5.x, r4.x + add r0.zw, r0.wzyx, c1.x + add r0.xy, r0, c1.w + mul r0.xy, r2, r0 + mul r2.xy, r2, r0.wzyx + mov r5.y, r2.y + mov r6.x, r5.x + mov r7.y, r5.y + mov r8.x, r2.x + mov r7.x, r0.x + mov r9.x, r7.x + mov r8.y, r4.y + mov r10.x, r8.x + mov r9.y, r8.y + mov r10.y, r0.y + mov r6.y, r10.y + texld r5, r5, s0 + texld r2, r2, s0 + texld r7, r7, s0 + texld r4, r4, s0 + texld r8, r8, s0 + texld r9, r9, s0 + texld r0, r0, s0 + texld r6, r6, s0 + mul r5, r1.w, r5 + mad r3.zw, r1.wzyx, -c1.y, c1.z + mad r3.zw, r1.wzyx, r3, c1.x + mul r3.zw, r1.wzyx, r3 + mad r1.xy, r1, c1.y, c1.x + mul r1.xy, r1, r3 + mul r5, r3.z, r5 + mul r2, r2, r3.w + mad r2, r2, r3.z, r5 + mul r5, r1.x, r7 + mad r2, r5, r3.z, r2 + mul r4, r1.w, r4 + mul r5, r1.x, r9 + mul r7, r3.w, r8 + mad r2, r7, r1.z, r2 + mad r2, r4, r1.z, r2 + mad r2, r5, r1.z, r2 + mul r0, r0, r1.x + texld r4, r10, s0 + mul r5, r1.w, r6 + mul r3, r3.w, r4 + mad r2, r3, r1.y, r2 + mad r2, r5, r1.y, r2 + mad r0, r0, r1.y, r2 + mov oC0, r0 + +// approximately 68 instruction slots used (9 texture, 59 arithmetic) + +// fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h +/* +uniform sampler2D SurfaceTex; + +float4 TextureSize : register(c0); + +float4 catmull_rom(float2 coord) +{ + // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae + + // Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. + // See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details + + float2 samplePos = coord * TextureSize.xy; + float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; + + float2 f = samplePos - texPos1; + + float2 w0 = f * (-0.5f + f * (1.0f - 0.5f * f)); + float2 w1 = 1.0f + f * f * (-2.5f + 1.5f * f); + float2 w2 = f * (0.5f + f * (2.0f - 1.5f * f)); + float2 w3 = f * f * (-0.5f + 0.5f * f); + + float2 w12 = w1 + w2; + float2 offset12 = w2 / (w1 + w2); + + float2 texPos0 = texPos1 - 1; + float2 texPos3 = texPos1 + 2; + float2 texPos12 = texPos1 + offset12; + + texPos0 /= TextureSize.xy; + texPos3 /= TextureSize.xy; + texPos12 /= TextureSize.xy; + + float4 result = 0.0f; + result += tex2D(SurfaceTex, float2(texPos0.x, texPos0.y)) * w0.x * w0.y; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos0.y)) * w12.x * w0.y; + result += tex2D(SurfaceTex, float2(texPos3.x, texPos0.y)) * w3.x * w0.y; + + result += tex2D(SurfaceTex, float2(texPos0.x, texPos12.y)) * w0.x * w12.y; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos12.y)) * w12.x * w12.y; + result += tex2D(SurfaceTex, float2(texPos3.x, texPos12.y)) * w3.x * w12.y; + + result += tex2D(SurfaceTex, float2(texPos0.x, texPos3.y)) * w0.x * w3.y; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos3.y)) * w12.x * w3.y; + result += tex2D(SurfaceTex, float2(texPos3.x, texPos3.y)) * w3.x * w3.y; + + return result; +} + +float4 main(float2 texCoords : TEXCOORD) : COLOR +{ + return catmull_rom(texCoords); +} + +*/ +#endif + +const BYTE D3D9_CATMULL_ROM_SHADER[] = +{ + 0, 2, 255, 255, 254, 255, + 44, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 131, 0, + 0, 0, 0, 2, 255, 255, + 2, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 124, 0, 0, 0, 68, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 2, 0, + 108, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 191, 0, 0, + 0, 63, 0, 0, 128, 63, + 0, 0, 32, 64, 81, 0, + 0, 5, 2, 0, 15, 160, + 0, 0, 192, 63, 0, 0, + 32, 192, 0, 0, 0, 64, + 0, 0, 0, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 8, 128, + 1, 0, 0, 160, 4, 0, + 0, 4, 0, 0, 3, 128, + 0, 0, 228, 176, 0, 0, + 228, 160, 0, 0, 255, 128, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 27, 128, + 2, 0, 0, 3, 0, 0, + 3, 128, 0, 0, 27, 129, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 128, 1, 0, + 85, 160, 4, 0, 0, 4, + 1, 0, 3, 128, 0, 0, + 228, 176, 0, 0, 228, 160, + 0, 0, 27, 129, 4, 0, + 0, 4, 1, 0, 12, 128, + 1, 0, 27, 128, 2, 0, + 0, 161, 2, 0, 170, 160, + 4, 0, 0, 4, 1, 0, + 12, 128, 1, 0, 27, 128, + 1, 0, 228, 128, 1, 0, + 85, 160, 5, 0, 0, 3, + 2, 0, 3, 128, 1, 0, + 27, 128, 1, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 12, 128, 1, 0, 27, 128, + 2, 0, 0, 160, 2, 0, + 85, 160, 5, 0, 0, 3, + 3, 0, 3, 128, 1, 0, + 228, 128, 1, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 12, 128, 3, 0, 27, 128, + 2, 0, 228, 128, 1, 0, + 170, 160, 4, 0, 0, 4, + 1, 0, 12, 128, 1, 0, + 27, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 6, 0, + 0, 2, 4, 0, 1, 128, + 1, 0, 255, 128, 6, 0, + 0, 2, 4, 0, 2, 128, + 1, 0, 170, 128, 4, 0, + 0, 4, 0, 0, 12, 128, + 2, 0, 27, 128, 4, 0, + 27, 128, 0, 0, 228, 128, + 6, 0, 0, 2, 2, 0, + 1, 128, 0, 0, 0, 160, + 6, 0, 0, 2, 2, 0, + 2, 128, 0, 0, 85, 160, + 5, 0, 0, 3, 4, 0, + 3, 128, 0, 0, 27, 128, + 2, 0, 228, 128, 1, 0, + 0, 2, 5, 0, 1, 128, + 4, 0, 0, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 128, 1, 0, + 0, 160, 2, 0, 0, 3, + 0, 0, 3, 128, 0, 0, + 228, 128, 1, 0, 255, 160, + 5, 0, 0, 3, 0, 0, + 3, 128, 2, 0, 228, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 2, 0, 3, 128, + 2, 0, 228, 128, 0, 0, + 27, 128, 1, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 85, 128, 1, 0, 0, 2, + 6, 0, 1, 128, 5, 0, + 0, 128, 1, 0, 0, 2, + 7, 0, 2, 128, 5, 0, + 85, 128, 1, 0, 0, 2, + 8, 0, 1, 128, 2, 0, + 0, 128, 1, 0, 0, 2, + 7, 0, 1, 128, 0, 0, + 0, 128, 1, 0, 0, 2, + 9, 0, 1, 128, 7, 0, + 0, 128, 1, 0, 0, 2, + 8, 0, 2, 128, 4, 0, + 85, 128, 1, 0, 0, 2, + 10, 0, 1, 128, 8, 0, + 0, 128, 1, 0, 0, 2, + 9, 0, 2, 128, 8, 0, + 85, 128, 1, 0, 0, 2, + 10, 0, 2, 128, 0, 0, + 85, 128, 1, 0, 0, 2, + 6, 0, 2, 128, 10, 0, + 85, 128, 66, 0, 0, 3, + 5, 0, 15, 128, 5, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 2, 0, + 15, 128, 2, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 7, 0, 15, 128, + 7, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 4, 0, 15, 128, 4, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 8, 0, + 15, 128, 8, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 9, 0, 15, 128, + 9, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 6, 0, + 15, 128, 6, 0, 228, 128, + 0, 8, 228, 160, 5, 0, + 0, 3, 5, 0, 15, 128, + 1, 0, 255, 128, 5, 0, + 228, 128, 4, 0, 0, 4, + 3, 0, 12, 128, 1, 0, + 27, 128, 1, 0, 85, 161, + 1, 0, 170, 160, 4, 0, + 0, 4, 3, 0, 12, 128, + 1, 0, 27, 128, 3, 0, + 228, 128, 1, 0, 0, 160, + 5, 0, 0, 3, 3, 0, + 12, 128, 1, 0, 27, 128, + 3, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 3, 128, + 1, 0, 228, 128, 1, 0, + 85, 160, 1, 0, 0, 160, + 5, 0, 0, 3, 1, 0, + 3, 128, 1, 0, 228, 128, + 3, 0, 228, 128, 5, 0, + 0, 3, 5, 0, 15, 128, + 3, 0, 170, 128, 5, 0, + 228, 128, 5, 0, 0, 3, + 2, 0, 15, 128, 2, 0, + 228, 128, 3, 0, 255, 128, + 4, 0, 0, 4, 2, 0, + 15, 128, 2, 0, 228, 128, + 3, 0, 170, 128, 5, 0, + 228, 128, 5, 0, 0, 3, + 5, 0, 15, 128, 1, 0, + 0, 128, 7, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 15, 128, 5, 0, 228, 128, + 3, 0, 170, 128, 2, 0, + 228, 128, 5, 0, 0, 3, + 4, 0, 15, 128, 1, 0, + 255, 128, 4, 0, 228, 128, + 5, 0, 0, 3, 5, 0, + 15, 128, 1, 0, 0, 128, + 9, 0, 228, 128, 5, 0, + 0, 3, 7, 0, 15, 128, + 3, 0, 255, 128, 8, 0, + 228, 128, 4, 0, 0, 4, + 2, 0, 15, 128, 7, 0, + 228, 128, 1, 0, 170, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 2, 0, 15, 128, + 4, 0, 228, 128, 1, 0, + 170, 128, 2, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 15, 128, 5, 0, 228, 128, + 1, 0, 170, 128, 2, 0, + 228, 128, 5, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 128, 1, 0, 0, 128, + 66, 0, 0, 3, 4, 0, + 15, 128, 10, 0, 228, 128, + 0, 8, 228, 160, 5, 0, + 0, 3, 5, 0, 15, 128, + 1, 0, 255, 128, 6, 0, + 228, 128, 5, 0, 0, 3, + 3, 0, 15, 128, 3, 0, + 255, 128, 4, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 15, 128, 3, 0, 228, 128, + 1, 0, 85, 128, 2, 0, + 228, 128, 4, 0, 0, 4, + 2, 0, 15, 128, 5, 0, + 228, 128, 1, 0, 85, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 15, 128, + 0, 0, 228, 128, 1, 0, + 85, 128, 2, 0, 228, 128, + 1, 0, 0, 2, 0, 8, + 15, 128, 0, 0, 228, 128, + 255, 255, 0, 0 +}; + #endif From 58fea73c9b317d33f26ad836440e1c9d2fbd64c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 10:50:03 +0200 Subject: [PATCH 0345/1724] enable catmull rom shader --- inc/render_d3d9.h | 2 +- src/render_d3d9.c | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index d95aad6..d1c52a0 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -20,7 +20,7 @@ typedef struct D3D9RENDERER IDirect3DTexture9* surface_tex[D3D9_TEXTURE_COUNT]; IDirect3DTexture9* palette_tex[D3D9_TEXTURE_COUNT]; IDirect3DPixelShader9* pixel_shader; - IDirect3DPixelShader9* pixel_shader_bilinear; + IDirect3DPixelShader9* pixel_shader_upscale; float scale_w; float scale_h; int bits_per_pixel; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index ade0ae6..62d0296 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -201,10 +201,10 @@ BOOL d3d9_release_resources() g_d3d9.pixel_shader = NULL; } - if (g_d3d9.pixel_shader_bilinear) + if (g_d3d9.pixel_shader_upscale) { - IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_bilinear); - g_d3d9.pixel_shader_bilinear = NULL; + IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_upscale); + g_d3d9.pixel_shader_upscale = NULL; } for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) @@ -326,7 +326,14 @@ static BOOL d3d9_create_resources() IDirect3DDevice9_CreatePixelShader( g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER_BILINEAR, - &g_d3d9.pixel_shader_bilinear); + &g_d3d9.pixel_shader_upscale); + } + else + { + IDirect3DDevice9_CreatePixelShader( + g_d3d9.device, + (DWORD*)D3D9_CATMULL_ROM_SHADER, + &g_d3d9.pixel_shader_upscale); } return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err; @@ -346,13 +353,13 @@ static BOOL d3d9_set_states() BOOL bilinear = g_ddraw->d3d9linear && - g_d3d9.pixel_shader_bilinear && + g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); err = err || FAILED( IDirect3DDevice9_SetPixelShader( g_d3d9.device, - bilinear ? g_d3d9.pixel_shader_bilinear : g_d3d9.pixel_shader)); + bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader)); if (bilinear) { @@ -364,8 +371,15 @@ static BOOL d3d9_set_states() { if (g_ddraw->d3d9linear) { - IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + if (SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && + SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && + g_d3d9.pixel_shader_upscale && + (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && + SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + { + float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; + err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + } } } From 63e2e697639cefe7db281f5c83b72fb994b23063 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 05:12:49 +0200 Subject: [PATCH 0346/1724] update preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 949ed60..a9627b9 100644 --- a/src/config.c +++ b/src/config.c @@ -1004,7 +1004,7 @@ static void cfg_create_ini() "\n" "; Sim City 3000\n" "[SC3]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "minfps=-2\n" "\n" "; Shadow Watch\n" From 2154d13b147e73cf41a4042d69227eb8afb0b119 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 05:19:55 +0200 Subject: [PATCH 0347/1724] enable fpupreserve by default --- src/config.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index a9627b9..b0a1a20 100644 --- a/src/config.c +++ b/src/config.c @@ -357,10 +357,6 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected\n" "fixchilds=2\n" "\n" - "; Set the precision for Direct3D9 floating-point calculations to the precision used by the calling thread\n" - "; Note: Enable this if there are desyncs in online games\n" - "fpupreserve=false\n" - "\n" "\n" "; Undocumented settings\n" "d3d9_adapter=0\n" @@ -386,6 +382,7 @@ static void cfg_create_ini() "bpp=0\n" "rgb555=false\n" "hook_peekmessage=false\n" + "fpupreserve=true\n" "\n" "\n" "\n" From 63cb62f9e49a08fe11348ea3047acaacbf4e324b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 05:43:47 +0200 Subject: [PATCH 0348/1724] adjust preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index b0a1a20..d2231cf 100644 --- a/src/config.c +++ b/src/config.c @@ -902,7 +902,7 @@ static void cfg_create_ini() "\n" "; Mech Warrior 3\n" "[Mech3]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "nonexclusive=true\n" "\n" "; Moorhuhn\n" From 35d2f892bc12ba936cdac03bf299bf43a562bdbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 05:55:30 +0200 Subject: [PATCH 0349/1724] update presets --- src/config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index d2231cf..72cbc70 100644 --- a/src/config.c +++ b/src/config.c @@ -512,19 +512,19 @@ static void cfg_create_ini() "\n" "; Carmageddon\n" "[CARMA95]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "noactivateapp=true\n" "flipclear=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "noactivateapp=true\n" "flipclear=true\n" "\n" "; Carmageddon 2\n" "[Carma2_SW]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "noactivateapp=true\n" "\n" "; Captain Claw\n" From 61160de0a9de659f5c2dbd92c8658c5517a86c6e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 06:35:04 +0200 Subject: [PATCH 0350/1724] update presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 72cbc70..12a4dbd 100644 --- a/src/config.c +++ b/src/config.c @@ -484,7 +484,7 @@ static void cfg_create_ini() "\n" "; Amerzone\n" "[AMERZONE]\n" - "renderer=opengl\n" + "fpupreserve=true\n" "\n" "; Atlantis\n" "[ATLANTIS]\n" @@ -821,7 +821,7 @@ static void cfg_create_ini() "; Interstate 76\n" "[i76]\n" "adjmouse=true\n" - "renderer=opengl\n" + "fpupreserve=true\n" "\n" "; Infantry Online\n" "[infantry]\n" From 5fa01d8390e0e4cf98436b8b19d17a0e00fd0b95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 09:24:00 +0200 Subject: [PATCH 0351/1724] fix default setting --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 12a4dbd..395f42e 100644 --- a/src/config.c +++ b/src/config.c @@ -49,7 +49,7 @@ void cfg_load() g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); + g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", TRUE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); From 4ec4260f8e05a578419b1f300d4e0d815dd71952 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 20:13:49 +0200 Subject: [PATCH 0352/1724] new .ini setting "d3d9_filter" --- inc/dd.h | 6 +++++- src/config.c | 7 ++++--- src/render_d3d9.c | 5 +++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 76a1922..fff5e0e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -32,6 +32,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define RESLIST_MINI 1 #define RESLIST_FULL 2 +#define FILTER_NEAREST 0 +#define FILTER_LINEAR 1 +#define FILTER_CUBIC 2 + #define SDM_MODE_SET_BY_GAME 0x00000001l #define SDM_LEAVE_WINDOWED 0x00000002l #define SDM_LEAVE_FULLSCREEN 0x00000004l @@ -150,7 +154,7 @@ typedef struct CNCDDRAW BOOL flipclear; BOOL locktopleft; BOOL lock_surfaces; - BOOL d3d9linear; + int d3d9_filter; BOOL gdilinear; BOOL d3d9on12; int guard_lines; diff --git a/src/config.c b/src/config.c index 395f42e..22ff8d6 100644 --- a/src/config.c +++ b/src/config.c @@ -45,7 +45,7 @@ void cfg_load() g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); - g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); + g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); @@ -304,8 +304,9 @@ static void cfg_create_ini() "; Should the window be resizable by the user in windowed mode?\n" "resizable=true\n" "\n" - "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer\n" - "d3d9linear=true\n" + "; Upscaling filter for the direct3d9 renderer\n" + "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic (16/32bit color depth games only)\n" + "d3d9_filter=2\n" "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" "vhack=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 62d0296..63efb0a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -352,7 +352,7 @@ static BOOL d3d9_set_states() err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = - g_ddraw->d3d9linear && + g_ddraw->d3d9_filter && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); @@ -369,10 +369,11 @@ static BOOL d3d9_set_states() } else { - if (g_ddraw->d3d9linear) + if (g_ddraw->d3d9_filter) { if (SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && + g_ddraw->d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) From 53fc392f4e3ec751b88477a7300c9e00218cd692 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 23:01:19 +0200 Subject: [PATCH 0353/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 97d2f7c..3d73442 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ece4d8bdd47adac3bcea810344733e729350e531 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Jul 2023 18:04:06 +0200 Subject: [PATCH 0354/1724] add windowed check --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 30514a5..4a3a08b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -333,7 +333,7 @@ void util_toggle_fullscreen() if (g_ddraw->bnet_active) return; - if (g_ddraw->toggle_borderless) + if (g_ddraw->toggle_borderless && g_ddraw->windowed) { if (!g_ddraw->fullscreen) { From 8f362f3e25ee52cd86ad4f852afc61b001c048a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Jul 2023 18:04:39 +0200 Subject: [PATCH 0355/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 3d73442..ca758c0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 095eaaf8989038c0dc6a0ec0bcd63129ee4a8348 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jul 2023 05:46:41 +0200 Subject: [PATCH 0356/1724] add debug code --- src/opengl_utils.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 901383f..9342177 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -2,6 +2,7 @@ #include #include "opengl_utils.h" #include "dd.h" +#include "debug.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -281,6 +282,14 @@ GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { + /* + GLint len = 0; + glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); + char* log = calloc(len + 50, 1); + glGetShaderInfoLog(frag_shader, len, &len, &log[0]); + TRACE("| GL_LOG: %s\n", log); + free(log); + */ if (glDeleteShader) { glDeleteShader(frag_shader); From 993ecf92c7a977f7cd36d0a9c232c1f390ec9074 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jul 2023 07:53:09 +0200 Subject: [PATCH 0357/1724] modify Catmull-Rom shader to use 5 taps --- inc/d3d9shader.h | 554 ++++++++++++++++++++++------------------------- 1 file changed, 262 insertions(+), 292 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 28b3668..ea38c66 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -371,72 +371,62 @@ const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = mad r0.xy, t0, c0, r0.w frc r0.zw, r0.wzyx add r0.xy, -r0.wzyx, r0 - add r0.zw, r0.wzyx, c1.y - mad r1.xy, t0, c0, -r0.wzyx - mad r1.zw, r1.wzyx, -c2.x, c2.z - mad r1.zw, r1.wzyx, r1, c1.y - mul r2.xy, r1.wzyx, r1 - mad r2.zw, r1.wzyx, c2.x, c2.y - mul r3.xy, r1, r1 - mad r2.zw, r3.wzyx, r2, c1.z - mad r1.zw, r1.wzyx, r1, r2 - rcp r4.x, r1.w - rcp r4.y, r1.z - mad r0.zw, r2.wzyx, r4.wzyx, r0 - rcp r2.x, c0.x - rcp r2.y, c0.y - mul r4.xy, r0.wzyx, r2 - mov r5.x, r4.x add r0.zw, r0.wzyx, c1.x + rcp r1.x, c0.x + rcp r1.y, c0.y + mul r2.xy, r0.wzyx, r1 + mov r3.x, r2.x + add r0.zw, r0.wzyx, c1.y add r0.xy, r0, c1.w - mul r0.xy, r2, r0 - mul r2.xy, r2, r0.wzyx - mov r5.y, r2.y - mov r6.x, r5.x - mov r7.y, r5.y - mov r8.x, r2.x - mov r7.x, r0.x - mov r9.x, r7.x - mov r8.y, r4.y - mov r10.x, r8.x - mov r9.y, r8.y - mov r10.y, r0.y - mov r6.y, r10.y + mul r0.xy, r1, r0 + mad r1.zw, t0.wzyx, c0.wzyx, -r0 + mad r2.zw, r1, -c2.x, c2.z + mad r2.zw, r1, r2, c1.y + mul r3.zw, r1, r2 + mad r4.xy, r1.wzyx, c2.x, c2.y + mul r4.zw, r1, r1 + mad r4.xy, r4.wzyx, r4, c1.z + mad r2.zw, r1, r2, r4.wzyx + rcp r4.x, r2.w + rcp r4.y, r2.z + mad r0.zw, r3, r4.wzyx, r0 + mul r1.xy, r1, r0.wzyx + mov r3.y, r1.y + mov r4.y, r3.y + mov r2.x, r1.x + mov r5.x, r2.x + mov r4.x, r0.x + mov r5.y, r0.y + texld r0, r3, s0 + texld r3, r1, s0 + texld r6, r2, s0 texld r5, r5, s0 - texld r2, r2, s0 - texld r7, r7, s0 - texld r4, r4, s0 - texld r8, r8, s0 - texld r9, r9, s0 - texld r0, r0, s0 - texld r6, r6, s0 - mul r5, r1.w, r5 - mad r3.zw, r1.wzyx, -c1.y, c1.z - mad r3.zw, r1.wzyx, r3, c1.x - mul r3.zw, r1.wzyx, r3 - mad r1.xy, r1, c1.y, c1.x - mul r1.xy, r1, r3 - mul r5, r3.z, r5 - mul r2, r2, r3.w - mad r2, r2, r3.z, r5 - mul r5, r1.x, r7 - mad r2, r5, r3.z, r2 - mul r4, r1.w, r4 - mul r5, r1.x, r9 - mul r7, r3.w, r8 - mad r2, r7, r1.z, r2 - mad r2, r4, r1.z, r2 - mad r2, r5, r1.z, r2 + texld r7, r4, s0 + mad r1.xy, r1.wzyx, -c1.y, c1.z + mad r1.xy, r1.wzyx, r1, c1.x + mul r1.xy, r1, r1.wzyx + mad r1.zw, r1, c1.y, c1.x + mul r1.zw, r1, r4 + mul r0, r0, r1.x + mul r0, r2.z, r0 + mul r3, r2.w, r3 + mul r4, r2.w, r6 + mad r0, r4, r1.y, r0 + mad r0, r3, r2.z, r0 + mul r3, r2.w, r5 + mul r4, r1.w, r7 + mad r0, r4, r2.z, r0 + mad r0, r3, r1.z, r0 + mul r1.x, r2.z, r1.x + mad r1.x, r2.w, r1.y, r1.x + mad r1.x, r2.w, r2.z, r1.x + mad r1.x, r1.w, r2.z, r1.x + mad r1.x, r2.w, r1.z, r1.x + rcp r1.x, r1.x mul r0, r0, r1.x - texld r4, r10, s0 - mul r5, r1.w, r6 - mul r3, r3.w, r4 - mad r2, r3, r1.y, r2 - mad r2, r5, r1.y, r2 - mad r0, r0, r1.y, r2 mov oC0, r0 -// approximately 68 instruction slots used (9 texture, 59 arithmetic) +// approximately 58 instruction slots used (5 texture, 53 arithmetic) // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* @@ -451,6 +441,8 @@ float4 catmull_rom(float2 coord) // Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. // See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details + // Modified to use 5 texture fetches + float2 samplePos = coord * TextureSize.xy; float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; @@ -473,19 +465,21 @@ float4 catmull_rom(float2 coord) texPos12 /= TextureSize.xy; float4 result = 0.0f; - result += tex2D(SurfaceTex, float2(texPos0.x, texPos0.y)) * w0.x * w0.y; + //result += tex2D(SurfaceTex, float2(texPos0.x, texPos0.y)) * w0.x * w0.y; result += tex2D(SurfaceTex, float2(texPos12.x, texPos0.y)) * w12.x * w0.y; - result += tex2D(SurfaceTex, float2(texPos3.x, texPos0.y)) * w3.x * w0.y; + //result += tex2D(SurfaceTex, float2(texPos3.x, texPos0.y)) * w3.x * w0.y; result += tex2D(SurfaceTex, float2(texPos0.x, texPos12.y)) * w0.x * w12.y; result += tex2D(SurfaceTex, float2(texPos12.x, texPos12.y)) * w12.x * w12.y; result += tex2D(SurfaceTex, float2(texPos3.x, texPos12.y)) * w3.x * w12.y; - result += tex2D(SurfaceTex, float2(texPos0.x, texPos3.y)) * w0.x * w3.y; + //result += tex2D(SurfaceTex, float2(texPos0.x, texPos3.y)) * w0.x * w3.y; result += tex2D(SurfaceTex, float2(texPos12.x, texPos3.y)) * w12.x * w3.y; - result += tex2D(SurfaceTex, float2(texPos3.x, texPos3.y)) * w3.x * w3.y; + //result += tex2D(SurfaceTex, float2(texPos3.x, texPos3.y)) * w3.x * w3.y; - return result; + float wm = 1./((w12.x * w0.y)+(w0.x * w12.y)+(w12.x * w12.y)+(w3.x * w12.y)+(w12.x * w3.y)); + + return result * wm; } float4 main(float2 texCoords : TEXCOORD) : COLOR @@ -497,232 +491,208 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR #endif const BYTE D3D9_CATMULL_ROM_SHADER[] = -{ - 0, 2, 255, 255, 254, 255, - 44, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 131, 0, - 0, 0, 0, 2, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 124, 0, 0, 0, 68, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 2, 0, - 108, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 191, 0, 0, - 0, 63, 0, 0, 128, 63, - 0, 0, 32, 64, 81, 0, - 0, 5, 2, 0, 15, 160, - 0, 0, 192, 63, 0, 0, - 32, 192, 0, 0, 0, 64, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 8, 128, - 1, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 176, 0, 0, - 228, 160, 0, 0, 255, 128, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 27, 128, - 2, 0, 0, 3, 0, 0, - 3, 128, 0, 0, 27, 129, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 128, 1, 0, - 85, 160, 4, 0, 0, 4, - 1, 0, 3, 128, 0, 0, - 228, 176, 0, 0, 228, 160, - 0, 0, 27, 129, 4, 0, - 0, 4, 1, 0, 12, 128, - 1, 0, 27, 128, 2, 0, - 0, 161, 2, 0, 170, 160, - 4, 0, 0, 4, 1, 0, - 12, 128, 1, 0, 27, 128, - 1, 0, 228, 128, 1, 0, - 85, 160, 5, 0, 0, 3, - 2, 0, 3, 128, 1, 0, - 27, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 12, 128, 1, 0, 27, 128, - 2, 0, 0, 160, 2, 0, - 85, 160, 5, 0, 0, 3, - 3, 0, 3, 128, 1, 0, - 228, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 12, 128, 3, 0, 27, 128, - 2, 0, 228, 128, 1, 0, - 170, 160, 4, 0, 0, 4, - 1, 0, 12, 128, 1, 0, - 27, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 6, 0, - 0, 2, 4, 0, 1, 128, - 1, 0, 255, 128, 6, 0, - 0, 2, 4, 0, 2, 128, - 1, 0, 170, 128, 4, 0, - 0, 4, 0, 0, 12, 128, - 2, 0, 27, 128, 4, 0, - 27, 128, 0, 0, 228, 128, - 6, 0, 0, 2, 2, 0, - 1, 128, 0, 0, 0, 160, - 6, 0, 0, 2, 2, 0, - 2, 128, 0, 0, 85, 160, - 5, 0, 0, 3, 4, 0, - 3, 128, 0, 0, 27, 128, - 2, 0, 228, 128, 1, 0, - 0, 2, 5, 0, 1, 128, - 4, 0, 0, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 128, 1, 0, - 0, 160, 2, 0, 0, 3, - 0, 0, 3, 128, 0, 0, - 228, 128, 1, 0, 255, 160, - 5, 0, 0, 3, 0, 0, - 3, 128, 2, 0, 228, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 2, 0, 3, 128, - 2, 0, 228, 128, 0, 0, - 27, 128, 1, 0, 0, 2, - 5, 0, 2, 128, 2, 0, - 85, 128, 1, 0, 0, 2, - 6, 0, 1, 128, 5, 0, - 0, 128, 1, 0, 0, 2, - 7, 0, 2, 128, 5, 0, - 85, 128, 1, 0, 0, 2, - 8, 0, 1, 128, 2, 0, - 0, 128, 1, 0, 0, 2, - 7, 0, 1, 128, 0, 0, - 0, 128, 1, 0, 0, 2, - 9, 0, 1, 128, 7, 0, - 0, 128, 1, 0, 0, 2, - 8, 0, 2, 128, 4, 0, - 85, 128, 1, 0, 0, 2, - 10, 0, 1, 128, 8, 0, - 0, 128, 1, 0, 0, 2, - 9, 0, 2, 128, 8, 0, - 85, 128, 1, 0, 0, 2, - 10, 0, 2, 128, 0, 0, - 85, 128, 1, 0, 0, 2, - 6, 0, 2, 128, 10, 0, - 85, 128, 66, 0, 0, 3, - 5, 0, 15, 128, 5, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 2, 0, - 15, 128, 2, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 7, 0, 15, 128, - 7, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 4, 0, 15, 128, 4, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 8, 0, - 15, 128, 8, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 9, 0, 15, 128, - 9, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 6, 0, - 15, 128, 6, 0, 228, 128, - 0, 8, 228, 160, 5, 0, - 0, 3, 5, 0, 15, 128, - 1, 0, 255, 128, 5, 0, - 228, 128, 4, 0, 0, 4, - 3, 0, 12, 128, 1, 0, - 27, 128, 1, 0, 85, 161, - 1, 0, 170, 160, 4, 0, - 0, 4, 3, 0, 12, 128, - 1, 0, 27, 128, 3, 0, - 228, 128, 1, 0, 0, 160, - 5, 0, 0, 3, 3, 0, - 12, 128, 1, 0, 27, 128, - 3, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 3, 128, - 1, 0, 228, 128, 1, 0, - 85, 160, 1, 0, 0, 160, - 5, 0, 0, 3, 1, 0, - 3, 128, 1, 0, 228, 128, - 3, 0, 228, 128, 5, 0, - 0, 3, 5, 0, 15, 128, - 3, 0, 170, 128, 5, 0, - 228, 128, 5, 0, 0, 3, - 2, 0, 15, 128, 2, 0, - 228, 128, 3, 0, 255, 128, - 4, 0, 0, 4, 2, 0, - 15, 128, 2, 0, 228, 128, - 3, 0, 170, 128, 5, 0, - 228, 128, 5, 0, 0, 3, - 5, 0, 15, 128, 1, 0, - 0, 128, 7, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 15, 128, 5, 0, 228, 128, - 3, 0, 170, 128, 2, 0, - 228, 128, 5, 0, 0, 3, - 4, 0, 15, 128, 1, 0, - 255, 128, 4, 0, 228, 128, - 5, 0, 0, 3, 5, 0, - 15, 128, 1, 0, 0, 128, - 9, 0, 228, 128, 5, 0, - 0, 3, 7, 0, 15, 128, - 3, 0, 255, 128, 8, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 15, 128, 7, 0, - 228, 128, 1, 0, 170, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 2, 0, 15, 128, - 4, 0, 228, 128, 1, 0, - 170, 128, 2, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 15, 128, 5, 0, 228, 128, - 1, 0, 170, 128, 2, 0, - 228, 128, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 1, 0, 0, 128, - 66, 0, 0, 3, 4, 0, - 15, 128, 10, 0, 228, 128, - 0, 8, 228, 160, 5, 0, - 0, 3, 5, 0, 15, 128, - 1, 0, 255, 128, 6, 0, - 228, 128, 5, 0, 0, 3, - 3, 0, 15, 128, 3, 0, - 255, 128, 4, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 15, 128, 3, 0, 228, 128, - 1, 0, 85, 128, 2, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 15, 128, 5, 0, - 228, 128, 1, 0, 85, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 0, 0, 228, 128, 1, 0, - 85, 128, 2, 0, 228, 128, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0 -}; + { + 0, 2, 255, 255, 254, 255, + 44, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 131, 0, + 0, 0, 0, 2, 255, 255, + 2, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 124, 0, 0, 0, 68, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 2, 0, + 108, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 191, 0, 0, + 0, 63, 0, 0, 128, 63, + 0, 0, 32, 64, 81, 0, + 0, 5, 2, 0, 15, 160, + 0, 0, 192, 63, 0, 0, + 32, 192, 0, 0, 0, 64, + 0, 0, 0, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 8, 128, + 1, 0, 0, 160, 4, 0, + 0, 4, 0, 0, 3, 128, + 0, 0, 228, 176, 0, 0, + 228, 160, 0, 0, 255, 128, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 27, 128, + 2, 0, 0, 3, 0, 0, + 3, 128, 0, 0, 27, 129, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 128, 1, 0, + 0, 160, 6, 0, 0, 2, + 1, 0, 1, 128, 0, 0, + 0, 160, 6, 0, 0, 2, + 1, 0, 2, 128, 0, 0, + 85, 160, 5, 0, 0, 3, + 2, 0, 3, 128, 0, 0, + 27, 128, 1, 0, 228, 128, + 1, 0, 0, 2, 3, 0, + 1, 128, 2, 0, 0, 128, + 2, 0, 0, 3, 0, 0, + 12, 128, 0, 0, 27, 128, + 1, 0, 85, 160, 2, 0, + 0, 3, 0, 0, 3, 128, + 0, 0, 228, 128, 1, 0, + 255, 160, 5, 0, 0, 3, + 0, 0, 3, 128, 1, 0, + 228, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 1, 0, + 12, 128, 0, 0, 27, 176, + 0, 0, 27, 160, 0, 0, + 228, 129, 4, 0, 0, 4, + 2, 0, 12, 128, 1, 0, + 228, 128, 2, 0, 0, 161, + 2, 0, 170, 160, 4, 0, + 0, 4, 2, 0, 12, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 1, 0, 85, 160, + 5, 0, 0, 3, 3, 0, + 12, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 4, 0, 3, 128, + 1, 0, 27, 128, 2, 0, + 0, 160, 2, 0, 85, 160, + 5, 0, 0, 3, 4, 0, + 12, 128, 1, 0, 228, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 4, 0, 3, 128, + 4, 0, 27, 128, 4, 0, + 228, 128, 1, 0, 170, 160, + 4, 0, 0, 4, 2, 0, + 12, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 4, 0, + 27, 128, 6, 0, 0, 2, + 4, 0, 1, 128, 2, 0, + 255, 128, 6, 0, 0, 2, + 4, 0, 2, 128, 2, 0, + 170, 128, 4, 0, 0, 4, + 0, 0, 12, 128, 3, 0, + 228, 128, 4, 0, 27, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 3, 128, + 1, 0, 228, 128, 0, 0, + 27, 128, 1, 0, 0, 2, + 3, 0, 2, 128, 1, 0, + 85, 128, 1, 0, 0, 2, + 4, 0, 2, 128, 3, 0, + 85, 128, 1, 0, 0, 2, + 2, 0, 1, 128, 1, 0, + 0, 128, 1, 0, 0, 2, + 5, 0, 1, 128, 2, 0, + 0, 128, 1, 0, 0, 2, + 4, 0, 1, 128, 0, 0, + 0, 128, 1, 0, 0, 2, + 5, 0, 2, 128, 0, 0, + 85, 128, 66, 0, 0, 3, + 0, 0, 15, 128, 3, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 3, 0, + 15, 128, 1, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 6, 0, 15, 128, + 2, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 5, 0, 15, 128, 5, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 7, 0, + 15, 128, 4, 0, 228, 128, + 0, 8, 228, 160, 4, 0, + 0, 4, 1, 0, 3, 128, + 1, 0, 27, 128, 1, 0, + 85, 161, 1, 0, 170, 160, + 4, 0, 0, 4, 1, 0, + 3, 128, 1, 0, 27, 128, + 1, 0, 228, 128, 1, 0, + 0, 160, 5, 0, 0, 3, + 1, 0, 3, 128, 1, 0, + 228, 128, 1, 0, 27, 128, + 4, 0, 0, 4, 1, 0, + 12, 128, 1, 0, 228, 128, + 1, 0, 85, 160, 1, 0, + 0, 160, 5, 0, 0, 3, + 1, 0, 12, 128, 1, 0, + 228, 128, 4, 0, 228, 128, + 5, 0, 0, 3, 0, 0, + 15, 128, 0, 0, 228, 128, + 1, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 15, 128, + 2, 0, 170, 128, 0, 0, + 228, 128, 5, 0, 0, 3, + 3, 0, 15, 128, 2, 0, + 255, 128, 3, 0, 228, 128, + 5, 0, 0, 3, 4, 0, + 15, 128, 2, 0, 255, 128, + 6, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 15, 128, + 4, 0, 228, 128, 1, 0, + 85, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 15, 128, 3, 0, 228, 128, + 2, 0, 170, 128, 0, 0, + 228, 128, 5, 0, 0, 3, + 3, 0, 15, 128, 2, 0, + 255, 128, 5, 0, 228, 128, + 5, 0, 0, 3, 4, 0, + 15, 128, 1, 0, 255, 128, + 7, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 15, 128, + 4, 0, 228, 128, 2, 0, + 170, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 15, 128, 3, 0, 228, 128, + 1, 0, 170, 128, 0, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 1, 128, 2, 0, + 170, 128, 1, 0, 0, 128, + 4, 0, 0, 4, 1, 0, + 1, 128, 2, 0, 255, 128, + 1, 0, 85, 128, 1, 0, + 0, 128, 4, 0, 0, 4, + 1, 0, 1, 128, 2, 0, + 255, 128, 2, 0, 170, 128, + 1, 0, 0, 128, 4, 0, + 0, 4, 1, 0, 1, 128, + 1, 0, 255, 128, 2, 0, + 170, 128, 1, 0, 0, 128, + 4, 0, 0, 4, 1, 0, + 1, 128, 2, 0, 255, 128, + 1, 0, 170, 128, 1, 0, + 0, 128, 6, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 128, 1, 0, 0, 128, + 1, 0, 0, 2, 0, 8, + 15, 128, 0, 0, 228, 128, + 255, 255, 0, 0 + }; #endif From ed642b8c7ead5080f74393b8d4a2843ba2ba403c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jul 2023 18:49:13 +0200 Subject: [PATCH 0358/1724] optimize shader --- inc/d3d9shader.h | 462 +++++++++++++++++++++++------------------------ 1 file changed, 231 insertions(+), 231 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index ea38c66..71575b8 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -407,23 +407,23 @@ const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = mul r1.xy, r1, r1.wzyx mad r1.zw, r1, c1.y, c1.x mul r1.zw, r1, r4 - mul r0, r0, r1.x - mul r0, r2.z, r0 - mul r3, r2.w, r3 - mul r4, r2.w, r6 - mad r0, r4, r1.y, r0 - mad r0, r3, r2.z, r0 - mul r3, r2.w, r5 - mul r4, r1.w, r7 - mad r0, r4, r2.z, r0 - mad r0, r3, r1.z, r0 - mul r1.x, r2.z, r1.x - mad r1.x, r2.w, r1.y, r1.x - mad r1.x, r2.w, r2.z, r1.x - mad r1.x, r1.w, r2.z, r1.x - mad r1.x, r2.w, r1.z, r1.x - rcp r1.x, r1.x - mul r0, r0, r1.x + mul r0.w, r2.z, r1.x + mul r0.xyz, r0.w, r0 + mad r0.w, r2.w, r1.y, r0.w + mul r3.w, r1.y, r2.w + mad r0.w, r2.w, r2.z, r0.w + mad r0.w, r1.w, r2.z, r0.w + mad r0.w, r2.w, r1.z, r0.w + rcp r0.w, r0.w + mad r0.xyz, r6, r3.w, r0 + mul r3.w, r2.z, r2.w + mad r0.xyz, r3, r3.w, r0 + mul r5.w, r2.z, r1.w + mul r7.w, r1.z, r2.w + mad r0.xyz, r7, r5.w, r0 + mad r0.xyz, r5, r7.w, r0 + mul r0.xyz, r0.w, r0 + mov r0.w, c1.z mov oC0, r0 // approximately 58 instruction slots used (5 texture, 53 arithmetic) @@ -464,22 +464,21 @@ float4 catmull_rom(float2 coord) texPos3 /= TextureSize.xy; texPos12 /= TextureSize.xy; - float4 result = 0.0f; - //result += tex2D(SurfaceTex, float2(texPos0.x, texPos0.y)) * w0.x * w0.y; - result += tex2D(SurfaceTex, float2(texPos12.x, texPos0.y)) * w12.x * w0.y; - //result += tex2D(SurfaceTex, float2(texPos3.x, texPos0.y)) * w3.x * w0.y; + float wtm = w12.x * w0.y; + float wml = w0.x * w12.y; + float wmm = w12.x * w12.y; + float wmr = w3.x * w12.y; + float wbm = w12.x * w3.y; - result += tex2D(SurfaceTex, float2(texPos0.x, texPos12.y)) * w0.x * w12.y; - result += tex2D(SurfaceTex, float2(texPos12.x, texPos12.y)) * w12.x * w12.y; - result += tex2D(SurfaceTex, float2(texPos3.x, texPos12.y)) * w3.x * w12.y; + float3 result = 0.0f; - //result += tex2D(SurfaceTex, float2(texPos0.x, texPos3.y)) * w0.x * w3.y; - result += tex2D(SurfaceTex, float2(texPos12.x, texPos3.y)) * w12.x * w3.y; - //result += tex2D(SurfaceTex, float2(texPos3.x, texPos3.y)) * w3.x * w3.y; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos0.y)).rgb * wtm; + result += tex2D(SurfaceTex, float2(texPos0.x, texPos12.y)).rgb * wml; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos12.y)).rgb * wmm; + result += tex2D(SurfaceTex, float2(texPos3.x, texPos12.y)).rgb * wmr; + result += tex2D(SurfaceTex, float2(texPos12.x, texPos3.y)).rgb * wbm; - float wm = 1./((w12.x * w0.y)+(w0.x * w12.y)+(w12.x * w12.y)+(w3.x * w12.y)+(w12.x * w3.y)); - - return result * wm; + return float4(result * (1./(wtm+wml+wmm+wmr+wbm)), 1.0); } float4 main(float2 texCoords : TEXCOORD) : COLOR @@ -492,207 +491,208 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR const BYTE D3D9_CATMULL_ROM_SHADER[] = { - 0, 2, 255, 255, 254, 255, - 44, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 131, 0, - 0, 0, 0, 2, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 124, 0, 0, 0, 68, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 2, 0, - 108, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 191, 0, 0, - 0, 63, 0, 0, 128, 63, - 0, 0, 32, 64, 81, 0, - 0, 5, 2, 0, 15, 160, - 0, 0, 192, 63, 0, 0, - 32, 192, 0, 0, 0, 64, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 8, 128, - 1, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 176, 0, 0, - 228, 160, 0, 0, 255, 128, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 27, 128, - 2, 0, 0, 3, 0, 0, - 3, 128, 0, 0, 27, 129, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 128, 1, 0, - 0, 160, 6, 0, 0, 2, - 1, 0, 1, 128, 0, 0, - 0, 160, 6, 0, 0, 2, - 1, 0, 2, 128, 0, 0, - 85, 160, 5, 0, 0, 3, - 2, 0, 3, 128, 0, 0, - 27, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 3, 0, - 1, 128, 2, 0, 0, 128, - 2, 0, 0, 3, 0, 0, - 12, 128, 0, 0, 27, 128, - 1, 0, 85, 160, 2, 0, - 0, 3, 0, 0, 3, 128, - 0, 0, 228, 128, 1, 0, - 255, 160, 5, 0, 0, 3, - 0, 0, 3, 128, 1, 0, - 228, 128, 0, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 12, 128, 0, 0, 27, 176, - 0, 0, 27, 160, 0, 0, - 228, 129, 4, 0, 0, 4, - 2, 0, 12, 128, 1, 0, - 228, 128, 2, 0, 0, 161, - 2, 0, 170, 160, 4, 0, - 0, 4, 2, 0, 12, 128, - 1, 0, 228, 128, 2, 0, - 228, 128, 1, 0, 85, 160, - 5, 0, 0, 3, 3, 0, - 12, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 4, 0, 3, 128, - 1, 0, 27, 128, 2, 0, - 0, 160, 2, 0, 85, 160, - 5, 0, 0, 3, 4, 0, - 12, 128, 1, 0, 228, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 4, 0, 3, 128, - 4, 0, 27, 128, 4, 0, - 228, 128, 1, 0, 170, 160, - 4, 0, 0, 4, 2, 0, - 12, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 4, 0, - 27, 128, 6, 0, 0, 2, - 4, 0, 1, 128, 2, 0, - 255, 128, 6, 0, 0, 2, - 4, 0, 2, 128, 2, 0, - 170, 128, 4, 0, 0, 4, - 0, 0, 12, 128, 3, 0, - 228, 128, 4, 0, 27, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 3, 128, - 1, 0, 228, 128, 0, 0, - 27, 128, 1, 0, 0, 2, - 3, 0, 2, 128, 1, 0, - 85, 128, 1, 0, 0, 2, - 4, 0, 2, 128, 3, 0, - 85, 128, 1, 0, 0, 2, - 2, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 0, 2, - 5, 0, 1, 128, 2, 0, - 0, 128, 1, 0, 0, 2, - 4, 0, 1, 128, 0, 0, - 0, 128, 1, 0, 0, 2, - 5, 0, 2, 128, 0, 0, - 85, 128, 66, 0, 0, 3, - 0, 0, 15, 128, 3, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 3, 0, - 15, 128, 1, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 6, 0, 15, 128, - 2, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 5, 0, 15, 128, 5, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 7, 0, - 15, 128, 4, 0, 228, 128, - 0, 8, 228, 160, 4, 0, - 0, 4, 1, 0, 3, 128, - 1, 0, 27, 128, 1, 0, - 85, 161, 1, 0, 170, 160, - 4, 0, 0, 4, 1, 0, - 3, 128, 1, 0, 27, 128, - 1, 0, 228, 128, 1, 0, - 0, 160, 5, 0, 0, 3, - 1, 0, 3, 128, 1, 0, - 228, 128, 1, 0, 27, 128, - 4, 0, 0, 4, 1, 0, - 12, 128, 1, 0, 228, 128, - 1, 0, 85, 160, 1, 0, - 0, 160, 5, 0, 0, 3, - 1, 0, 12, 128, 1, 0, - 228, 128, 4, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 1, 0, 0, 128, 5, 0, - 0, 3, 0, 0, 15, 128, - 2, 0, 170, 128, 0, 0, - 228, 128, 5, 0, 0, 3, - 3, 0, 15, 128, 2, 0, - 255, 128, 3, 0, 228, 128, - 5, 0, 0, 3, 4, 0, - 15, 128, 2, 0, 255, 128, - 6, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 4, 0, 228, 128, 1, 0, - 85, 128, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 128, - 2, 0, 170, 128, 0, 0, - 228, 128, 5, 0, 0, 3, - 3, 0, 15, 128, 2, 0, - 255, 128, 5, 0, 228, 128, - 5, 0, 0, 3, 4, 0, - 15, 128, 1, 0, 255, 128, - 7, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 4, 0, 228, 128, 2, 0, - 170, 128, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 128, - 1, 0, 170, 128, 0, 0, - 228, 128, 5, 0, 0, 3, - 1, 0, 1, 128, 2, 0, - 170, 128, 1, 0, 0, 128, - 4, 0, 0, 4, 1, 0, - 1, 128, 2, 0, 255, 128, - 1, 0, 85, 128, 1, 0, - 0, 128, 4, 0, 0, 4, - 1, 0, 1, 128, 2, 0, - 255, 128, 2, 0, 170, 128, - 1, 0, 0, 128, 4, 0, - 0, 4, 1, 0, 1, 128, - 1, 0, 255, 128, 2, 0, - 170, 128, 1, 0, 0, 128, - 4, 0, 0, 4, 1, 0, - 1, 128, 2, 0, 255, 128, - 1, 0, 170, 128, 1, 0, - 0, 128, 6, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 1, 0, 0, 128, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0 + 0, 2, 255, 255, 254, 255, + 44, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 131, 0, + 0, 0, 0, 2, 255, 255, + 2, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 124, 0, 0, 0, 68, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 2, 0, + 108, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 191, 0, 0, + 0, 63, 0, 0, 128, 63, + 0, 0, 32, 64, 81, 0, + 0, 5, 2, 0, 15, 160, + 0, 0, 192, 63, 0, 0, + 32, 192, 0, 0, 0, 64, + 0, 0, 0, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 8, 128, + 1, 0, 0, 160, 4, 0, + 0, 4, 0, 0, 3, 128, + 0, 0, 228, 176, 0, 0, + 228, 160, 0, 0, 255, 128, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 27, 128, + 2, 0, 0, 3, 0, 0, + 3, 128, 0, 0, 27, 129, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 128, 1, 0, + 0, 160, 6, 0, 0, 2, + 1, 0, 1, 128, 0, 0, + 0, 160, 6, 0, 0, 2, + 1, 0, 2, 128, 0, 0, + 85, 160, 5, 0, 0, 3, + 2, 0, 3, 128, 0, 0, + 27, 128, 1, 0, 228, 128, + 1, 0, 0, 2, 3, 0, + 1, 128, 2, 0, 0, 128, + 2, 0, 0, 3, 0, 0, + 12, 128, 0, 0, 27, 128, + 1, 0, 85, 160, 2, 0, + 0, 3, 0, 0, 3, 128, + 0, 0, 228, 128, 1, 0, + 255, 160, 5, 0, 0, 3, + 0, 0, 3, 128, 1, 0, + 228, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 1, 0, + 12, 128, 0, 0, 27, 176, + 0, 0, 27, 160, 0, 0, + 228, 129, 4, 0, 0, 4, + 2, 0, 12, 128, 1, 0, + 228, 128, 2, 0, 0, 161, + 2, 0, 170, 160, 4, 0, + 0, 4, 2, 0, 12, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 1, 0, 85, 160, + 5, 0, 0, 3, 3, 0, + 12, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 4, 0, 3, 128, + 1, 0, 27, 128, 2, 0, + 0, 160, 2, 0, 85, 160, + 5, 0, 0, 3, 4, 0, + 12, 128, 1, 0, 228, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 4, 0, 3, 128, + 4, 0, 27, 128, 4, 0, + 228, 128, 1, 0, 170, 160, + 4, 0, 0, 4, 2, 0, + 12, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 4, 0, + 27, 128, 6, 0, 0, 2, + 4, 0, 1, 128, 2, 0, + 255, 128, 6, 0, 0, 2, + 4, 0, 2, 128, 2, 0, + 170, 128, 4, 0, 0, 4, + 0, 0, 12, 128, 3, 0, + 228, 128, 4, 0, 27, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 3, 128, + 1, 0, 228, 128, 0, 0, + 27, 128, 1, 0, 0, 2, + 3, 0, 2, 128, 1, 0, + 85, 128, 1, 0, 0, 2, + 4, 0, 2, 128, 3, 0, + 85, 128, 1, 0, 0, 2, + 2, 0, 1, 128, 1, 0, + 0, 128, 1, 0, 0, 2, + 5, 0, 1, 128, 2, 0, + 0, 128, 1, 0, 0, 2, + 4, 0, 1, 128, 0, 0, + 0, 128, 1, 0, 0, 2, + 5, 0, 2, 128, 0, 0, + 85, 128, 66, 0, 0, 3, + 0, 0, 15, 128, 3, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 3, 0, + 15, 128, 1, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 6, 0, 15, 128, + 2, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 5, 0, 15, 128, 5, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 7, 0, + 15, 128, 4, 0, 228, 128, + 0, 8, 228, 160, 4, 0, + 0, 4, 1, 0, 3, 128, + 1, 0, 27, 128, 1, 0, + 85, 161, 1, 0, 170, 160, + 4, 0, 0, 4, 1, 0, + 3, 128, 1, 0, 27, 128, + 1, 0, 228, 128, 1, 0, + 0, 160, 5, 0, 0, 3, + 1, 0, 3, 128, 1, 0, + 228, 128, 1, 0, 27, 128, + 4, 0, 0, 4, 1, 0, + 12, 128, 1, 0, 228, 128, + 1, 0, 85, 160, 1, 0, + 0, 160, 5, 0, 0, 3, + 1, 0, 12, 128, 1, 0, + 228, 128, 4, 0, 228, 128, + 5, 0, 0, 3, 0, 0, + 8, 128, 2, 0, 170, 128, + 1, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 255, 128, 0, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 8, 128, 2, 0, + 255, 128, 1, 0, 85, 128, + 0, 0, 255, 128, 5, 0, + 0, 3, 3, 0, 8, 128, + 1, 0, 85, 128, 2, 0, + 255, 128, 4, 0, 0, 4, + 0, 0, 8, 128, 2, 0, + 255, 128, 2, 0, 170, 128, + 0, 0, 255, 128, 4, 0, + 0, 4, 0, 0, 8, 128, + 1, 0, 255, 128, 2, 0, + 170, 128, 0, 0, 255, 128, + 4, 0, 0, 4, 0, 0, + 8, 128, 2, 0, 255, 128, + 1, 0, 170, 128, 0, 0, + 255, 128, 6, 0, 0, 2, + 0, 0, 8, 128, 0, 0, + 255, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 6, 0, + 228, 128, 3, 0, 255, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 3, 0, 8, 128, + 2, 0, 170, 128, 2, 0, + 255, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 3, 0, + 228, 128, 3, 0, 255, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 5, 0, 8, 128, + 2, 0, 170, 128, 1, 0, + 255, 128, 5, 0, 0, 3, + 7, 0, 8, 128, 1, 0, + 170, 128, 2, 0, 255, 128, + 4, 0, 0, 4, 0, 0, + 7, 128, 7, 0, 228, 128, + 5, 0, 255, 128, 0, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 5, 0, + 228, 128, 7, 0, 255, 128, + 0, 0, 228, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 255, 128, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 128, 1, 0, + 170, 160, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0 }; + + #endif From 99c82aaad14685e2341698797e7686a1fae5322c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jul 2023 19:45:15 +0200 Subject: [PATCH 0359/1724] update opengl shaders --- inc/openglshader.h | 87 +++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 56 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index f23bfdd..1b23724 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -128,12 +128,11 @@ const char PASSTHROUGH_FRAG_SHADER_CORE[] = "}\n"; /* -// Bicubic Catmull-Rom 9 taps (Fast) - ported by Hyllian - 2020 // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae // Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 // Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. // See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details -// ATENTION: This code only work using LINEAR filter sampling set on Retroarch! +// Modified to use 5 texture fetches */ const char CATMULL_ROM_FRAG_SHADER[] = @@ -153,8 +152,6 @@ const char CATMULL_ROM_FRAG_SHADER[] = "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" "\n" - "#define mul(c,d) (d*c)\n" - "\n" "void main()\n" "{\n" " vec2 samplePos = vTexCoord * SourceSize.xy;\n" @@ -166,7 +163,6 @@ const char CATMULL_ROM_FRAG_SHADER[] = " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" - " //vec2 w3 = 1.0 - w0 - w1 - w2;\n" "\n" " vec2 w12 = w1 + w2;\n" " vec2 offset12 = w2 / (w1 + w2);\n" @@ -175,34 +171,25 @@ const char CATMULL_ROM_FRAG_SHADER[] = " vec2 texPos3 = texPos1 + 2.;\n" " vec2 texPos12 = texPos1 + offset12;\n" "\n" - " texPos0 *= SourceSize.zw;\n" - " texPos3 *= SourceSize.zw;\n" - " texPos12 *= SourceSize.zw;\n" + " texPos0 /= SourceSize.xy;\n" + " texPos3 /= SourceSize.xy;\n" + " texPos12 /= SourceSize.xy;\n" "\n" - " vec4 c00 = texture(Source, vec2(texPos0.x, texPos0.y));\n" - " vec4 c10 = texture(Source, vec2(texPos12.x, texPos0.y));\n" - " vec4 c20 = texture(Source, vec2(texPos3.x, texPos0.y));\n" + " float wtm = w12.x * w0.y;\n" + " float wml = w0.x * w12.y;\n" + " float wmm = w12.x * w12.y;\n" + " float wmr = w3.x * w12.y;\n" + " float wbm = w12.x * w3.y;\n" "\n" - " vec4 c01 = texture(Source, vec2(texPos0.x, texPos12.y));\n" - " vec4 c11 = texture(Source, vec2(texPos12.x, texPos12.y));\n" - " vec4 c21 = texture(Source, vec2(texPos3.x, texPos12.y));\n" + " vec3 result = vec3(0.0f);\n" "\n" - " vec4 c02 = texture(Source, vec2(texPos0.x, texPos3.y));\n" - " vec4 c12 = texture(Source, vec2(texPos12.x, texPos3.y));\n" - " vec4 c22 = texture(Source, vec2(texPos3.x, texPos3.y));\n" + " result += texture(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" + " result += texture(Source, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" + " result += texture(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" + " result += texture(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" + " result += texture(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" "\n" - " vec4 c1, c2, c3, wx, wy = vec4(0.,0.,0.,0.);\n" - "\n" - " vec4 dummy = vec4(0.,0.,0.,1.);\n" - "\n" - " wx = vec4(w0.x, w12.x, w3.x, 1.0);\n" - " wy = vec4(w0.y, w12.y, w3.y, 1.0);\n" - "\n" - " c1 = vec4(mul(wx, mat4(c00, c10, c20, dummy)));\n" - " c2 = vec4(mul(wx, mat4(c01, c11, c21, dummy)));\n" - " c3 = vec4(mul(wx, mat4(c02, c12, c22, dummy)));\n" - "\n" - " FragColor = mul(wy, mat4(c1, c2, c3, dummy));\n" + " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" "}\n"; @@ -223,8 +210,6 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" "\n" - "#define mul(c,d) (d*c)\n" - "\n" "void main()\n" "{\n" " vec2 samplePos = vTexCoord * SourceSize.xy;\n" @@ -236,7 +221,6 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" - " //vec2 w3 = 1.0 - w0 - w1 - w2;\n" "\n" " vec2 w12 = w1 + w2;\n" " vec2 offset12 = w2 / (w1 + w2);\n" @@ -245,34 +229,25 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = " vec2 texPos3 = texPos1 + 2.;\n" " vec2 texPos12 = texPos1 + offset12;\n" "\n" - " texPos0 *= SourceSize.zw;\n" - " texPos3 *= SourceSize.zw;\n" - " texPos12 *= SourceSize.zw;\n" + " texPos0 /= SourceSize.xy;\n" + " texPos3 /= SourceSize.xy;\n" + " texPos12 /= SourceSize.xy;\n" "\n" - " vec4 c00 = texture(Source, vec2(texPos0.x, texPos0.y));\n" - " vec4 c10 = texture(Source, vec2(texPos12.x, texPos0.y));\n" - " vec4 c20 = texture(Source, vec2(texPos3.x, texPos0.y));\n" + " float wtm = w12.x * w0.y;\n" + " float wml = w0.x * w12.y;\n" + " float wmm = w12.x * w12.y;\n" + " float wmr = w3.x * w12.y;\n" + " float wbm = w12.x * w3.y;\n" "\n" - " vec4 c01 = texture(Source, vec2(texPos0.x, texPos12.y));\n" - " vec4 c11 = texture(Source, vec2(texPos12.x, texPos12.y));\n" - " vec4 c21 = texture(Source, vec2(texPos3.x, texPos12.y));\n" + " vec3 result = vec3(0.0f);\n" "\n" - " vec4 c02 = texture(Source, vec2(texPos0.x, texPos3.y));\n" - " vec4 c12 = texture(Source, vec2(texPos12.x, texPos3.y));\n" - " vec4 c22 = texture(Source, vec2(texPos3.x, texPos3.y));\n" + " result += texture(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" + " result += texture(Source, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" + " result += texture(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" + " result += texture(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" + " result += texture(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" "\n" - " vec4 c1, c2, c3, wx, wy = vec4(0.,0.,0.,0.);\n" - "\n" - " vec4 dummy = vec4(0.,0.,0.,1.);\n" - "\n" - " wx = vec4(w0.x, w12.x, w3.x, 1.0);\n" - " wy = vec4(w0.y, w12.y, w3.y, 1.0);\n" - "\n" - " c1 = vec4(mul(wx, mat4(c00, c10, c20, dummy)));\n" - " c2 = vec4(mul(wx, mat4(c01, c11, c21, dummy)));\n" - " c3 = vec4(mul(wx, mat4(c02, c12, c22, dummy)));\n" - "\n" - " FragColor = mul(wy, mat4(c1, c2, c3, dummy));\n" + " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" "}\n"; From 566492577c60af18d6f82eb1a88445cba1a48a80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 01:23:41 +0200 Subject: [PATCH 0360/1724] fix ifdef --- src/hook.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index ccc09c3..4b4a4e5 100644 --- a/src/hook.c +++ b/src/hook.c @@ -568,7 +568,7 @@ void hook_init() void hook_early_init() { -#ifdef _DEBUG && _MSC_VER +#if defined(_DEBUG) && defined(_MSC_VER) hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); DetourTransactionBegin(); @@ -636,7 +636,7 @@ void hook_exit() hook_revert((HOOKLIST*)&g_hooks); } -#ifdef _DEBUG && _MSC_VER +#if defined(_DEBUG) && defined(_MSC_VER) DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); From 045ed051ea4de036416680bbdc35360df0188614 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 01:24:16 +0200 Subject: [PATCH 0361/1724] fix for opengl borderless mode --- inc/dd.h | 1 + src/dd.c | 5 +++++ src/render_ogl.c | 18 +++++++++++------- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fff5e0e..b7d58a0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -82,6 +82,7 @@ typedef struct CNCDDRAW int width; int height; int bpp; + int opengl_y_align; HDC hdc; int* tex; diff --git a/src/dd.c b/src/dd.c index db0846b..12f14df 100644 --- a/src/dd.c +++ b/src/dd.c @@ -704,6 +704,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) { g_ddraw->render.height++; + g_ddraw->render.opengl_y_align = 1; + } + else + { + g_ddraw->render.opengl_y_align = 0; } if (g_ddraw->windowed) diff --git a/src/render_ogl.c b/src/render_ogl.c index b20b0d9..8be4671 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -183,13 +183,13 @@ static void ogl_build_programs() if (!g_ogl.scale_program && (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height)) + g_ddraw->render.viewport.height != g_ddraw->height)) { g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, CATMULL_ROM_FRAG_SHADER); if (!g_ogl.scale_program) { - g_ogl.scale_program = + g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, CATMULL_ROM_FRAG_SHADER_CORE); } @@ -616,8 +616,10 @@ static void ogl_render() BOOL needs_update = FALSE; glViewport( - g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, g_ddraw->render.viewport.height); + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height); if (g_ogl.main_program) { @@ -753,8 +755,10 @@ static void ogl_render() else if (needs_update) { glViewport( - g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, g_ddraw->render.viewport.height); + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height); needs_update = FALSE; } @@ -845,7 +849,7 @@ static void ogl_render() { glViewport( g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, + g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, g_ddraw->render.viewport.width, g_ddraw->render.viewport.height); } From 99708327050ee11d10864faca517ddd40ffbeda8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 01:39:38 +0200 Subject: [PATCH 0362/1724] fix d3d9 vertices --- src/render_d3d9.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 63efb0a..8a2f433 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -411,10 +411,10 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) CUSTOMVERTEX vertices[] = { - { vp_x - 0.5f, vp_h - 0.5f, 0.0f, 1.0f, 0.0f, s_h }, - { vp_x - 0.5f, vp_y - 0.5f, 0.0f, 1.0f, 0.0f, 0.0f }, - { vp_w - 0.5f, vp_h - 0.5f, 0.0f, 1.0f, s_w, s_h }, - { vp_w - 0.5f, vp_y - 0.5f, 0.0f, 1.0f, s_w, 0.0f } + { vp_x, vp_h, 0.0f, 1.0f, 0.0f, s_h }, + { vp_x, vp_y, 0.0f, 1.0f, 0.0f, 0.0f }, + { vp_w, vp_h, 0.0f, 1.0f, s_w, s_h }, + { vp_w, vp_y, 0.0f, 1.0f, s_w, 0.0f } }; void* data; From f422ac1ee9364c61a1d32389bfb022b32096a7a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 02:10:31 +0200 Subject: [PATCH 0363/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index ca758c0..d21f6e0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b600cb36ba6bea7bd4d33e34e1e3b9e90772549c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 02:29:51 +0200 Subject: [PATCH 0364/1724] tweak shaders --- inc/d3d9shader.h | 10 ++++++---- inc/openglshader.h | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 71575b8..f453597 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -434,6 +434,8 @@ uniform sampler2D SurfaceTex; float4 TextureSize : register(c0); +#define SourceSize float4(TextureSize.xy, 1.0 / TextureSize.xy) + float4 catmull_rom(float2 coord) { // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae @@ -443,7 +445,7 @@ float4 catmull_rom(float2 coord) // Modified to use 5 texture fetches - float2 samplePos = coord * TextureSize.xy; + float2 samplePos = coord * SourceSize.xy; float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; float2 f = samplePos - texPos1; @@ -460,9 +462,9 @@ float4 catmull_rom(float2 coord) float2 texPos3 = texPos1 + 2; float2 texPos12 = texPos1 + offset12; - texPos0 /= TextureSize.xy; - texPos3 /= TextureSize.xy; - texPos12 /= TextureSize.xy; + texPos0 *= SourceSize.zw; + texPos3 *= SourceSize.zw; + texPos12 *= SourceSize.zw; float wtm = w12.x * w0.y; float wml = w0.x * w12.y; diff --git a/inc/openglshader.h b/inc/openglshader.h index 1b23724..9502f8a 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -171,9 +171,9 @@ const char CATMULL_ROM_FRAG_SHADER[] = " vec2 texPos3 = texPos1 + 2.;\n" " vec2 texPos12 = texPos1 + offset12;\n" "\n" - " texPos0 /= SourceSize.xy;\n" - " texPos3 /= SourceSize.xy;\n" - " texPos12 /= SourceSize.xy;\n" + " texPos0 *= SourceSize.zw;\n" + " texPos3 *= SourceSize.zw;\n" + " texPos12 *= SourceSize.zw;\n" "\n" " float wtm = w12.x * w0.y;\n" " float wml = w0.x * w12.y;\n" @@ -229,9 +229,9 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = " vec2 texPos3 = texPos1 + 2.;\n" " vec2 texPos12 = texPos1 + offset12;\n" "\n" - " texPos0 /= SourceSize.xy;\n" - " texPos3 /= SourceSize.xy;\n" - " texPos12 /= SourceSize.xy;\n" + " texPos0 *= SourceSize.zw;\n" + " texPos3 *= SourceSize.zw;\n" + " texPos12 *= SourceSize.zw;\n" "\n" " float wtm = w12.x * w0.y;\n" " float wml = w0.x * w12.y;\n" From 29d6c4e1e7e60b40646f013b2f2d41e642719fcb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 02:53:32 +0200 Subject: [PATCH 0365/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index d21f6e0..16c2c68 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 2d009fe4776f116ab53e77f6138e13c36f09a9b3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 06:40:31 +0200 Subject: [PATCH 0366/1724] fix d3d9 vertices --- src/render_d3d9.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 8a2f433..0fa6c11 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -411,10 +411,10 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) CUSTOMVERTEX vertices[] = { - { vp_x, vp_h, 0.0f, 1.0f, 0.0f, s_h }, - { vp_x, vp_y, 0.0f, 1.0f, 0.0f, 0.0f }, - { vp_w, vp_h, 0.0f, 1.0f, s_w, s_h }, - { vp_w, vp_y, 0.0f, 1.0f, s_w, 0.0f } + { vp_x + 0.5f, vp_h + 0.5f, 0.0f, 1.0f, 0.0f, s_h }, + { vp_x + 0.5f, vp_y + 0.5f, 0.0f, 1.0f, 0.0f, 0.0f }, + { vp_w + 0.5f, vp_h + 0.5f, 0.0f, 1.0f, s_w, s_h }, + { vp_w + 0.5f, vp_y + 0.5f, 0.0f, 1.0f, s_w, 0.0f } }; void* data; From 1f931870d21588651f59c6efc6c1ac85175537dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 07:22:01 +0200 Subject: [PATCH 0367/1724] reduce alt+enter delay --- src/render_d3d9.c | 2 +- src/render_ogl.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 0fa6c11..0cf8d49 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -431,7 +431,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) DWORD WINAPI d3d9_render_main(void) { - Sleep(500); + Sleep(250); fpsl_init(); diff --git a/src/render_ogl.c b/src/render_ogl.c index 8be4671..3ebe84a 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -27,7 +27,7 @@ static OGLRENDERER g_ogl; DWORD WINAPI ogl_render_main(void) { - Sleep(500); + Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; g_ogl.context = ogl_create_context(g_ddraw->render.hdc); From 6101e34ddd088e35dc938844bdf517327f305c69 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 20:43:54 +0200 Subject: [PATCH 0368/1724] remove menu in fullscreen/borderless modes --- src/dd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 12f14df..119d738 100644 --- a/src/dd.c +++ b/src/dd.c @@ -724,6 +724,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_GetWindowLongA( g_ddraw->hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); + + if (GetMenu(g_ddraw->hwnd)) + SetMenu(g_ddraw->hwnd, NULL); } else { @@ -759,7 +762,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); - + AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); real_SetWindowPos( @@ -788,6 +791,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + if (GetMenu(g_ddraw->hwnd)) + SetMenu(g_ddraw->hwnd, NULL); + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); DWORD swp_flags = SWP_SHOWWINDOW; From dfe15ec8b049e24cc5479f040c621c9a127a28a2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jul 2023 23:54:59 +0200 Subject: [PATCH 0369/1724] fix for HOMM4 cursor issues --- src/dd.c | 4 +++- src/mouse.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 119d738..39068c3 100644 --- a/src/dd.c +++ b/src/dd.c @@ -922,7 +922,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_ddraw->devmode) { HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); - InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)cursor); + + if (cursor != LoadCursor(NULL, IDC_WAIT)) + InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)cursor); } int cursor_count = real_ShowCursor(TRUE) - 1; diff --git a/src/mouse.c b/src/mouse.c index d2ead61..e54438d 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -61,6 +61,7 @@ void mouse_unlock() g_mouse_locked = FALSE; real_ClipCursor(NULL); + //ReleaseCapture(); RECT rc = { 0 }; real_GetClientRect(g_ddraw->hwnd, &rc); @@ -74,6 +75,8 @@ void mouse_unlock() (int)(rc.left + (cur_x * g_ddraw->render.scale_w)), (int)(rc.top + (cur_y * g_ddraw->render.scale_h))); + real_SetCursor(LoadCursor(NULL, IDC_ARROW)); + while (real_ShowCursor(TRUE) < 0); } } From 3b7b1f308f4d4fa37132a12c9a8437850b11e119 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 00:28:17 +0200 Subject: [PATCH 0370/1724] always redraw for HOMM4 --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 39068c3..975464c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -854,9 +854,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_lock(); } + RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) { - RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); } From 36aa243d10d62bb06542f43642ba74c83435c927 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 04:11:26 +0200 Subject: [PATCH 0371/1724] use SetWindowPos to fix mouse lock bug in HOMM4 --- src/dd.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 975464c..db376a8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -764,12 +764,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); - - real_SetWindowPos( - g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - real_MoveWindow( - g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); + real_SetWindowPos( + g_ddraw->hwnd, + HWND_NOTOPMOST, + dst.left, + dst.top, + (dst.right - dst.left), + (dst.bottom - dst.top), + SWP_SHOWWINDOW | SWP_FRAMECHANGED); BOOL d3d9_active = FALSE; From 6542559733d5e1b9820edadc29e4a8f91e16bb6e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 04:44:38 +0200 Subject: [PATCH 0372/1724] fix alt+enter on wine --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 925dade..6bb3d7a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -412,7 +412,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || g_ddraw->wine) + if (in_size_move || (g_ddraw->wine && !g_ddraw->fullscreen)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ From 4dfc73a780ed06cd80d5acee300d45a870ca632e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 06:45:16 +0200 Subject: [PATCH 0373/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 16c2c68..7e9bbe0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 5690008d9142f214897ebb149bceeb0ceb4be24e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 09:23:21 +0200 Subject: [PATCH 0374/1724] update vertices --- src/render_d3d9.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 0cf8d49..5d94b92 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -411,10 +411,10 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) CUSTOMVERTEX vertices[] = { - { vp_x + 0.5f, vp_h + 0.5f, 0.0f, 1.0f, 0.0f, s_h }, - { vp_x + 0.5f, vp_y + 0.5f, 0.0f, 1.0f, 0.0f, 0.0f }, - { vp_w + 0.5f, vp_h + 0.5f, 0.0f, 1.0f, s_w, s_h }, - { vp_w + 0.5f, vp_y + 0.5f, 0.0f, 1.0f, s_w, 0.0f } + { vp_x - 0.5f, vp_h - 0.5f, 0.0f, 1.0f, 0.0f, s_h }, + { vp_x - 0.5f, vp_y - 0.5f, 0.0f, 1.0f, 0.0f, 0.0f }, + { vp_w - 0.5f, vp_h - 0.5f, 0.0f, 1.0f, s_w, s_h }, + { vp_w - 0.5f, vp_y - 0.5f, 0.0f, 1.0f, s_w, 0.0f } }; void* data; From eb445e378db93b7a59ea2ac053d0a1bc45d2bd76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jul 2023 09:26:50 +0200 Subject: [PATCH 0375/1724] bump vertices --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 7e9bbe0..e826988 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 1aca711562114e176c90906af4fcd6e155e198ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Jul 2023 06:25:37 +0200 Subject: [PATCH 0376/1724] don't use PeekMessageA hack on wine --- src/dd.c | 7 +++++-- src/ddsurface.c | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index db376a8..c8c077b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -713,8 +713,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->windowed) { - MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + if (!g_ddraw->wine) + { + MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + } if (!border) { diff --git a/src/ddsurface.c b/src/ddsurface.c index 3511fa1..5c8a0c5 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -940,7 +940,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_ddraw->fixnotresponding) + if (g_ddraw && g_ddraw->fixnotresponding && !g_ddraw->wine) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); From e4478e69bddf3dc0eab3c0486dd328dd9e750938 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Jul 2023 06:26:04 +0200 Subject: [PATCH 0377/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e826988..769ca59 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 115087de53e1a9d2c91c9fd6b1366057aacfe621 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Jul 2023 10:41:51 +0200 Subject: [PATCH 0378/1724] fix gdi renderer for infantry --- src/render_gdi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 9fe62a1..bf34598 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -86,7 +86,7 @@ DWORD WINAPI gdi_render_main(void) EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } - if (g_ddraw->primary->palette) + if (g_ddraw->bpp == 8 && g_ddraw->primary->palette) { memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); } From 031cb25ec2297bb95ec900d32b46fb46da7145a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 01:08:43 +0200 Subject: [PATCH 0379/1724] allow maximize hotkey with window border enabled as well --- src/wndproc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 6bb3d7a..48be32d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -622,7 +622,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->hotkeys.toggle_maximize && wParam == g_ddraw->hotkeys.toggle_maximize && g_ddraw->resizable && - !g_ddraw->border && g_ddraw->windowed && !g_ddraw->fullscreen) { From d7fa8ace6b41d99034ef70aa74c281b375abbd02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 01:27:58 +0200 Subject: [PATCH 0380/1724] log wine sysname and release --- src/debug.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/debug.c b/src/debug.c index 6825342..26625b2 100644 --- a/src/debug.c +++ b/src/debug.c @@ -108,14 +108,27 @@ void dbg_init() RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); TRACE("%s (%s)\n", name, build); + } - const char* (CDECL * wine_get_version)() = - (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); + const char* (CDECL * wine_get_version)() = + (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); - if (wine_get_version) - { - TRACE("Wine version = %s\n", wine_get_version()); - } + if (wine_get_version) + { + TRACE("Wine version = %s\n", wine_get_version()); + } + + void (CDECL* wine_get_host_version)(const char** sysname, const char** release) = + (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version"); + + if (wine_get_host_version) + { + const char* sysname = NULL; + const char* release = NULL; + + wine_get_host_version(&sysname, &release); + + TRACE("Wine sysname = %s, release = %s\n", sysname, release); } } } From 6fc969097dd7c2073e2fbc259780240970f5710b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 02:17:03 +0200 Subject: [PATCH 0381/1724] make sure width is not below game width --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index c8c077b..1e361d0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -615,8 +615,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* try current display settings */ - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw->render.width = max(g_ddraw->width, g_ddraw->mode.dmPelsWidth); + g_ddraw->render.height = max(g_ddraw->height, g_ddraw->mode.dmPelsHeight); g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; From 0f37251d648718e060da1c2720a6631c5bc08a18 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 03:01:15 +0200 Subject: [PATCH 0382/1724] switch to borderless on failure (linux mint) --- src/dd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dd.c b/src/dd.c index 1e361d0..2096b72 100644 --- a/src/dd.c +++ b/src/dd.c @@ -832,6 +832,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.run = FALSE; g_ddraw->windowed = TRUE; + g_ddraw->fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } From 19d1d4f942a2838d4eefb39fa468ae4189de6b7f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 22:08:50 +0200 Subject: [PATCH 0383/1724] update ShowWindow hook --- inc/dd.h | 1 + src/dd.c | 4 ++++ src/winapi_hooks.c | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index b7d58a0..3abdd4a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -168,6 +168,7 @@ typedef struct CNCDDRAW int maxgameticks; BOOL alt_key_down; BOOL releasealt; + BOOL invisible; BOOL bnet_active; BOOL bnet_was_fullscreen; BOOL bnet_was_upscaled; diff --git a/src/dd.c b/src/dd.c index 2096b72..fd70aa4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -766,6 +766,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + g_ddraw->invisible = !(style & WS_VISIBLE); + AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); real_SetWindowPos( @@ -802,6 +804,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + g_ddraw->invisible = !(style & WS_VISIBLE); + DWORD swp_flags = SWP_SHOWWINDOW; if ((style & WS_CAPTION)) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 25605c3..cfd28e7 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -504,6 +504,26 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { if (g_ddraw && g_ddraw->hwnd == hWnd) { + if (g_ddraw->invisible && + (nCmdShow == SW_SHOWDEFAULT || nCmdShow == SW_SHOWNORMAL) && + (g_hook_method != 2 && g_hook_method != 3)) + { + g_ddraw->invisible = FALSE; + + BOOL result = real_ShowWindow(hWnd, nCmdShow); + + if (result) + { + //real_SendMessageA(g_ddraw->hwnd, WM_SHOWWINDOW, 1, 0); + real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + + return 0; + } + + return result; + } + if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; From 92ba581e28702b3ceb2df77f7aa0bcc31cd16bb5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 23:55:44 +0200 Subject: [PATCH 0384/1724] send WM_SIZE on MoveWindow --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cfd28e7..87cf051 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -357,6 +357,8 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO { if (g_ddraw->hwnd == hWnd) { + real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(nWidth, nHeight)); + return TRUE; } else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) From e6596492ad9982d7d047bdfccf330f52681ab1a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jul 2023 23:59:56 +0200 Subject: [PATCH 0385/1724] add wm move --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 87cf051..a416e1a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -357,6 +357,7 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO { if (g_ddraw->hwnd == hWnd) { + //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(nWidth, nHeight)); return TRUE; From 225f76438815213ac9c059e9d1699e698bff320f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jul 2023 02:13:30 +0200 Subject: [PATCH 0386/1724] fix MoveWindow WM_SIZE --- src/winapi_hooks.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a416e1a..f70e214 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -357,8 +357,16 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO { if (g_ddraw->hwnd == hWnd) { - //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); - real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(nWidth, nHeight)); + if (g_ddraw->width && g_ddraw->height && (nWidth != g_ddraw->width || nHeight != g_ddraw->height)) + { + //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); + + real_SendMessageA( + g_ddraw->hwnd, + WM_SIZE_DDRAW, + 0, + MAKELPARAM(min(nWidth, g_ddraw->width), min(nHeight, g_ddraw->height))); + } return TRUE; } From c1a9d72b68d9fb1712f74de1e15980924918e9c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jul 2023 02:33:06 +0200 Subject: [PATCH 0387/1724] Revert "update ShowWindow hook" This reverts commit 19d1d4f942a2838d4eefb39fa468ae4189de6b7f. --- inc/dd.h | 1 - src/dd.c | 4 ---- src/winapi_hooks.c | 20 -------------------- 3 files changed, 25 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 3abdd4a..b7d58a0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -168,7 +168,6 @@ typedef struct CNCDDRAW int maxgameticks; BOOL alt_key_down; BOOL releasealt; - BOOL invisible; BOOL bnet_active; BOOL bnet_was_fullscreen; BOOL bnet_was_upscaled; diff --git a/src/dd.c b/src/dd.c index fd70aa4..2096b72 100644 --- a/src/dd.c +++ b/src/dd.c @@ -766,8 +766,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); - g_ddraw->invisible = !(style & WS_VISIBLE); - AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); real_SetWindowPos( @@ -804,8 +802,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - g_ddraw->invisible = !(style & WS_VISIBLE); - DWORD swp_flags = SWP_SHOWWINDOW; if ((style & WS_CAPTION)) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f70e214..28a1f39 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -515,26 +515,6 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { if (g_ddraw && g_ddraw->hwnd == hWnd) { - if (g_ddraw->invisible && - (nCmdShow == SW_SHOWDEFAULT || nCmdShow == SW_SHOWNORMAL) && - (g_hook_method != 2 && g_hook_method != 3)) - { - g_ddraw->invisible = FALSE; - - BOOL result = real_ShowWindow(hWnd, nCmdShow); - - if (result) - { - //real_SendMessageA(g_ddraw->hwnd, WM_SHOWWINDOW, 1, 0); - real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); - //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); - - return 0; - } - - return result; - } - if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; From eeffc910d12db06e7ddf6dbaf9f566ab94610743 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Nov 2021 02:05:39 +0100 Subject: [PATCH 0388/1724] make lowest resolutio check less strict --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 4a3a08b..e995da0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -211,7 +211,7 @@ BOOL util_get_lowest_resolution( DWORD max_height) { BOOL result = FALSE; - int org_ratio = (int)((ratio + 0.005f) * 100); + int org_ratio = (int)((ratio + 0.005f) * 10); SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 }; DWORD i = 0; DEVMODE m; @@ -227,7 +227,7 @@ BOOL util_get_lowest_resolution( m.dmPelsWidth < lowest.cx && m.dmPelsHeight < lowest.cy) { - int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100); + int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10); if (res_ratio == org_ratio) { From af99ce1a7e3f0a60b1cfdf9b4933f3f80f9b08f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 13 Jul 2023 06:02:29 +0200 Subject: [PATCH 0389/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 769ca59..5724ae3 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 2 +#define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From a33169eb6370df1587066d2f1467bef60b8a4163 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jul 2023 00:48:19 +0200 Subject: [PATCH 0390/1724] #225 don't increase ref count in EnumAttachedSurfaces --- src/ddsurface.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 5c8a0c5..4a748de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -721,7 +721,6 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); - IDirectDrawSurface_AddRef(This->backbuffer); lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); } From f86ad29835e0dcd670972d2d4a12391691e708d7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Apr 2023 19:32:24 +0200 Subject: [PATCH 0391/1724] fix for non working links in profile --- src/winapi_hooks.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 28a1f39..37222a9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -108,6 +108,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } + else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt)) + { + if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height) + { + lpPoint->x = pt.x; + lpPoint->y = pt.y; + + return TRUE; + } + } if (lpPoint) { From 766e4b434c9980b7ede2fe2cb49579f4ee269a85 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 9 Apr 2023 20:06:51 +0200 Subject: [PATCH 0392/1724] hook SetForegroundWindow for profile links --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 12303d0..3f3cb82 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[27]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[28]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -44,6 +44,7 @@ typedef int (WINAPI* SETDIBITSTODEVICEPROC)( typedef int (WINAPI* STRETCHDIBITSPROC)( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); +typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); @@ -85,6 +86,7 @@ extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow; extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; +extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 709f53a..009cac8 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -29,6 +29,7 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HWND WINAPI fake_GetTopWindow(HWND hWnd); HWND WINAPI fake_GetForegroundWindow(void); +BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 4b4a4e5..3cf9cae 100644 --- a/src/hook.c +++ b/src/hook.c @@ -45,6 +45,7 @@ GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; +SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -87,6 +88,7 @@ static HOOKLIST g_hooks[] = { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, + { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 37222a9..9c94b8a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -558,6 +558,16 @@ HWND WINAPI fake_GetForegroundWindow() return real_GetForegroundWindow(); } +BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) +{ + if (g_ddraw && g_ddraw->bnet_active) + { + return TRUE; + } + + return real_SetForegroundWindow(hWnd); +} + HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) From eade99a8ad638998d9fe62e58972f4f7baec8836 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Jul 2023 02:22:07 +0200 Subject: [PATCH 0393/1724] #106 add presets for diablo and hellfire --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 22ff8d6..15251ea 100644 --- a/src/config.c +++ b/src/config.c @@ -746,6 +746,14 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Diablo\n" + "[Diablo]\n" + "devmode=true\n" + "\n" + "; Diablo: Hellfire\n" + "[hellfire]\n" + "devmode=true\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "renderer=opengl\n" From bd69f1c51282766fcd90e79c069a1a19950bab4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Jul 2023 02:42:29 +0200 Subject: [PATCH 0394/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 5724ae3..e79bbe8 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6840d2ea58e9f8bcb1cbdec8554d671c69019e50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Jul 2023 03:10:51 +0200 Subject: [PATCH 0395/1724] #225 add some notes --- src/ddsurface.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 4a748de..0425318 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1333,6 +1333,12 @@ HRESULT dd_CreateSurface( } } + if (dst_surface->caps & DDSCAPS_FLIP) + { + /* may or may not be needed by some games, keep commented out for now */ + //dst_surface->caps |= DDSCAPS_FRONTBUFFER; + } + if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { dst_surface->width = g_ddraw->width; @@ -1480,7 +1486,8 @@ HRESULT dd_CreateSurface( desc.dwFlags |= DDSD_BACKBUFFERCOUNT; } - desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER; + /* setting DDSCAPS_FLIP enables flip for Nox, keep commented out for now */ + desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;// | DDSCAPS_FLIP; desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; From cb490497dcfdbdb8ac115884d7a13d3deaebc1ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Jul 2023 19:21:18 +0200 Subject: [PATCH 0396/1724] #212 add preset for BALDR FORCE EXE --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 15251ea..4c5fe52 100644 --- a/src/config.c +++ b/src/config.c @@ -501,6 +501,10 @@ static void cfg_create_ini() "[BGMain]\n" "resolutions=2\n" "\n" + "; BALDR FORCE EXE\n" + "[BaldrForce]\n" + "noactivateapp=true\n" + "\n" "; Blade & Sword\n" "[comeon]\n" "maxgameticks=62\n" From 8d212a9be344356731122117aac49a4f838e6d65 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 18 Jul 2023 19:54:39 +0200 Subject: [PATCH 0397/1724] #212 fix BALDR FORCE EXE windowed mode --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 3cf9cae..0cc1f25 100644 --- a/src/hook.c +++ b/src/hook.c @@ -587,6 +587,7 @@ void hook_early_init() hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK + hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); @@ -657,6 +658,7 @@ void hook_exit() hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK + hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); From efccab9709d512b3a97019613e9d466992045bf6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 25 Jul 2023 05:26:38 +0200 Subject: [PATCH 0398/1724] fix WM MOVE linux bug --- src/dd.c | 2 +- src/wndproc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 2096b72..d810611 100644 --- a/src/dd.c +++ b/src/dd.c @@ -716,7 +716,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!g_ddraw->wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } if (!border) diff --git a/src/wndproc.c b/src/wndproc.c index 48be32d..00e1514 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -412,7 +412,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_ddraw->wine && !g_ddraw->fullscreen)) + if (in_size_move || (g_ddraw->wine && !g_ddraw->fullscreen && g_ddraw->render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ From 152c3aa36113cf0565fee70b7121e68f1a596c73 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 06:59:09 +0200 Subject: [PATCH 0399/1724] fix surface caps/flags --- src/ddsurface.c | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 0425318..8ce5dc2 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -20,7 +20,13 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI if (!This->backbuffer) { - lpDDSurface->caps |= DDSCAPS_BACKBUFFER; + if (This->caps & DDSCAPS_FRONTBUFFER) + { + lpDDSurface->caps |= DDSCAPS_BACKBUFFER; + } + + lpDDSurface->caps |= DDSCAPS_FLIP; + This->backbuffer = lpDDSurface; } } @@ -683,7 +689,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; - if ((g_ddraw && !g_ddraw->novidmem) || (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) + if (g_ddraw && !g_ddraw->novidmem) { lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } @@ -864,7 +870,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) HDC dc = This->hdc; - if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) + if (This->backbuffer || (This->caps & DDSCAPS_FLIP)) dc = (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0); if (This->bpp == 8 && data) @@ -1260,7 +1266,7 @@ void* dds_GetBuffer(IDirectDrawSurfaceImpl* This) if (!This) return NULL; - if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) + if (This->backbuffer || (This->caps & DDSCAPS_FLIP)) return (void*)InterlockedExchangeAdd((LONG*)&This->surface, 0); return This->surface; @@ -1333,16 +1339,17 @@ HRESULT dd_CreateSurface( } } - if (dst_surface->caps & DDSCAPS_FLIP) - { - /* may or may not be needed by some games, keep commented out for now */ - //dst_surface->caps |= DDSCAPS_FRONTBUFFER; - } - if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { + if (dst_surface->caps & DDSCAPS_FLIP) + { + dst_surface->caps |= DDSCAPS_FRONTBUFFER; + } + dst_surface->width = g_ddraw->width; dst_surface->height = g_ddraw->height; + + dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } else { @@ -1483,11 +1490,23 @@ HRESULT dd_CreateSurface( if (lpDDSurfaceDesc->dwBackBufferCount > 1) { desc.dwBackBufferCount = lpDDSurfaceDesc->dwBackBufferCount - 1; - desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + desc.dwFlags |= DDSD_BACKBUFFERCOUNT | DDSD_CAPS | DDSD_ALL; } - /* setting DDSCAPS_FLIP enables flip for Nox, keep commented out for now */ - desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;// | DDSCAPS_FLIP; + if (dst_surface->caps & DDSCAPS_FRONTBUFFER) + { + desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER; + } + + if (dst_surface->caps & DDSCAPS_FLIP) + { + desc.ddsCaps.dwCaps |= DDSCAPS_FLIP; + } + + if (dst_surface->caps & DDSCAPS_VIDEOMEMORY) + { + desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; + } desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; From f0586cb4cf1316293e5b92367dca54ac7a1469d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 07:25:26 +0200 Subject: [PATCH 0400/1724] set DDSD_CAPS | DDSD_ALL --- src/ddsurface.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8ce5dc2..21d44b9 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1487,10 +1487,12 @@ HRESULT dd_CreateSurface( DDSURFACEDESC desc; memset(&desc, 0, sizeof(desc)); + desc.dwFlags |= DDSD_CAPS | DDSD_ALL; + if (lpDDSurfaceDesc->dwBackBufferCount > 1) { desc.dwBackBufferCount = lpDDSurfaceDesc->dwBackBufferCount - 1; - desc.dwFlags |= DDSD_BACKBUFFERCOUNT | DDSD_CAPS | DDSD_ALL; + desc.dwFlags |= DDSD_BACKBUFFERCOUNT; } if (dst_surface->caps & DDSCAPS_FRONTBUFFER) From a9418fc02a92b249b376bdbd5536c5282b86f9fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 07:48:23 +0200 Subject: [PATCH 0401/1724] remove old setting --- inc/dd.h | 1 - src/config.c | 6 ------ src/ddsurface.c | 10 +++++----- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index b7d58a0..0b4c615 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -140,7 +140,6 @@ typedef struct CNCDDRAW BOOL wine; HCURSOR old_cursor; int show_cursor_count; - BOOL novidmem; BOOL fpupreserve; BOOL allow_wmactivate; int d3d9_adapter; diff --git a/src/config.c b/src/config.c index 4c5fe52..34b1df7 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,6 @@ void cfg_load() g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); - g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); @@ -370,7 +369,6 @@ static void cfg_create_ini() "accuratetimers=false\n" "fixpitch=true\n" "fixwndprochook=false\n" - "novidmem=false\n" "fixnotresponding=false\n" "locktopleft=false\n" "lock_surfaces=false\n" @@ -849,7 +847,6 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" - "novidmem=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" @@ -857,7 +854,6 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" - "novidmem=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" @@ -865,7 +861,6 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" - "novidmem=true\n" "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" @@ -873,7 +868,6 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" - "novidmem=true\n" "\n" "; Kings Quest 8\n" "[Mask]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 21d44b9..3ccb9c6 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -689,11 +689,6 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; - if (g_ddraw && !g_ddraw->novidmem) - { - lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - } - if (This->bpp == 8) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; @@ -1353,6 +1348,11 @@ HRESULT dd_CreateSurface( } else { + if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY)) + { + dst_surface->caps |= DDSCAPS_VIDEOMEMORY; + } + dst_surface->width = lpDDSurfaceDesc->dwWidth; dst_surface->height = lpDDSurfaceDesc->dwHeight; } From 0ac8709a5021ef4965626ad359ece0197c17bc77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 08:16:09 +0200 Subject: [PATCH 0402/1724] remove DDSD_ALL --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 3ccb9c6..a5b7de4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1487,7 +1487,7 @@ HRESULT dd_CreateSurface( DDSURFACEDESC desc; memset(&desc, 0, sizeof(desc)); - desc.dwFlags |= DDSD_CAPS | DDSD_ALL; + desc.dwFlags |= DDSD_CAPS; if (lpDDSurfaceDesc->dwBackBufferCount > 1) { From 03c25add3c95197b3529918fa93133a72e95c44b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 09:50:19 +0200 Subject: [PATCH 0403/1724] add preset for Jagged Alliance 2: Unfinished Business --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 34b1df7..e30e083 100644 --- a/src/config.c +++ b/src/config.c @@ -848,6 +848,13 @@ static void cfg_create_ini() "noactivateapp=true\n" "releasealt=true\n" "\n" + "; Jagged Alliance 2: Unfinished Business\n" + "[JA2UB]\n" + "singlecpu=false\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" + "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "singlecpu=false\n" From 713c53c1acccaabcc501e75235b4559fc9665e2d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 27 Jul 2023 11:01:00 +0200 Subject: [PATCH 0404/1724] don't log IsLost --- src/IDirectDraw/IDirectDrawSurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 98408ff..154f73f 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -366,9 +366,9 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( HRESULT __stdcall IDirectDrawSurface__IsLost(IDirectDrawSurfaceImpl* This) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE_EXT("<- %s\n", __FUNCTION__); + //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } From 79100ce6097d71a0d41167d0dc2d55c640982f73 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 04:50:51 +0200 Subject: [PATCH 0405/1724] #227 add preset for RollerCoaster Tycoon --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index e30e083..210e004 100644 --- a/src/config.c +++ b/src/config.c @@ -1052,6 +1052,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "limit_bltfast=true\n" "\n" + "; RollerCoaster Tycoon\n" + "[rct]\n" + "singlecpu=false\n" + "\n" "; Twisted Metal\n" "[TWISTED]\n" "renderer=opengl\n" From 6269950402de4ef917a7aa9e39523152aee81d50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 05:50:23 +0200 Subject: [PATCH 0406/1724] #227 fix changing resolutions bug --- src/dd.c | 5 ++++- src/winapi_hooks.c | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index d810611..e2ffced 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1131,7 +1131,10 @@ ULONG dd_Release() DeleteCriticalSection(&g_ddraw->cs); /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + if (g_ddraw->hwnd) + { + real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + } HeapFree(GetProcessHeap(), 0, g_ddraw); g_ddraw = NULL; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9c94b8a..2aeddf0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -969,6 +969,13 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { BOOL result = real_DestroyWindow(hWnd); + if (result && g_ddraw && hWnd == g_ddraw->hwnd) + { + g_ddraw->hwnd = NULL; + g_ddraw->wndproc = NULL; + g_ddraw->render.hdc = NULL; + } + if (g_ddraw && g_ddraw->hwnd != hWnd && g_ddraw->bnet_active) { RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); From a0f825fa4cad8ebbd22a2e9909d5b029f4d48868 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 07:02:03 +0200 Subject: [PATCH 0407/1724] adjust preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 210e004..b6d7c7f 100644 --- a/src/config.c +++ b/src/config.c @@ -1055,6 +1055,7 @@ static void cfg_create_ini() "; RollerCoaster Tycoon\n" "[rct]\n" "singlecpu=false\n" + "maxfps=0\n" "\n" "; Twisted Metal\n" "[TWISTED]\n" From 2ee62a46740855f8665d3250e94f23cde1594680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 08:00:09 +0200 Subject: [PATCH 0408/1724] improve logs --- src/directinput.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directinput.c b/src/directinput.c index e320828..86be466 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -38,7 +38,7 @@ static PROC hook_func(PROC* org_func, PROC new_func) static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) { - TRACE("DirectInput SetCooperativeLevel\n"); + TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) { From 2e6dcb29062474582e52acdfdce478e2ccbeece3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 09:38:39 +0200 Subject: [PATCH 0409/1724] add dinput curspr hack --- inc/dd.h | 1 + src/config.c | 3 +++ src/directinput.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 0b4c615..996aa04 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -141,6 +141,7 @@ typedef struct CNCDDRAW HCURSOR old_cursor; int show_cursor_count; BOOL fpupreserve; + BOOL dinput_show_cursor; BOOL allow_wmactivate; int d3d9_adapter; BOOL opengl_core; diff --git a/src/config.c b/src/config.c index b6d7c7f..c784c20 100644 --- a/src/config.c +++ b/src/config.c @@ -49,6 +49,7 @@ void cfg_load() g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", TRUE); + g_ddraw->dinput_show_cursor = cfg_get_bool("dinput_show_cursor", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); @@ -382,6 +383,7 @@ static void cfg_create_ini() "rgb555=false\n" "hook_peekmessage=false\n" "fpupreserve=true\n" + "dinput_show_cursor=false\n" "\n" "\n" "\n" @@ -1054,6 +1056,7 @@ static void cfg_create_ini() "\n" "; RollerCoaster Tycoon\n" "[rct]\n" + "dinput_show_cursor=true\n" "singlecpu=false\n" "maxfps=0\n" "\n" diff --git a/src/directinput.c b/src/directinput.c index 86be466..9dd1944 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -40,7 +40,7 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); - if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE) && !g_ddraw->dinput_show_cursor) { if (g_mouse_locked || g_ddraw->devmode) { From 5764a0dca41c0e9b78e969b45ee61d468163812d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 09:45:29 +0200 Subject: [PATCH 0410/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index e79bbe8..30aa8f0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b8a872ced60e6aac953ea3a3bb70b24956da507f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 09:53:04 +0200 Subject: [PATCH 0411/1724] update preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index c784c20..6bc9af7 100644 --- a/src/config.c +++ b/src/config.c @@ -1059,6 +1059,7 @@ static void cfg_create_ini() "dinput_show_cursor=true\n" "singlecpu=false\n" "maxfps=0\n" + "adjmouse=true\n" "\n" "; Twisted Metal\n" "[TWISTED]\n" From e19fca1c7d4316307bab18fa85f3941f20698e37 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 13:53:57 +0200 Subject: [PATCH 0412/1724] #227 make dinput hook optional --- src/config.c | 2 ++ src/hook.c | 25 +++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index 6bc9af7..a00a1dd 100644 --- a/src/config.c +++ b/src/config.c @@ -384,6 +384,7 @@ static void cfg_create_ini() "hook_peekmessage=false\n" "fpupreserve=true\n" "dinput_show_cursor=false\n" + "no_dinput_hook=false\n" "\n" "\n" "\n" @@ -1056,6 +1057,7 @@ static void cfg_create_ini() "\n" "; RollerCoaster Tycoon\n" "[rct]\n" + "no_dinput_hook=true\n" "dinput_show_cursor=true\n" "singlecpu=false\n" "maxfps=0\n" diff --git a/src/hook.c b/src/hook.c index 0cc1f25..11b9ea7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -8,6 +8,7 @@ #include "hook.h" #include "debug.h" #include "dllmain.h" +#include "config.h" #ifdef _MSC_VER #include "detours.h" @@ -581,16 +582,20 @@ void hook_early_init() hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); + + if (!cfg_get_bool("no_dinput_hook", FALSE)) + { + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); + } } void hook_exit() @@ -652,14 +657,18 @@ void hook_exit() hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); + + if (!cfg_get_bool("no_dinput_hook", FALSE)) + { + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); + } } From 61a6dddf8d9ff164ca2c47cd3681fe754597afa0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jul 2023 13:55:10 +0200 Subject: [PATCH 0413/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 30aa8f0..4620f6b 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 2f6564c2928cd64eeac00e88ebaa2a1981e19dd7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 02:57:47 +0200 Subject: [PATCH 0414/1724] update dd caps --- src/dd.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index e2ffced..e576974 100644 --- a/src/dd.c +++ b/src/dd.c @@ -332,9 +332,25 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) DDCAPS_BLTCOLORFILL | DDCAPS_BLTSTRETCH | DDCAPS_CANCLIP | - DDCAPS_CANBLTSYSMEM; + DDCAPS_CANBLTSYSMEM | + DDCAPS_CANCLIPSTRETCHED; + + lpDDDriverCaps->dwCaps2 = + DDCAPS2_NOPAGELOCKREQUIRED | + DDCAPS2_WIDESURFACES; + + lpDDDriverCaps->dwCKeyCaps = + DDCKEYCAPS_SRCBLT | + DDCKEYCAPS_SRCBLTCLRSPACE; + + lpDDDriverCaps->dwFXCaps = + DDFXCAPS_BLTMIRRORLEFTRIGHT | + DDFXCAPS_BLTMIRRORUPDOWN; + + lpDDDriverCaps->dwPalCaps = + DDPCAPS_8BIT | + DDPCAPS_PRIMARYSURFACE; - lpDDDriverCaps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_PRIMARYSURFACE; lpDDDriverCaps->dwVidMemTotal = 16777216; lpDDDriverCaps->dwVidMemFree = 16777216; lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP; From dd214b35d9afb78c1df814fdee352b309d4fd0ca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 03:42:08 +0200 Subject: [PATCH 0415/1724] add DDSD_CAPS --- src/ddsurface.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index a5b7de4..b9eb8aa 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -678,7 +678,15 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur memset(lpDDSurfaceDesc, 0, size); lpDDSurfaceDesc->dwSize = size; - lpDDSurfaceDesc->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_BACKBUFFERCOUNT; + lpDDSurfaceDesc->dwFlags = + DDSD_CAPS | + DDSD_WIDTH | + DDSD_HEIGHT | + DDSD_PITCH | + DDSD_PIXELFORMAT | + DDSD_LPSURFACE | + DDSD_BACKBUFFERCOUNT; + lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; lpDDSurfaceDesc->lPitch = This->pitch; From 5a928caa70fe510fe741e4302c764f4151eb7851 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 05:54:10 +0200 Subject: [PATCH 0416/1724] improve logs --- src/ddsurface.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index b9eb8aa..f0caf67 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1470,6 +1470,8 @@ HRESULT dd_CreateSurface( dst_surface->mapping, map_offset); + SelectObject(dst_surface->hdc, dst_surface->bitmap); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) @@ -1481,9 +1483,7 @@ HRESULT dd_CreateSurface( { g_ddraw->primary = dst_surface; FakePrimarySurface = dst_surface->surface; - } - - SelectObject(dst_surface->hdc, dst_surface->bitmap); + } } if (dst_surface->flags & DDSD_BACKBUFFERCOUNT) @@ -1525,11 +1525,12 @@ HRESULT dd_CreateSurface( } TRACE( - " surface = %p (%ux%u@%u)\n", + " surface = %p (%ux%u@%u), buf = %p\n", dst_surface, dst_surface->width, dst_surface->height, - dst_surface->bpp); + dst_surface->bpp, + dst_surface->surface); *lpDDSurface = dst_surface; From 428acf24ba9887d69a858335660fe158afa8f42c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 06:19:30 +0200 Subject: [PATCH 0417/1724] #189 fix freeze on loading screen --- inc/dd.h | 1 + src/config.c | 6 ++++ src/ddsurface.c | 74 ++++++++++++++++++++++++++----------------------- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 996aa04..26d537e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -183,6 +183,7 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL rgb555; BOOL hook_peekmessage; + BOOL dont_emulate_dc; } CNCDDRAW; diff --git a/src/config.c b/src/config.c index a00a1dd..3b7903f 100644 --- a/src/config.c +++ b/src/config.c @@ -58,6 +58,7 @@ void cfg_load() g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); + g_ddraw->dont_emulate_dc = cfg_get_bool("dont_emulate_dc", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -385,6 +386,7 @@ static void cfg_create_ini() "fpupreserve=true\n" "dinput_show_cursor=false\n" "no_dinput_hook=false\n" + "dont_emulate_dc=false\n" "\n" "\n" "\n" @@ -826,6 +828,10 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" + "; Hooligans: Storm over Europe\n" + "[Hooligans]\n" + "dont_emulate_dc=true\n" + "\n" "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index f0caf67..c3e9268 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1431,53 +1431,59 @@ HRESULT dd_CreateSurface( ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; } - dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); - dst_surface->mapping = - CreateFileMappingA( - INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE | SEC_COMMIT, - 0, - bmp_size + 256, - NULL); - - DWORD map_offset = 0; - - if (dst_surface->mapping) + if (!g_ddraw->dont_emulate_dc) { - LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); - if (data) + dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + + dst_surface->mapping = + CreateFileMappingA( + INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE | SEC_COMMIT, + 0, + bmp_size + 256, + NULL); + + DWORD map_offset = 0; + + if (dst_surface->mapping) { - while (((DWORD)data + map_offset) % 128) map_offset++; - UnmapViewOfFile(data); + LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); + if (data) + { + while (((DWORD)data + map_offset) % 128) map_offset++; + UnmapViewOfFile(data); + } + + if (!data || (map_offset % sizeof(DWORD))) + { + map_offset = 0; + CloseHandle(dst_surface->mapping); + dst_surface->mapping = NULL; + } } - if (!data || (map_offset % sizeof(DWORD))) - { - map_offset = 0; - CloseHandle(dst_surface->mapping); - dst_surface->mapping = NULL; - } + dst_surface->bitmap = + CreateDIBSection( + dst_surface->hdc, + dst_surface->bmi, + DIB_RGB_COLORS, + (void**)&dst_surface->surface, + dst_surface->mapping, + map_offset); } - dst_surface->bitmap = - CreateDIBSection( - dst_surface->hdc, - dst_surface->bmi, - DIB_RGB_COLORS, - (void**)&dst_surface->surface, - dst_surface->mapping, - map_offset); - - SelectObject(dst_surface->hdc, dst_surface->bitmap); - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) { dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size); } + else + { + SelectObject(dst_surface->hdc, dst_surface->bitmap); + } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { From cf6d5957491fd509f41aa6d512fa536e62410845 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 06:38:23 +0200 Subject: [PATCH 0418/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 4620f6b..c230785 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ce435c6dcf71d934dbdd82c0440bc7a14fe54fad Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 08:51:56 +0200 Subject: [PATCH 0419/1724] remove WS_EX_TOOLWINDOW style --- src/dd.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index e576974..815cf17 100644 --- a/src/dd.c +++ b/src/dd.c @@ -755,6 +755,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); } + LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_TOOLWINDOW)) + { + real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + } + if (g_ddraw->wine) { real_SetWindowLongA( @@ -780,7 +787,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); @@ -830,6 +837,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } + LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_TOOLWINDOW)) + { + real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + } + BOOL d3d9_active = FALSE; if (g_ddraw->renderer == d3d9_render_main) From 44774d14d95043ed60c9962e731b74214809cd10 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jul 2023 09:19:48 +0200 Subject: [PATCH 0420/1724] update Age of Wonders presets --- src/config.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/config.c b/src/config.c index 3b7903f..dd7f59a 100644 --- a/src/config.c +++ b/src/config.c @@ -459,19 +459,25 @@ static void cfg_create_ini() "guard_lines=300\n" "minfps=-2\n" "\n" - "; Age of Wonders\n" - "[AoWSM]\n" - "windowed=true\n" - "fullscreen=false\n" - "renderer=gdi\n" - "hook=2\n" - "\n" "; Age of Wonders 2\n" "[AoW2]\n" - "windowed=true\n" - "fullscreen=false\n" - "renderer=gdi\n" - "hook=2\n" + "renderer=opengl\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders 2\n" + "[AoW2Compat]\n" + "renderer=opengl\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders: Shadow Magic\n" + "[AoWSM]\n" + "renderer=opengl\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders: Shadow Magic\n" + "[AoWSMCompat]\n" + "renderer=opengl\n" + "singlecpu=false\n" "\n" "; Anstoss 3\n" "[anstoss3]\n" From bdb80dcf9aadf4060028278a50df50c79eba4d38 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Jul 2023 07:01:25 +0200 Subject: [PATCH 0421/1724] remove old setting --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index dd7f59a..b255a65 100644 --- a/src/config.c +++ b/src/config.c @@ -1111,7 +1111,6 @@ static void cfg_create_ini() "fixmousehook=true\n" "noactivateapp=true\n" "releasealt=true\n" - "novidmem=true\n" "\n" "; Worms Armageddon\n" "[WA]\n" From 5aa33228df062dd54036e1b81882b8c615ea0e41 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Jul 2023 07:26:37 +0200 Subject: [PATCH 0422/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index c230785..3cc275a 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 3 +#define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From e42d0003660d06c0857e4cfa33eb64c6b7835498 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 07:33:57 +0200 Subject: [PATCH 0423/1724] remove fixwndprochook setting --- inc/dd.h | 1 - src/config.c | 12 ------------ src/winapi_hooks.c | 24 ++++++------------------ 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 26d537e..0b19dd9 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -150,7 +150,6 @@ typedef struct CNCDDRAW BOOL toggle_borderless; BOOL nonexclusive; int fixchilds; - BOOL fixwndprochook; BOOL fixnotresponding; BOOL flipclear; BOOL locktopleft; diff --git a/src/config.c b/src/config.c index b255a65..ff2a259 100644 --- a/src/config.c +++ b/src/config.c @@ -38,7 +38,6 @@ void cfg_load() g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); - g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); @@ -370,7 +369,6 @@ static void cfg_create_ini() "game_handles_close=false\n" "accuratetimers=false\n" "fixpitch=true\n" - "fixwndprochook=false\n" "fixnotresponding=false\n" "locktopleft=false\n" "lock_surfaces=false\n" @@ -811,17 +809,14 @@ static void cfg_create_ini() "\n" "; Grand Theft Auto\n" "[Grand Theft Auto]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Grand Theft Auto: London 1969\n" "[gta_uk]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Grand Theft Auto: London 1961\n" "[Gta_61]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Heroes of Might and Magic II: The Succession Wars\n" @@ -841,7 +836,6 @@ static void cfg_create_ini() "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" - "fixwndprochook=true\n" "renderer=opengl\n" "\n" "; Interstate 76\n" @@ -1045,21 +1039,15 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Theme Park World\n" - "[TP]\n" - "fixwndprochook=true\n" - "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "lock_surfaces=true\n" "singlecpu=false\n" - "fixwndprochook=true\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" "lock_surfaces=true\n" "singlecpu=false\n" - "fixwndprochook=true\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2aeddf0..b500cf9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -440,24 +440,12 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) if (nIndex == GWL_STYLE) return 0; - if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + if (nIndex == GWL_WNDPROC) { - if (dwNewLong == (LONG)compat_WndProc) - { - WNDPROC old = g_ddraw->wndproc = g_compat_wndproc; - //g_compat_wndproc = NULL; - return (LONG)old; - } - else - { - if (dwNewLong != (LONG)g_ddraw->wndproc) - { - g_compat_wndproc = g_ddraw->wndproc; - g_ddraw->wndproc = (WNDPROC)dwNewLong; - } + WNDPROC old = g_ddraw->wndproc; + g_ddraw->wndproc = (WNDPROC)dwNewLong; - return (LONG)compat_WndProc; - } + return (LONG)old; } } @@ -468,9 +456,9 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { if (g_ddraw && g_ddraw->hwnd == hWnd) { - if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + if (nIndex == GWL_WNDPROC) { - return (LONG)compat_WndProc; + return (LONG)g_ddraw->wndproc; } } From ef9d5c350f1057e14d124158e76b0a3c3e7c41ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 07:46:19 +0200 Subject: [PATCH 0424/1724] remove d3d9_adapter setting --- inc/dd.h | 1 - src/config.c | 2 -- src/render_d3d9.c | 6 +++--- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 0b19dd9..dd4f411 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -143,7 +143,6 @@ typedef struct CNCDDRAW BOOL fpupreserve; BOOL dinput_show_cursor; BOOL allow_wmactivate; - int d3d9_adapter; BOOL opengl_core; BOOL accurate_timers; BOOL resizable; diff --git a/src/config.c b/src/config.c index ff2a259..f8870dc 100644 --- a/src/config.c +++ b/src/config.c @@ -50,7 +50,6 @@ void cfg_load() g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", TRUE); g_ddraw->dinput_show_cursor = cfg_get_bool("dinput_show_cursor", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); - g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); @@ -360,7 +359,6 @@ static void cfg_create_ini() "\n" "\n" "; Undocumented settings\n" - "d3d9_adapter=0\n" "opengl_core=false\n" "d3d9on12=false\n" "guard_lines=200\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5d94b92..97277bf 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -81,8 +81,8 @@ BOOL d3d9_create() #if _DEBUG D3DADAPTER_IDENTIFIER9 ai = {0}; D3DCAPS9 caps = { 0 }; - HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, g_ddraw->d3d9_adapter, 0, &ai); - HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, g_ddraw->d3d9_adapter, D3DDEVTYPE_HAL, &caps); + HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); + HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); if (SUCCEEDED(hr)) { @@ -145,7 +145,7 @@ BOOL d3d9_create() if (SUCCEEDED( IDirect3D9_CreateDevice( g_d3d9.instance, - g_ddraw->d3d9_adapter, + D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_ddraw->hwnd, behavior_flags[i] | (g_ddraw->fpupreserve ? D3DCREATE_FPU_PRESERVE : 0), From 2ee0767520bcd8c0f83403cfa6a02020e6d1b2eb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 07:55:52 +0200 Subject: [PATCH 0425/1724] remove fpupreserve setting --- inc/dd.h | 1 - src/config.c | 21 --------------------- src/render_d3d9.c | 2 +- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index dd4f411..f504df6 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -140,7 +140,6 @@ typedef struct CNCDDRAW BOOL wine; HCURSOR old_cursor; int show_cursor_count; - BOOL fpupreserve; BOOL dinput_show_cursor; BOOL allow_wmactivate; BOOL opengl_core; diff --git a/src/config.c b/src/config.c index f8870dc..a2f224f 100644 --- a/src/config.c +++ b/src/config.c @@ -47,7 +47,6 @@ void cfg_load() g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", TRUE); g_ddraw->dinput_show_cursor = cfg_get_bool("dinput_show_cursor", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); @@ -379,7 +378,6 @@ static void cfg_create_ini() "bpp=0\n" "rgb555=false\n" "hook_peekmessage=false\n" - "fpupreserve=true\n" "dinput_show_cursor=false\n" "no_dinput_hook=false\n" "dont_emulate_dc=false\n" @@ -488,10 +486,6 @@ static void cfg_create_ini() "[AN]\n" "adjmouse=true\n" "\n" - "; Amerzone\n" - "[AMERZONE]\n" - "fpupreserve=true\n" - "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" @@ -522,25 +516,21 @@ static void cfg_create_ini() "\n" "; Carmageddon\n" "[CARMA95]\n" - "fpupreserve=true\n" "noactivateapp=true\n" "flipclear=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" - "fpupreserve=true\n" "noactivateapp=true\n" "flipclear=true\n" "\n" "; Carmageddon 2\n" "[Carma2_SW]\n" - "fpupreserve=true\n" "noactivateapp=true\n" "\n" "; Captain Claw\n" "[claw]\n" "noactivateapp=true\n" - "fpupreserve=true\n" "renderer=opengl\n" "nonexclusive=true\n" "\n" @@ -724,14 +714,6 @@ static void cfg_create_ini() "resolutions=2\n" "singlecpu=false\n" "\n" - "; Dune 2000\n" - "[dune2000]\n" - "fpupreserve=true\n" - "\n" - "; Dune 2000 - CnCNet\n" - "[dune2000-spawn]\n" - "fpupreserve=true\n" - "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" "maxgameticks=60\n" @@ -839,7 +821,6 @@ static void cfg_create_ini() "; Interstate 76\n" "[i76]\n" "adjmouse=true\n" - "fpupreserve=true\n" "\n" "; Infantry Online\n" "[infantry]\n" @@ -923,7 +904,6 @@ static void cfg_create_ini() "\n" "; Mech Warrior 3\n" "[Mech3]\n" - "fpupreserve=true\n" "nonexclusive=true\n" "\n" "; Moorhuhn\n" @@ -1022,7 +1002,6 @@ static void cfg_create_ini() "\n" "; Sim City 3000\n" "[SC3]\n" - "fpupreserve=true\n" "minfps=-2\n" "\n" "; Shadow Watch\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 97277bf..17c58b3 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -148,7 +148,7 @@ BOOL d3d9_create() D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_ddraw->hwnd, - behavior_flags[i] | (g_ddraw->fpupreserve ? D3DCREATE_FPU_PRESERVE : 0), + behavior_flags[i], &g_d3d9.params, &g_d3d9.device))) return g_d3d9.device && d3d9_create_resources() && d3d9_set_states(); From 63257823b1e9e5478e550d77dc14da5dab5a4253 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 09:17:57 +0200 Subject: [PATCH 0426/1724] remove dont_emulate_dc setting --- inc/dd.h | 1 - inc/ddsurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 4 ++++ src/config.c | 6 ------ src/ddsurface.c | 14 ++++++++++++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index f504df6..4b54dc6 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -180,7 +180,6 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL rgb555; BOOL hook_peekmessage; - BOOL dont_emulate_dc; } CNCDDRAW; diff --git a/inc/ddsurface.h b/inc/ddsurface.h index 8a3583c..80e37ae 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -37,5 +37,6 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); +extern LONG g_dds_gdi_handles; #endif diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 154f73f..973b5ba 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -92,6 +92,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->bitmap) { DeleteObject(This->bitmap); + InterlockedDecrement(&g_dds_gdi_handles); } else if (This->surface && !This->custom_buf) { @@ -99,7 +100,10 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) } if (This->hdc) + { DeleteDC(This->hdc); + InterlockedDecrement(&g_dds_gdi_handles); + } if (This->bmi) HeapFree(GetProcessHeap(), 0, This->bmi); diff --git a/src/config.c b/src/config.c index a2f224f..afabc83 100644 --- a/src/config.c +++ b/src/config.c @@ -55,7 +55,6 @@ void cfg_load() g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); - g_ddraw->dont_emulate_dc = cfg_get_bool("dont_emulate_dc", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); if (g_ddraw->locktopleft) @@ -380,7 +379,6 @@ static void cfg_create_ini() "hook_peekmessage=false\n" "dinput_show_cursor=false\n" "no_dinput_hook=false\n" - "dont_emulate_dc=false\n" "\n" "\n" "\n" @@ -809,10 +807,6 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" - "; Hooligans: Storm over Europe\n" - "[Hooligans]\n" - "dont_emulate_dc=true\n" - "\n" "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index c3e9268..1914d3d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -12,6 +12,8 @@ #include "blt.h" +LONG g_dds_gdi_handles; + HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurface) { if (lpDDSurface) @@ -1205,6 +1207,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD if (This->bitmap) { DeleteObject(This->bitmap); + InterlockedDecrement(&g_dds_gdi_handles); This->bitmap = NULL; } else if (This->surface && !This->custom_buf) @@ -1216,6 +1219,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD if (This->hdc) { DeleteDC(This->hdc); + InterlockedDecrement(&g_dds_gdi_handles); This->hdc = NULL; } @@ -1432,10 +1436,13 @@ HRESULT dd_CreateSurface( } - if (!g_ddraw->dont_emulate_dc) + if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + if (dst_surface->hdc) + InterlockedIncrement(&g_dds_gdi_handles); + dst_surface->mapping = CreateFileMappingA( INVALID_HANDLE_VALUE, @@ -1472,6 +1479,9 @@ HRESULT dd_CreateSurface( (void**)&dst_surface->surface, dst_surface->mapping, map_offset); + + if (dst_surface->bitmap) + InterlockedIncrement(&g_dds_gdi_handles); } dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); @@ -1489,7 +1499,7 @@ HRESULT dd_CreateSurface( { g_ddraw->primary = dst_surface; FakePrimarySurface = dst_surface->surface; - } + } } if (dst_surface->flags & DDSD_BACKBUFFERCOUNT) From 6170e267f2e173fe8f2ab336424b8d5c7352d271 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 10:30:27 +0200 Subject: [PATCH 0427/1724] remove gdilinear setting --- inc/dd.h | 1 - src/config.c | 2 -- src/render_gdi.c | 6 ------ 3 files changed, 9 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 4b54dc6..fb87103 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -153,7 +153,6 @@ typedef struct CNCDDRAW BOOL locktopleft; BOOL lock_surfaces; int d3d9_filter; - BOOL gdilinear; BOOL d3d9on12; int guard_lines; int resolutions; diff --git a/src/config.c b/src/config.c index afabc83..0a7e671 100644 --- a/src/config.c +++ b/src/config.c @@ -44,7 +44,6 @@ void cfg_load() g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); - g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->dinput_show_cursor = cfg_get_bool("dinput_show_cursor", FALSE); @@ -369,7 +368,6 @@ static void cfg_create_ini() "locktopleft=false\n" "lock_surfaces=false\n" "releasealt=false\n" - "gdilinear=false\n" "allow_wmactivate=false\n" "dinputhook=false\n" "flipclear=false\n" diff --git a/src/render_gdi.c b/src/render_gdi.c index bf34598..f8dfb24 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -97,12 +97,6 @@ DWORD WINAPI gdi_render_main(void) FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } - if (g_ddraw->gdilinear) - { - SetStretchBltMode(g_ddraw->render.hdc, HALFTONE); - SetBrushOrgEx(g_ddraw->render.hdc, 0, 0, NULL); - } - if (g_ddraw->bnet_active) { RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; From 6989cb806e7b13699cc2d1da360f4d1964cc77da Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 10:42:02 +0200 Subject: [PATCH 0428/1724] remove dinput_show_cursor setting --- inc/dd.h | 1 - src/config.c | 5 +---- src/directinput.c | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fb87103..7aca2ef 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -140,7 +140,6 @@ typedef struct CNCDDRAW BOOL wine; HCURSOR old_cursor; int show_cursor_count; - BOOL dinput_show_cursor; BOOL allow_wmactivate; BOOL opengl_core; BOOL accurate_timers; diff --git a/src/config.c b/src/config.c index 0a7e671..827600a 100644 --- a/src/config.c +++ b/src/config.c @@ -46,7 +46,6 @@ void cfg_load() g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - g_ddraw->dinput_show_cursor = cfg_get_bool("dinput_show_cursor", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); @@ -374,8 +373,7 @@ static void cfg_create_ini() "fixmousehook=false\n" "bpp=0\n" "rgb555=false\n" - "hook_peekmessage=false\n" - "dinput_show_cursor=false\n" + "hook_peekmessage=false\n" "no_dinput_hook=false\n" "\n" "\n" @@ -1027,7 +1025,6 @@ static void cfg_create_ini() "; RollerCoaster Tycoon\n" "[rct]\n" "no_dinput_hook=true\n" - "dinput_show_cursor=true\n" "singlecpu=false\n" "maxfps=0\n" "adjmouse=true\n" diff --git a/src/directinput.c b/src/directinput.c index 9dd1944..86be466 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -40,7 +40,7 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); - if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE) && !g_ddraw->dinput_show_cursor) + if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) { if (g_mouse_locked || g_ddraw->devmode) { From bfbbca9d327e7c404f2c00ecf8e54f789c1bf299 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 12:12:33 +0200 Subject: [PATCH 0429/1724] fix string --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 827600a..0b124dd 100644 --- a/src/config.c +++ b/src/config.c @@ -386,7 +386,7 @@ static void cfg_create_ini() "; Switch between windowed and fullscreen mode = [Alt] + ???\n" "keytogglefullscreen=0x0D\n" "\n" - "; Maximize window without frame = [Alt] + ???\n" + "; Maximize window = [Alt] + ???\n" "keytogglemaximize=0x22\n" "\n" "; Unlock cursor 1 = [Ctrl] + ???\n" From 9f6a6be340ad48e9fa2b5d5e3537ba41c0e83226 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 12:13:01 +0200 Subject: [PATCH 0430/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd21ff7..290d45c 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor * [Right Alt] + [Right Ctrl] = Unlock cursor -* [Alt] + [Page Down] = Maximize window (Window borders must be disabled in config) +* [Alt] + [Page Down] = Maximize window   From 377d34fbca76be0b41367e4154b2143a27559336 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 17:09:23 +0200 Subject: [PATCH 0431/1724] add D3DCREATE_FPU_PRESERVE --- src/render_d3d9.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 17c58b3..f582c57 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -133,11 +133,11 @@ BOOL d3d9_create() g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING, - D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING, - D3DCREATE_MULTITHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE, + D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, + D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, + D3DCREATE_MULTITHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, }; for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) From 81294dbecf61a1257835a0158a682fbe94896203 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 03:02:35 +0200 Subject: [PATCH 0432/1724] remove old code --- src/winapi_hooks.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b500cf9..191a4c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -427,12 +427,6 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar return result; } -static WNDPROC g_compat_wndproc; -LRESULT CALLBACK compat_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return CallWindowProcA(g_compat_wndproc, hWnd, uMsg, wParam, lParam); -} - LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { if (g_ddraw && g_ddraw->hwnd == hWnd) From cddf2524d246fdcfbe0f2dad9ea195364fba47c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 03:06:09 +0200 Subject: [PATCH 0433/1724] remove bpp setting --- inc/dd.h | 1 - inc/render_d3d9.h | 1 - src/config.c | 7 ------- src/dd.c | 8 +------- src/render_d3d9.c | 6 ++---- 5 files changed, 3 insertions(+), 20 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 7aca2ef..8d6ef39 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -81,7 +81,6 @@ typedef struct CNCDDRAW DWORD minfps_tick_len; int width; int height; - int bpp; int opengl_y_align; HDC hdc; diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index d1c52a0..2de021c 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -23,7 +23,6 @@ typedef struct D3D9RENDERER IDirect3DPixelShader9* pixel_shader_upscale; float scale_w; float scale_h; - int bits_per_pixel; int tex_width; int tex_height; } D3D9RENDERER; diff --git a/src/config.c b/src/config.c index 0b124dd..b2a2be8 100644 --- a/src/config.c +++ b/src/config.c @@ -139,13 +139,6 @@ void cfg_load() SetProcessAffinityMask(proc, system_affinity); } - g_ddraw->render.bpp = cfg_get_int("bpp", 0); - - if (g_ddraw->render.bpp != 16 && g_ddraw->render.bpp != 24 && g_ddraw->render.bpp != 32) - { - g_ddraw->render.bpp = 0; - } - /* to do: read .glslp config file instead of the shader and apply the correct settings */ cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_ddraw->shader, sizeof(g_ddraw->shader)); diff --git a/src/dd.c b/src/dd.c index 815cf17..e98f485 100644 --- a/src/dd.c +++ b/src/dd.c @@ -567,12 +567,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (g_ddraw->render.bpp) - { - g_ddraw->render.mode.dmFields |= DM_BITSPERPEL; - g_ddraw->render.mode.dmBitsPerPel = g_ddraw->render.bpp; - } - if (!g_ddraw->windowed) { /* Making sure the chosen resolution is valid */ @@ -951,7 +945,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw->renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; + pfd.cColorBits = g_ddraw->mode.dmBitsPerPel; pfd.iLayerType = PFD_MAIN_PLANE; SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index f582c57..5413120 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -117,8 +117,6 @@ BOOL d3d9_create() TRACE("+------------------------------------------------\n"); } #endif - - g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; g_d3d9.hwnd = g_ddraw->hwnd; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); @@ -129,7 +127,7 @@ BOOL d3d9_create() g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { @@ -174,7 +172,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.Windowed = windowed; g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { From 2a750a53f627e3a62ee37e0d5ed0013b9cd7583c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 03:07:16 +0200 Subject: [PATCH 0434/1724] remove bpp from ini --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index b2a2be8..80c2b58 100644 --- a/src/config.c +++ b/src/config.c @@ -364,7 +364,6 @@ static void cfg_create_ini() "dinputhook=false\n" "flipclear=false\n" "fixmousehook=false\n" - "bpp=0\n" "rgb555=false\n" "hook_peekmessage=false\n" "no_dinput_hook=false\n" From af9cd76d39a2dd2077d4ad4b9e37091052e3d5bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 05:46:20 +0200 Subject: [PATCH 0435/1724] fix mouse sensitivity scaling for space rangers --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 80c2b58..4916b55 100644 --- a/src/config.c +++ b/src/config.c @@ -972,7 +972,7 @@ static void cfg_create_ini() "\n" "; Space Rangers\n" "[Rangers]\n" - "locktopleft=true\n" + "hook_peekmessage=true\n" "\n" "; Stronghold Crusader Extreme HD\n" "[Stronghold_Crusader_Extreme]\n" From 4312e1368fffef480292a7de4eefda649186c642 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 06:16:58 +0200 Subject: [PATCH 0436/1724] allow custom ticks values on flip --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 1914d3d..9fb04e8 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -778,7 +778,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); SwitchToThread(); - if ((dwFlags & DDFLIP_WAIT) || g_ddraw->maxgameticks == -2) + if (g_ddraw->maxgameticks < 60 && ((dwFlags & DDFLIP_WAIT) || g_ddraw->maxgameticks == -2)) { dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } From 396ccf9da78bb7b3e0b5d586b316aff39b7d01a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 06:23:37 +0200 Subject: [PATCH 0437/1724] fix for last commit --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 9fb04e8..cdc3368 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -778,7 +778,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw->maxgameticks < 60 && ((dwFlags & DDFLIP_WAIT) || g_ddraw->maxgameticks == -2)) + if ((g_ddraw->maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_ddraw->maxgameticks == -2) { dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } From c85177bc8f42cc74551b61b42d4437a8fda97619 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 07:10:18 +0200 Subject: [PATCH 0438/1724] fix mouse sensitivity scaling for lionheart --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 4916b55..af4cc41 100644 --- a/src/config.c +++ b/src/config.c @@ -870,7 +870,7 @@ static void cfg_create_ini() "\n" "; Lionheart\n" "[Lionheart]\n" - "locktopleft=true\n" + "hook_peekmessage=true\n" "\n" "; Majesty Gold\n" "[Majesty]\n" From c384f6166e5d1d6ecb2aae3b0a461617f693bc4f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 07:11:23 +0200 Subject: [PATCH 0439/1724] remove locktopleft setting --- inc/dd.h | 1 - src/config.c | 4 ---- src/dd.c | 9 +++------ 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 8d6ef39..857804a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -148,7 +148,6 @@ typedef struct CNCDDRAW int fixchilds; BOOL fixnotresponding; BOOL flipclear; - BOOL locktopleft; BOOL lock_surfaces; int d3d9_filter; BOOL d3d9on12; diff --git a/src/config.c b/src/config.c index af4cc41..a47b6f9 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,6 @@ void cfg_load() g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); - g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); @@ -55,8 +54,6 @@ void cfg_load() g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); - if (g_ddraw->locktopleft) - g_ddraw->adjmouse = FALSE; g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); @@ -357,7 +354,6 @@ static void cfg_create_ini() "accuratetimers=false\n" "fixpitch=true\n" "fixnotresponding=false\n" - "locktopleft=false\n" "lock_surfaces=false\n" "releasealt=false\n" "allow_wmactivate=false\n" diff --git a/src/dd.c b/src/dd.c index e98f485..f77449a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -693,12 +693,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.scale_h = ((float)g_ddraw->render.viewport.height / g_ddraw->height); g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); - - if (!g_ddraw->locktopleft) - { - g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; - g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; - } +{ + g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; + g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust;; g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust;; From a44016363723f21ef55b11b4abac6375cffa4517 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 07:30:18 +0200 Subject: [PATCH 0440/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 3cc275a..a4e1968 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From caf376801aa8e5ce4e0286f35244cffef96ddb06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 07:59:22 +0200 Subject: [PATCH 0441/1724] does now build again, oops --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index f77449a..0a89b35 100644 --- a/src/dd.c +++ b/src/dd.c @@ -693,7 +693,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.scale_h = ((float)g_ddraw->render.viewport.height / g_ddraw->height); g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); -{ + g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; From 02dcfd96b6483053e206d7f226c11d4162a0c9ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 13:47:27 +0200 Subject: [PATCH 0442/1724] remove accuratetimers setting --- inc/dd.h | 1 - src/config.c | 11 +++-------- src/dd.c | 15 +++++++-------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 857804a..290886d 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -141,7 +141,6 @@ typedef struct CNCDDRAW int show_cursor_count; BOOL allow_wmactivate; BOOL opengl_core; - BOOL accurate_timers; BOOL resizable; BOOL toggle_borderless; BOOL nonexclusive; diff --git a/src/config.c b/src/config.c index a47b6f9..5509907 100644 --- a/src/config.c +++ b/src/config.c @@ -33,7 +33,6 @@ void cfg_load() g_ddraw->vsync = cfg_get_bool("vsync", FALSE); g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE); g_ddraw->vhack = cfg_get_bool("vhack", FALSE); - g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); @@ -94,15 +93,13 @@ void cfg_load() } /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ - if (g_ddraw->accurate_timers || g_ddraw->vsync) - g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); g_ddraw->maxgameticks = cfg_get_int("maxgameticks", 0); if (g_ddraw->maxgameticks > 0 && g_ddraw->maxgameticks <= 1000) { - if (g_ddraw->accurate_timers) - g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float len = 1000.0f / g_ddraw->maxgameticks; g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); @@ -112,8 +109,7 @@ void cfg_load() if (g_ddraw->maxgameticks >= 0 || g_ddraw->maxgameticks == -2) { /* always using 60 fps for flip... */ - if (g_ddraw->accurate_timers) - g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float flip_len = 1000.0f / 60; g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); @@ -351,7 +347,6 @@ static void cfg_create_ini() "max_resolutions=0\n" "limit_bltfast=false\n" "game_handles_close=false\n" - "accuratetimers=false\n" "fixpitch=true\n" "fixnotresponding=false\n" "lock_surfaces=false\n" diff --git a/src/dd.c b/src/dd.c index 0a89b35..4ef8b89 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1030,21 +1030,20 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) if (g_ddraw->flip_limiter.htimer) { - FILETIME last_flip_ft = { 0 }; - GetSystemTimeAsFileTime(&last_flip_ft); + FILETIME ft = { 0 }; + GetSystemTimeAsFileTime(&ft); - if (!g_ddraw->flip_limiter.due_time.QuadPart) + if (CompareFileTime((FILETIME*)&g_ddraw->flip_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw->flip_limiter.due_time, &last_flip_ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw->flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - while (CompareFileTime((FILETIME*)&g_ddraw->flip_limiter.due_time, &last_flip_ft) == -1) - g_ddraw->flip_limiter.due_time.QuadPart += g_ddraw->flip_limiter.tick_length_ns; - - SetWaitableTimer(g_ddraw->flip_limiter.htimer, &g_ddraw->flip_limiter.due_time, 0, NULL, NULL, FALSE); WaitForSingleObject(g_ddraw->flip_limiter.htimer, g_ddraw->flip_limiter.tick_length * 2); } + + g_ddraw->flip_limiter.due_time.QuadPart += g_ddraw->flip_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw->flip_limiter.htimer, &g_ddraw->flip_limiter.due_time, 0, NULL, NULL, FALSE); } else { From fa50f37faf03b130ada455160d51314f1a23104f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 13:54:22 +0200 Subject: [PATCH 0443/1724] adjust preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 5509907..809a772 100644 --- a/src/config.c +++ b/src/config.c @@ -483,7 +483,7 @@ static void cfg_create_ini() "\n" "; Blade & Sword\n" "[comeon]\n" - "maxgameticks=62\n" + "maxgameticks=60\n" "fixchilds=3\n" "\n" "; Blood II - The Chosen / Shogo - Mobile Armor Division\n" From 6ea51be8d59382fad8a65edb9975a51d8dc3f49a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Aug 2023 18:36:26 +0200 Subject: [PATCH 0444/1724] improve logs --- src/IDirectDraw/IDirectDraw.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 89659ca..1c779c9 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -13,7 +13,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid { TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); - HRESULT ret = DDERR_UNSUPPORTED; + HRESULT ret = E_NOINTERFACE; if (riid) { @@ -104,12 +104,14 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid *ppvObj = d3d; ret = S_OK; - } - /* - else if ( - !g_ddraw->passthrough && - (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid))) + } + else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid)) { + TRACE("NOT_IMPLEMENTED GUID = %08X (IID_IXXMediaStream)\n", ((GUID*)riid)->Data1); + + ret = E_NOINTERFACE; + + /* IAMMediaStreamImpl* ms = (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl)); @@ -118,11 +120,11 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ms->lpVtbl = &g_ms_vtbl; ms->lpVtbl->AddRef(ms); - *obj = ms; + *ppvObj = ms; ret = S_OK; + */ } - */ else { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); @@ -144,9 +146,10 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid else ret = E_NOINTERFACE; } + } - TRACE("<- %s\n", __FUNCTION__); + TRACE("<- %s(result=%08X)\n", __FUNCTION__, ret); return ret; } From 3b975a32331c424d3d8f707eded3500ccd8e4cf1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 06:13:53 +0200 Subject: [PATCH 0445/1724] #173 unlock cursor in windowed mode for starcraft --- src/dd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dd.c b/src/dd.c index 4ef8b89..4dfe35f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -966,6 +966,12 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) while (real_ShowCursor(TRUE) < 0); } + /* Starcraft locks the cursor before ddraw.dll was loaded */ + if (g_ddraw->windowed && (!g_ddraw->fullscreen || real_GetForegroundWindow() != g_ddraw->hwnd)) + { + real_ClipCursor(NULL); + } + GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); g_ddraw->isredalert = strcmp(g_ddraw->title, "Red Alert") == 0; From cd47d238f1f2ee3219ba3f4d910813d8d45dacb1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 06:19:11 +0200 Subject: [PATCH 0446/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index a4e1968..360ff87 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 8fe772d385abde0ceefe8e079ff205808c2da205 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 06:39:50 +0200 Subject: [PATCH 0447/1724] call mouse_unlock on initial hook --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 4dfe35f..c7eab42 100644 --- a/src/dd.c +++ b/src/dd.c @@ -967,9 +967,10 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } /* Starcraft locks the cursor before ddraw.dll was loaded */ - if (g_ddraw->windowed && (!g_ddraw->fullscreen || real_GetForegroundWindow() != g_ddraw->hwnd)) + if (g_ddraw->windowed) { real_ClipCursor(NULL); + mouse_unlock(); } GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); From 1452bbe5989847599c55ced122356972e9faf900 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 15:15:44 +0200 Subject: [PATCH 0448/1724] remove early hook function --- inc/hook.h | 3 +- src/config.c | 1 - src/directinput.c | 11 ++-- src/dllmain.c | 3 +- src/hook.c | 95 ++++++++++++++++---------------- src/mouse.c | 4 +- src/winapi_hooks.c | 132 ++++++++++++++++++++++++++++++++------------- 7 files changed, 154 insertions(+), 95 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 3f3cb82..d42bef9 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -9,7 +9,7 @@ #define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[28]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -103,7 +103,6 @@ extern BOOL g_hook_dinput; extern BOOL g_hook_active; void hook_init(); -void hook_early_init(); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); diff --git a/src/config.c b/src/config.c index 809a772..4272f84 100644 --- a/src/config.c +++ b/src/config.c @@ -76,7 +76,6 @@ void cfg_load() g_config.save_settings = cfg_get_int("savesettings", 1); - g_hook_method = cfg_get_int("hook", 4); g_hook_dinput = cfg_get_bool("dinputhook", FALSE); g_ddraw->render.maxfps = cfg_get_int("maxfps", -1); diff --git a/src/directinput.c b/src/directinput.c index 86be466..047a2f1 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -195,7 +195,7 @@ HRESULT WINAPI fake_DirectInputCreateA( HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -229,7 +229,7 @@ HRESULT WINAPI fake_DirectInputCreateW( HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -264,7 +264,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -273,7 +273,8 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDeviceEx && riidltf && - (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf))) + (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) + && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDeviceEx = (DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx); @@ -308,7 +309,7 @@ HRESULT WINAPI fake_DirectInput8Create( HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice) + if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); diff --git a/src/dllmain.c b/src/dllmain.c index 9aadbbe..b084ecc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -101,7 +101,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } timeBeginPeriod(1); - hook_early_init(); + g_hook_method = cfg_get_int("hook", 4); + hook_init(); break; } case DLL_PROCESS_DETACH: diff --git a/src/hook.c b/src/hook.c index 11b9ea7..a8d4e37 100644 --- a/src/hook.c +++ b/src/hook.c @@ -90,6 +90,30 @@ static HOOKLIST g_hooks[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, + { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, + { "", NULL, NULL, 0 } + } + }, + { + "ole32.dll", + { + { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 | SKIP_HOOK3 }, + { "", NULL, NULL, 0 } + } + }, + { + "dinput.dll", + { + { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 | SKIP_HOOK3 }, + { "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 | SKIP_HOOK3 }, + { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 | SKIP_HOOK3 }, + { "", NULL, NULL, 0 } + } + }, + { + "dinput8.dll", + { + { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 | SKIP_HOOK3 }, { "", NULL, NULL, 0 } } }, @@ -110,6 +134,7 @@ static HOOKLIST g_hooks[] = { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 }, { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 | SKIP_HOOK3 }, { "", NULL, NULL, 0 } } }, @@ -400,7 +425,10 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE_EXT("Module %s = %p\n", mod_path, hmod); + if (initial_hook) + { + TRACE_EXT("Module %s = %p\n", mod_path, hmod); + } _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); @@ -515,7 +543,7 @@ void hook_init() BOOL initial_hook = !g_hook_active; #ifdef _MSC_VER - if (initial_hook && g_hook_dinput) + if (initial_hook && cfg_get_bool("dinputhook", FALSE)) { real_DirectInputCreateA = (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); @@ -563,41 +591,29 @@ void hook_init() } #endif +#if defined(_DEBUG) && defined(_MSC_VER) + if (initial_hook) + { + hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); + DetourTransactionCommit(); + } +#endif + + if (initial_hook) + { + hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + } + g_hook_active = TRUE; hook_create((HOOKLIST*)&g_hooks, initial_hook); } } -void hook_early_init() -{ -#if defined(_DEBUG) && defined(_MSC_VER) - hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); - DetourTransactionCommit(); -#endif - - hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); - hook_patch_iat(GetModuleHandle("XIIIGame.dll"), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans - hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 - hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK - hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE - hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); - - if (!cfg_get_bool("no_dinput_hook", FALSE)) - { - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); - hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); - } -} - void hook_exit() { if (g_hook_active) @@ -605,7 +621,7 @@ void hook_exit() g_hook_active = FALSE; #ifdef _MSC_VER - if (g_hook_dinput) + if (cfg_get_bool("dinputhook", FALSE)) { if (real_DirectInputCreateA) { @@ -655,20 +671,5 @@ void hook_exit() real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #endif - hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); - hook_patch_iat(GetModuleHandle("XIIIGame.dll"), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); //Hooligans - hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 - hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "ClipCursor", (PROC)fake_ClipCursor); //NexusTK - hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowLongA", (PROC)fake_SetWindowLongA); //BALDR FORCE EXE hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA); - - if (!cfg_get_bool("no_dinput_hook", FALSE)) - { - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); - } } diff --git a/src/mouse.c b/src/mouse.c index e54438d..1a805da 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -11,7 +11,7 @@ HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_ddraw->devmode || g_ddraw->bnet_active) + if (g_ddraw->devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) return; if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd)) @@ -53,7 +53,7 @@ void mouse_lock() void mouse_unlock() { - if (g_ddraw->devmode || !g_hook_active) + if (g_ddraw->devmode || !g_hook_active || !g_ddraw->hwnd) return; if (g_mouse_locked) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 191a4c0..f3dfb38 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -16,9 +16,12 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { + if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + return real_GetCursorPos(lpPoint); + POINT pt, realpt; - if (!real_GetCursorPos(&pt) || !g_ddraw) + if (!real_GetCursorPos(&pt)) return FALSE; realpt.x = pt.x; @@ -130,7 +133,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd && g_ddraw->width) { RECT dst_rc = { 0, @@ -176,7 +179,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) int WINAPI fake_ShowCursor(BOOL bShow) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd) { if (g_mouse_locked || g_ddraw->devmode) { @@ -197,7 +200,7 @@ int WINAPI fake_ShowCursor(BOOL bShow) HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd) { HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); @@ -260,7 +263,10 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - if (g_ddraw && g_ddraw->hwnd != hWnd) + if (!g_ddraw || !g_ddraw->hwnd) + return real_ClientToScreen(hWnd, lpPoint); + + if (g_ddraw->hwnd != hWnd) return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint); return TRUE; @@ -268,7 +274,10 @@ BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint) BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - if (g_ddraw && g_ddraw->hwnd != hWnd) + if (!g_ddraw || !g_ddraw->hwnd) + return real_ScreenToClient(hWnd, lpPoint); + + if (g_ddraw->hwnd != hWnd) return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); return TRUE; @@ -276,35 +285,41 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) BOOL WINAPI fake_SetCursorPos(int X, int Y) { - if (g_ddraw && !g_mouse_locked && !g_ddraw->devmode) + if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + return real_SetCursorPos(X, Y); + + if (!g_mouse_locked && !g_ddraw->devmode) return TRUE; POINT pt = { X, Y }; - if (g_ddraw) + if (g_ddraw->adjmouse) { - if (g_ddraw->adjmouse) - { - pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w)); - pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); - } - - pt.x += g_ddraw->mouse.x_adjust; - pt.y += g_ddraw->mouse.y_adjust; + pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w)); + pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); } - return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); + pt.x += g_ddraw->mouse.x_adjust; + pt.y += g_ddraw->mouse.y_adjust; + + return real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); } HWND WINAPI fake_WindowFromPoint(POINT Point) { + if (!g_ddraw || !g_ddraw->hwnd) + return real_WindowFromPoint(Point); + POINT pt = { Point.x, Point.y }; - return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; + return real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; } BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) { - if (lpRect && g_ddraw) + if (!g_ddraw || !g_ddraw->width) + return real_GetClipCursor(lpRect); + + if (lpRect) { lpRect->bottom = g_ddraw->height; lpRect->left = 0; @@ -319,12 +334,15 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) { - return pci && g_ddraw && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos); + if (!g_ddraw || !g_ddraw->hwnd) + return real_GetCursorInfo(pci); + + return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos); } int WINAPI fake_GetSystemMetrics(int nIndex) { - if (g_ddraw) + if (g_ddraw && g_ddraw->width) { if (nIndex == SM_CXSCREEN) return g_ddraw->width; @@ -396,7 +414,10 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE) + if (!g_ddraw || !g_ddraw->hwnd) + return real_SendMessageA(hWnd, Msg, wParam, lParam); + + if (g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); @@ -410,7 +431,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); } - if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3)) + if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3)) { Msg = WM_SIZE_DDRAW; } @@ -471,7 +492,7 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) { - if (g_ddraw) + if (g_ddraw && g_ddraw->hwnd) { if (hWndTo == HWND_DESKTOP) { @@ -570,7 +591,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_ddraw && g_ddraw->hook_peekmessage) + if (result && g_ddraw && g_ddraw->width && g_ddraw->hook_peekmessage) { switch (lpMsg->message) { @@ -882,6 +903,14 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); +#ifdef _DEBUG_X + char mod_path[MAX_PATH] = { 0 }; + if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + { + TRACE_EXT("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + } +#endif + hook_init(); return hmod; @@ -891,6 +920,14 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryW(lpLibFileName); +#ifdef _DEBUG + char mod_path[MAX_PATH] = { 0 }; + if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + { + TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod); + } +#endif + hook_init(); return hmod; @@ -900,6 +937,14 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF { HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags); +#ifdef _DEBUG + char mod_path[MAX_PATH] = { 0 }; + if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + { + TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + } +#endif + hook_init(); return hmod; @@ -909,6 +954,14 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw { HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags); +#ifdef _DEBUG + char mod_path[MAX_PATH] = { 0 }; + if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + { + TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod); + } +#endif + hook_init(); return hmod; @@ -1008,12 +1061,12 @@ HWND WINAPI fake_CreateWindowExA( int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { /* Fix for SMACKW32.DLL creating another window that steals the focus */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd) { dwStyle &= ~WS_VISIBLE; } - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw && g_ddraw->hwnd) { if (!g_ddraw->bnet_active) { @@ -1080,18 +1133,23 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv) { - if (rclsid && riid && (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid))) + if (rclsid && riid) { - if (IsEqualGUID(&IID_IDirectDraw2, riid) || - IsEqualGUID(&IID_IDirectDraw4, riid) || - IsEqualGUID(&IID_IDirectDraw7, riid)) + TRACE("CoCreateInstance rclsid = %08X, riid = %08X, \n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); + + if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { - return dd_CreateEx(NULL, ppv, riid, NULL); - } - else - { - return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); - } + if (IsEqualGUID(&IID_IDirectDraw2, riid) || + IsEqualGUID(&IID_IDirectDraw4, riid) || + IsEqualGUID(&IID_IDirectDraw7, riid)) + { + return dd_CreateEx(NULL, ppv, riid, NULL); + } + else + { + return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); + } + } } return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); From ad1a35aa84216219bdd1312b7dc5fb75c85295c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 17:09:01 +0200 Subject: [PATCH 0449/1724] remove dinputhook setting --- inc/directinput.h | 5 +++ inc/hook.h | 3 +- src/config.c | 16 -------- src/dd.c | 2 +- src/directinput.c | 98 ++++++++++++++++++++++++++++++++++++++++++++- src/dllmain.c | 4 +- src/hook.c | 99 ++-------------------------------------------- src/winapi_hooks.c | 38 ++++++++++++++++-- src/wndproc.c | 3 +- 9 files changed, 146 insertions(+), 122 deletions(-) diff --git a/inc/directinput.h b/inc/directinput.h index 0bd822c..cc0f25a 100644 --- a/inc/directinput.h +++ b/inc/directinput.h @@ -14,6 +14,8 @@ typedef HRESULT(WINAPI* DIDSETCOOPERATIVELEVELPROC)(IDirectInputDeviceA*, HWND, typedef HRESULT(WINAPI* DIDGETDEVICEDATAPROC)(IDirectInputDeviceA*, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD); typedef HRESULT(WINAPI* DIDGETDEVICESTATEPROC)(IDirectInputDeviceA*, DWORD, LPVOID); +extern BOOL g_dinput_hook_active; + extern DIRECTINPUTCREATEAPROC real_DirectInputCreateA; extern DIRECTINPUTCREATEWPROC real_DirectInputCreateW; extern DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; @@ -24,4 +26,7 @@ HRESULT WINAPI fake_DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIREC HRESULT WINAPI fake_DirectInputCreateEx(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter); HRESULT WINAPI fake_DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter); +void dinput_hook_init(); +void dinput_hook_exit(); + #endif diff --git a/inc/hook.h b/inc/hook.h index d42bef9..e5025c6 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -99,10 +99,9 @@ extern COCREATEINSTANCEPROC real_CoCreateInstance; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern int g_hook_method; -extern BOOL g_hook_dinput; extern BOOL g_hook_active; -void hook_init(); +void hook_init(BOOL initial_hook); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); diff --git a/src/config.c b/src/config.c index 4272f84..9b785a0 100644 --- a/src/config.c +++ b/src/config.c @@ -76,8 +76,6 @@ void cfg_load() g_config.save_settings = cfg_get_int("savesettings", 1); - g_hook_dinput = cfg_get_bool("dinputhook", FALSE); - g_ddraw->render.maxfps = cfg_get_int("maxfps", -1); g_ddraw->render.minfps = cfg_get_int("minfps", 0); @@ -351,7 +349,6 @@ static void cfg_create_ini() "lock_surfaces=false\n" "releasealt=false\n" "allow_wmactivate=false\n" - "dinputhook=false\n" "flipclear=false\n" "fixmousehook=false\n" "rgb555=false\n" @@ -735,14 +732,6 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" - "; Fallout\n" - "[falloutw]\n" - "dinputhook=true\n" - "\n" - "; Fallout 2\n" - "[FALLOUT2]\n" - "dinputhook=true\n" - "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" @@ -878,13 +867,8 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" - "; Moorhuhn\n" - "[Moorhuhn]\n" - "dinputhook=true\n" - "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" - "dinputhook=true\n" "releasealt=true\n" "\n" "; New Robinson\n" diff --git a/src/dd.c b/src/dd.c index c7eab42..2df6c39 100644 --- a/src/dd.c +++ b/src/dd.c @@ -924,7 +924,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_ddraw->wndproc) { - hook_init(); + hook_init(FALSE); g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw->gui_thread_id = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); diff --git a/src/directinput.c b/src/directinput.c index 047a2f1..4cee4b4 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,4 +1,3 @@ - #include #include #include "directinput.h" @@ -7,6 +6,11 @@ #include "dd.h" #include "mouse.h" +#ifdef _MSC_VER +#include "detours.h" +#endif + +BOOL g_dinput_hook_active; DIRECTINPUTCREATEAPROC real_DirectInputCreateA; DIRECTINPUTCREATEWPROC real_DirectInputCreateW; @@ -317,3 +321,95 @@ HRESULT WINAPI fake_DirectInput8Create( return result; } + +void dinput_hook_init() +{ +#ifdef _MSC_VER + if (!g_dinput_hook_active) + { + g_dinput_hook_active = TRUE; + + real_DirectInputCreateA = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); + + if (real_DirectInputCreateA && real_DirectInputCreateA != fake_DirectInputCreateA) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); + DetourTransactionCommit(); + } + + real_DirectInputCreateW = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); + + if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); + DetourTransactionCommit(); + } + + real_DirectInputCreateEx = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); + + if (real_DirectInputCreateEx && real_DirectInputCreateEx != fake_DirectInputCreateEx) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); + DetourTransactionCommit(); + } + + real_DirectInput8Create = (void*)GetProcAddress(LoadLibraryA("dinput8.dll"), "DirectInput8Create"); + + if (real_DirectInput8Create && real_DirectInput8Create != fake_DirectInput8Create) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); + DetourTransactionCommit(); + } + } +#endif +} + +void dinput_hook_exit() +{ +#ifdef _MSC_VER + if (g_dinput_hook_active) + { + if (real_DirectInputCreateA) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); + DetourTransactionCommit(); + } + + if (real_DirectInputCreateW) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); + DetourTransactionCommit(); + } + + if (real_DirectInputCreateEx) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); + DetourTransactionCommit(); + } + + if (real_DirectInput8Create) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); + DetourTransactionCommit(); + } + + g_dinput_hook_active = FALSE; + } +#endif +} diff --git a/src/dllmain.c b/src/dllmain.c index b084ecc..13832a1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -2,6 +2,7 @@ #include "ddraw.h" #include #include "dllmain.h" +#include "directinput.h" #include "IDirectDraw.h" #include "dd.h" #include "ddclipper.h" @@ -102,7 +103,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) timeBeginPeriod(1); g_hook_method = cfg_get_int("hook", 4); - hook_init(); + hook_init(TRUE); break; } case DLL_PROCESS_DETACH: @@ -112,6 +113,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_save(); timeEndPeriod(1); + dinput_hook_exit(); hook_exit(); break; } diff --git a/src/hook.c b/src/hook.c index a8d4e37..8add6b2 100644 --- a/src/hook.c +++ b/src/hook.c @@ -15,7 +15,6 @@ #endif BOOL g_hook_active; -BOOL g_hook_dinput; int g_hook_method = 1; GETCURSORPOSPROC real_GetCursorPos = GetCursorPos; @@ -536,66 +535,13 @@ void hook_revert(HOOKLIST* hooks) } } -void hook_init() +void hook_init(BOOL initial_hook) { if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) { - BOOL initial_hook = !g_hook_active; - -#ifdef _MSC_VER - if (initial_hook && cfg_get_bool("dinputhook", FALSE)) - { - real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); - - if (real_DirectInputCreateA) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); - DetourTransactionCommit(); - } - - real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); - - if (real_DirectInputCreateW) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); - DetourTransactionCommit(); - } - - real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); - - if (real_DirectInputCreateEx) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); - DetourTransactionCommit(); - } - - real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("dinput8.dll"), "DirectInput8Create"); - - if (real_DirectInput8Create) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); - DetourTransactionCommit(); - } - } -#endif - #if defined(_DEBUG) && defined(_MSC_VER) if (initial_hook) { - hook_patch_iat(GetModuleHandle(NULL), FALSE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); - DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); @@ -608,9 +554,9 @@ void hook_init() hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } - g_hook_active = TRUE; - hook_create((HOOKLIST*)&g_hooks, initial_hook); + + g_hook_active = TRUE; } } @@ -620,43 +566,6 @@ void hook_exit() { g_hook_active = FALSE; -#ifdef _MSC_VER - if (cfg_get_bool("dinputhook", FALSE)) - { - if (real_DirectInputCreateA) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); - DetourTransactionCommit(); - } - - if (real_DirectInputCreateW) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); - DetourTransactionCommit(); - } - - if (real_DirectInputCreateEx) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); - DetourTransactionCommit(); - } - - if (real_DirectInput8Create) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); - DetourTransactionCommit(); - } - } -#endif - hook_revert((HOOKLIST*)&g_hooks); } @@ -666,8 +575,6 @@ void hook_exit() DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); - hook_patch_iat(GetModuleHandle(NULL), TRUE, "kernel32.dll", "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter); - real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #endif diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f3dfb38..3bc9a92 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -11,7 +11,9 @@ #include "mouse.h" #include "wndproc.h" #include "render_gdi.h" +#include "directinput.h" #include "ddsurface.h" +#include "dllmain.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -911,7 +913,14 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) } #endif - hook_init(); + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + + hook_init(FALSE); return hmod; } @@ -928,7 +937,14 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) } #endif - hook_init(); + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + + hook_init(FALSE); return hmod; } @@ -945,7 +961,14 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF } #endif - hook_init(); + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + + hook_init(FALSE); return hmod; } @@ -962,7 +985,14 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw } #endif - hook_init(); + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + + hook_init(FALSE); return hmod; } diff --git a/src/wndproc.c b/src/wndproc.c index 00e1514..413cd5e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -9,6 +9,7 @@ #include "config.h" #include "screenshot.h" #include "winapi_hooks.h" +#include "directinput.h" #include "wndproc.h" #include "utils.h" #include "debug.h" @@ -560,7 +561,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); - if (g_hook_dinput) + if (g_dinput_hook_active) { ip.type = INPUT_KEYBOARD; ip.ki.wScan = 56; // LeftAlt From 9830d02c3d7455933a2686d4f7be95c6de6ffe11 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 18:47:00 +0200 Subject: [PATCH 0450/1724] remove unlock --- src/dd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 2df6c39..f51b5e2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -970,7 +970,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (g_ddraw->windowed) { real_ClipCursor(NULL); - mouse_unlock(); } GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); From 9269b737a286d14f9d83b10b17d897190829d7e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 18:53:36 +0200 Subject: [PATCH 0451/1724] remove DirectInputCreateW hook --- src/directinput.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 4cee4b4..978f269 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -338,7 +338,7 @@ void dinput_hook_init() DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); DetourTransactionCommit(); } - + /* real_DirectInputCreateW = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW) @@ -348,7 +348,7 @@ void dinput_hook_init() DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); DetourTransactionCommit(); } - + */ real_DirectInputCreateEx = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx && real_DirectInputCreateEx != fake_DirectInputCreateEx) @@ -384,7 +384,7 @@ void dinput_hook_exit() DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); DetourTransactionCommit(); } - + /* Being called from winmm for some reason if (real_DirectInputCreateW) { DetourTransactionBegin(); @@ -392,7 +392,7 @@ void dinput_hook_exit() DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); DetourTransactionCommit(); } - + */ if (real_DirectInputCreateEx) { DetourTransactionBegin(); From 7402e13d988d094053fe40030e4bab2c52052025 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 18:57:34 +0200 Subject: [PATCH 0452/1724] add comment --- src/directinput.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directinput.c b/src/directinput.c index 978f269..486f487 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -338,7 +338,7 @@ void dinput_hook_init() DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); DetourTransactionCommit(); } - /* + /* Being called from winmm for some reason real_DirectInputCreateW = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW) From 57b42d9d5dab9dc7bea5dd6b536595db2ba23987 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Aug 2023 19:31:04 +0200 Subject: [PATCH 0453/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 360ff87..6fc10ae 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 107d09e1d9397b3184b73464048c61c3d453c516 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Aug 2023 07:19:27 +0200 Subject: [PATCH 0454/1724] add missing header --- src/directinput.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/directinput.c b/src/directinput.c index 486f487..9406885 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -5,6 +5,7 @@ #include "hook.h" #include "dd.h" #include "mouse.h" +#include "config.h" #ifdef _MSC_VER #include "detours.h" From 99ebc3c9dd7214f209dfe02c35551421708fdf1d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Aug 2023 17:28:40 +0200 Subject: [PATCH 0455/1724] raise render thread priority --- src/dd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dd.c b/src/dd.c index f51b5e2..0407c86 100644 --- a/src/dd.c +++ b/src/dd.c @@ -896,6 +896,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL); + SetThreadPriority(g_ddraw->render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_ddraw->infantryhack) From 86fe2e5a907f7f0c710fdb510988a3e6a9d695d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 07:07:56 +0200 Subject: [PATCH 0456/1724] add win2000 build config --- cnc-ddraw.sln | 3 +++ cnc-ddraw.vcxproj | 56 +++++++++++++++++++++++++++++++++++++++ cnc-ddraw.vcxproj.filters | 5 ++++ 3 files changed, 64 insertions(+) diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index d5267c8..317ca47 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -10,6 +10,7 @@ Global Debug|x86 = Debug|x86 DebugLog|x86 = DebugLog|x86 Release|x86 = Release|x86 + ReleaseWin2000|x86 = ReleaseWin2000|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 @@ -18,6 +19,8 @@ Global {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.ActiveCfg = ReleaseWin2000|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.Build.0 = ReleaseWin2000|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 233f75a..a6e3b55 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -9,6 +9,10 @@ Debug Win32 + + ReleaseWin2000 + Win32 + Release Win32 @@ -102,6 +106,9 @@ + + + cnc_ddraw 7.0 @@ -121,6 +128,13 @@ true MultiByte + + DynamicLibrary + false + v141_xp + true + MultiByte + DynamicLibrary false @@ -130,6 +144,7 @@ + @@ -139,6 +154,9 @@ + + + @@ -155,6 +173,12 @@ false ddraw + + $(SolutionDir)bin\ReleaseWin2000\ + $(SolutionDir)bin\ReleaseWin2000\ + false + ddraw + $(SolutionDir)bin\DebugLog\ $(SolutionDir)bin\DebugLog\ @@ -211,6 +235,37 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" + + + Level2 + + + MaxSpeed + true + true + _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + inc;src\detours + NoExtensions + + + Windows + true + true + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ddraw.def + + + +if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) + + + + /safeseh %(AdditionalOptions) + + Level2 @@ -240,5 +295,6 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" + \ No newline at end of file diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 39187f8..145a53f 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -272,4 +272,9 @@ Resource Files + + + Source Files + + \ No newline at end of file From e6b4eabe5b87dbff7326622526da702fd7f28196 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 07:18:29 +0200 Subject: [PATCH 0457/1724] add __GNUC__ defines --- inc/dd.h | 4 ++++ src/hook.c | 8 -------- src/utils.c | 30 ++++++++++++------------------ 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 290886d..0a85966 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -5,6 +5,10 @@ #include #include "ddraw.h" +#ifdef __GNUC__ +#define __try +#define __except(x) if (0) +#endif typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*); diff --git a/src/hook.c b/src/hook.c index 8add6b2..3ed0b4a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -163,10 +163,8 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; -#ifdef _MSC_VER __try { -#endif PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; @@ -259,12 +257,10 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) import_desc++; } -#ifdef _MSC_VER } __except (EXCEPTION_EXECUTE_HANDLER) { } -#endif } void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) @@ -274,10 +270,8 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; -#ifdef _MSC_VER __try { -#endif PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; @@ -362,12 +356,10 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) import_desc++; } -#ifdef _MSC_VER } __except (EXCEPTION_EXECUTE_HANDLER) { } -#endif } void hook_create(HOOKLIST* hooks, BOOL initial_hook) diff --git a/src/utils.c b/src/utils.c index e995da0..b6f1486 100644 --- a/src/utils.c +++ b/src/utils.c @@ -24,38 +24,32 @@ BOOL util_is_avx_supported() BOOL result = FALSE; -#ifdef _MSC_VER __try { -#endif + int info[4] = { 0 }; + __cpuid(info, 0); - int info[4] = { 0 }; - __cpuid(info, 0); - - if (info[0] >= 1) - { - __cpuid(info, 1); - - if ((info[2] & CPU_AVX_BITS) == CPU_AVX_BITS) + if (info[0] >= 1) { - unsigned int xcr0 = 0; + __cpuid(info, 1); + + if ((info[2] & CPU_AVX_BITS) == CPU_AVX_BITS) + { + unsigned int xcr0 = 0; #ifdef _MSC_VER - xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); + xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); #elif __AVX__ - __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); + __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); #endif - result = (xcr0 & OS_AVX_BITS) == OS_AVX_BITS; + result = (xcr0 & OS_AVX_BITS) == OS_AVX_BITS; + } } } - -#ifdef _MSC_VER - } __except (EXCEPTION_EXECUTE_HANDLER) { } -#endif return result; } From e575b07d2e5ed7064704fc41d2ccea18375151dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 08:40:52 +0200 Subject: [PATCH 0458/1724] fix hook_exit --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index 3ed0b4a..f090bb0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -418,7 +418,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) { if (initial_hook) { - TRACE_EXT("Module %s = %p\n", mod_path, hmod); + TRACE("Module %s = %p\n", mod_path, hmod); } _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); From 59f8da56da15d2a21973f05a4cdd77283b81cd76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 08:41:14 +0200 Subject: [PATCH 0459/1724] fix hook_exit --- src/hook.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hook.c b/src/hook.c index f090bb0..474ee52 100644 --- a/src/hook.c +++ b/src/hook.c @@ -559,16 +559,16 @@ void hook_exit() g_hook_active = FALSE; hook_revert((HOOKLIST*)&g_hooks); - } #if defined(_DEBUG) && defined(_MSC_VER) - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); - DetourTransactionCommit(); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); + DetourTransactionCommit(); - real_SetUnhandledExceptionFilter(g_dbg_exception_filter); + real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #endif - hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + } } From 6bd51b9e59a15d7f54c5bc37221f4b891e961ecf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 09:01:59 +0200 Subject: [PATCH 0460/1724] add warning message --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index e2e5531..b10930b 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,12 @@ FILES = src/IDirect3D/IDirect3D.c \ src/opengl_utils.c all: + $(info ) + $(info **********************************************************************************************) + $(info WARNING: This build is outdated and does not support all cnc-ddraw features [Detours/SEH]) + $(info WARNING: Some games that require hooks may crash or glitch, please use the msvc build instead) + $(info **********************************************************************************************) + $(info ) $(WINDRES) -J rc ddraw.rc ddraw.rc.o $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) # $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt From f5e594b0ef4d0e0a91d6ee3578d3ea7101a5d962 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 09:09:21 +0200 Subject: [PATCH 0461/1724] change default value --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index 474ee52..5a0be42 100644 --- a/src/hook.c +++ b/src/hook.c @@ -15,7 +15,7 @@ #endif BOOL g_hook_active; -int g_hook_method = 1; +int g_hook_method = 4; GETCURSORPOSPROC real_GetCursorPos = GetCursorPos; CLIPCURSORPROC real_ClipCursor = ClipCursor; From c530f5f4a8c1dcc3e0ca41506314a7d15a50a6f1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 10:00:38 +0200 Subject: [PATCH 0462/1724] log SetWindowsHookExA --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3bc9a92..6ec26c8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -575,6 +575,8 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { + TRACE("SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d)\n", idHook, lpfn, hmod, dwThreadId); + if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { return NULL; From d108816fb6116b2ffd3134a092a0c131163a5a26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 10:18:47 +0200 Subject: [PATCH 0463/1724] adjust claw preset for custom level dialog --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 9b785a0..8413326 100644 --- a/src/config.c +++ b/src/config.c @@ -503,6 +503,7 @@ static void cfg_create_ini() "\n" "; Captain Claw\n" "[claw]\n" + "adjmouse=true\n" "noactivateapp=true\n" "renderer=opengl\n" "nonexclusive=true\n" From e286a6cdf392a75ced1abe08c04d5e412cb63345 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 11:45:21 +0200 Subject: [PATCH 0464/1724] update config to latest version --- config/ConfigFormUnit.dfm | 22 +- config/cnc-ddraw config.cbproj | 823 ++++++++++++++++----------------- config/cnc-ddraw config.cpp | 2 +- src/config.c | 2 +- 4 files changed, 417 insertions(+), 432 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 0e04389..3674d66 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,9 +4,9 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 475 - ClientWidth = 708 - Color = clBlack + ClientHeight = 481 + ClientWidth = 704 + Color = clHotLight Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -2677,10 +2677,9 @@ object ConfigForm: TConfigForm 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} - OldCreateOrder = False Position = poDesktopCenter + StyleElements = [seFont, seBorder] OnCreate = FormCreate - PixelsPerInch = 96 TextHeight = 13 object AdvancedPnl: TPanel Left = 201 @@ -3250,16 +3249,17 @@ object ConfigForm: TConfigForm Width = 201 Height = 465 BevelOuter = bvNone - Color = clBlack + Color = clHotLight ParentBackground = False TabOrder = 0 + StyleElements = [seFont, seBorder] DesignSize = ( 201 465) object DisplayBtn: TSpeedButton Left = 5 Top = 8 - Width = 187 + Width = 190 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Display Settings' @@ -3270,13 +3270,13 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [fsBold] ParentFont = False - StyleElements = [seFont, seBorder] + StyleElements = [seClient, seBorder] OnClick = DisplayBtnClick end object AdvancedBtn: TSpeedButton Left = 5 Top = 55 - Width = 187 + Width = 190 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Advanced Settings' @@ -3287,12 +3287,13 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [fsBold] ParentFont = False + StyleElements = [seClient, seBorder] OnClick = AdvancedBtnClick end object CompatibilityBtn: TSpeedButton Left = 5 Top = 102 - Width = 187 + Width = 190 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Compatibility Settings' @@ -3303,6 +3304,7 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [fsBold] ParentFont = False + StyleElements = [seClient, seBorder] OnClick = CompatibilityBtnClick end end diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 3ac67c6..c2b58b6 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -1,7 +1,7 @@  {E020D5C7-AE07-4DB9-9688-6D289E9FFF1A} - 18.8 + 19.5 VCL Application cnc-ddraw config.cpp @@ -9,6 +9,7 @@ Release Win32 1 + c true @@ -18,6 +19,11 @@ Base true + + true + Base + true + true Base @@ -29,6 +35,12 @@ true true + + true + Cfg_1 + true + true + true Base @@ -40,6 +52,12 @@ true true + + true + Cfg_2 + true + true + JPHNE true @@ -52,7 +70,7 @@ $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) CppVCLApplication System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib;bindengine.lib <_TCHARMapping>wchar_t true $(BDS)\bin\cbuilder_PROJECTICON.ico @@ -61,7 +79,7 @@ cnc-ddraw\config\;$(IncludePath) cnc-ddraw\config\;$(ILINK_LibraryPath) cnc-ddraw_config - "Windows10 Blue|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10Blue.vsf" + Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf adortl;appanalytics;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;FireDAC;FireDACADSDriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACIBDriver;FireDACMSAccDriver;FireDACMySQLDriver;FireDACPgDriver;FireDACSqliteDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;tethering;vcl;vclactnband;vcldb;vcldsnap;vclFireDAC;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) @@ -73,6 +91,14 @@ 1033 $(BDS)\bin\default_app.manifest + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + false true @@ -105,22 +131,28 @@ false false rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + PerMonitorV2 NDEBUG;$(Defines) None - true PerMonitorV2 false false false true - rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib;bindengine.lib 1033 cnc-ddraw.ico + + PerMonitorV2 + 0 @@ -160,10 +192,6 @@ PngImage_US - - Cfg_2 - Base - Base @@ -171,6 +199,10 @@ Cfg_1 Base + + Cfg_2 + Base + CPlusPlusBuilder.Personality.12 @@ -187,125 +219,78 @@ cnc-ddraw config.cpp - Embarcadero C++Builder-Package für Office 2000-Server - Embarcadero C++Builder-Package für Office XP-Server + Embarcadero C++Builder-Package für Office 2000-Server + Embarcadero C++Builder-Package für Office XP-Server - - - - true - - + true - - - true - - - - - true - - - - - true - - true - - - true - - + + true - + + + true - - - cnc-ddraw_config.exe - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - cnc-ddraw_config.exe - true - - - - - .\ - true - - - + true - + true - + + + - .\ true - - - true - - - + - .\ true + + + + + true + + + + + true + + + + + + + + + + + 1 @@ -318,14 +303,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -446,6 +431,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -609,6 +604,11 @@ 1 .framework + + Contents\MacOS + 1 + .framework + 0 @@ -622,7 +622,7 @@ 1 .dylib - + 1 .dylib @@ -636,6 +636,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .dll;.bpl @@ -650,7 +655,7 @@ 1 .dylib - + 1 .dylib @@ -664,6 +669,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .bpl @@ -682,7 +692,7 @@ 0 - + 0 @@ -693,272 +703,12 @@ Contents\Resources\StartUp\ 0 - + + Contents\Resources\StartUp\ 0 - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 + + 0 @@ -969,61 +719,15 @@ 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - 1 - - - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + @@ -1034,6 +738,10 @@ ..\ 1 + + ..\ + 1 + @@ -1044,6 +752,10 @@ Contents 1 + + Contents + 1 + @@ -1054,6 +766,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -1070,7 +786,7 @@ 1 - + 1 @@ -1084,6 +800,10 @@ Contents\MacOS 1 + + Contents\MacOS + 1 + 0 @@ -1102,6 +822,66 @@ 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + Assets @@ -1122,19 +902,222 @@ 1 - - - - - - + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + - - + + + + + + + + + + True + False 12 diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index e98fba6..d0dbb6f 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -14,7 +14,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { Application->Initialize(); Application->MainFormOnTaskBar = true; - TStyleManager::TrySetStyle("Windows10 Blue"); + TStyleManager::TrySetStyle("Windows10"); Application->CreateForm(__classid(TConfigForm), &ConfigForm); Application->Run(); } diff --git a/src/config.c b/src/config.c index 8413326..333f2dc 100644 --- a/src/config.c +++ b/src/config.c @@ -344,7 +344,7 @@ static void cfg_create_ini() "max_resolutions=0\n" "limit_bltfast=false\n" "game_handles_close=false\n" - "fixpitch=true\n" + "fixpitch=false\n" "fixnotresponding=false\n" "lock_surfaces=false\n" "releasealt=false\n" From 08c71bc75fe7be2ffa433e5ec98612f410a108fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 11:54:46 +0200 Subject: [PATCH 0465/1724] remove border --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 82f9920..bd8652a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -861,6 +861,6 @@ void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) void __fastcall TConfigForm::PboxPaint(TObject *Sender) { TPaintBox *pbox = static_cast(Sender); - pbox->Canvas->Rectangle(pbox->ClientRect); + //pbox->Canvas->Rectangle(pbox->ClientRect); } From 3c5d99ac5721d785237536396f21b1bce339c810 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:21:47 +0200 Subject: [PATCH 0466/1724] change theme to workaround c++ builder bug --- config/ConfigFormUnit.dfm | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 3674d66..38187cc 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2678,7 +2678,6 @@ object ConfigForm: TConfigForm BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} Position = poDesktopCenter - StyleElements = [seFont, seBorder] OnCreate = FormCreate TextHeight = 13 object AdvancedPnl: TPanel @@ -3252,7 +3251,6 @@ object ConfigForm: TConfigForm Color = clHotLight ParentBackground = False TabOrder = 0 - StyleElements = [seFont, seBorder] DesignSize = ( 201 465) @@ -3266,11 +3264,10 @@ object ConfigForm: TConfigForm Flat = True Font.Charset = DEFAULT_CHARSET Font.Color = clWhite - Font.Height = -13 + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] OnClick = DisplayBtnClick end object AdvancedBtn: TSpeedButton @@ -3283,11 +3280,10 @@ object ConfigForm: TConfigForm Flat = True Font.Charset = DEFAULT_CHARSET Font.Color = clWhite - Font.Height = -13 + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] OnClick = AdvancedBtnClick end object CompatibilityBtn: TSpeedButton @@ -3300,11 +3296,10 @@ object ConfigForm: TConfigForm Flat = True Font.Charset = DEFAULT_CHARSET Font.Color = clWhite - Font.Height = -13 + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] OnClick = CompatibilityBtnClick end end From 5e2f00f174f77da885624dc1f08f512b4b5a2da4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:28:21 +0200 Subject: [PATCH 0467/1724] adjust form size --- config/ConfigFormUnit.dfm | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 38187cc..3d9e51a 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,8 +4,8 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 481 - ClientWidth = 704 + ClientHeight = 477 + ClientWidth = 731 Color = clHotLight Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -2681,7 +2681,7 @@ object ConfigForm: TConfigForm OnCreate = FormCreate TextHeight = 13 object AdvancedPnl: TPanel - Left = 201 + Left = 233 Top = 8 Width = 499 Height = 465 @@ -2875,7 +2875,7 @@ object ConfigForm: TConfigForm end end object DisplayPnl: TPanel - Left = 201 + Left = 233 Top = 8 Width = 499 Height = 465 @@ -3060,7 +3060,7 @@ object ConfigForm: TConfigForm end end object CompatibilityPnl: TPanel - Left = 201 + Left = 233 Top = 8 Width = 499 Height = 465 @@ -3245,19 +3245,19 @@ object ConfigForm: TConfigForm object MenuPnl: TPanel Left = 0 Top = 8 - Width = 201 + Width = 227 Height = 465 BevelOuter = bvNone Color = clHotLight ParentBackground = False TabOrder = 0 DesignSize = ( - 201 + 227 465) object DisplayBtn: TSpeedButton Left = 5 Top = 8 - Width = 190 + Width = 216 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Display Settings' @@ -3269,11 +3269,12 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = DisplayBtnClick + ExplicitWidth = 190 end object AdvancedBtn: TSpeedButton Left = 5 Top = 55 - Width = 190 + Width = 216 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Advanced Settings' @@ -3285,11 +3286,12 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = AdvancedBtnClick + ExplicitWidth = 190 end object CompatibilityBtn: TSpeedButton Left = 5 Top = 102 - Width = 190 + Width = 216 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Compatibility Settings' @@ -3301,6 +3303,7 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = CompatibilityBtnClick + ExplicitWidth = 190 end end end From dad3f056a71a362f55f232f8fe56651ed0d8a098 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:35:42 +0200 Subject: [PATCH 0468/1724] adjust size of russian translation --- config/ConfigFormUnit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index bd8652a..8e93658 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -202,9 +202,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; ClientWidth *= 1.13; - DisplayPnl->Width *= 1.184; - AdvancedPnl->Width *= 1.184; - CompatibilityPnl->Width *= 1.184; + DisplayPnl->Width *= 1.192; + AdvancedPnl->Width *= 1.192; + CompatibilityPnl->Width *= 1.192; /* -Russian- made by shikulja @ github */ From c1acf2a565a05d7f596c86a4e9dd052afea34733 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:42:34 +0200 Subject: [PATCH 0469/1724] add italian language hint --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 333f2dc..86d5937 100644 --- a/src/config.c +++ b/src/config.c @@ -289,7 +289,7 @@ static void cfg_create_ini() "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" "vhack=false\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" "configlang=auto\n" "\n" "; Where should screenshots be saved\n" From 55417fe3f6c21626c98e1c529cf49b3fd5177fb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:47:23 +0200 Subject: [PATCH 0470/1724] lower OS version requirement --- config/cnc-ddraw config.cbproj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index b26d072..3b3ee7b 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -90,6 +90,9 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 $(BDS)\bin\default_app.manifest + 5.0 + 5.0 + none Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) @@ -122,7 +125,6 @@ $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) - true PerMonitorV2 false true @@ -132,6 +134,8 @@ false rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + 5.0 + 5.0 PerMonitorV2 @@ -149,6 +153,8 @@ rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib;bindengine.lib 1033 cnc-ddraw.ico + 5.0 + 5.0 PerMonitorV2 @@ -273,12 +279,6 @@ true - - - .\ - true - - From 559234e7755707a9eb1c2eaa09e076b8d560cda3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 12:55:58 +0200 Subject: [PATCH 0471/1724] revert some changes --- config/cnc-ddraw config.cbproj | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 3b3ee7b..88b41e5 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -92,7 +92,6 @@ $(BDS)\bin\default_app.manifest 5.0 5.0 - none Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) @@ -125,6 +124,7 @@ $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + true PerMonitorV2 false true @@ -279,6 +279,12 @@ true + + + .\ + true + + From 64ee681f43f3468d626929fb03edcbe6a2850216 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 13:02:49 +0200 Subject: [PATCH 0472/1724] fix config width --- config/ConfigFormUnit.dfm | 2 +- config/cnc-ddraw config.cbproj | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 3d9e51a..83c539d 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -5,7 +5,7 @@ object ConfigForm: TConfigForm BorderStyle = bsSingle Caption = 'cnc-ddraw config' ClientHeight = 477 - ClientWidth = 731 + ClientWidth = 741 Color = clHotLight Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 88b41e5..bab1b8e 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -279,12 +279,6 @@ true - - - .\ - true - - From 50c8bd8516d149bca4ceca57f04356a82a8d2c4e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 13:38:49 +0200 Subject: [PATCH 0473/1724] replace fixpitch setting with singlecpu setting --- config/ConfigFormUnit.cpp | 24 ++++++++++++------------ config/ConfigFormUnit.dfm | 10 +++++----- config/ConfigFormUnit.h | 6 +++--- src/config.c | 1 - 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 6b93c56..5686f6a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -73,7 +73,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; HookLbl->Caption = L"修复损坏的窗口模式或拉伸"; MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; - FixpitchLbl->Caption = L"修复倾斜撕裂显示的问题"; + SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; RendererCbx->Items->Clear(); @@ -123,7 +123,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Corregir Alt+Tab roto"; HookLbl->Caption = L"Corregir modo ventana o ampliación de escala"; MinfpsLbl->Caption = L"Forzar un alto FPS / Corregir retrasos en Freesync/G-Sync"; - FixpitchLbl->Caption = L"Corregir problemas de visualización de dibujos en diagonal"; + SinglecpuLbl->Caption = L"Solucione el mal rendimiento y los problemas de sonido"; NonexclusiveLbl->Caption = L"Corregir vídeos / elementos de interfaz invisibles"; RendererCbx->Items->Clear(); @@ -173,7 +173,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Fehlerhaftes Alt+Tab reparieren"; //The first word can be ignored if its to long (eng word "Fix" HookLbl->Caption = L"Fehlerhafter Fenstermodus oder Hochskalierung reparieren"; //The first word can be ignored if its to long (eng word "Fix") MinfpsLbl->Caption = L"Erzwinge Hohe FPS / Repariere Stottern bei Freesync/G-Sync"; - FixpitchLbl->Caption = L"Diagonal dargestellte Zeichnungsfehler reparieren"; + SinglecpuLbl->Caption = L"Schlechte Leistung und Soundprobleme reparieren"; NonexclusiveLbl->Caption = L"Unsichtbare Videos / UI Elemente reparieren"; RendererCbx->Items->Clear(); @@ -227,7 +227,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Исправить сломанный Alt+Tab"; HookLbl->Caption = L"Исправить сломанный оконный режим или масштабированние"; MinfpsLbl->Caption = L"Принудительно высокий FPS / Исправить заикание при Freesync/G-Sync"; - FixpitchLbl->Caption = L"Исправить проблемы с отображением отрисовки по диагонали"; + SinglecpuLbl->Caption = L"Исправление проблем с производительностью и звуком"; NonexclusiveLbl->Caption = L"Исправить невидимые видео / элементы пользовательского интерфейса"; RendererCbx->Items->Clear(); @@ -277,7 +277,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Alt+Tab hiba kiküszöbölése"; HookLbl->Caption = L"Hibás ablakos mód, vagy felskálázás javítása"; MinfpsLbl->Caption = L"Magas FPS kényszerítés / Akadozásjavítás Freesync/G-Sync esetén"; - FixpitchLbl->Caption = L"Átlós rajzolási gondok kiküszöbölése"; + SinglecpuLbl->Caption = L"Javítsa ki a rossz teljesítmény- és hangproblémákat"; NonexclusiveLbl->Caption = L"Láthatatlan videók / kezelőfelületi elemek javítása"; RendererCbx->Items->Clear(); @@ -327,7 +327,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Corriger Alt+Tab défaillant"; HookLbl->Caption = L"Corriger mode fenêtré ou mise à l'échelle défaillant"; MinfpsLbl->Caption = L"Forcer FPS élevé / Corriger saccades en Freesync/G-Sync"; - FixpitchLbl->Caption = L"Corriger défauts d'affichage diagonaux"; + SinglecpuLbl->Caption = L"Résoudre les problèmes de mauvaise performance et de son"; NonexclusiveLbl->Caption = L"Corriger vidéos et éléments d'interface invisibles"; RendererCbx->Items->Clear(); @@ -377,7 +377,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; HookLbl->Caption = L"Risolvi i problemi con la modalità finestra o il ridimensionamento"; MinfpsLbl->Caption = L"Forza FPS elevati / Correggi balbuzie su Freesync/G-Sync"; - FixpitchLbl->Caption = L"Correggi artefatti mostrati in diagonale"; + SinglecpuLbl->Caption = L"Risolvi problemi di prestazioni e audio scadenti"; NonexclusiveLbl->Caption = L"Correggi video / elementi dell'interfaccia utente invisibili"; RendererCbx->Items->Clear(); @@ -472,7 +472,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) NoactivateappLbl->Caption = L"Fix broken Alt+Tab"; HookLbl->Caption = L"Fix broken windowed mode or upscaling"; MinfpsLbl->Caption = L"Force high FPS / Fix stuttering on Freesync/G-Sync"; - FixpitchLbl->Caption = L"Fix diagonally displayed drawing issues"; + SinglecpuLbl->Caption = L"Fix bad performance and sound issues"; NonexclusiveLbl->Caption = L"Fix invisible videos / UI elements"; RendererCbx->Items->Clear(); @@ -640,7 +640,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) Minfps = ini->ReadInteger("ddraw", "minfps", 0); MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; - FixpitchChk->State = GetBool(ini, "fixpitch", false) ? tssOn : tssOff; + SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; delete ini; @@ -811,8 +811,8 @@ void TConfigForm::SaveSettings() ini->WriteString( "ddraw", - "fixpitch", - FixpitchChk->State == tssOn ? "true" : "false"); + "singlecpu", + SinglecpuChk->State == tssOn ? "false" : "true"); ini->WriteString( "ddraw", @@ -904,7 +904,7 @@ void __fastcall TConfigForm::MinfpsChkClick(TObject *Sender) SaveSettings(); } -void __fastcall TConfigForm::FixpitchChkClick(TObject *Sender) +void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) { SaveSettings(); } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 83c539d..ed48676 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3130,13 +3130,13 @@ object ConfigForm: TConfigForm ParentFont = False StyleElements = [seClient, seBorder] end - object FixpitchLbl: TLabel + object SinglecpuLbl: TLabel Left = 40 Top = 309 - Width = 272 + Width = 265 Height = 21 Margins.Top = 18 - Caption = 'Fix diagonally displayed drawing issues' + Caption = 'Fix bad performance and sound issues' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3223,14 +3223,14 @@ object ConfigForm: TConfigForm TabOrder = 3 OnClick = MinfpsChkClick end - object FixpitchChk: TToggleSwitch + object SinglecpuChk: TToggleSwitch Left = 40 Top = 336 Width = 50 Height = 20 ShowStateCaption = False TabOrder = 4 - OnClick = FixpitchChkClick + OnClick = SinglecpuChkClick end object NonexclusiveChk: TToggleSwitch Left = 40 diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 689f83f..8c80133 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -53,8 +53,8 @@ __published: // Von der IDE verwaltete Komponenten TToggleSwitch *HookChk; TLabel *MinfpsLbl; TToggleSwitch *MinfpsChk; - TToggleSwitch *FixpitchChk; - TLabel *FixpitchLbl; + TToggleSwitch *SinglecpuChk; + TLabel *SinglecpuLbl; TLabel *NonexclusiveLbl; TToggleSwitch *NonexclusiveChk; TPaintBox *PresentationPbox; @@ -81,7 +81,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall NoactivateappChkClick(TObject *Sender); void __fastcall HookChkClick(TObject *Sender); void __fastcall MinfpsChkClick(TObject *Sender); - void __fastcall FixpitchChkClick(TObject *Sender); + void __fastcall SinglecpuChkClick(TObject *Sender); void __fastcall NonexclusiveChkClick(TObject *Sender); void __fastcall PboxPaint(TObject *Sender); void __fastcall LanguageImgClick(TObject *Sender); diff --git a/src/config.c b/src/config.c index 86d5937..8972a48 100644 --- a/src/config.c +++ b/src/config.c @@ -344,7 +344,6 @@ static void cfg_create_ini() "max_resolutions=0\n" "limit_bltfast=false\n" "game_handles_close=false\n" - "fixpitch=false\n" "fixnotresponding=false\n" "lock_surfaces=false\n" "releasealt=false\n" From 3c1cb0bf6e167fbff49446f8522ad5302a117659 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 13:51:57 +0200 Subject: [PATCH 0474/1724] add more maxgameticks settings --- config/ConfigFormUnit.cpp | 46 +++++++++++++++++++++++++++++++-------- config/ConfigFormUnit.dfm | 4 +++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 5686f6a..fc47e9c 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -94,6 +94,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL); MaxgameticksCbx->AddItem(L"1000tick每秒", NULL); MaxgameticksCbx->AddItem(L"500tick每秒", NULL); + MaxgameticksCbx->AddItem(L"250tick每秒", NULL); + MaxgameticksCbx->AddItem(L"125tick每秒", NULL); MaxgameticksCbx->AddItem(L"60tick每秒", NULL); MaxgameticksCbx->AddItem(L"30tick每秒", NULL); MaxgameticksCbx->AddItem(L"25tick每秒", NULL); @@ -144,6 +146,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emular monitor con tasa de refresco de 60hz", NULL); MaxgameticksCbx->AddItem(L"1000 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"500 tics por segundo", NULL); + MaxgameticksCbx->AddItem(L"250 tics por segundo", NULL); + MaxgameticksCbx->AddItem(L"125 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"60 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); @@ -194,6 +198,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emuliere 60hz Bildschirmaktualisierungsrate", NULL); MaxgameticksCbx->AddItem(L"1000 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"500 Ticks pro Sekunde", NULL); + MaxgameticksCbx->AddItem(L"250 Ticks pro Sekunde", NULL); + MaxgameticksCbx->AddItem(L"125 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"60 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); @@ -248,6 +254,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Эмуляция частоты обновления монитора 60 Гц", NULL); MaxgameticksCbx->AddItem(L"1000 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"500 тиков в секунду", NULL); + MaxgameticksCbx->AddItem(L"250 тиков в секунду", NULL); + MaxgameticksCbx->AddItem(L"125 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"60 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); @@ -298,6 +306,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"60hz képfrissítésű kijelző emulálása", NULL); MaxgameticksCbx->AddItem(L"1000 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"500 tick másodpercenként", NULL); + MaxgameticksCbx->AddItem(L"250 tick másodpercenként", NULL); + MaxgameticksCbx->AddItem(L"125 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"60 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); @@ -348,6 +358,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Émuler un écran à 60Hz", NULL); MaxgameticksCbx->AddItem(L"1000 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"500 tics par seconde", NULL); + MaxgameticksCbx->AddItem(L"250 tics par seconde", NULL); + MaxgameticksCbx->AddItem(L"125 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"60 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); @@ -398,6 +410,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emula uno schermo a 60Hz", NULL); MaxgameticksCbx->AddItem(L"1000 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"500 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"250 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"125 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"60 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); @@ -493,6 +507,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emulate 60hz refresh rate monitor", NULL); MaxgameticksCbx->AddItem(L"1000 ticks per second", NULL); MaxgameticksCbx->AddItem(L"500 ticks per second", NULL); + MaxgameticksCbx->AddItem(L"250 ticks per second", NULL); + MaxgameticksCbx->AddItem(L"125 ticks per second", NULL); MaxgameticksCbx->AddItem(L"60 ticks per second", NULL); MaxgameticksCbx->AddItem(L"30 ticks per second", NULL); MaxgameticksCbx->AddItem(L"25 ticks per second", NULL); @@ -614,21 +630,27 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) case 500: MaxgameticksCbx->ItemIndex = 4; break; - case 60: + case 250: MaxgameticksCbx->ItemIndex = 5; break; - case 30: + case 125: MaxgameticksCbx->ItemIndex = 6; break; - case 25: + case 60: MaxgameticksCbx->ItemIndex = 7; break; - case 15: + case 30: MaxgameticksCbx->ItemIndex = 8; break; + case 25: + MaxgameticksCbx->ItemIndex = 9; + break; + case 15: + MaxgameticksCbx->ItemIndex = 10; + break; default: MaxgameticksCbx->AddItem(IntToStr(maxgameticks), NULL); - MaxgameticksCbx->ItemIndex = 9; + MaxgameticksCbx->ItemIndex = 11; break; } @@ -769,18 +791,24 @@ void TConfigForm::SaveSettings() ini->WriteInteger("ddraw", "maxgameticks", 500); break; case 5: - ini->WriteInteger("ddraw", "maxgameticks", 60); + ini->WriteInteger("ddraw", "maxgameticks", 250); break; case 6: - ini->WriteInteger("ddraw", "maxgameticks", 30); + ini->WriteInteger("ddraw", "maxgameticks", 125); break; case 7: - ini->WriteInteger("ddraw", "maxgameticks", 25); + ini->WriteInteger("ddraw", "maxgameticks", 60); break; case 8: - ini->WriteInteger("ddraw", "maxgameticks", 15); + ini->WriteInteger("ddraw", "maxgameticks", 30); break; case 9: + ini->WriteInteger("ddraw", "maxgameticks", 25); + break; + case 10: + ini->WriteInteger("ddraw", "maxgameticks", 15); + break; + case 11: ini->WriteString("ddraw", "maxgameticks", MaxgameticksCbx->Text); break; default: diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index ed48676..2e453ee 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3176,7 +3176,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 10 + DropDownCount = 12 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3191,6 +3191,8 @@ object ConfigForm: TConfigForm 'Emulate 60hz refresh rate monitor' '1000 ticks per second' '500 ticks per second' + '250 ticks per second' + '125 ticks per second' '60 ticks per second' '30 ticks per second' '25 ticks per second' From db446cb94bc7ef32e449f20d44682f737cb8a944 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 14:14:49 +0200 Subject: [PATCH 0475/1724] add manifest --- config/cnc-ddraw config.cbproj | 6 ++++-- config/cnc-ddraw config.manifest | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 config/cnc-ddraw config.manifest diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index bab1b8e..b003eb6 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -89,9 +89,10 @@ true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 - $(BDS)\bin\default_app.manifest + cnc-ddraw config.manifest 5.0 5.0 + none Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) @@ -124,7 +125,6 @@ $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) - true PerMonitorV2 false true @@ -136,6 +136,7 @@ $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) 5.0 5.0 + cnc-ddraw config.manifest PerMonitorV2 @@ -155,6 +156,7 @@ cnc-ddraw.ico 5.0 5.0 + cnc-ddraw config.manifest PerMonitorV2 diff --git a/config/cnc-ddraw config.manifest b/config/cnc-ddraw config.manifest new file mode 100644 index 0000000..35c0fea --- /dev/null +++ b/config/cnc-ddraw config.manifest @@ -0,0 +1,34 @@ + + + + + true/pm + PerMonitorV2 + + + + + + + + + + + + + + + + + + + + + + From b4334a011a5a3dbcd2ac921b4685ad411c7a4b49 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 14:15:20 +0200 Subject: [PATCH 0476/1724] tweak projectfile --- config/cnc-ddraw config.cbproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index b003eb6..b2f89f1 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -92,7 +92,6 @@ cnc-ddraw config.manifest 5.0 5.0 - none Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) @@ -125,6 +124,7 @@ $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + true PerMonitorV2 false true From 1b84d736f6391cdf0c9d7cf4ab96b3d180811321 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 14:31:46 +0200 Subject: [PATCH 0477/1724] set toggle_borderless to match current presentaton setting --- config/ConfigFormUnit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index fc47e9c..e8ded54 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -683,6 +683,7 @@ void TConfigForm::SaveSettings() case 0: ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "false"); + ini->WriteString("ddraw", "toggle_borderless", "false"); break; case 1: ini->WriteString("ddraw", "windowed", "false"); @@ -691,6 +692,7 @@ void TConfigForm::SaveSettings() case 2: ini->WriteString("ddraw", "windowed", "true"); ini->WriteString("ddraw", "fullscreen", "true"); + ini->WriteString("ddraw", "toggle_borderless", "true"); break; case 3: ini->WriteString("ddraw", "windowed", "true"); From a8992f99b37f16c88d6ebbed2c04d7dd63460109 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 15:06:23 +0200 Subject: [PATCH 0478/1724] add hidden setting "hide_compat_tab" --- config/ConfigFormUnit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index e8ded54..d5a80b5 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -665,6 +665,10 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; + if (GetBool(ini, "hide_compat_tab", false)) { + CompatibilityBtn->Visible = false; + } + delete ini; Initialized = true; From 9238a3e8749d1223bd6b16176f67f31cbfbd7432 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 15:47:43 +0200 Subject: [PATCH 0479/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 6fc10ae..3bc2d72 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 9974d70a5e24a98369a9a22f1bf7ddcd234569af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 17:38:31 +0200 Subject: [PATCH 0480/1724] add dll override --- config/ConfigFormUnit.cpp | 43 +++++++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 1 + config/ConfigFormUnit.h | 1 + 3 files changed, 45 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d5a80b5..40cabe4 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -856,6 +857,46 @@ void TConfigForm::SaveSettings() delete ini; } + +void __fastcall TConfigForm::FormActivate(TObject *Sender) +{ + if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) + return; + + TRegistry* reg = new TRegistry(KEY_READ); + reg->RootKey = HKEY_CURRENT_USER; + + if(reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { + + if (!reg->ValueExists("ddraw")) { + + reg->CloseKey(); + + if (Application->MessageBox( + L"cnc-ddraw requires a dll override in winecfg, " + "would you like to add it now?", + L"cnc-ddraw", + MB_YESNO) == IDNO) { + + reg->Free(); + return; + } + + reg->Access = KEY_WRITE; + + if (reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { + + reg->WriteString("ddraw", "native,builtin"); + reg->CloseKey(); + } + } + else + reg->CloseKey(); + } + + reg->Free(); +} + bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) { auto s = LowerCase(ini->ReadString("ddraw", key, defValue ? "true" : "false")); @@ -954,3 +995,5 @@ void __fastcall TConfigForm::PboxPaint(TObject *Sender) //pbox->Canvas->Rectangle(pbox->ClientRect); } +//--------------------------------------------------------------------------- + diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 2e453ee..36f3daa 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2678,6 +2678,7 @@ object ConfigForm: TConfigForm BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} Position = poDesktopCenter + OnActivate = FormActivate OnCreate = FormCreate TextHeight = 13 object AdvancedPnl: TPanel diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8c80133..9bb01ca 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -85,6 +85,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall NonexclusiveChkClick(TObject *Sender); void __fastcall PboxPaint(TObject *Sender); void __fastcall LanguageImgClick(TObject *Sender); + void __fastcall FormActivate(TObject *Sender); private: // Benutzer-Deklarationen void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); From 0e8e7bba2cf0c267920f9120dccf9ecf3eb18f82 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 18:35:22 +0200 Subject: [PATCH 0481/1724] add missing entry --- config/cnc-ddraw config.cbproj | 1 + 1 file changed, 1 insertion(+) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index b2f89f1..e47b6e4 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -303,6 +303,7 @@ + 1 From cb7fde77ea878297d9e77a7c34adcee0a7f9ae95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Aug 2023 18:41:34 +0200 Subject: [PATCH 0482/1724] align --- config/cnc-ddraw config.cbproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index e47b6e4..2ba1b8f 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -303,7 +303,7 @@ - + 1 From 15cee173fc232e7eba1bda99bc01d5d4aacce600 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 04:50:02 +0200 Subject: [PATCH 0483/1724] Let cnc-ddraw create a new ddraw.ini if it doesn't exist --- config/ConfigFormUnit.cpp | 26 ++++++++++++++++++++++++++ inc/config.h | 1 + src/config.c | 6 +----- src/dllmain.c | 3 +++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 40cabe4..012499f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -541,6 +541,31 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { + /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ + if (!FileExists(".\\ddraw.ini")) { + + SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); + + HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + + if (ddraw) { + + void (WINAPI* dd_create)(void*, void**, void*); + + dd_create = + (void (WINAPI*)(void*, void**, void*)) + GetProcAddress(ddraw, "DirectDrawCreate"); + + if (dd_create) { + + void *buf; + dd_create(NULL, &buf, NULL); + } + + FreeLibrary(ddraw); + } + } + auto *ini = new TIniFile(".\\ddraw.ini"); ApplyTranslation(ini); @@ -860,6 +885,7 @@ void TConfigForm::SaveSettings() void __fastcall TConfigForm::FormActivate(TObject *Sender) { + /* Detect wine (Linux/macOS) and create the needed dll override */ if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) return; diff --git a/inc/config.h b/inc/config.h index 1b40a22..44b6939 100644 --- a/inc/config.h +++ b/inc/config.h @@ -20,6 +20,7 @@ typedef struct CNCDDRAWCONFIG extern CNCDDRAWCONFIG g_config; +void cfg_init(); void cfg_load(); void cfg_save(); diff --git a/src/config.c b/src/config.c index 8972a48..5d5bcf4 100644 --- a/src/config.c +++ b/src/config.c @@ -901,10 +901,6 @@ static void cfg_create_ini() "adjmouse=true\n" "fixchilds=1\n" "\n" - "; Septerra Core\n" - "[septerra]\n" - "hook=2\n" - "\n" "; Sim Copter\n" "[SimCopter]\n" "renderer=opengl\n" @@ -1058,7 +1054,7 @@ static void cfg_create_ini() } } -static void cfg_init() +void cfg_init() { /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) diff --git a/src/dllmain.c b/src/dllmain.c index 13832a1..ef60f1d 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -22,6 +22,9 @@ HMODULE g_ddraw_module; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + return TRUE; + switch (dwReason) { case DLL_PROCESS_ATTACH: From 62688e93d4bf1f66089a8af2f8f9928a805ba4fb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 05:02:49 +0200 Subject: [PATCH 0484/1724] revert changes --- inc/config.h | 1 - src/config.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 44b6939..1b40a22 100644 --- a/inc/config.h +++ b/inc/config.h @@ -20,7 +20,6 @@ typedef struct CNCDDRAWCONFIG extern CNCDDRAWCONFIG g_config; -void cfg_init(); void cfg_load(); void cfg_save(); diff --git a/src/config.c b/src/config.c index 5d5bcf4..f7e53ba 100644 --- a/src/config.c +++ b/src/config.c @@ -1054,7 +1054,7 @@ static void cfg_create_ini() } } -void cfg_init() +static void cfg_init() { /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) From da6e2068bc8ad3e0d4816c8460f148d66c5cc0e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 05:20:11 +0200 Subject: [PATCH 0485/1724] align --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 012499f..4274caa 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -886,7 +886,7 @@ void TConfigForm::SaveSettings() void __fastcall TConfigForm::FormActivate(TObject *Sender) { /* Detect wine (Linux/macOS) and create the needed dll override */ - if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) + if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) return; TRegistry* reg = new TRegistry(KEY_READ); From 1d6ac452a9b9906cc5a8f03204f45c841a316fed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 19:03:34 +0200 Subject: [PATCH 0486/1724] add workaround for CnCGraphicsPatcher --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index cdc3368..ead79ca 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1360,7 +1360,7 @@ HRESULT dd_CreateSurface( } else { - if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY)) + if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY) || g_ddraw->tshack) { dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } From fb835c617e271024d00f2379dc281c0ea5aa5cc6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 19:04:36 +0200 Subject: [PATCH 0487/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 3bc2d72..4b59efe 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6c3790cd24becc7fb5c3c5f63f1a01c8fa1bb8b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:09:38 +0200 Subject: [PATCH 0488/1724] replace hook=3 with GetProcAddress hook --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/config.c | 4 ++-- src/hook.c | 54 +++++++++++++++++++++------------------------- src/winapi_hooks.c | 39 +++++++++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 34 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index e5025c6..008ca2f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -6,7 +6,6 @@ #define SKIP_HOOK2 0x00000001l -#define SKIP_HOOK3 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; @@ -54,6 +53,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); +typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); @@ -94,12 +94,14 @@ extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; +extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern int g_hook_method; extern BOOL g_hook_active; +extern HOOKLIST g_hook_hooklist[]; void hook_init(BOOL initial_hook); void hook_exit(); diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 009cac8..0983b9b 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -47,6 +47,7 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); +FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName); BOOL WINAPI fake_GetDiskFreeSpaceA( LPCSTR lpRootPathName, diff --git a/src/config.c b/src/config.c index f7e53ba..59b8f43 100644 --- a/src/config.c +++ b/src/config.c @@ -312,9 +312,9 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+Detours Hooking (All Modules), 4 = IAT Hooking (All Modules)\n" + "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+GetProcAddress hook (All Modules), 4 = IAT Hooking (All Modules)\n" "; Note: Change this value if windowed mode or upscaling isn't working properly\n" - "; Note: 'hook=2' will usually work for problematic games, but 'hook=2' should be combined with renderer=gdi\n" + "; Note: 'hook=3' will usually work for problematic games, if it doesn't then try 'hook=2' + 'renderer=gdi'\n" "hook=4\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" diff --git a/src/hook.c b/src/hook.c index 5a0be42..5b18e25 100644 --- a/src/hook.c +++ b/src/hook.c @@ -53,11 +53,12 @@ LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; +GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; -static HOOKLIST g_hooks[] = +HOOKLIST g_hook_hooklist[] = { { "user32.dll", @@ -66,8 +67,8 @@ static HOOKLIST g_hooks[] = { "ClipCursor", (PROC)fake_ClipCursor, (PROC*)&real_ClipCursor, 0 }, { "ShowCursor", (PROC)fake_ShowCursor, (PROC*)&real_ShowCursor, 0 }, { "SetCursor", (PROC)fake_SetCursor, (PROC*)&real_SetCursor, 0 }, - { "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, SKIP_HOOK3 }, - { "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, SKIP_HOOK3 }, + { "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, 0 }, + { "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, 0 }, { "ClientToScreen", (PROC)fake_ClientToScreen, (PROC*)&real_ClientToScreen, 0 }, { "ScreenToClient", (PROC)fake_ScreenToClient, (PROC*)&real_ScreenToClient, 0 }, { "SetCursorPos", (PROC)fake_SetCursorPos, (PROC*)&real_SetCursorPos, 0 }, @@ -96,44 +97,45 @@ static HOOKLIST g_hooks[] = { "ole32.dll", { - { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 | SKIP_HOOK3 }, + { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 }, { "", NULL, NULL, 0 } } }, { "dinput.dll", { - { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 | SKIP_HOOK3 }, - { "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 | SKIP_HOOK3 }, - { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 | SKIP_HOOK3 }, + { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 }, + { "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, + { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 }, { "", NULL, NULL, 0 } } }, { "dinput8.dll", { - { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 | SKIP_HOOK3 }, + { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 }, { "", NULL, NULL, 0 } } }, { "gdi32.dll", { - { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, - { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 | SKIP_HOOK3 }, - { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 | SKIP_HOOK3 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, + { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, + { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, + { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, { "", NULL, NULL, 0 } } }, { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 | SKIP_HOOK3 }, - { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 }, - { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 }, - { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 | SKIP_HOOK3 }, + { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 }, + { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 }, + { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 }, + { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 }, + { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, SKIP_HOOK2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 }, { "", NULL, NULL, 0 } } }, @@ -365,16 +367,13 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) void hook_create(HOOKLIST* hooks, BOOL initial_hook) { #ifdef _MSC_VER - if ((g_hook_method == 2 || g_hook_method == 3) && initial_hook) + if ((g_hook_method == 2) && initial_hook) { for (int i = 0; hooks[i].module_name[0]; i++) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2)) - continue; - - if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3)) + if ((hooks[i].data[x].flags & SKIP_HOOK2)) continue; DetourTransactionBegin(); @@ -453,16 +452,13 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) void hook_revert(HOOKLIST* hooks) { #ifdef _MSC_VER - if (g_hook_method == 2 || g_hook_method == 3) + if (g_hook_method == 2) { for (int i = 0; hooks[i].module_name[0]; i++) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2)) - continue; - - if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3)) + if ((hooks[i].data[x].flags & SKIP_HOOK2)) continue; DetourTransactionBegin(); @@ -546,7 +542,7 @@ void hook_init(BOOL initial_hook) hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } - hook_create((HOOKLIST*)&g_hooks, initial_hook); + hook_create((HOOKLIST*)&g_hook_hooklist, initial_hook); g_hook_active = TRUE; } @@ -558,7 +554,7 @@ void hook_exit() { g_hook_active = FALSE; - hook_revert((HOOKLIST*)&g_hooks); + hook_revert((HOOKLIST*)&g_hook_hooklist); #if defined(_DEBUG) && defined(_MSC_VER) DetourTransactionBegin(); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6ec26c8..dcf2be2 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -14,6 +14,7 @@ #include "directinput.h" #include "ddsurface.h" #include "dllmain.h" +#include "hook.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -433,7 +434,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); } - if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3)) + if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && g_hook_method != 2) { Msg = WM_SIZE_DDRAW; } @@ -536,7 +537,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) if (nCmdShow == SW_MAXIMIZE) nCmdShow = SW_NORMAL; - if (nCmdShow == SW_MINIMIZE && (g_hook_method != 2 && g_hook_method != 3)) + if (nCmdShow == SW_MINIMIZE && g_hook_method != 2) return TRUE; } @@ -999,6 +1000,40 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw return hmod; } +FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) +{ +#ifdef _DEBUG + char mod_path[MAX_PATH] = { 0 }; + if (hModule && GetModuleFileNameA(hModule, mod_path, MAX_PATH)) + { + TRACE("GetProcAddress %s (%s)\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path); + } +#endif + + FARPROC proc = real_GetProcAddress(hModule, lpProcName); + + if (g_hook_method != 3 || !hModule || !HIWORD(lpProcName)) + return proc; + + for (int i = 0; g_hook_hooklist[i].module_name[0]; i++) + { + HMODULE mod = GetModuleHandleA(g_hook_hooklist[i].module_name); + + if (hModule != mod) + continue; + + for (int x = 0; g_hook_hooklist[i].data[x].function_name[0]; x++) + { + if (strcmp(lpProcName, g_hook_hooklist[i].data[x].function_name) == 0) + { + return (FARPROC)g_hook_hooklist[i].data[x].new_function; + } + } + } + + return proc; +} + BOOL WINAPI fake_GetDiskFreeSpaceA( LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, From 1d646e0f4f38727ea39546399f22e3fa7be94f75 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:13:51 +0200 Subject: [PATCH 0489/1724] update presets --- src/config.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index 59b8f43..1802b23 100644 --- a/src/config.c +++ b/src/config.c @@ -844,8 +844,7 @@ static void cfg_create_ini() "; KKND2: Krossfire\n" "[KKND2]\n" "noactivateapp=true\n" - "renderer=gdi\n" - "hook=2\n" + "hook=3\n" "\n" "; Lionheart\n" "[Lionheart]\n" @@ -1037,8 +1036,7 @@ static void cfg_create_ini() "\n" "; Wizards and Warriors\n" "[deep6]\n" - "renderer=gdi\n" - "hook=2\n" + "hook=3\n" "\n" "; War Wind\n" "[WW]\n" From a28578f925ef43979f3a880540a20b81d2feb235 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:25:34 +0200 Subject: [PATCH 0490/1724] use real functions --- src/IDirectDraw/IDirectDraw.c | 2 +- src/dd.c | 2 +- src/debug.c | 4 ++-- src/directinput.c | 32 +++++++++++++++---------- src/dllmain.c | 6 ++--- src/fps_limiter.c | 14 +++++------ src/hook.c | 4 ++-- src/opengl_utils.c | 44 +++++++++++++++++------------------ src/render_d3d9.c | 8 +++---- 9 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 1c779c9..50de4f8 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -133,7 +133,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll"); if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) - g_ddraw->DirectDrawCreate = (void*)GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); + g_ddraw->DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); if (g_ddraw->DirectDrawCreate == DirectDrawCreate) g_ddraw->DirectDrawCreate = NULL; diff --git a/src/dd.c b/src/dd.c index 0407c86..1e4aa48 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1218,7 +1218,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute InitializeCriticalSection(&g_ddraw->cs); g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); - g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + g_ddraw->wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; g_blt_use_avx = util_is_avx_supported(); cfg_load(); diff --git a/src/debug.c b/src/debug.c index 26625b2..eee17a8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -111,7 +111,7 @@ void dbg_init() } const char* (CDECL * wine_get_version)() = - (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); + (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); if (wine_get_version) { @@ -119,7 +119,7 @@ void dbg_init() } void (CDECL* wine_get_host_version)(const char** sysname, const char** release) = - (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version"); + (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version"); if (wine_get_host_version) { diff --git a/src/directinput.c b/src/directinput.c index 9406885..c73f7cf 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -186,12 +186,14 @@ HRESULT WINAPI fake_DirectInputCreateA( if (!real_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA"); if (real_DirectInputCreateA == fake_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)real_GetProcAddress( + real_LoadLibraryA("system32\\dinput.dll"), + "DirectInputCreateA"); } } @@ -220,12 +222,14 @@ HRESULT WINAPI fake_DirectInputCreateW( if (!real_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW == fake_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)real_GetProcAddress( + real_LoadLibraryA("system32\\dinput.dll"), + "DirectInputCreateW"); } } @@ -255,12 +259,14 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (!real_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx == fake_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)real_GetProcAddress( + real_LoadLibraryA("system32\\dinput.dll"), + "DirectInputCreateEx"); } } @@ -300,12 +306,14 @@ HRESULT WINAPI fake_DirectInput8Create( if (!real_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)real_GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create"); if (real_DirectInput8Create == fake_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("system32\\dinput8.dll"), "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)real_GetProcAddress( + real_LoadLibraryA("system32\\dinput8.dll"), + "DirectInput8Create"); } } @@ -330,7 +338,7 @@ void dinput_hook_init() { g_dinput_hook_active = TRUE; - real_DirectInputCreateA = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); + real_DirectInputCreateA = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA"); if (real_DirectInputCreateA && real_DirectInputCreateA != fake_DirectInputCreateA) { @@ -340,7 +348,7 @@ void dinput_hook_init() DetourTransactionCommit(); } /* Being called from winmm for some reason - real_DirectInputCreateW = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); + real_DirectInputCreateW = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW) { @@ -350,7 +358,7 @@ void dinput_hook_init() DetourTransactionCommit(); } */ - real_DirectInputCreateEx = (void*)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); + real_DirectInputCreateEx = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx && real_DirectInputCreateEx != fake_DirectInputCreateEx) { @@ -360,7 +368,7 @@ void dinput_hook_init() DetourTransactionCommit(); } - real_DirectInput8Create = (void*)GetProcAddress(LoadLibraryA("dinput8.dll"), "DirectInput8Create"); + real_DirectInput8Create = (void*)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create"); if (real_DirectInput8Create && real_DirectInput8Create != fake_DirectInput8Create) { diff --git a/src/dllmain.c b/src/dllmain.c index ef60f1d..da9035d 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -74,7 +74,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (user32_dll) { SETPROCESSDPIAWARENESSCONTEXTPROC set_awareness_context = - (SETPROCESSDPIAWARENESSCONTEXTPROC)GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext"); + (SETPROCESSDPIAWARENESSCONTEXTPROC)real_GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext"); if (set_awareness_context) { @@ -85,7 +85,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (!set_dpi_aware && shcore_dll) { SETPROCESSDPIAWERENESSPROC set_awareness = - (SETPROCESSDPIAWERENESSPROC)GetProcAddress(shcore_dll, "SetProcessDpiAwareness"); + (SETPROCESSDPIAWERENESSPROC)real_GetProcAddress(shcore_dll, "SetProcessDpiAwareness"); if (set_awareness) { @@ -98,7 +98,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (!set_dpi_aware && user32_dll) { SETPROCESSDPIAWAREPROC set_aware = - (SETPROCESSDPIAWAREPROC)GetProcAddress(user32_dll, "SetProcessDPIAware"); + (SETPROCESSDPIAWAREPROC)real_GetProcAddress(user32_dll, "SetProcessDPIAware"); if (set_aware) set_aware(); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index c2c82a2..870b4be 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -35,42 +35,42 @@ void fpsl_init() if (!g_fpsl.gdi32_dll) { - g_fpsl.gdi32_dll = LoadLibraryA("gdi32.dll"); + g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); } if (!g_fpsl.dwmapi_dll) { - g_fpsl.dwmapi_dll = LoadLibraryA("dwmapi.dll"); + g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); } if (!g_fpsl.DwmFlush) { g_fpsl.DwmFlush = - (DWMFLUSHPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); + (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); } if (!g_fpsl.DwmIsCompositionEnabled) { g_fpsl.DwmIsCompositionEnabled = - (DWMISCOMPOSITIONENABLEDPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); + (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); } if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = - (D3DKMTWAITFORVERTICALBLANKEVENTPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent"); + (D3DKMTWAITFORVERTICALBLANKEVENTPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent"); } if (!g_fpsl.D3DKMTOpenAdapterFromHdc) { g_fpsl.D3DKMTOpenAdapterFromHdc = - (D3DKMTOPENADAPTERFROMHDCPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc"); + (D3DKMTOPENADAPTERFROMHDCPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc"); } if (!g_fpsl.D3DKMTCloseAdapter) { g_fpsl.D3DKMTCloseAdapter = - (D3DKMTCLOSEADAPTERPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter"); + (D3DKMTCLOSEADAPTERPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter"); } g_fpsl.initialized = TRUE; diff --git a/src/hook.c b/src/hook.c index 5b18e25..0762cf5 100644 --- a/src/hook.c +++ b/src/hook.c @@ -202,7 +202,7 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) for (int x = 0; hooks[i].data[x].function_name[0]; x++) { DWORD org_function = - (DWORD)GetProcAddress( + (DWORD)real_GetProcAddress( cur_mod, hooks[i].data[x].function_name); @@ -327,7 +327,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (unhook) { DWORD org = - (DWORD)GetProcAddress( + (DWORD)real_GetProcAddress( GetModuleHandle(hooks[i].module_name), hooks[i].data[x].function_name); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 9342177..ebd708d 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -98,30 +98,30 @@ BOOL oglu_load_dll() if (g_oglu_hmodule) { - xwglCreateContext = (PFNWGLCREATECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglCreateContext"); - xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglDeleteContext"); - xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)GetProcAddress(g_oglu_hmodule, "wglGetProcAddress"); - xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)GetProcAddress(g_oglu_hmodule, "wglMakeCurrent"); + xwglCreateContext = (PFNWGLCREATECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglCreateContext"); + xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglDeleteContext"); + xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)real_GetProcAddress(g_oglu_hmodule, "wglGetProcAddress"); + xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)real_GetProcAddress(g_oglu_hmodule, "wglMakeCurrent"); - glViewport = (PFNGLVIEWPORTPROC)GetProcAddress(g_oglu_hmodule, "glViewport"); - glBindTexture = (PFNGLBINDTEXTUREPROC)GetProcAddress(g_oglu_hmodule, "glBindTexture"); - glGenTextures = (PFNGLGENTEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glGenTextures"); - glTexParameteri = (PFNGLTEXPARAMETERIPROC)GetProcAddress(g_oglu_hmodule, "glTexParameteri"); - glDeleteTextures = (PFNGLDELETETEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glDeleteTextures"); - glTexImage2D = (PFNGLTEXIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexImage2D"); - glDrawElements = (PFNGLDRAWELEMENTSPROC)GetProcAddress(g_oglu_hmodule, "glDrawElements"); - glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexSubImage2D"); - glGetError = (PFNGLGETERRORPROC)GetProcAddress(g_oglu_hmodule, "glGetError"); - glGetString = (PFNGLGETSTRINGPROC)GetProcAddress(g_oglu_hmodule, "glGetString"); - glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(g_oglu_hmodule, "glGetTexImage"); - glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(g_oglu_hmodule, "glPixelStorei"); - glEnable = (PFNGLENABLEPROC)GetProcAddress(g_oglu_hmodule, "glEnable"); - glClear = (PFNGLCLEARPROC)GetProcAddress(g_oglu_hmodule, "glClear"); + glViewport = (PFNGLVIEWPORTPROC)real_GetProcAddress(g_oglu_hmodule, "glViewport"); + glBindTexture = (PFNGLBINDTEXTUREPROC)real_GetProcAddress(g_oglu_hmodule, "glBindTexture"); + glGenTextures = (PFNGLGENTEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glGenTextures"); + glTexParameteri = (PFNGLTEXPARAMETERIPROC)real_GetProcAddress(g_oglu_hmodule, "glTexParameteri"); + glDeleteTextures = (PFNGLDELETETEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glDeleteTextures"); + glTexImage2D = (PFNGLTEXIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexImage2D"); + glDrawElements = (PFNGLDRAWELEMENTSPROC)real_GetProcAddress(g_oglu_hmodule, "glDrawElements"); + glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexSubImage2D"); + glGetError = (PFNGLGETERRORPROC)real_GetProcAddress(g_oglu_hmodule, "glGetError"); + glGetString = (PFNGLGETSTRINGPROC)real_GetProcAddress(g_oglu_hmodule, "glGetString"); + glGetTexImage = (PFNGLGETTEXIMAGEPROC)real_GetProcAddress(g_oglu_hmodule, "glGetTexImage"); + glPixelStorei = (PFNGLPIXELSTOREIPROC)real_GetProcAddress(g_oglu_hmodule, "glPixelStorei"); + glEnable = (PFNGLENABLEPROC)real_GetProcAddress(g_oglu_hmodule, "glEnable"); + glClear = (PFNGLCLEARPROC)real_GetProcAddress(g_oglu_hmodule, "glClear"); - glBegin = (PFNGLBEGINPROC)GetProcAddress(g_oglu_hmodule, "glBegin"); - glEnd = (PFNGLENDPROC)GetProcAddress(g_oglu_hmodule, "glEnd"); - glTexCoord2f = (PFNGLTEXCOORD2FPROC)GetProcAddress(g_oglu_hmodule, "glTexCoord2f"); - glVertex2f = (PFNGLVERTEX2FPROC)GetProcAddress(g_oglu_hmodule, "glVertex2f"); + glBegin = (PFNGLBEGINPROC)real_GetProcAddress(g_oglu_hmodule, "glBegin"); + glEnd = (PFNGLENDPROC)real_GetProcAddress(g_oglu_hmodule, "glEnd"); + glTexCoord2f = (PFNGLTEXCOORD2FPROC)real_GetProcAddress(g_oglu_hmodule, "glTexCoord2f"); + glVertex2f = (PFNGLVERTEX2FPROC)real_GetProcAddress(g_oglu_hmodule, "glVertex2f"); } return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport && diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5413120..98cf9aa 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -26,7 +26,7 @@ BOOL d3d9_is_available() if ((g_d3d9.hmodule = LoadLibrary("d3d9.dll"))) { IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) IDirect3D9_Release(d3d9); @@ -52,7 +52,7 @@ BOOL d3d9_create() if (g_ddraw->nonexclusive) { int (WINAPI * d3d9_enable_shim)(BOOL) = - (int (WINAPI*)(BOOL))GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim"); + (int (WINAPI*)(BOOL))real_GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim"); if (d3d9_enable_shim) d3d9_enable_shim(TRUE); @@ -68,11 +68,11 @@ BOOL d3d9_create() if (g_ddraw->d3d9on12) { - d3d_create9on12 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); } else { - d3d_create9 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + d3d_create9 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); } if ((d3d_create9on12 && (d3d9on12 = g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || From ec8e2791fe501b989ff183d33c4beb04533ccf90 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:31:04 +0200 Subject: [PATCH 0491/1724] add missing header --- src/fps_limiter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 870b4be..ce76f93 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -2,6 +2,7 @@ #include "fps_limiter.h" #include "dd.h" #include "debug.h" +#include "hook.h" FPSLIMITER g_fpsl; From 8b42dbddba340612c017bd34c2c90505a295113f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:37:43 +0200 Subject: [PATCH 0492/1724] add missing header --- src/IDirectDraw/IDirectDraw.c | 1 + src/debug.c | 1 + src/opengl_utils.c | 1 + src/render_d3d9.c | 1 + 4 files changed, 4 insertions(+) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 50de4f8..31960c2 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -7,6 +7,7 @@ #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" +#include "hook.h" HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) diff --git a/src/debug.c b/src/debug.c index eee17a8..6ac0b88 100644 --- a/src/debug.c +++ b/src/debug.c @@ -6,6 +6,7 @@ #include "ddsurface.h" #include "wndproc.h" #include "debug.h" +#include "hook.h" double g_dbg_frame_time = 0; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index ebd708d..89d41e3 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -3,6 +3,7 @@ #include "opengl_utils.h" #include "dd.h" #include "debug.h" +#include "hook.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 98cf9aa..92ae32b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -11,6 +11,7 @@ #include "blt.h" #include "debug.h" #include "D3d9types.h" +#include "hook.h" static BOOL d3d9_create_resources(); From 68c72a55ad1e7556869d7f100f810565ec238780 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 09:41:47 +0200 Subject: [PATCH 0493/1724] use real function --- src/IDirectDraw/IDirectDraw.c | 2 +- src/opengl_utils.c | 2 +- src/render_d3d9.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 31960c2..45296dd 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -131,7 +131,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); if (!g_ddraw->real_dll) - g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll"); + g_ddraw->real_dll = real_LoadLibraryA("system32\\ddraw.dll"); if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) g_ddraw->DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 89d41e3..f1bc32b 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -95,7 +95,7 @@ char g_oglu_version[128]; BOOL oglu_load_dll() { if (!g_oglu_hmodule) - g_oglu_hmodule = LoadLibrary("opengl32.dll"); + g_oglu_hmodule = real_LoadLibraryA("opengl32.dll"); if (g_oglu_hmodule) { diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 92ae32b..b681ea6 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -24,7 +24,7 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; - if ((g_d3d9.hmodule = LoadLibrary("d3d9.dll"))) + if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { IDirect3D9* (WINAPI * d3d_create9)(UINT) = (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); @@ -46,7 +46,7 @@ BOOL d3d9_create() d3d9_release(); if (!g_d3d9.hmodule) - g_d3d9.hmodule = LoadLibrary("d3d9.dll"); + g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"); if (g_d3d9.hmodule) { From 00d2f69a6611d5e33942a858795ebc9e5be7844a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 10:19:40 +0200 Subject: [PATCH 0494/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 4b59efe..f40732a 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6a4941a1be1f5465e92721bf8a424e1a03a3256c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 10:29:03 +0200 Subject: [PATCH 0495/1724] use hook=3 now instead --- config/ConfigFormUnit.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4274caa..9cb5c70 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -683,7 +683,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) NoactivateappChk->State = GetBool(ini, "noactivateapp", false) ? tssOn : tssOff; Hook = ini->ReadInteger("ddraw", "hook", 4); - HookChk->State = Hook == 2 ? tssOn : tssOff; + HookChk->State = Hook == 3 ? tssOn : tssOff; Minfps = ini->ReadInteger("ddraw", "minfps", 0); MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; @@ -852,15 +852,12 @@ void TConfigForm::SaveSettings() "noactivateapp", NoactivateappChk->State == tssOn ? "true" : "false"); - int hook = Hook != 2 ? Hook : 4; + int hook = Hook != 3 ? Hook : 4; ini->WriteInteger( "ddraw", "hook", - HookChk->State == tssOn ? 2 : hook); - - if (HookChk->State == tssOn && Hook != 2) - ini->WriteString("ddraw", "renderer", "gdi"); + HookChk->State == tssOn ? 3 : hook); int minfps = Minfps == 0 ? -1 : Minfps; From b591827f1284eeee1837e0e97bd533cb159f9ca4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Aug 2023 18:57:30 +0200 Subject: [PATCH 0496/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index f40732a..b5c27f6 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 4 +#define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b54285d1292dffc0fcd2872f71ba46a3c7e1d0c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 7 Aug 2023 10:15:52 +0200 Subject: [PATCH 0497/1724] #231 add hack for stronghold --- inc/dd.h | 1 + src/config.c | 12 ++++++++---- src/dd.c | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 0a85966..9fdab93 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -161,6 +161,7 @@ typedef struct CNCDDRAW BOOL armadahack; BOOL tshack; BOOL infantryhack; + BOOL stronghold_hack; int maxgameticks; BOOL alt_key_down; BOOL releasealt; diff --git a/src/config.c b/src/config.c index 1802b23..8ef89b1 100644 --- a/src/config.c +++ b/src/config.c @@ -57,6 +57,7 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); + g_ddraw->stronghold_hack = cfg_get_bool("stronghold_hack", FALSE); if (cfg_get_bool("game_handles_close", FALSE) || g_ddraw->infantryhack) { @@ -935,20 +936,23 @@ static void cfg_create_ini() "[StarCraft]\n" "game_handles_close=true\n" "\n" - "; Stronghold Crusader HD\n" - "[Stronghold Crusader]\n" - "adjmouse=true\n" - "\n" "; Space Rangers\n" "[Rangers]\n" "hook_peekmessage=true\n" "\n" + "; Stronghold Crusader HD\n" + "[Stronghold Crusader]\n" + "stronghold_hack=true\n" + "adjmouse=true\n" + "\n" "; Stronghold Crusader Extreme HD\n" "[Stronghold_Crusader_Extreme]\n" + "stronghold_hack=true\n" "adjmouse=true\n" "\n" "; Stronghold HD\n" "[Stronghold]\n" + "stronghold_hack=true\n" "adjmouse=true\n" "\n" "; Sim City 3000\n" diff --git a/src/dd.c b/src/dd.c index 1e4aa48..2eb5e73 100644 --- a/src/dd.c +++ b/src/dd.c @@ -44,6 +44,11 @@ HRESULT dd_EnumDisplayModes( max_h = reg_m.dmPelsHeight; } + if (g_ddraw->stronghold_hack && max_w && (max_w % 8)) + { + while (--max_w % 8); + } + SIZE resolutions[] = { { 320, 200 }, From 63c13d8a635a9330bfb31e8397c5a2a85047101e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 7 Aug 2023 10:16:54 +0200 Subject: [PATCH 0498/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index b5c27f6..3fae455 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 54f23331e879b2377d64a9dbb11ee039c0162575 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 8 Aug 2023 17:45:19 +0200 Subject: [PATCH 0499/1724] merge opengl core and direct3d9on12 into renderer= setting --- config/ConfigFormUnit.cpp | 18 +- config/ConfigFormUnit.dfm | 388 +++++++++++++++++++------------------- src/config.c | 40 ++-- src/render_d3d9.c | 6 +- 4 files changed, 234 insertions(+), 218 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 9cb5c70..7ceea09 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -597,7 +597,15 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) auto renderer = LowerCase(ini->ReadString("ddraw", "renderer", "auto")); - if (StartsStr("d", renderer)) { + if (renderer == "direct3d9on12") { + RendererCbx->AddItem(L"Direct3D 12 (9On12)", NULL); + RendererCbx->ItemIndex = 4; + } + else if (renderer == "openglcore") { + RendererCbx->AddItem(L"OpenGL Core", NULL); + RendererCbx->ItemIndex = 4; + } + else if (StartsStr("d", renderer)) { RendererCbx->ItemIndex = 1; } else if (StartsStr("o", renderer)) { @@ -767,6 +775,14 @@ void TConfigForm::SaveSettings() case 3: ini->WriteString("ddraw", "renderer", "gdi"); break; + case 4: + if (RendererCbx->Text == "OpenGL Core") { + ini->WriteString("ddraw", "renderer", "openglcore"); + } + else { + ini->WriteString("ddraw", "renderer", "direct3d9on12"); + } + break; default: break; } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 36f3daa..b2eb62d 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2681,200 +2681,6 @@ object ConfigForm: TConfigForm OnActivate = FormActivate OnCreate = FormCreate TextHeight = 13 - object AdvancedPnl: TPanel - Left = 233 - Top = 8 - Width = 499 - Height = 465 - BevelOuter = bvNone - Color = clWhite - ParentBackground = False - ShowCaption = False - TabOrder = 2 - Visible = False - StyleElements = [seFont, seBorder] - object RendererLbl: TLabel - Left = 40 - Top = 28 - Width = 64 - Height = 21 - Caption = 'Renderer' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object SavesettingsLbl: TLabel - Left = 40 - Top = 386 - Width = 256 - Height = 21 - Margins.Top = 18 - Caption = 'Remember window position and size' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object ShaderLbl: TLabel - Left = 40 - Top = 105 - Width = 108 - Height = 21 - Margins.Top = 18 - Caption = 'OpenGL shader' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object MaxfpsLbl: TLabel - Left = 40 - Top = 182 - Width = 111 - Height = 21 - Margins.Top = 18 - Caption = 'Limit frame rate' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object BorderLbl: TLabel - Left = 40 - Top = 318 - Width = 293 - Height = 21 - Margins.Top = 18 - Caption = 'Show window borders in windowed mode' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object BoxingLbl: TLabel - Left = 40 - Top = 250 - Width = 267 - Height = 21 - Margins.Top = 18 - Caption = 'Enable windowboxing / integer scaling' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object RendererPbox: TPaintBox - Left = 40 - Top = 54 - Width = 207 - Height = 31 - OnPaint = PboxPaint - end - object ShaderPbox: TPaintBox - Left = 40 - Top = 131 - Width = 427 - Height = 31 - OnPaint = PboxPaint - end - object RendererCbx: TComboBox - Left = 41 - Top = 55 - Width = 205 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 0 - OnChange = RendererCbxChange - Items.Strings = ( - 'Automatic' - 'Direct3D 9' - 'OpenGL' - 'GDI') - end - object BorderChk: TToggleSwitch - Left = 40 - Top = 345 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 1 - OnClick = BorderChkClick - end - object SavesettingsChk: TToggleSwitch - Left = 40 - Top = 413 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 2 - OnClick = SavesettingsChkClick - end - object ShaderCbx: TComboBox - Left = 41 - Top = 132 - Width = 425 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - DropDownCount = 10 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 3 - OnChange = ShaderCbxChange - end - object MaxfpsChk: TToggleSwitch - Left = 40 - Top = 209 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 4 - OnClick = MaxfpsChkClick - end - object BoxingChk: TToggleSwitch - Left = 40 - Top = 277 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 5 - OnClick = BoxingChkClick - end - end object DisplayPnl: TPanel Left = 233 Top = 8 @@ -3245,6 +3051,200 @@ object ConfigForm: TConfigForm OnClick = NonexclusiveChkClick end end + object AdvancedPnl: TPanel + Left = 233 + Top = 8 + Width = 499 + Height = 465 + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 2 + Visible = False + StyleElements = [seFont, seBorder] + object RendererLbl: TLabel + Left = 40 + Top = 28 + Width = 64 + Height = 21 + Caption = 'Renderer' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object SavesettingsLbl: TLabel + Left = 40 + Top = 386 + Width = 256 + Height = 21 + Margins.Top = 18 + Caption = 'Remember window position and size' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object ShaderLbl: TLabel + Left = 40 + Top = 105 + Width = 108 + Height = 21 + Margins.Top = 18 + Caption = 'OpenGL shader' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object MaxfpsLbl: TLabel + Left = 40 + Top = 182 + Width = 111 + Height = 21 + Margins.Top = 18 + Caption = 'Limit frame rate' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object BorderLbl: TLabel + Left = 40 + Top = 318 + Width = 293 + Height = 21 + Margins.Top = 18 + Caption = 'Show window borders in windowed mode' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object BoxingLbl: TLabel + Left = 40 + Top = 250 + Width = 267 + Height = 21 + Margins.Top = 18 + Caption = 'Enable windowboxing / integer scaling' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object RendererPbox: TPaintBox + Left = 40 + Top = 54 + Width = 207 + Height = 31 + OnPaint = PboxPaint + end + object ShaderPbox: TPaintBox + Left = 40 + Top = 131 + Width = 427 + Height = 31 + OnPaint = PboxPaint + end + object RendererCbx: TComboBox + Left = 41 + Top = 55 + Width = 205 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = RendererCbxChange + Items.Strings = ( + 'Automatic' + 'Direct3D 9' + 'OpenGL' + 'GDI') + end + object BorderChk: TToggleSwitch + Left = 40 + Top = 345 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 1 + OnClick = BorderChkClick + end + object SavesettingsChk: TToggleSwitch + Left = 40 + Top = 413 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 2 + OnClick = SavesettingsChkClick + end + object ShaderCbx: TComboBox + Left = 41 + Top = 132 + Width = 425 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + DropDownCount = 10 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnChange = ShaderCbxChange + end + object MaxfpsChk: TToggleSwitch + Left = 40 + Top = 209 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 4 + OnClick = MaxfpsChkClick + end + object BoxingChk: TToggleSwitch + Left = 40 + Top = 277 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 5 + OnClick = BoxingChkClick + end + end object MenuPnl: TPanel Left = 0 Top = 8 diff --git a/src/config.c b/src/config.c index 8ef89b1..b4e8d0e 100644 --- a/src/config.c +++ b/src/config.c @@ -19,12 +19,11 @@ CNCDDRAWCONFIG g_config = void cfg_load() { - char tmp[256]; - cfg_init(); /* load settings from ini */ g_ddraw->windowed = cfg_get_bool("windowed", FALSE); + g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); g_ddraw->border = cfg_get_bool("border", TRUE); g_ddraw->boxing = cfg_get_bool("boxing", FALSE); g_ddraw->maintas = cfg_get_bool("maintas", FALSE); @@ -42,13 +41,11 @@ void cfg_load() g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); - g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); - g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); @@ -114,8 +111,6 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } - g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); - if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); @@ -133,18 +128,29 @@ void cfg_load() /* to do: read .glslp config file instead of the shader and apply the correct settings */ cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_ddraw->shader, sizeof(g_ddraw->shader)); - cfg_get_string("renderer", "auto", tmp, sizeof(tmp)); - TRACE(" Using %s renderer\n", tmp); + char renderer[256] = {0}; + cfg_get_string("renderer", "auto", renderer, sizeof(renderer)); - if (tolower(tmp[0]) == 'd' || g_ddraw->d3d9on12) /* direct3d9 */ + TRACE(" Using %s renderer\n", renderer); + + if (_strcmpi(renderer, "direct3d9on12") == 0) + { + g_ddraw->d3d9on12 = TRUE; + } + else if (_strcmpi(renderer, "openglcore") == 0) + { + g_ddraw->opengl_core = TRUE; + } + + if (tolower(renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ { g_ddraw->renderer = d3d9_render_main; } - else if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') /* gdi */ + else if (tolower(renderer[0]) == 's' || tolower(renderer[0]) == 'g') /* gdi */ { g_ddraw->renderer = gdi_render_main; } - else if (tolower(tmp[0]) == 'o') /* opengl */ + else if (tolower(renderer[0]) == 'o') /* opengl or openglcore */ { if (oglu_load_dll()) { @@ -251,7 +257,7 @@ static void cfg_create_ini() "; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks='\n" "maxfps=-1\n" "\n" - "; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl/direct3d9')\n" + "; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl*/direct3d9*')\n" "; Note: vsync=true can fix tearing but it will cause input lag\n" "vsync=false\n" "\n" @@ -259,7 +265,7 @@ static void cfg_create_ini() "; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window\n" "adjmouse=true\n" "\n" - "; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n" + "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" @@ -267,7 +273,7 @@ static void cfg_create_ini() "posX=-32000\n" "posY=-32000\n" "\n" - "; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n" + "; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi)\n" "renderer=auto\n" "\n" "; Developer mode (don't lock the cursor)\n" @@ -283,7 +289,7 @@ static void cfg_create_ini() "; Should the window be resizable by the user in windowed mode?\n" "resizable=true\n" "\n" - "; Upscaling filter for the direct3d9 renderer\n" + "; Upscaling filter for the direct3d9* renderers\n" "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic (16/32bit color depth games only)\n" "d3d9_filter=2\n" "\n" @@ -322,7 +328,7 @@ static void cfg_create_ini() "; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)\n" "minfps=0\n" "\n" - "; Disable fullscreen-exclusive mode for the direct3d9/opengl renderers\n" + "; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers\n" "; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible\n" "nonexclusive=false\n" "\n" @@ -339,8 +345,6 @@ static void cfg_create_ini() "\n" "\n" "; Undocumented settings\n" - "opengl_core=false\n" - "d3d9on12=false\n" "guard_lines=200\n" "max_resolutions=0\n" "limit_bltfast=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index b681ea6..94ff919 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -65,16 +65,12 @@ BOOL d3d9_create() args.Enable9On12 = TRUE; IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; - IDirect3D9* (WINAPI * d3d_create9)(UINT) = NULL; + IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); if (g_ddraw->d3d9on12) { d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); } - else - { - d3d_create9 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - } if ((d3d_create9on12 && (d3d9on12 = g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) From 88e243b91def32789ebcf0d36022243e59216b3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 8 Aug 2023 18:09:17 +0200 Subject: [PATCH 0500/1724] don't switch to opengl --- config/ConfigFormUnit.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 7ceea09..a01ffd8 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -905,7 +905,7 @@ void __fastcall TConfigForm::FormActivate(TObject *Sender) TRegistry* reg = new TRegistry(KEY_READ); reg->RootKey = HKEY_CURRENT_USER; - if(reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { + if (reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { if (!reg->ValueExists("ddraw")) { @@ -974,7 +974,10 @@ void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) void __fastcall TConfigForm::ShaderCbxChange(TObject *Sender) { - RendererCbx->ItemIndex = 2; + if (RendererCbx->Text != "OpenGL Core") { + RendererCbx->ItemIndex = 2; + } + SaveSettings(); } From 638150ad25a0abad0a9ef2d5d1a1eb444f9ecbea Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 9 Aug 2023 17:24:05 +0200 Subject: [PATCH 0501/1724] fix config height --- config/ConfigFormUnit.dfm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index b2eb62d..4f61a35 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,7 +4,7 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 477 + ClientHeight = 476 ClientWidth = 741 Color = clHotLight Font.Charset = DEFAULT_CHARSET From 9d85980430b648700f7f809f74fcd736d433967e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 9 Aug 2023 17:46:30 +0200 Subject: [PATCH 0502/1724] use anchors --- config/ConfigFormUnit.cpp | 3 --- config/ConfigFormUnit.dfm | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index a01ffd8..b8ff02a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -209,9 +209,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; ClientWidth *= 1.13; - DisplayPnl->Width *= 1.192; - AdvancedPnl->Width *= 1.192; - CompatibilityPnl->Width *= 1.192; /* -Russian- made by shikulja @ github */ diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 4f61a35..e76b25a 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2680,12 +2680,16 @@ object ConfigForm: TConfigForm Position = poDesktopCenter OnActivate = FormActivate OnCreate = FormCreate + DesignSize = ( + 741 + 476) TextHeight = 13 object DisplayPnl: TPanel Left = 233 Top = 8 Width = 499 Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite ParentBackground = False @@ -2871,6 +2875,7 @@ object ConfigForm: TConfigForm Top = 8 Width = 499 Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite ParentBackground = False @@ -3056,6 +3061,7 @@ object ConfigForm: TConfigForm Top = 8 Width = 499 Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite ParentBackground = False From 3a3304283f6080e59641f941e2bc80f8df192165 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 9 Aug 2023 18:06:08 +0200 Subject: [PATCH 0503/1724] fix anchor for left panel --- config/ConfigFormUnit.dfm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index e76b25a..7ca16c4 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2696,6 +2696,8 @@ object ConfigForm: TConfigForm ShowCaption = False TabOrder = 1 StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 DesignSize = ( 499 465) @@ -2883,6 +2885,8 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3069,6 +3073,8 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3256,6 +3262,7 @@ object ConfigForm: TConfigForm Top = 8 Width = 227 Height = 465 + Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone Color = clHotLight ParentBackground = False From d7786e1f0e2e7fb541edd4129c9a1ee0a20940e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 11:32:43 +0200 Subject: [PATCH 0504/1724] support CLSID_DirectDrawClipper in CoCreateInstance --- src/dd.c | 8 -------- src/winapi_hooks.c | 13 +++++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/dd.c b/src/dd.c index 2eb5e73..7789e43 100644 --- a/src/dd.c +++ b/src/dd.c @@ -758,14 +758,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (g_ddraw->wine) - { - real_SetWindowLongA( - g_ddraw->hwnd, - GWL_STYLE, - (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); - } - /* center the window with correct dimensions */ int cy = g_ddraw->mode.dmPelsWidth ? g_ddraw->mode.dmPelsWidth : g_ddraw->render.width; int cx = g_ddraw->mode.dmPelsHeight ? g_ddraw->mode.dmPelsHeight : g_ddraw->render.height; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index dcf2be2..0a02e09 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -13,6 +13,7 @@ #include "render_gdi.h" #include "directinput.h" #include "ddsurface.h" +#include "ddclipper.h" #include "dllmain.h" #include "hook.h" @@ -1206,6 +1207,8 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { + TRACE(" GUID = %08X (CLSID_DirectDrawX)\n", ((GUID*)rclsid)->Data1); + if (IsEqualGUID(&IID_IDirectDraw2, riid) || IsEqualGUID(&IID_IDirectDraw4, riid) || IsEqualGUID(&IID_IDirectDraw7, riid)) @@ -1217,6 +1220,16 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); } } + + if (IsEqualGUID(&CLSID_DirectDrawClipper, rclsid)) + { + TRACE(" GUID = %08X (CLSID_DirectDrawClipper)\n", ((GUID*)rclsid)->Data1); + + if (IsEqualGUID(&IID_IDirectDrawClipper, riid)) + { + return dd_CreateClipper(0, (IDirectDrawClipperImpl**)ppv, NULL); + } + } } return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); From cb481f513b9e495f6b18c580071bbc2f2b5701be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 11:33:19 +0200 Subject: [PATCH 0505/1724] revert change --- src/dd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dd.c b/src/dd.c index 7789e43..2eb5e73 100644 --- a/src/dd.c +++ b/src/dd.c @@ -758,6 +758,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } + if (g_ddraw->wine) + { + real_SetWindowLongA( + g_ddraw->hwnd, + GWL_STYLE, + (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + } + /* center the window with correct dimensions */ int cy = g_ddraw->mode.dmPelsWidth ? g_ddraw->mode.dmPelsWidth : g_ddraw->render.width; int cx = g_ddraw->mode.dmPelsHeight ? g_ddraw->mode.dmPelsHeight : g_ddraw->render.height; From 594cc4d8da87a572abe447bdbb496518958d6a71 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 14:41:42 +0200 Subject: [PATCH 0506/1724] add DebugLogMini build config --- cnc-ddraw.sln | 7 ++++-- cnc-ddraw.vcxproj | 47 +++++++++++++++++++++++++++++++++++ cnc-ddraw.vcxproj.filters | 5 ---- src/IDirectDraw/IDirectDraw.c | 4 +-- src/dd.c | 2 +- src/ddsurface.c | 6 ++--- src/debug.c | 4 +-- src/winapi_hooks.c | 6 ++--- 8 files changed, 63 insertions(+), 18 deletions(-) diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index 317ca47..ab7f479 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30503.244 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33829.357 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cnc-ddraw", "cnc-ddraw.vcxproj", "{96094551-5D52-4EBD-BE4C-5291A03507FC}" EndProject @@ -9,6 +9,7 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 DebugLog|x86 = DebugLog|x86 + DebugLogMini|x86 = DebugLogMini|x86 Release|x86 = Release|x86 ReleaseWin2000|x86 = ReleaseWin2000|x86 EndGlobalSection @@ -17,6 +18,8 @@ Global {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.ActiveCfg = DebugLog|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.ActiveCfg = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.ActiveCfg = ReleaseWin2000|Win32 diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index a6e3b55..6fa674b 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -1,6 +1,10 @@  + + DebugLogMini + Win32 + DebugLog Win32 @@ -142,6 +146,13 @@ true MultiByte + + DynamicLibrary + false + v141_xp + true + MultiByte + @@ -160,6 +171,9 @@ + + + $(SolutionDir)bin\Debug\ @@ -185,6 +199,12 @@ false ddraw + + $(SolutionDir)bin\DebugLogMini\ + $(SolutionDir)bin\DebugLogMini\ + false + ddraw + @@ -290,6 +310,33 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) + + + + + + Level2 + + + MaxSpeed + true + true + _DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + inc;src\detours + + + Windows + true + true + dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ddraw.def + + + +if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 145a53f..39187f8 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -272,9 +272,4 @@ Resource Files - - - Source Files - - \ No newline at end of file diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 45296dd..3bf3861 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -483,9 +483,9 @@ HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); + TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/dd.c b/src/dd.c index 2eb5e73..5d27aa3 100644 --- a/src/dd.c +++ b/src/dd.c @@ -129,7 +129,7 @@ HRESULT dd_EnumDisplayModes( flags == m.dmDisplayFlags && fixed_output == m.dmDisplayFixedOutput) { - TRACE_EXT( + TRACE( " %u: %ux%u@%u %u bpp\n", i, m.dmPelsWidth, diff --git a/src/ddsurface.c b/src/ddsurface.c index ead79ca..8571cd4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -844,9 +844,9 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - if (dwFlags != DDCKEY_SRCBLT) + if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) { - TRACE_EXT(" NOT_IMPLEMENTED dwFlags=%08X\n", dwFlags); + TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); } if (lpColorKey) @@ -1024,7 +1024,7 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE { if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) { - TRACE_EXT(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); + TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); } if (lpColorKey) diff --git a/src/debug.c b/src/debug.c index 6ac0b88..290aa63 100644 --- a/src/debug.c +++ b/src/debug.c @@ -516,7 +516,7 @@ void dbg_dump_dds_blt_fx_flags(DWORD flags) void dbg_dump_dds_caps(DWORD caps) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (caps & DDSCAPS_RESERVED1) { TRACE(" DDSCAPS_RESERVED1\n"); } @@ -612,7 +612,7 @@ void dbg_dump_dds_caps(DWORD caps) void dbg_dump_dds_flags(DWORD flags) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (flags & DDSD_CAPS) { TRACE(" DDSD_CAPS\n"); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 0a02e09..ea0f5cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -909,11 +909,11 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); -#ifdef _DEBUG_X +#ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE_EXT("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + TRACE("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); } #endif @@ -1203,7 +1203,7 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD { if (rclsid && riid) { - TRACE("CoCreateInstance rclsid = %08X, riid = %08X, \n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); + TRACE("CoCreateInstance rclsid = %08X, riid = %08X\n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { From 845360b021196bdc392dfb709cbf09271a0cc3ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 14:47:26 +0200 Subject: [PATCH 0507/1724] log wndproc --- src/wndproc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 413cd5e..0075022 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -17,12 +17,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER) { - TRACE_EXT( + TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", dbg_mes_to_str(uMsg), uMsg, From 5ff806a9500651a3117f8ac9346632d439760070 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 17:24:27 +0200 Subject: [PATCH 0508/1724] adjust stronghold presets --- src/config.c | 3 +++ src/dd.c | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index b4e8d0e..2142323 100644 --- a/src/config.c +++ b/src/config.c @@ -946,16 +946,19 @@ static void cfg_create_ini() "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" "; Stronghold Crusader Extreme HD\n" "[Stronghold_Crusader_Extreme]\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" "; Stronghold HD\n" "[Stronghold]\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" diff --git a/src/dd.c b/src/dd.c index 5d27aa3..7aefb75 100644 --- a/src/dd.c +++ b/src/dd.c @@ -129,6 +129,11 @@ HRESULT dd_EnumDisplayModes( flags == m.dmDisplayFlags && fixed_output == m.dmDisplayFixedOutput) { + if (g_ddraw->stronghold_hack && m.dmPelsWidth && (m.dmPelsWidth % 8)) + { + while (--m.dmPelsWidth % 8); + } + TRACE( " %u: %ux%u@%u %u bpp\n", i, From befbedb19a82e66ae27b360e051a1cf638668b9d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 17:28:09 +0200 Subject: [PATCH 0509/1724] add some more values to full res list --- src/dd.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 7aefb75..4100391 100644 --- a/src/dd.c +++ b/src/dd.c @@ -49,6 +49,8 @@ HRESULT dd_EnumDisplayModes( while (--max_w % 8); } + BOOL rlf = g_ddraw->resolutions == RESLIST_FULL; + SIZE resolutions[] = { { 320, 200 }, @@ -58,11 +60,29 @@ HRESULT dd_EnumDisplayModes( { 640, 480 }, { 800, 600 }, { 1024, 768 }, - { g_ddraw->resolutions == RESLIST_FULL ? 1280 : 0, g_ddraw->resolutions == RESLIST_FULL ? 960 : 0 }, { 1280, 1024 }, { 1600, 1200 }, - { g_ddraw->resolutions == RESLIST_FULL ? 2048 : 0, g_ddraw->resolutions == RESLIST_FULL ? 1536 : 0 }, { 1280, 720 }, + { rlf ? 1024 : 0, rlf ? 600 : 0 }, + /* 4:3 */ + { rlf ? 1280 : 0, rlf ? 960 : 0 }, + { rlf ? 2048 : 0, rlf ? 1536 : 0 }, + /* 16:10 */ + { rlf ? 960 : 0, rlf ? 600 : 0 }, + { rlf ? 1440 : 0, rlf ? 900 : 0 }, + { rlf ? 1680 : 0, rlf ? 1050 : 0 }, + { rlf ? 1920 : 0, rlf ? 1200 : 0 }, + { rlf ? 2560 : 0, rlf ? 1600 : 0 }, + /* 16:9 */ + { rlf ? 960 : 0, rlf ? 540 : 0 }, + { rlf ? 1360 : 0, rlf ? 768 : 0 }, + { rlf ? 1600 : 0, rlf ? 900 : 0 }, + { rlf ? 1920 : 0, rlf ? 1080 : 0 }, + { rlf ? 2560 : 0, rlf ? 1440 : 0 }, + /* 21:9 */ + { rlf ? 1280 : 0, rlf ? 544 : 0 }, + { rlf ? 1720 : 0, rlf ? 720 : 0 }, + { rlf ? 2560 : 0, rlf ? 1080 : 0 }, { max_w, max_h }, }; @@ -246,7 +266,7 @@ HRESULT dd_EnumDisplayModes( m.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; m.dmPelsWidth = resolutions[i].cx; m.dmPelsHeight = resolutions[i].cy; - + if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) continue; } From 1887439b955bd7c734c0b588ae8968457494c76e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 18:10:28 +0200 Subject: [PATCH 0510/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 3fae455..5021cca 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 9a1cd992fa62f468320e3c56654145e3055ff00d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 19:47:20 +0200 Subject: [PATCH 0511/1724] add "remove_menu" option for LukaStorme --- inc/dd.h | 1 + src/config.c | 1 + src/dd.c | 3 +++ 3 files changed, 5 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 9fdab93..630378d 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -162,6 +162,7 @@ typedef struct CNCDDRAW BOOL tshack; BOOL infantryhack; BOOL stronghold_hack; + BOOL remove_menu; int maxgameticks; BOOL alt_key_down; BOOL releasealt; diff --git a/src/config.c b/src/config.c index 2142323..f159189 100644 --- a/src/config.c +++ b/src/config.c @@ -48,6 +48,7 @@ void cfg_load() g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); + g_ddraw->remove_menu = cfg_get_bool("remove_menu", FALSE); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); diff --git a/src/dd.c b/src/dd.c index 4100391..e8a02bc 100644 --- a/src/dd.c +++ b/src/dd.c @@ -748,6 +748,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.opengl_y_align = 0; } + if (g_ddraw->remove_menu && GetMenu(g_ddraw->hwnd)) + SetMenu(g_ddraw->hwnd, NULL); + if (g_ddraw->windowed) { if (!g_ddraw->wine) From 0acc29e410849a5b01157796adb94be67828fb63 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Aug 2023 19:47:46 +0200 Subject: [PATCH 0512/1724] move patch down --- src/dd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index e8a02bc..061440e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -748,11 +748,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.opengl_y_align = 0; } - if (g_ddraw->remove_menu && GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); - if (g_ddraw->windowed) { + if (g_ddraw->remove_menu && GetMenu(g_ddraw->hwnd)) + SetMenu(g_ddraw->hwnd, NULL); + if (!g_ddraw->wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ From d4097ddc1415dffd775dc718dcd76e2ef04a48b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 08:43:36 +0200 Subject: [PATCH 0513/1724] adjust Corsairs preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index f159189..a368795 100644 --- a/src/config.c +++ b/src/config.c @@ -685,8 +685,6 @@ static void cfg_create_ini() "; Corsairs Gold\n" "[corsairs]\n" "adjmouse=true\n" - "renderer=gdi\n" - "hook=2\n" "\n" "; Divine Divinity\n" "[div]\n" From 5f3a968b083e575ecab0fe9d84cef9a6b7779802 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 12:58:48 +0200 Subject: [PATCH 0514/1724] read desc and apply filter in EnumDisplayModes --- src/dd.c | 144 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 52 deletions(-) diff --git a/src/dd.c b/src/dd.c index 061440e..32ed5ed 100644 --- a/src/dd.c +++ b/src/dd.c @@ -25,6 +25,28 @@ HRESULT dd_EnumDisplayModes( { dbg_dump_edm_flags(dwFlags); + DWORD bpp_filter = 0; + + if (lpDDSurfaceDesc) + { + dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); + dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps); + + if (lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) + { + TRACE(" ddpfPixelFormat.dwRGBBitCount=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); + + switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) + { + case 8: + case 16: + case 32: + bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount; + break; + } + } + } + DWORD i = 0; DWORD res_count = 0; DDSURFACEDESC2 s; @@ -175,18 +197,21 @@ HRESULT dd_EnumDisplayModes( s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } } @@ -197,18 +222,21 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x001F; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } } @@ -219,20 +247,23 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x0000FF; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } - } + } for (int x = 0; x < sizeof(resolutions) / sizeof(resolutions[0]); x++) { @@ -284,16 +315,19 @@ HRESULT dd_EnumDisplayModes( s.dwWidth = resolutions[i].cx; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } s.ddpfPixelFormat.dwFlags = DDPF_RGB; @@ -303,16 +337,19 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x001F; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } if (g_ddraw->resolutions == RESLIST_MINI) @@ -325,16 +362,19 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwBBitMask = 0x0000FF; s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } + if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + { + TRACE(" resolution limit reached, stopping\n"); + return DD_OK; + } - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) + { + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; + } } } } From 44ef9783d8649bc193c82c0d84c5770805acbb78 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 13:13:10 +0200 Subject: [PATCH 0515/1724] update Age of Wonders presets --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index a368795..7b50dda 100644 --- a/src/config.c +++ b/src/config.c @@ -433,24 +433,36 @@ static void cfg_create_ini() "\n" "; Age of Wonders 2\n" "[AoW2]\n" + "resolutions=2\n" "renderer=opengl\n" "singlecpu=false\n" "\n" "; Age of Wonders 2\n" "[AoW2Compat]\n" + "resolutions=2\n" "renderer=opengl\n" "singlecpu=false\n" "\n" + "; Age of Wonders 2 Config Tool\n" + "[aow2Setup]\n" + "resolutions=2\n" + "\n" "; Age of Wonders: Shadow Magic\n" "[AoWSM]\n" + "resolutions=2\n" "renderer=opengl\n" "singlecpu=false\n" "\n" "; Age of Wonders: Shadow Magic\n" "[AoWSMCompat]\n" + "resolutions=2\n" "renderer=opengl\n" "singlecpu=false\n" "\n" + "; Age of Wonders: Shadow Magic Config Tool\n" + "[AoWSMSetup]\n" + "resolutions=2\n" + "\n" "; Anstoss 3\n" "[anstoss3]\n" "renderer=gdi\n" From 42c40bc8a0fe8bd4dd67449af2cec5c7d2cf7992 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 14:00:20 +0200 Subject: [PATCH 0516/1724] update Total Annihilation preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 7b50dda..51e7e27 100644 --- a/src/config.c +++ b/src/config.c @@ -991,11 +991,13 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" + "resolutions=2\n" "lock_surfaces=true\n" "singlecpu=false\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" + "resolutions=2\n" "lock_surfaces=true\n" "singlecpu=false\n" "\n" From 4fe8f0d63c35bd8d4164fb47870799b15674cb4c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 18:00:35 +0200 Subject: [PATCH 0517/1724] update ddraw.ini comments --- src/config.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 51e7e27..bf7c518 100644 --- a/src/config.c +++ b/src/config.c @@ -337,27 +337,30 @@ static void cfg_create_ini() "singlecpu=true\n" "\n" "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" - "; Note: Set this to 2 if your chosen resolution is not working, set to 1 if the game is crashing\n" + "; Note: Set this to 2 if your chosen resolution is not working or does not shpw up in the list\n" + "; Note: Set this to 1 if the game is crashing\n" "resolutions=0\n" "\n" "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide\n" - "; Note: Disables upscaling if a child window was detected\n" + "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" + "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" + "hook_peekmessage=false\n" "\n" - "; Undocumented settings\n" + "\n" + "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" + "releasealt=false\n" + "game_handles_close=false\n" + "fixnotresponding=false\n" "guard_lines=200\n" "max_resolutions=0\n" "limit_bltfast=false\n" - "game_handles_close=false\n" - "fixnotresponding=false\n" "lock_surfaces=false\n" - "releasealt=false\n" "allow_wmactivate=false\n" "flipclear=false\n" "fixmousehook=false\n" "rgb555=false\n" - "hook_peekmessage=false\n" "no_dinput_hook=false\n" "\n" "\n" From e7d82d9dca6fe0935dd29775154b7966a95a955f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 18:33:08 +0200 Subject: [PATCH 0518/1724] add new setting "Unlock additional screen resolutions" --- config/ConfigFormUnit.cpp | 30 +++++++++++++++--------------- config/ConfigFormUnit.dfm | 11 ++++++----- config/ConfigFormUnit.h | 6 +++--- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index b8ff02a..4e77f9e 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -19,7 +19,7 @@ bool IsEnglish; /* Save previous settings so we don't override custom settings */ int Maxfps; int Savesettings; -int Hook; +int Resolutions; int Minfps; //--------------------------------------------------------------------------- @@ -72,7 +72,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; MaxgameticksLbl->Caption = L"限制游戏速率"; NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; - HookLbl->Caption = L"修复损坏的窗口模式或拉伸"; + ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; @@ -124,7 +124,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Activar encajado de ventanas / escalado de enteros"; MaxgameticksLbl->Caption = L"Limitar velocidad de juego"; NoactivateappLbl->Caption = L"Corregir Alt+Tab roto"; - HookLbl->Caption = L"Corregir modo ventana o ampliación de escala"; + ResolutionsLbl->Caption = L"Desbloquear resoluciones de pantalla adicionales"; MinfpsLbl->Caption = L"Forzar un alto FPS / Corregir retrasos en Freesync/G-Sync"; SinglecpuLbl->Caption = L"Solucione el mal rendimiento y los problemas de sonido"; NonexclusiveLbl->Caption = L"Corregir vídeos / elementos de interfaz invisibles"; @@ -176,7 +176,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. MaxgameticksLbl->Caption = L"Spielgeschwindigkeit limitieren"; NoactivateappLbl->Caption = L"Fehlerhaftes Alt+Tab reparieren"; //The first word can be ignored if its to long (eng word "Fix" - HookLbl->Caption = L"Fehlerhafter Fenstermodus oder Hochskalierung reparieren"; //The first word can be ignored if its to long (eng word "Fix") + ResolutionsLbl->Caption = L"Zusätzliche Bildschirmauflösungen freischalten"; MinfpsLbl->Caption = L"Erzwinge Hohe FPS / Repariere Stottern bei Freesync/G-Sync"; SinglecpuLbl->Caption = L"Schlechte Leistung und Soundprobleme reparieren"; NonexclusiveLbl->Caption = L"Unsichtbare Videos / UI Elemente reparieren"; @@ -229,7 +229,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Включить windowboxing / целочисленное масштабирование"; MaxgameticksLbl->Caption = L"Ограничить скорость игры"; NoactivateappLbl->Caption = L"Исправить сломанный Alt+Tab"; - HookLbl->Caption = L"Исправить сломанный оконный режим или масштабированние"; + ResolutionsLbl->Caption = L"Разблокировать дополнительные разрешения экрана"; MinfpsLbl->Caption = L"Принудительно высокий FPS / Исправить заикание при Freesync/G-Sync"; SinglecpuLbl->Caption = L"Исправление проблем с производительностью и звуком"; NonexclusiveLbl->Caption = L"Исправить невидимые видео / элементы пользовательского интерфейса"; @@ -281,7 +281,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Ablakos mód / felskálázás bekapcsolása"; MaxgameticksLbl->Caption = L"Játéksebesség korlátozás"; NoactivateappLbl->Caption = L"Alt+Tab hiba kiküszöbölése"; - HookLbl->Caption = L"Hibás ablakos mód, vagy felskálázás javítása"; + ResolutionsLbl->Caption = L"További képernyőfelbontások feloldása"; MinfpsLbl->Caption = L"Magas FPS kényszerítés / Akadozásjavítás Freesync/G-Sync esetén"; SinglecpuLbl->Caption = L"Javítsa ki a rossz teljesítmény- és hangproblémákat"; NonexclusiveLbl->Caption = L"Láthatatlan videók / kezelőfelületi elemek javítása"; @@ -333,7 +333,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Activer windowboxing / mise à l'échelle par nombres entiers"; MaxgameticksLbl->Caption = L"Limiter la vitesse du jeu"; NoactivateappLbl->Caption = L"Corriger Alt+Tab défaillant"; - HookLbl->Caption = L"Corriger mode fenêtré ou mise à l'échelle défaillant"; + ResolutionsLbl->Caption = L"Déverrouiller des résolutions d'écran supplémentaires"; MinfpsLbl->Caption = L"Forcer FPS élevé / Corriger saccades en Freesync/G-Sync"; SinglecpuLbl->Caption = L"Résoudre les problèmes de mauvaise performance et de son"; NonexclusiveLbl->Caption = L"Corriger vidéos et éléments d'interface invisibles"; @@ -385,7 +385,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Abilita il ridimensionamento dei numeri interi"; MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; - HookLbl->Caption = L"Risolvi i problemi con la modalità finestra o il ridimensionamento"; + ResolutionsLbl->Caption = L"Sblocca ulteriori risoluzioni dello schermo"; MinfpsLbl->Caption = L"Forza FPS elevati / Correggi balbuzie su Freesync/G-Sync"; SinglecpuLbl->Caption = L"Risolvi problemi di prestazioni e audio scadenti"; NonexclusiveLbl->Caption = L"Correggi video / elementi dell'interfaccia utente invisibili"; @@ -482,7 +482,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Caption = L"Enable windowboxing / integer scaling"; MaxgameticksLbl->Caption = L"Limit game speed"; NoactivateappLbl->Caption = L"Fix broken Alt+Tab"; - HookLbl->Caption = L"Fix broken windowed mode or upscaling"; + ResolutionsLbl->Caption = L"Unlock additional screen resolutions"; MinfpsLbl->Caption = L"Force high FPS / Fix stuttering on Freesync/G-Sync"; SinglecpuLbl->Caption = L"Fix bad performance and sound issues"; NonexclusiveLbl->Caption = L"Fix invisible videos / UI elements"; @@ -687,8 +687,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) NoactivateappChk->State = GetBool(ini, "noactivateapp", false) ? tssOn : tssOff; - Hook = ini->ReadInteger("ddraw", "hook", 4); - HookChk->State = Hook == 3 ? tssOn : tssOff; + Resolutions = ini->ReadInteger("ddraw", "resolutions", 0); + ResolutionsChk->State = Resolutions == 2 ? tssOn : tssOff; Minfps = ini->ReadInteger("ddraw", "minfps", 0); MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; @@ -865,12 +865,12 @@ void TConfigForm::SaveSettings() "noactivateapp", NoactivateappChk->State == tssOn ? "true" : "false"); - int hook = Hook != 3 ? Hook : 4; + int resolutions = Resolutions != 2 ? Resolutions : 0; ini->WriteInteger( "ddraw", - "hook", - HookChk->State == tssOn ? 3 : hook); + "resolutions", + ResolutionsChk->State == tssOn ? 2 : resolutions); int minfps = Minfps == 0 ? -1 : Minfps; @@ -1008,7 +1008,7 @@ void __fastcall TConfigForm::NoactivateappChkClick(TObject *Sender) SaveSettings(); } -void __fastcall TConfigForm::HookChkClick(TObject *Sender) +void __fastcall TConfigForm::ResolutionsChkClick(TObject *Sender) { SaveSettings(); } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 7ca16c4..03b6480 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2916,13 +2916,13 @@ object ConfigForm: TConfigForm ParentFont = False StyleElements = [seClient, seBorder] end - object HookLbl: TLabel + object ResolutionsLbl: TLabel Left = 40 Top = 173 - Width = 281 + Width = 251 Height = 21 Margins.Top = 18 - Caption = 'Fix broken windowed mode or upscaling' + Caption = 'Unlock additional screen resolutions' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3023,14 +3023,14 @@ object ConfigForm: TConfigForm TabOrder = 1 OnClick = NoactivateappChkClick end - object HookChk: TToggleSwitch + object ResolutionsChk: TToggleSwitch Left = 40 Top = 200 Width = 50 Height = 20 ShowStateCaption = False TabOrder = 2 - OnClick = HookChkClick + OnClick = ResolutionsChkClick end object MinfpsChk: TToggleSwitch Left = 40 @@ -3267,6 +3267,7 @@ object ConfigForm: TConfigForm Color = clHotLight ParentBackground = False TabOrder = 0 + ExplicitHeight = 464 DesignSize = ( 227 465) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 9bb01ca..0e84e20 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -49,8 +49,8 @@ __published: // Von der IDE verwaltete Komponenten TLabel *MaxgameticksLbl; TLabel *NoactivateappLbl; TToggleSwitch *NoactivateappChk; - TLabel *HookLbl; - TToggleSwitch *HookChk; + TLabel *ResolutionsLbl; + TToggleSwitch *ResolutionsChk; TLabel *MinfpsLbl; TToggleSwitch *MinfpsChk; TToggleSwitch *SinglecpuChk; @@ -79,7 +79,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall SavesettingsChkClick(TObject *Sender); void __fastcall MaxgameticksCbxChange(TObject *Sender); void __fastcall NoactivateappChkClick(TObject *Sender); - void __fastcall HookChkClick(TObject *Sender); + void __fastcall ResolutionsChkClick(TObject *Sender); void __fastcall MinfpsChkClick(TObject *Sender); void __fastcall SinglecpuChkClick(TObject *Sender); void __fastcall NonexclusiveChkClick(TObject *Sender); From b8b624ade7feecba2b32f1f9baabf5eb04d78cc1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 19:05:11 +0200 Subject: [PATCH 0519/1724] fix comment --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index bf7c518..c56f05e 100644 --- a/src/config.c +++ b/src/config.c @@ -337,7 +337,7 @@ static void cfg_create_ini() "singlecpu=true\n" "\n" "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" - "; Note: Set this to 2 if your chosen resolution is not working or does not shpw up in the list\n" + "; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list\n" "; Note: Set this to 1 if the game is crashing\n" "resolutions=0\n" "\n" From 62e147f27dd4b82f1902602acc25b13d63dc8bdc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Aug 2023 19:19:12 +0200 Subject: [PATCH 0520/1724] Update README.md --- README.md | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 290d45c..fb039af 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,11 @@ Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/W   -If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. - -If you want to play in windowed mode then start the game once in fullscreen and then press Alt+Enter to enable the cnc-ddraw windowed mode (Or enable windowed mode in the config program without using Alt+Enter). +If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. You can enable windowed mode via cnc-ddraw config.exe instead.   -**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**. Alternatively you can also open ddraw.ini with notepad and modify the **Compatibility settings** in there. +**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**.   @@ -46,20 +44,6 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -**Compatibility settings in ddraw.ini** - -- If there are **problems on Alt+Tab** then try to set `noactivateapp=true` - If it still doesn't work also try `renderer=opengl` or `renderer=gdi`. - -- If the **game is running too fast** then try to set `maxgameticks=60` - If it's still too fast, try a lower value. - -- If **windowed mode or upscaling are not working properly** then try to set `hook=2` and `renderer=gdi`. - -- If **videos or other UI elements are invisible** then try to set `nonexclusive=true`. - -- If the game is **stuttering on a Freesync/G-Sync monitor** then try to set `minfps=-1`. - -  - **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From 5b82ffbb9620b69c6f6ad6764c1072e91f3ced33 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 00:58:48 +0200 Subject: [PATCH 0521/1724] add hotkey editor --- config/ConfigFormUnit.cpp | 177 +++++++++++++++++++++++- config/ConfigFormUnit.dfm | 276 ++++++++++++++++++++++++++++++++++++-- config/ConfigFormUnit.h | 24 ++++ 3 files changed, 463 insertions(+), 14 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4e77f9e..0b6c14a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -70,6 +70,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL着色器"; MaxfpsLbl->Caption = L"限制帧率"; BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; + ToggleWindowedLbl->Caption = L"切换窗口模式"; + MaximizeWindowLbl->Caption = L"最大化窗口"; + UnlockCursor1Lbl->Caption = L"解锁光标 1"; + UnlockCursor2Lbl->Caption = L"解锁光标 2"; + ScreenshotLbl->Caption = L"截屏"; MaxgameticksLbl->Caption = L"限制游戏速率"; NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; @@ -122,6 +127,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Sombreador OpenGL"; MaxfpsLbl->Caption = L"Limitar velocidad de fotogramas"; BoxingLbl->Caption = L"Activar encajado de ventanas / escalado de enteros"; + ToggleWindowedLbl->Caption = L"Alternar modo de ventana"; + MaximizeWindowLbl->Caption = L"Maximizar ventana"; + UnlockCursor1Lbl->Caption = L"Desbloquear cursor 1"; + UnlockCursor2Lbl->Caption = L"Desbloquear cursor 2"; + ScreenshotLbl->Caption = L"Captura de pantalla"; MaxgameticksLbl->Caption = L"Limitar velocidad de juego"; NoactivateappLbl->Caption = L"Corregir Alt+Tab roto"; ResolutionsLbl->Caption = L"Desbloquear resoluciones de pantalla adicionales"; @@ -174,6 +184,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. + ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; + MaximizeWindowLbl->Caption = L"Fenster maximieren"; + UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; + UnlockCursor2Lbl->Caption = L"Cursor entsperren 2"; + ScreenshotLbl->Caption = L"Bildschirmfoto"; MaxgameticksLbl->Caption = L"Spielgeschwindigkeit limitieren"; NoactivateappLbl->Caption = L"Fehlerhaftes Alt+Tab reparieren"; //The first word can be ignored if its to long (eng word "Fix" ResolutionsLbl->Caption = L"Zusätzliche Bildschirmauflösungen freischalten"; @@ -227,6 +242,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Шейдер OpenGL"; MaxfpsLbl->Caption = L"Ограничить частоту кадров"; BoxingLbl->Caption = L"Включить windowboxing / целочисленное масштабирование"; + ToggleWindowedLbl->Caption = L"Переключить оконный режим"; + MaximizeWindowLbl->Caption = L"Развернуть окно"; + UnlockCursor1Lbl->Caption = L"Разблокировать курсор 1"; + UnlockCursor2Lbl->Caption = L"Разблокировать курсор 2"; + ScreenshotLbl->Caption = L"Скриншот"; MaxgameticksLbl->Caption = L"Ограничить скорость игры"; NoactivateappLbl->Caption = L"Исправить сломанный Alt+Tab"; ResolutionsLbl->Caption = L"Разблокировать дополнительные разрешения экрана"; @@ -279,6 +299,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL árnyaló"; MaxfpsLbl->Caption = L"Képkockaszám korlátozás"; BoxingLbl->Caption = L"Ablakos mód / felskálázás bekapcsolása"; + ToggleWindowedLbl->Caption = L"Az ablakos mód váltása"; + MaximizeWindowLbl->Caption = L"Az ablak maximalizálása"; + UnlockCursor1Lbl->Caption = L"A kurzor feloldása 1"; + UnlockCursor2Lbl->Caption = L"A kurzor feloldása 2"; + ScreenshotLbl->Caption = L"Képernyőkép"; MaxgameticksLbl->Caption = L"Játéksebesség korlátozás"; NoactivateappLbl->Caption = L"Alt+Tab hiba kiküszöbölése"; ResolutionsLbl->Caption = L"További képernyőfelbontások feloldása"; @@ -331,6 +356,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Shader OpenGL"; MaxfpsLbl->Caption = L"Limiter les images par seconde (FPS)"; BoxingLbl->Caption = L"Activer windowboxing / mise à l'échelle par nombres entiers"; + ToggleWindowedLbl->Caption = L"Basculer en mode fenêtré"; + MaximizeWindowLbl->Caption = L"Agrandir la fenêtre"; + UnlockCursor1Lbl->Caption = L"Déverrouiller le curseur 1"; + UnlockCursor2Lbl->Caption = L"Déverrouiller le curseur 2"; + ScreenshotLbl->Caption = L"Capture d'écran"; MaxgameticksLbl->Caption = L"Limiter la vitesse du jeu"; NoactivateappLbl->Caption = L"Corriger Alt+Tab défaillant"; ResolutionsLbl->Caption = L"Déverrouiller des résolutions d'écran supplémentaires"; @@ -383,6 +413,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Shader OpenGL"; MaxfpsLbl->Caption = L"Limita la frequenza dei fotogrammi (FPS)"; BoxingLbl->Caption = L"Abilita il ridimensionamento dei numeri interi"; + ToggleWindowedLbl->Caption = L"Attiva/disattiva la modalità finestra"; + MaximizeWindowLbl->Caption = L"Ingrandisci finestra"; + UnlockCursor1Lbl->Caption = L"Sblocca cursore 1"; + UnlockCursor2Lbl->Caption = L"Sblocca cursore 2"; + ScreenshotLbl->Caption = L"Immagine dello schermo"; MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; ResolutionsLbl->Caption = L"Sblocca ulteriori risoluzioni dello schermo"; @@ -480,6 +515,11 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL shader"; MaxfpsLbl->Caption = L"Limit frame rate"; BoxingLbl->Caption = L"Enable windowboxing / integer scaling"; + ToggleWindowedLbl->Caption = L"Toggle windowed mode"; + MaximizeWindowLbl->Caption = L"Maximize window"; + UnlockCursor1Lbl->Caption = L"Unlock cursor 1"; + UnlockCursor2Lbl->Caption = L"Unlock cursor 2"; + ScreenshotLbl->Caption = L"Screenshot"; MaxgameticksLbl->Caption = L"Limit game speed"; NoactivateappLbl->Caption = L"Fix broken Alt+Tab"; ResolutionsLbl->Caption = L"Unlock additional screen resolutions"; @@ -513,12 +553,18 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ } + + ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; + MaximizeWindowKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; + UnlockCursor1KeyLbl->Caption = GetKeyText(VK_CONTROL) + L" +"; + UnlockCursor2KeyLbl->Caption = GetKeyText(VK_RMENU) + L" +"; } void __fastcall TConfigForm::DisplayBtnClick(TObject *Sender) { DisplayPnl->Visible = true; AdvancedPnl->Visible = false; + HotkeyPnl->Visible = false; CompatibilityPnl->Visible = false; } @@ -526,6 +572,16 @@ void __fastcall TConfigForm::AdvancedBtnClick(TObject *Sender) { AdvancedPnl->Visible = true; DisplayPnl->Visible = false; + HotkeyPnl->Visible = false; + CompatibilityPnl->Visible = false; +} + + +void __fastcall TConfigForm::HotkeyBtnClick(TObject *Sender) +{ + HotkeyPnl->Visible = true; + AdvancedPnl->Visible = false; + DisplayPnl->Visible = false; CompatibilityPnl->Visible = false; } @@ -534,6 +590,7 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) CompatibilityPnl->Visible = true; AdvancedPnl->Visible = false; DisplayPnl->Visible = false; + HotkeyPnl->Visible = false; } void __fastcall TConfigForm::FormCreate(TObject *Sender) @@ -641,6 +698,23 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) Savesettings = ini->ReadInteger("ddraw", "savesettings", 1); SavesettingsChk->State = Savesettings != 0 ? tssOn : tssOff; + /* Hotkey Settings */ + + ToggleWindowedEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keytogglefullscreen", 0x0D))); + + MaximizeWindowEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keytogglemaximize", 0x22))); + + UnlockCursor1Edt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyunlockcursor1", 0x09))); + + UnlockCursor2Edt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyunlockcursor2", 0xA3))); + + ScreenshotEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyscreenshot", 0x2C))); + /* Compatibility Settings */ int maxgameticks = ini->ReadInteger("ddraw", "maxgameticks", 0); @@ -817,6 +891,33 @@ void TConfigForm::SaveSettings() ini->WriteInteger("ddraw", "posY", -32000); } + /* Hotkey Settings */ + + ini->WriteString( + "ddraw", + "keytogglefullscreen", + "0x" + IntToHex(Byte(GetKeyCode(ToggleWindowedEdt->Text)))); + + ini->WriteString( + "ddraw", + "keytogglemaximize", + "0x" + IntToHex(Byte(GetKeyCode(MaximizeWindowEdt->Text)))); + + ini->WriteString( + "ddraw", + "keyunlockcursor1", + "0x" + IntToHex(Byte(GetKeyCode(UnlockCursor1Edt->Text)))); + + ini->WriteString( + "ddraw", + "keyunlockcursor2", + "0x" + IntToHex(Byte(GetKeyCode(UnlockCursor2Edt->Text)))); + + ini->WriteString( + "ddraw", + "keyscreenshot", + "0x" + IntToHex(Byte(GetKeyCode(ScreenshotEdt->Text)))); + /* Compatibility Settings */ switch(MaxgameticksCbx->ItemIndex) { @@ -933,6 +1034,80 @@ void __fastcall TConfigForm::FormActivate(TObject *Sender) reg->Free(); } +void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + TEdit *edit = static_cast(Sender); + + if (Key == VK_DELETE || Key == VK_BACK) { + edit->Text = L""; + } + else if (GetAsyncKeyState(VK_RMENU) & 0x8000) { + edit->Text = GetKeyText(VK_RMENU); + } + else if (GetAsyncKeyState(VK_RCONTROL) & 0x8000) { + edit->Text = GetKeyText(VK_RCONTROL); + } + else if (GetAsyncKeyState(VK_RSHIFT) & 0x8000) { + edit->Text = GetKeyText(VK_RSHIFT); + } + else { + edit->Text = GetKeyText(Key); + } +} + +void __fastcall TConfigForm::HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) +{ + TEdit *edit = static_cast(Sender); + + if (Key == VK_SNAPSHOT || Key == VK_TAB) { + edit->Text = GetKeyText(Key); + } + + SaveSettings(); +} + +WORD TConfigForm::GetKeyCode(System::UnicodeString key) +{ + if (key == L"Print Screen") { + return VK_SNAPSHOT; + } + + if (key == L"R " + ShortCutToText(VK_MENU)) { + return VK_RMENU; + } + + if (key == L"R " + ShortCutToText(VK_CONTROL)) { + return VK_RCONTROL; + } + + if (key == L"R " + ShortCutToText(VK_SHIFT)) { + return VK_RSHIFT; + } + + return TextToShortCut(key); +} + +System::UnicodeString TConfigForm::GetKeyText(WORD key) +{ + if (key == VK_SNAPSHOT) { + return L"Print Screen"; + } + + if (key == VK_RMENU) { + return L"R " + ShortCutToText(VK_MENU); + } + + if (key == VK_RCONTROL) { + return L"R " + ShortCutToText(VK_CONTROL); + } + + if (key == VK_RSHIFT) { + return L"R " + ShortCutToText(VK_SHIFT); + } + + return ShortCutToText(key); +} + bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) { auto s = LowerCase(ini->ReadString("ddraw", key, defValue ? "true" : "false")); @@ -1034,5 +1209,3 @@ void __fastcall TConfigForm::PboxPaint(TObject *Sender) //pbox->Canvas->Rectangle(pbox->ClientRect); } -//--------------------------------------------------------------------------- - diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 03b6480..1a67382 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3257,10 +3257,249 @@ object ConfigForm: TConfigForm OnClick = BoxingChkClick end end + object HotkeyPnl: TPanel + Left = 234 + Top = 8 + Width = 499 + Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 4 + Visible = False + StyleElements = [seFont, seBorder] + object ToggleWindowedLbl: TLabel + Left = 40 + Top = 27 + Width = 165 + Height = 21 + Margins.Top = 18 + Caption = 'Toggle windowed mode' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object ToggleWindowedKeyLbl: TLabel + Left = 41 + Top = 60 + Width = 34 + Height = 21 + Margins.Top = 8 + Caption = 'Alt +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object MaximizeWindowLbl: TLabel + Left = 39 + Top = 107 + Width = 125 + Height = 21 + Margins.Top = 18 + Caption = 'Maximize window' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object MaximizeWindowKeyLbl: TLabel + Left = 40 + Top = 139 + Width = 34 + Height = 21 + Margins.Top = 8 + Caption = 'Alt +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object UnlockCursor1Lbl: TLabel + Left = 40 + Top = 186 + Width = 109 + Height = 21 + Margins.Top = 18 + Caption = 'Unlock cursor 1' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object UnlockCursor1KeyLbl: TLabel + Left = 41 + Top = 218 + Width = 40 + Height = 21 + Margins.Top = 8 + Caption = 'Ctrl +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object UnlockCursor2Lbl: TLabel + Left = 41 + Top = 265 + Width = 109 + Height = 21 + Margins.Top = 18 + Caption = 'Unlock cursor 2' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object UnlockCursor2KeyLbl: TLabel + Left = 41 + Top = 297 + Width = 48 + Height = 21 + Margins.Top = 8 + Caption = 'R Alt +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object ScreenshotLbl: TLabel + Left = 41 + Top = 344 + Width = 77 + Height = 21 + Margins.Top = 18 + Caption = 'Screenshot' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + StyleElements = [seClient, seBorder] + end + object ToggleWindowedEdt: TEdit + Left = 137 + Top = 57 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 0 + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp + end + object MaximizeWindowEdt: TEdit + Left = 137 + Top = 136 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 1 + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp + end + object UnlockCursor1Edt: TEdit + Left = 137 + Top = 215 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 2 + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp + end + object UnlockCursor2Edt: TEdit + Left = 137 + Top = 294 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 3 + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp + end + object ScreenshotEdt: TEdit + Left = 137 + Top = 373 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 4 + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp + end + end object MenuPnl: TPanel Left = 0 Top = 8 - Width = 227 + Width = 233 Height = 465 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone @@ -3269,12 +3508,12 @@ object ConfigForm: TConfigForm TabOrder = 0 ExplicitHeight = 464 DesignSize = ( - 227 + 233 465) object DisplayBtn: TSpeedButton - Left = 5 + Left = 0 Top = 8 - Width = 216 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Display Settings' @@ -3286,12 +3525,11 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = DisplayBtnClick - ExplicitWidth = 190 end object AdvancedBtn: TSpeedButton - Left = 5 + Left = 0 Top = 55 - Width = 216 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Advanced Settings' @@ -3303,12 +3541,11 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = AdvancedBtnClick - ExplicitWidth = 190 end object CompatibilityBtn: TSpeedButton - Left = 5 - Top = 102 - Width = 216 + Left = 0 + Top = 149 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Compatibility Settings' @@ -3320,7 +3557,22 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = CompatibilityBtnClick - ExplicitWidth = 190 + end + object HotkeyBtn: TSpeedButton + Left = 0 + Top = 102 + Width = 227 + Height = 41 + Anchors = [akLeft, akTop, akRight] + Caption = 'Hotkey Settings' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + OnClick = HotkeyBtnClick end end end diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 0e84e20..4ff127a 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -62,6 +62,22 @@ __published: // Von der IDE verwaltete Komponenten TPaintBox *ShaderPbox; TPaintBox *MaxgameticksPbox; TImage *LanguageImg; + TPanel *HotkeyPnl; + TLabel *ToggleWindowedLbl; + TSpeedButton *HotkeyBtn; + TEdit *ToggleWindowedEdt; + TLabel *ToggleWindowedKeyLbl; + TLabel *MaximizeWindowLbl; + TEdit *MaximizeWindowEdt; + TLabel *MaximizeWindowKeyLbl; + TLabel *UnlockCursor1Lbl; + TEdit *UnlockCursor1Edt; + TLabel *UnlockCursor1KeyLbl; + TLabel *UnlockCursor2Lbl; + TEdit *UnlockCursor2Edt; + TLabel *UnlockCursor2KeyLbl; + TLabel *ScreenshotLbl; + TEdit *ScreenshotEdt; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -86,10 +102,18 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall PboxPaint(TObject *Sender); void __fastcall LanguageImgClick(TObject *Sender); void __fastcall FormActivate(TObject *Sender); + void __fastcall HotkeyBtnClick(TObject *Sender); + void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); + + + private: // Benutzer-Deklarationen void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); void ApplyTranslation(TIniFile *ini); + System::UnicodeString GetKeyText(WORD key); + WORD GetKeyCode(System::UnicodeString key); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; From 2f7646c6d1bf67147a83152472954497352efa8c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 01:20:02 +0200 Subject: [PATCH 0522/1724] disable right shift --- config/ConfigFormUnit.cpp | 6 +----- config/ConfigFormUnit.dfm | 2 ++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 0b6c14a..50395be 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1080,10 +1080,6 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_RCONTROL; } - if (key == L"R " + ShortCutToText(VK_SHIFT)) { - return VK_RSHIFT; - } - return TextToShortCut(key); } @@ -1102,7 +1098,7 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) } if (key == VK_RSHIFT) { - return L"R " + ShortCutToText(VK_SHIFT); + return ShortCutToText(VK_SHIFT); } return ShortCutToText(key); diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 1a67382..f6cd679 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3270,6 +3270,8 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 From e6c7057d8c6e932a91ae7e7c5febc2fbe9b02d95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 01:23:19 +0200 Subject: [PATCH 0523/1724] rename key --- config/ConfigFormUnit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 50395be..c03a702 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1068,7 +1068,7 @@ void __fastcall TConfigForm::HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftSt WORD TConfigForm::GetKeyCode(System::UnicodeString key) { - if (key == L"Print Screen") { + if (key == L"PrtScn") { return VK_SNAPSHOT; } @@ -1086,7 +1086,7 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) System::UnicodeString TConfigForm::GetKeyText(WORD key) { if (key == VK_SNAPSHOT) { - return L"Print Screen"; + return L"PrtScn"; } if (key == VK_RMENU) { From 5412deb27edb7299c1dc7ad9746bc17f9fbc0674 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 01:43:03 +0200 Subject: [PATCH 0524/1724] fix translation --- config/ConfigFormUnit.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index c03a702..d6f1d6e 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -58,6 +58,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw 配置"; DisplayBtn->Caption = L"显示设置"; AdvancedBtn->Caption = L"高级设置"; + HotkeyBtn->Caption = L"热键设置"; CompatibilityBtn->Caption = L"兼容性设置"; PresentationLbl->Caption = L"显示方式"; MaintasLbl->Caption = L"保持纵横比"; @@ -115,6 +116,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Ajustes de cnc-ddraw"; DisplayBtn->Caption = L"Ajustes de pantalla"; AdvancedBtn->Caption = L"Ajustes avanzados"; + HotkeyBtn->Caption = L"Teclas de acceso rápido"; CompatibilityBtn->Caption = L"Ajustes de compatibilidad"; PresentationLbl->Caption = L"Presentación"; MaintasLbl->Caption = L"Mantener la relación de aspecto"; @@ -172,16 +174,17 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw Konfiguration"; DisplayBtn->Caption = L"Anzeigeeinstellungen"; AdvancedBtn->Caption = L"Erweiterte Einstellungen"; + HotkeyBtn->Caption = L"Tastenkürzel-Einstellungen"; CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen"; - PresentationLbl->Caption = L"Presentation"; - MaintasLbl->Caption = L"Erhalte Seitenverhältnis"; + PresentationLbl->Caption = L"Darstellung"; + MaintasLbl->Caption = L"Seitenverhältnis beibehalten"; VsyncLbl->Caption = L"VSync aktiveren"; AdjmouseLbl->Caption = L"Mausempfindlichkeit anpassen"; DevmodeLbl->Caption = L"Sperre Cursor zu Fenster / Bildschirm"; //Not 100% sure, if not a better translation exists RendererLbl->Caption = L"Renderer"; BorderLbl->Caption = L"Zeige Fensterränder in Fenstermodus"; SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; - ShaderLbl->Caption = L"OpenGL shader"; + ShaderLbl->Caption = L"OpenGL Shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; @@ -206,7 +209,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->AddItem(L"Vollbild", NULL); PresentationCbx->AddItem(L"Hochskaliertes Vollbild", NULL); PresentationCbx->AddItem(L"Ränderfreies Fenster", NULL); - PresentationCbx->AddItem(L"Fenster", NULL); + PresentationCbx->AddItem(L"Fenstermodus", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"Unlimitiert", NULL); @@ -230,6 +233,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Настройки cnc-ddraw"; DisplayBtn->Caption = L"Настройки отображения"; AdvancedBtn->Caption = L"Расширенные настройки"; + HotkeyBtn->Caption = L"Настройки горячих клавиш"; CompatibilityBtn->Caption = L"Настройки совместимости"; PresentationLbl->Caption = L"Отображение"; MaintasLbl->Caption = L"Сохранять соотношение сторон"; @@ -287,6 +291,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw Beállító"; DisplayBtn->Caption = L"Képbeállítások"; AdvancedBtn->Caption = L"Haladó Beállítások"; + HotkeyBtn->Caption = L"Gyorsbillentyűk beállításai"; CompatibilityBtn->Caption = L"Kompatibilitás Beállítások"; PresentationLbl->Caption = L"Bemutató"; MaintasLbl->Caption = L"Képarány megtartása"; @@ -344,6 +349,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Configuration cnc-ddraw"; DisplayBtn->Caption = L"Paramètres d'Affichage"; AdvancedBtn->Caption = L"Paramètres Avancés"; + HotkeyBtn->Caption = L"Paramètres de raccourci"; CompatibilityBtn->Caption = L"Paramètres de Compatibilité"; PresentationLbl->Caption = L"Présentation"; MaintasLbl->Caption = L"Conserver les proportions de l'image"; @@ -401,6 +407,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Configurazione di cnc-ddraw"; DisplayBtn->Caption = L"Impostazioni dello schermo"; AdvancedBtn->Caption = L"Impostazioni avanzate"; + HotkeyBtn->Caption = L"Tasti di scelta rapida"; CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; PresentationLbl->Caption = L"Presentazione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; @@ -503,6 +510,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw config"; DisplayBtn->Caption = L"Display Settings"; AdvancedBtn->Caption = L"Advanced Settings"; + HotkeyBtn->Caption = L"Hotkey Settings"; CompatibilityBtn->Caption = L"Compatibility Settings"; PresentationLbl->Caption = L"Presentation"; MaintasLbl->Caption = L"Maintain aspect ratio"; From 38453e3a091a76832b967f9b401d732354d222d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 02:03:17 +0200 Subject: [PATCH 0525/1724] fix pause key --- config/ConfigFormUnit.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d6f1d6e..2a7974d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1080,6 +1080,10 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_SNAPSHOT; } + if (key == L"Pause_") { + return VK_PAUSE; + } + if (key == L"R " + ShortCutToText(VK_MENU)) { return VK_RMENU; } @@ -1097,6 +1101,10 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) return L"PrtScn"; } + if (key == VK_PAUSE) { + return L"Pause_"; + } + if (key == VK_RMENU) { return L"R " + ShortCutToText(VK_MENU); } From 809a70f366c56ba3996de4babdb1921c033a60a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 02:05:43 +0200 Subject: [PATCH 0526/1724] remove old code --- config/ConfigFormUnit.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 2a7974d..2f6afc7 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1055,9 +1055,6 @@ void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShift else if (GetAsyncKeyState(VK_RCONTROL) & 0x8000) { edit->Text = GetKeyText(VK_RCONTROL); } - else if (GetAsyncKeyState(VK_RSHIFT) & 0x8000) { - edit->Text = GetKeyText(VK_RSHIFT); - } else { edit->Text = GetKeyText(Key); } From d53139ca40a1629b8e469a737931be128d453a52 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 02:36:40 +0200 Subject: [PATCH 0527/1724] fix wine bug --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 2f6afc7..0988f86 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -604,7 +604,7 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (!FileExists(".\\ddraw.ini")) { + if (FileExists(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); From c4c720fe8462fd4ea9444f0dd1434502a60d692c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 02:51:16 +0200 Subject: [PATCH 0528/1724] fix another wine issue - make sure right ddraw.dll is loaded --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 0988f86..4ca0bf7 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -618,7 +618,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) (void (WINAPI*)(void*, void**, void*)) GetProcAddress(ddraw, "DirectDrawCreate"); - if (dd_create) { + if (dd_create && GetProcAddress(ddraw, "GameHandlesClose")) { void *buf; dd_create(NULL, &buf, NULL); From 9653c3c69c350532960215c9e38f79e2da5c2d29 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 10:10:35 +0200 Subject: [PATCH 0529/1724] remove right alt key --- config/ConfigFormUnit.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4ca0bf7..4f6fd10 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -565,7 +565,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; MaximizeWindowKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; UnlockCursor1KeyLbl->Caption = GetKeyText(VK_CONTROL) + L" +"; - UnlockCursor2KeyLbl->Caption = GetKeyText(VK_RMENU) + L" +"; + UnlockCursor2KeyLbl->Caption = "R " + GetKeyText(VK_MENU) + L" +"; } void __fastcall TConfigForm::DisplayBtnClick(TObject *Sender) @@ -1049,9 +1049,6 @@ void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShift if (Key == VK_DELETE || Key == VK_BACK) { edit->Text = L""; } - else if (GetAsyncKeyState(VK_RMENU) & 0x8000) { - edit->Text = GetKeyText(VK_RMENU); - } else if (GetAsyncKeyState(VK_RCONTROL) & 0x8000) { edit->Text = GetKeyText(VK_RCONTROL); } @@ -1081,10 +1078,6 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_PAUSE; } - if (key == L"R " + ShortCutToText(VK_MENU)) { - return VK_RMENU; - } - if (key == L"R " + ShortCutToText(VK_CONTROL)) { return VK_RCONTROL; } @@ -1102,10 +1095,6 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) return L"Pause_"; } - if (key == VK_RMENU) { - return L"R " + ShortCutToText(VK_MENU); - } - if (key == VK_RCONTROL) { return L"R " + ShortCutToText(VK_CONTROL); } From e537530f990be59bedcef4e956d031ce6bbfdecf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 10:21:12 +0200 Subject: [PATCH 0530/1724] fix position --- config/ConfigFormUnit.dfm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index f6cd679..4dd0289 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3258,7 +3258,7 @@ object ConfigForm: TConfigForm end end object HotkeyPnl: TPanel - Left = 234 + Left = 233 Top = 8 Width = 499 Height = 465 @@ -3270,8 +3270,6 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 From 9de2c045a74e9f0e6ba8ea89a05037e4d69423e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 10:41:56 +0200 Subject: [PATCH 0531/1724] fix default theme --- config/ConfigFormUnit.dfm | 14 ++++++++------ config/cnc-ddraw config.cbproj | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 4dd0289..176301d 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -6,7 +6,7 @@ object ConfigForm: TConfigForm Caption = 'cnc-ddraw config' ClientHeight = 476 ClientWidth = 741 - Color = clHotLight + Color = clMenu Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -3270,6 +3270,8 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3503,7 +3505,7 @@ object ConfigForm: TConfigForm Height = 465 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone - Color = clHotLight + Color = clMenu ParentBackground = False TabOrder = 0 ExplicitHeight = 464 @@ -3519,7 +3521,7 @@ object ConfigForm: TConfigForm Caption = 'Display Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clBlack Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] @@ -3535,7 +3537,7 @@ object ConfigForm: TConfigForm Caption = 'Advanced Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clBlack Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] @@ -3551,7 +3553,7 @@ object ConfigForm: TConfigForm Caption = 'Compatibility Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clBlack Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] @@ -3567,7 +3569,7 @@ object ConfigForm: TConfigForm Caption = 'Hotkey Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite + Font.Color = clBlack Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 2ba1b8f..ec25516 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -299,11 +299,11 @@ + - 1 From d7a173b0daf5efa4a2af68023bcb67856385b8c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 12:49:54 +0200 Subject: [PATCH 0532/1724] add option to configure d3d9 filter --- config/ConfigFormUnit.cpp | 49 +++++++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 24 +++++++++++++++++++ config/ConfigFormUnit.h | 2 ++ 3 files changed, 75 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4f6fd10..fc4ed62 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -662,6 +662,12 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) if (renderer == "direct3d9on12") { RendererCbx->AddItem(L"Direct3D 12 (9On12)", NULL); RendererCbx->ItemIndex = 4; + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; } else if (renderer == "openglcore") { RendererCbx->AddItem(L"OpenGL Core", NULL); @@ -669,6 +675,12 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } else if (StartsStr("d", renderer)) { RendererCbx->ItemIndex = 1; + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; } else if (StartsStr("o", renderer)) { RendererCbx->ItemIndex = 2; @@ -697,6 +709,20 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) { } + int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); + + switch (d3d9_filter) { + case 0: + ShaderD3DCbx->ItemIndex = 0; + break; + case 1: + ShaderD3DCbx->ItemIndex = 1; + break; + default: + ShaderD3DCbx->ItemIndex = 2; + break; + } + Maxfps = ini->ReadInteger("ddraw", "maxfps", -1); MaxfpsChk->State = Maxfps != 0 ? tssOn : tssOff; @@ -868,6 +894,8 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "shader", ShaderCbx->Text); + ini->WriteInteger("ddraw", "d3d9_filter", ShaderD3DCbx->ItemIndex); + int maxfps = Maxfps == 0 ? -1 : Maxfps; ini->WriteInteger( @@ -1139,6 +1167,22 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender) void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) { + if (ContainsStr(RendererCbx->Text, "Direct3D")) { + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; + } + else { + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "Direct3D", "OpenGL"); + + ShaderCbx->Visible = true; + ShaderD3DCbx->Visible = false; + } + SaveSettings(); } @@ -1151,6 +1195,11 @@ void __fastcall TConfigForm::ShaderCbxChange(TObject *Sender) SaveSettings(); } +void __fastcall TConfigForm::ShaderD3DCbxChange(TObject *Sender) +{ + SaveSettings(); +} + void __fastcall TConfigForm::MaxfpsChkClick(TObject *Sender) { SaveSettings(); diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 176301d..03ead2a 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3178,6 +3178,30 @@ object ConfigForm: TConfigForm Height = 31 OnPaint = PboxPaint end + object ShaderD3DCbx: TComboBox + Left = 41 + Top = 132 + Width = 425 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + DropDownCount = 10 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 6 + Visible = False + OnChange = ShaderD3DCbxChange + Items.Strings = ( + 'Nearest neighbor' + 'Bilinear' + 'Bicubic Catmull-Rom') + end object RendererCbx: TComboBox Left = 41 Top = 55 diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 4ff127a..bf1eaec 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -78,6 +78,7 @@ __published: // Von der IDE verwaltete Komponenten TLabel *UnlockCursor2KeyLbl; TLabel *ScreenshotLbl; TEdit *ScreenshotEdt; + TComboBox *ShaderD3DCbx; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -105,6 +106,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall HotkeyBtnClick(TObject *Sender); void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall ShaderD3DCbxChange(TObject *Sender); From 694b5d1caeea7a591ad250f05e2ff5a653fd1d39 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 12:51:38 +0200 Subject: [PATCH 0533/1724] align --- config/ConfigFormUnit.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index fc4ed62..ad048ec 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -584,7 +584,6 @@ void __fastcall TConfigForm::AdvancedBtnClick(TObject *Sender) CompatibilityPnl->Visible = false; } - void __fastcall TConfigForm::HotkeyBtnClick(TObject *Sender) { HotkeyPnl->Visible = true; @@ -676,7 +675,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) else if (StartsStr("d", renderer)) { RendererCbx->ItemIndex = 1; - ShaderLbl->Caption = + ShaderLbl->Caption = ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); ShaderD3DCbx->Visible = true; @@ -1029,7 +1028,6 @@ void TConfigForm::SaveSettings() delete ini; } - void __fastcall TConfigForm::FormActivate(TObject *Sender) { /* Detect wine (Linux/macOS) and create the needed dll override */ From 4f3325071edb776d4337293d490f7acc1386d6a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 12:53:12 +0200 Subject: [PATCH 0534/1724] align --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index ad048ec..d678ec1 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1174,7 +1174,7 @@ void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) ShaderCbx->Visible = false; } else { - ShaderLbl->Caption = + ShaderLbl->Caption = ReplaceStr(ShaderLbl->Caption, "Direct3D", "OpenGL"); ShaderCbx->Visible = true; From a9164e8308f9a75496c4b1ee8e018c607e50f6cf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 14:40:29 +0200 Subject: [PATCH 0535/1724] add "Restore Default Settings" button --- config/ConfigFormUnit.cpp | 34 ++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 16 ++++++++++++++++ config/ConfigFormUnit.h | 2 ++ 3 files changed, 52 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d678ec1..4b5675b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -45,6 +45,29 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) Application->Terminate(); } +void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) +{ + if (Application->MessageBox( + (RestoreDefaultsBtn->Caption + "?").w_str(), + L"cnc-ddraw", + MB_YESNO) == IDNO) { + + return; + } + + DeleteFile(".\\ddraw.ini"); + + ShellExecute( + NULL, + L"open", + Application->ExeName.w_str(), + NULL, + NULL, + SW_SHOWNORMAL); + + Application->Terminate(); +} + void TConfigForm::ApplyTranslation(TIniFile *ini) { auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); @@ -60,6 +83,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"高级设置"; HotkeyBtn->Caption = L"热键设置"; CompatibilityBtn->Caption = L"兼容性设置"; + RestoreDefaultsBtn->Caption = L"恢复默认设置"; PresentationLbl->Caption = L"显示方式"; MaintasLbl->Caption = L"保持纵横比"; VsyncLbl->Caption = L"打开垂直同步"; @@ -118,6 +142,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Ajustes avanzados"; HotkeyBtn->Caption = L"Teclas de acceso rápido"; CompatibilityBtn->Caption = L"Ajustes de compatibilidad"; + RestoreDefaultsBtn->Caption = L"Restaurar la configuración predeterminada"; PresentationLbl->Caption = L"Presentación"; MaintasLbl->Caption = L"Mantener la relación de aspecto"; VsyncLbl->Caption = L"Activar VSync"; @@ -176,6 +201,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Erweiterte Einstellungen"; HotkeyBtn->Caption = L"Tastenkürzel-Einstellungen"; CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen"; + RestoreDefaultsBtn->Caption = L"Standardeinstellungen wiederherstellen"; PresentationLbl->Caption = L"Darstellung"; MaintasLbl->Caption = L"Seitenverhältnis beibehalten"; VsyncLbl->Caption = L"VSync aktiveren"; @@ -235,6 +261,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Расширенные настройки"; HotkeyBtn->Caption = L"Настройки горячих клавиш"; CompatibilityBtn->Caption = L"Настройки совместимости"; + RestoreDefaultsBtn->Caption = L"Восстановить настройки по умолчанию"; PresentationLbl->Caption = L"Отображение"; MaintasLbl->Caption = L"Сохранять соотношение сторон"; VsyncLbl->Caption = L"Включить VSync"; @@ -293,6 +320,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Haladó Beállítások"; HotkeyBtn->Caption = L"Gyorsbillentyűk beállításai"; CompatibilityBtn->Caption = L"Kompatibilitás Beállítások"; + RestoreDefaultsBtn->Caption = L"Visszaállítja az alapértelmezett beállításokat"; PresentationLbl->Caption = L"Bemutató"; MaintasLbl->Caption = L"Képarány megtartása"; VsyncLbl->Caption = L"VSync bekapcsolása"; @@ -351,6 +379,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Paramètres Avancés"; HotkeyBtn->Caption = L"Paramètres de raccourci"; CompatibilityBtn->Caption = L"Paramètres de Compatibilité"; + RestoreDefaultsBtn->Caption = L"Restaurer les paramètres par défaut"; PresentationLbl->Caption = L"Présentation"; MaintasLbl->Caption = L"Conserver les proportions de l'image"; VsyncLbl->Caption = L"Activer la synchro verticale (VSync)"; @@ -409,6 +438,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Impostazioni avanzate"; HotkeyBtn->Caption = L"Tasti di scelta rapida"; CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; + RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni di default"; PresentationLbl->Caption = L"Presentazione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; @@ -512,6 +542,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Advanced Settings"; HotkeyBtn->Caption = L"Hotkey Settings"; CompatibilityBtn->Caption = L"Compatibility Settings"; + RestoreDefaultsBtn->Caption = L"Restore Default Settings"; PresentationLbl->Caption = L"Presentation"; MaintasLbl->Caption = L"Maintain aspect ratio"; VsyncLbl->Caption = L"Enable VSync"; @@ -807,6 +838,9 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) CompatibilityBtn->Visible = false; } + RestoreDefaultsBtn->Visible = + FileExists(".\\ddraw.dll") && GetBool(ini, "allow_reset", true); + delete ini; Initialized = true; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 03ead2a..9c8aa44 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3600,5 +3600,21 @@ object ConfigForm: TConfigForm ParentFont = False OnClick = HotkeyBtnClick end + object RestoreDefaultsBtn: TSpeedButton + Left = 0 + Top = 440 + Width = 227 + Height = 22 + Anchors = [akLeft, akTop, akRight] + Caption = 'Restore Default Settings' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + OnClick = RestoreDefaultsBtnClick + end end end diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index bf1eaec..f534e43 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -79,6 +79,7 @@ __published: // Von der IDE verwaltete Komponenten TLabel *ScreenshotLbl; TEdit *ScreenshotEdt; TComboBox *ShaderD3DCbx; + TSpeedButton *RestoreDefaultsBtn; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -107,6 +108,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall ShaderD3DCbxChange(TObject *Sender); + void __fastcall RestoreDefaultsBtnClick(TObject *Sender); From ada4bc1b8564538e040d94a5ca6e4ca9213e85b3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 14:54:52 +0200 Subject: [PATCH 0536/1724] add additional check --- config/ConfigFormUnit.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4b5675b..393cfc4 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -839,7 +839,9 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } RestoreDefaultsBtn->Visible = - FileExists(".\\ddraw.dll") && GetBool(ini, "allow_reset", true); + FileExists(".\\ddraw.dll") && + FileExists(".\\ddraw.ini") && + GetBool(ini, "allow_reset", true); delete ini; From 0712986a852803e161b6980f691bf81523270e18 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 15:03:25 +0200 Subject: [PATCH 0537/1724] use lower case text --- config/ConfigFormUnit.cpp | 2 +- config/ConfigFormUnit.dfm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 393cfc4..70e1e15 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -542,7 +542,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Advanced Settings"; HotkeyBtn->Caption = L"Hotkey Settings"; CompatibilityBtn->Caption = L"Compatibility Settings"; - RestoreDefaultsBtn->Caption = L"Restore Default Settings"; + RestoreDefaultsBtn->Caption = L"Restore default settings"; PresentationLbl->Caption = L"Presentation"; MaintasLbl->Caption = L"Maintain aspect ratio"; VsyncLbl->Caption = L"Enable VSync"; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 9c8aa44..7c58255 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3606,7 +3606,7 @@ object ConfigForm: TConfigForm Width = 227 Height = 22 Anchors = [akLeft, akTop, akRight] - Caption = 'Restore Default Settings' + Caption = 'Restore default settings' Flat = True Font.Charset = DEFAULT_CHARSET Font.Color = clBlack From 7d57a08de2b2e2c6d6c2121d82599b47a86932e1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 15:19:45 +0200 Subject: [PATCH 0538/1724] minor tweak --- config/ConfigFormUnit.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 70e1e15..e786054 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -834,9 +834,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; - if (GetBool(ini, "hide_compat_tab", false)) { - CompatibilityBtn->Visible = false; - } + CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); RestoreDefaultsBtn->Visible = FileExists(".\\ddraw.dll") && From 8b772680dca562ad2ad629cd2e55ea3b7cb76db1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 15:29:07 +0200 Subject: [PATCH 0539/1724] fix style elements --- config/ConfigFormUnit.dfm | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 7c58255..01a9216 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2713,7 +2713,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaintasLbl: TLabel Left = 40 @@ -2728,7 +2727,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object VsyncLbl: TLabel Left = 40 @@ -2743,7 +2741,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object AdjmouseLbl: TLabel Left = 40 @@ -2758,7 +2755,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object DevmodeLbl: TLabel Left = 40 @@ -2773,7 +2769,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object PresentationPbox: TPaintBox Left = 40 @@ -2899,7 +2894,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object NoactivateappLbl: TLabel Left = 40 @@ -2914,7 +2908,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ResolutionsLbl: TLabel Left = 40 @@ -2929,7 +2922,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MinfpsLbl: TLabel Left = 40 @@ -2944,7 +2936,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object SinglecpuLbl: TLabel Left = 40 @@ -2959,7 +2950,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object NonexclusiveLbl: TLabel Left = 40 @@ -2974,7 +2964,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaxgameticksPbox: TPaintBox Left = 40 @@ -3087,7 +3076,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object SavesettingsLbl: TLabel Left = 40 @@ -3102,7 +3090,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ShaderLbl: TLabel Left = 40 @@ -3117,7 +3104,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaxfpsLbl: TLabel Left = 40 @@ -3132,7 +3118,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object BorderLbl: TLabel Left = 40 @@ -3147,7 +3132,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object BoxingLbl: TLabel Left = 40 @@ -3162,7 +3146,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object RendererPbox: TPaintBox Left = 40 @@ -3309,7 +3292,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ToggleWindowedKeyLbl: TLabel Left = 41 @@ -3324,7 +3306,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaximizeWindowLbl: TLabel Left = 39 @@ -3339,7 +3320,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaximizeWindowKeyLbl: TLabel Left = 40 @@ -3354,7 +3334,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object UnlockCursor1Lbl: TLabel Left = 40 @@ -3369,7 +3348,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object UnlockCursor1KeyLbl: TLabel Left = 41 @@ -3384,7 +3362,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object UnlockCursor2Lbl: TLabel Left = 41 @@ -3399,7 +3376,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object UnlockCursor2KeyLbl: TLabel Left = 41 @@ -3414,7 +3390,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ScreenshotLbl: TLabel Left = 41 @@ -3429,7 +3404,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ToggleWindowedEdt: TEdit Left = 137 From b42c3e1d491188cfa685cbcc7318b915a914257e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 17:15:59 +0200 Subject: [PATCH 0540/1724] add dark theme --- config/ConfigFormUnit.cpp | 33 +++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 19 ++++++++++++++++--- config/ConfigFormUnit.h | 2 ++ config/cnc-ddraw config.cbproj | 2 +- config/cnc-ddraw config.cpp | 11 ++++++++++- src/config.c | 3 +++ 6 files changed, 65 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index e786054..6bfd98b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -45,6 +45,27 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) Application->Terminate(); } +void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) +{ + auto *ini = new TIniFile(".\\ddraw.ini"); + auto theme = + ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; + + ini->WriteString("ddraw", "configtheme", theme); + + delete ini; + + ShellExecute( + NULL, + L"open", + Application->ExeName.w_str(), + NULL, + NULL, + SW_SHOWNORMAL); + + Application->Terminate(); +} + void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) { if (Application->MessageBox( @@ -660,6 +681,18 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) auto *ini = new TIniFile(".\\ddraw.ini"); + if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { + + ThemePnl->Color = (TColor)RGB(243, 243, 243); + DisplayPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + AdvancedPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + HotkeyPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + CompatibilityPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + + MenuPnl->StyleElements = TStyleElements(seFont); + MenuPnl->Color = (TColor)RGB(31, 31, 31); + } + ApplyTranslation(ini); /* Display Settings */ diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 01a9216..575b027 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2778,7 +2778,7 @@ object ConfigForm: TConfigForm OnPaint = PboxPaint end object LanguageImg: TImage - Left = 477 + Left = 453 Top = 8 Width = 16 Height = 11 @@ -2805,7 +2805,6 @@ object ConfigForm: TConfigForm Stretch = True Visible = False OnClick = LanguageImgClick - ExplicitLeft = 569 end object PresentationCbx: TComboBox Left = 41 @@ -2866,6 +2865,20 @@ object ConfigForm: TConfigForm TabOrder = 4 OnClick = DevmodeChkClick end + object ThemePnl: TPanel + Left = 475 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + BevelOuter = bvNone + Color = 2039583 + ParentBackground = False + TabOrder = 5 + StyleElements = [seFont, seBorder] + OnClick = ThemePnlClick + ExplicitLeft = 471 + end end object CompatibilityPnl: TPanel Left = 233 @@ -3579,7 +3592,7 @@ object ConfigForm: TConfigForm Top = 440 Width = 227 Height = 22 - Anchors = [akLeft, akTop, akRight] + Anchors = [akLeft, akRight, akBottom] Caption = 'Restore default settings' Flat = True Font.Charset = DEFAULT_CHARSET diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index f534e43..1abcb9e 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -80,6 +80,7 @@ __published: // Von der IDE verwaltete Komponenten TEdit *ScreenshotEdt; TComboBox *ShaderD3DCbx; TSpeedButton *RestoreDefaultsBtn; + TPanel *ThemePnl; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -109,6 +110,7 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall ShaderD3DCbxChange(TObject *Sender); void __fastcall RestoreDefaultsBtnClick(TObject *Sender); + void __fastcall ThemePnlClick(TObject *Sender); diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index ec25516..dbd448c 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -79,7 +79,7 @@ cnc-ddraw\config\;$(IncludePath) cnc-ddraw\config\;$(ILINK_LibraryPath) cnc-ddraw_config - Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf + Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf;"Cobalt XEMedia|VCLSTYLE|$(BDSCOMMONDIR)\Styles\CobaltXEMedia.vsf" adortl;appanalytics;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;FireDAC;FireDACADSDriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACIBDriver;FireDACMSAccDriver;FireDACMySQLDriver;FireDACPgDriver;FireDACSqliteDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;tethering;vcl;vclactnband;vcldb;vcldsnap;vclFireDAC;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index d0dbb6f..958693d 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -1,6 +1,7 @@ //--------------------------------------------------------------------------- #include +#include #pragma hdrstop #include //--------------------------------------------------------------------------- @@ -14,7 +15,15 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { Application->Initialize(); Application->MainFormOnTaskBar = true; - TStyleManager::TrySetStyle("Windows10"); + + auto *ini = new TIniFile(".\\ddraw.ini"); + auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); + + TStyleManager::TrySetStyle( + theme == "Cobalt XEMedia" ? "Cobalt XEMedia" : "Windows10"); + + delete ini; + Application->CreateForm(__classid(TConfigForm), &ConfigForm); Application->Run(); } diff --git a/src/config.c b/src/config.c index c56f05e..f110d54 100644 --- a/src/config.c +++ b/src/config.c @@ -300,6 +300,9 @@ static void cfg_create_ini() "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" "configlang=auto\n" "\n" + "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" + "configtheme=Windows10\n" + "\n" "; Where should screenshots be saved\n" "screenshotdir=.\\Screenshots\\\n" "\n" From 97a81b67b54874a82569354886d690f50277abce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 20:31:26 +0200 Subject: [PATCH 0541/1724] try to use hook=3 by default --- src/config.c | 11 +---------- src/dllmain.c | 1 - src/hook.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/config.c b/src/config.c index f110d54..284d445 100644 --- a/src/config.c +++ b/src/config.c @@ -323,11 +323,6 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+GetProcAddress hook (All Modules), 4 = IAT Hooking (All Modules)\n" - "; Note: Change this value if windowed mode or upscaling isn't working properly\n" - "; Note: 'hook=3' will usually work for problematic games, if it doesn't then try 'hook=2' + 'renderer=gdi'\n" - "hook=4\n" - "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" "; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)\n" "minfps=0\n" @@ -356,6 +351,7 @@ static void cfg_create_ini() "releasealt=false\n" "game_handles_close=false\n" "fixnotresponding=false\n" + "hook=4\n" "guard_lines=200\n" "max_resolutions=0\n" "limit_bltfast=false\n" @@ -866,7 +862,6 @@ static void cfg_create_ini() "; KKND2: Krossfire\n" "[KKND2]\n" "noactivateapp=true\n" - "hook=3\n" "\n" "; Lionheart\n" "[Lionheart]\n" @@ -1064,10 +1059,6 @@ static void cfg_create_ini() "height=0\n" "resizable=false\n" "\n" - "; Wizards and Warriors\n" - "[deep6]\n" - "hook=3\n" - "\n" "; War Wind\n" "[WW]\n" "renderer=opengl\n" diff --git a/src/dllmain.c b/src/dllmain.c index da9035d..92e6d2d 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -105,7 +105,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } timeBeginPeriod(1); - g_hook_method = cfg_get_int("hook", 4); hook_init(TRUE); break; } diff --git a/src/hook.c b/src/hook.c index 0762cf5..b7a06df 100644 --- a/src/hook.c +++ b/src/hook.c @@ -364,6 +364,45 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) } } +BOOL hook_got_ddraw_import() +{ + __try + { + HMODULE hmod = GetModuleHandleA(NULL); + + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + return FALSE; + + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + if (nt_headers->Signature != IMAGE_NT_SIGNATURE) + return FALSE; + + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + + (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + + if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + return FALSE; + + while (import_desc->FirstThunk) + { + char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + + if (_stricmp(imp_module_name, "ddraw.dll") == 0) + { + return TRUE; + } + + import_desc++; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } + + return FALSE; +} + void hook_create(HOOKLIST* hooks, BOOL initial_hook) { #ifdef _MSC_VER @@ -525,6 +564,17 @@ void hook_revert(HOOKLIST* hooks) void hook_init(BOOL initial_hook) { + if (initial_hook) + { + g_hook_method = cfg_get_int("hook", 4); + + if (g_hook_method == 4 && hook_got_ddraw_import()) + { + /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ + g_hook_method = 3; + } + } + if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) { #if defined(_DEBUG) && defined(_MSC_VER) From 94b93da8f699e1844aec2508f9eeab8ef6484d15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 20:35:36 +0200 Subject: [PATCH 0542/1724] update comments --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 284d445..d73651a 100644 --- a/src/config.c +++ b/src/config.c @@ -332,11 +332,12 @@ static void cfg_create_ini() "nonexclusive=false\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" + "; Note: Disable this if the game is not running smooth or there are sound issues\n" "singlecpu=true\n" "\n" "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" "; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list\n" - "; Note: Set this to 1 if the game is crashing\n" + "; Note: Set this to 1 if the game is crashing on startup\n" "resolutions=0\n" "\n" "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide\n" From 785d625635f0b0605810200a09ea469cad7abba7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 13 Aug 2023 21:55:47 +0200 Subject: [PATCH 0543/1724] add HoMM3 presets --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index d73651a..9912e55 100644 --- a/src/config.c +++ b/src/config.c @@ -787,6 +787,14 @@ static void cfg_create_ini() "[HEROES2W]\n" "adjmouse=true\n" "\n" + "; Heroes of Might and Magic III\n" + "[Heroes3]\n" + "game_handles_close=true\n" + "\n" + "; Heroes of Might and Magic III HD Mod\n" + "[Heroes3 HD]\n" + "game_handles_close=true\n" + "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" "maxgameticks=25\n" From e3b60780dc3f63c145a2b498bc12ba8c9fb781a2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 09:07:14 +0200 Subject: [PATCH 0544/1724] adjust coords --- config/ConfigFormUnit.dfm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 575b027..adf671f 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3307,7 +3307,7 @@ object ConfigForm: TConfigForm ParentFont = False end object ToggleWindowedKeyLbl: TLabel - Left = 41 + Left = 50 Top = 60 Width = 34 Height = 21 @@ -3321,7 +3321,7 @@ object ConfigForm: TConfigForm ParentFont = False end object MaximizeWindowLbl: TLabel - Left = 39 + Left = 40 Top = 107 Width = 125 Height = 21 @@ -3335,7 +3335,7 @@ object ConfigForm: TConfigForm ParentFont = False end object MaximizeWindowKeyLbl: TLabel - Left = 40 + Left = 50 Top = 139 Width = 34 Height = 21 @@ -3363,7 +3363,7 @@ object ConfigForm: TConfigForm ParentFont = False end object UnlockCursor1KeyLbl: TLabel - Left = 41 + Left = 50 Top = 218 Width = 40 Height = 21 @@ -3377,7 +3377,7 @@ object ConfigForm: TConfigForm ParentFont = False end object UnlockCursor2Lbl: TLabel - Left = 41 + Left = 40 Top = 265 Width = 109 Height = 21 @@ -3391,7 +3391,7 @@ object ConfigForm: TConfigForm ParentFont = False end object UnlockCursor2KeyLbl: TLabel - Left = 41 + Left = 50 Top = 297 Width = 48 Height = 21 From 2f18ca470a427da6c0adf0da5e2159f41e85bce4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 11:06:29 +0200 Subject: [PATCH 0545/1724] fix panel size --- config/ConfigFormUnit.dfm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index adf671f..f914cc8 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3513,16 +3513,16 @@ object ConfigForm: TConfigForm Left = 0 Top = 8 Width = 233 - Height = 465 + Height = 468 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone Color = clMenu ParentBackground = False TabOrder = 0 - ExplicitHeight = 464 + ExplicitHeight = 467 DesignSize = ( 233 - 465) + 468) object DisplayBtn: TSpeedButton Left = 0 Top = 8 From f3b85780add6657af24b6b9c6157b2e6c9309bc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 19:56:00 +0200 Subject: [PATCH 0546/1724] replace Direct3D9EnableMaximizedWindowedModeShim with better solution --- src/dd.c | 8 ++++---- src/render_d3d9.c | 17 ++++------------- src/utils.c | 2 +- src/wndproc.c | 6 +++--- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/dd.c b/src/dd.c index 32ed5ed..e0a18cb 100644 --- a/src/dd.c +++ b/src/dd.c @@ -506,7 +506,6 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } - /* only stop drawing in GL mode when minimized */ if (g_ddraw->renderer != gdi_render_main) { EnterCriticalSection(&g_ddraw->cs); @@ -523,7 +522,7 @@ HRESULT dd_RestoreDisplayMode() if (!g_ddraw->windowed) { - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -922,7 +921,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (!d3d9_active && ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if ((!d3d9_active || g_ddraw->nonexclusive) && + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { g_ddraw->render.run = FALSE; g_ddraw->windowed = TRUE; @@ -1185,7 +1185,7 @@ ULONG dd_Release() if (!g_ddraw->windowed) { - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 94ff919..ad557e8 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -50,15 +50,6 @@ BOOL d3d9_create() if (g_d3d9.hmodule) { - if (g_ddraw->nonexclusive) - { - int (WINAPI * d3d9_enable_shim)(BOOL) = - (int (WINAPI*)(BOOL))real_GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim"); - - if (d3d9_enable_shim) - d3d9_enable_shim(TRUE); - } - LPDIRECT3D9 d3d9on12 = NULL; D3D9ON12_ARGS args; memset(&args, 0, sizeof(args)); @@ -118,7 +109,7 @@ BOOL d3d9_create() memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); - g_d3d9.params.Windowed = g_ddraw->windowed; + g_d3d9.params.Windowed = g_ddraw->windowed || g_ddraw->nonexclusive; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; @@ -166,9 +157,9 @@ BOOL d3d9_on_device_lost() BOOL d3d9_reset(BOOL windowed) { - g_d3d9.params.Windowed = windowed; - g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.Windowed = windowed || g_ddraw->nonexclusive; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) diff --git a/src/utils.c b/src/utils.c index b6f1486..eb6a96f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -365,7 +365,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.window_state = g_ddraw->windowed = TRUE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { d3d9_reset(g_ddraw->windowed); } diff --git a/src/wndproc.c b/src/wndproc.c index 0075022..ee97f51 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -136,7 +136,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if ((!g_ddraw->windowed || !IsIconic(g_ddraw->hwnd)) && + if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !IsIconic(g_ddraw->hwnd)) && g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) { @@ -519,7 +519,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_ddraw->windowed) { - if (g_ddraw->renderer != d3d9_render_main) + if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); @@ -543,7 +543,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (!g_ddraw->windowed) { - if (g_ddraw->renderer != d3d9_render_main) + if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); From dfd862592cdbd025df13ccee3dcf7afaf80b0e44 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 20:07:31 +0200 Subject: [PATCH 0547/1724] fix fullscreen upscaled mode --- src/dd.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dd.c b/src/dd.c index e0a18cb..c0052ea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -911,6 +911,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->renderer == d3d9_render_main) { + if (g_ddraw->nonexclusive) + { + if (IsIconic(g_ddraw->hwnd)) + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + + real_SetWindowPos( + g_ddraw->hwnd, + HWND_TOPMOST, + 0, + 0, + g_ddraw->render.width, + g_ddraw->render.height, + swp_flags); + } + d3d9_active = d3d9_create(); if (!d3d9_active) From dec0d33ef362eaab9d1666c43349f4eb026269b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 20:12:42 +0200 Subject: [PATCH 0548/1724] fix flags --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index c0052ea..df5111e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -924,6 +924,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.width, g_ddraw->render.height, swp_flags); + + swp_flags = SWP_SHOWWINDOW; } d3d9_active = d3d9_create(); From 8e0ca6825c179f00b7f6ecda16f4eb9b710a8bb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 20:53:36 +0200 Subject: [PATCH 0549/1724] update presets --- src/config.c | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/config.c b/src/config.c index 9912e55..d686732 100644 --- a/src/config.c +++ b/src/config.c @@ -404,27 +404,23 @@ static void cfg_create_ini() "\n" "; Age of Empires\n" "[empires]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires: The Rise of Rome\n" "[empiresx]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires II\n" "[EMPIRES2]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Age of Empires II: The Conquerors\n" "[age2_x1]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -525,7 +521,6 @@ static void cfg_create_ini() "[claw]\n" "adjmouse=true\n" "noactivateapp=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Command & Conquer: Sole Survivor\n" @@ -652,7 +647,6 @@ static void cfg_create_ini() "\n" "; Caesar III\n" "[c3]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -671,25 +665,21 @@ static void cfg_create_ini() "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Call To Power 2\n" @@ -739,7 +729,6 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" - "renderer=opengl\n" "devmode=true\n" "hook_peekmessage=true\n" "rgb555=true\n" @@ -757,7 +746,6 @@ static void cfg_create_ini() "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -768,7 +756,6 @@ static void cfg_create_ini() "; Gangsters: Organized Crime\n" "[gangsters]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Grand Theft Auto\n" @@ -914,7 +901,6 @@ static void cfg_create_ini() "\n" "; Pax Imperia\n" "[Pax Imperia]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Railroad Tycoon II\n" @@ -928,18 +914,15 @@ static void cfg_create_ini() "\n" "; Sim Copter\n" "[SimCopter]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Settlers 3\n" "[s3]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -947,13 +930,11 @@ static void cfg_create_ini() "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -967,7 +948,7 @@ static void cfg_create_ini() "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" - "resolutions=2\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" @@ -993,7 +974,6 @@ static void cfg_create_ini() "\n" "; Shadow Flare\n" "[ShadowFlare]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -1026,14 +1006,12 @@ static void cfg_create_ini() "\n" "; Twisted Metal\n" "[TWISTED]\n" - "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=25\n" "minfps=5\n" "\n" "; Twisted Metal 2\n" "[Tm2]\n" - "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" From 486baae2efa15942458082a83cc4ce58023d6124 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 21:18:59 +0200 Subject: [PATCH 0550/1724] Revert "update presets" This reverts commit 8e0ca6825c179f00b7f6ecda16f4eb9b710a8bb7. --- src/config.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index d686732..9912e55 100644 --- a/src/config.c +++ b/src/config.c @@ -404,23 +404,27 @@ static void cfg_create_ini() "\n" "; Age of Empires\n" "[empires]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires: The Rise of Rome\n" "[empiresx]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires II\n" "[EMPIRES2]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Age of Empires II: The Conquerors\n" "[age2_x1]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -521,6 +525,7 @@ static void cfg_create_ini() "[claw]\n" "adjmouse=true\n" "noactivateapp=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Command & Conquer: Sole Survivor\n" @@ -647,6 +652,7 @@ static void cfg_create_ini() "\n" "; Caesar III\n" "[c3]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -665,21 +671,25 @@ static void cfg_create_ini() "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Call To Power 2\n" @@ -729,6 +739,7 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" + "renderer=opengl\n" "devmode=true\n" "hook_peekmessage=true\n" "rgb555=true\n" @@ -746,6 +757,7 @@ static void cfg_create_ini() "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -756,6 +768,7 @@ static void cfg_create_ini() "; Gangsters: Organized Crime\n" "[gangsters]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Grand Theft Auto\n" @@ -901,6 +914,7 @@ static void cfg_create_ini() "\n" "; Pax Imperia\n" "[Pax Imperia]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Railroad Tycoon II\n" @@ -914,15 +928,18 @@ static void cfg_create_ini() "\n" "; Sim Copter\n" "[SimCopter]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Settlers 3\n" "[s3]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -930,11 +947,13 @@ static void cfg_create_ini() "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -948,7 +967,7 @@ static void cfg_create_ini() "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" - "resolutions=2\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" @@ -974,6 +993,7 @@ static void cfg_create_ini() "\n" "; Shadow Flare\n" "[ShadowFlare]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -1006,12 +1026,14 @@ static void cfg_create_ini() "\n" "; Twisted Metal\n" "[TWISTED]\n" + "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=25\n" "minfps=5\n" "\n" "; Twisted Metal 2\n" "[Tm2]\n" + "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" From 15e7f9d2c3d2a68a125623ad20e76010a23c4c4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 06:27:54 +0200 Subject: [PATCH 0551/1724] reset device when nonexclusive is enabled --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index df5111e..2b36771 100644 --- a/src/dd.c +++ b/src/dd.c @@ -967,6 +967,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.height, swp_flags); + if (d3d9_active && g_ddraw->nonexclusive) + d3d9_reset(TRUE); + g_ddraw->last_set_window_pos_tick = timeGetTime(); mouse_lock(); From 26175acde77e42bba7426ef7c8fb55ad65d40ba9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 08:46:14 +0200 Subject: [PATCH 0552/1724] revert min fps setting on d3d9 --- src/render_d3d9.c | 2 +- src/wndproc.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index ad557e8..d461edb 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -423,7 +423,7 @@ DWORD WINAPI d3d9_render_main(void) BOOL needs_update = FALSE; - DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : 200; + DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; while (g_ddraw->render.run && (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) diff --git a/src/wndproc.c b/src/wndproc.c index ee97f51..4a7bd09 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -530,6 +530,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { mouse_lock(); } + + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + PostMessageA(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0); } else { From 4c620b224ffa79cb3dd387ff31218b25a1c8f080 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 08:59:26 +0200 Subject: [PATCH 0553/1724] retry until device was reset --- src/render_d3d9.c | 3 +++ src/wndproc.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d461edb..bbffb0c 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -553,6 +553,9 @@ DWORD WINAPI d3d9_render_main(void) { DWORD_PTR result; SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); + + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + Sleep(50); } #if _DEBUG diff --git a/src/wndproc.c b/src/wndproc.c index 4a7bd09..1d70959 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -20,7 +20,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam #ifdef _DEBUG if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && - uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER) + uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && + uMsg != WM_D3D9DEVICELOST) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", From 7144208c695b6ec55d5194ab405c8077ab4ccae3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 20:53:36 +0200 Subject: [PATCH 0554/1724] update presets --- src/config.c | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/config.c b/src/config.c index 9912e55..d686732 100644 --- a/src/config.c +++ b/src/config.c @@ -404,27 +404,23 @@ static void cfg_create_ini() "\n" "; Age of Empires\n" "[empires]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires: The Rise of Rome\n" "[empiresx]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires II\n" "[EMPIRES2]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Age of Empires II: The Conquerors\n" "[age2_x1]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -525,7 +521,6 @@ static void cfg_create_ini() "[claw]\n" "adjmouse=true\n" "noactivateapp=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Command & Conquer: Sole Survivor\n" @@ -652,7 +647,6 @@ static void cfg_create_ini() "\n" "; Caesar III\n" "[c3]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -671,25 +665,21 @@ static void cfg_create_ini() "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Call To Power 2\n" @@ -739,7 +729,6 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" - "renderer=opengl\n" "devmode=true\n" "hook_peekmessage=true\n" "rgb555=true\n" @@ -757,7 +746,6 @@ static void cfg_create_ini() "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -768,7 +756,6 @@ static void cfg_create_ini() "; Gangsters: Organized Crime\n" "[gangsters]\n" "adjmouse=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Grand Theft Auto\n" @@ -914,7 +901,6 @@ static void cfg_create_ini() "\n" "; Pax Imperia\n" "[Pax Imperia]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Railroad Tycoon II\n" @@ -928,18 +914,15 @@ static void cfg_create_ini() "\n" "; Sim Copter\n" "[SimCopter]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Settlers 3\n" "[s3]\n" - "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -947,13 +930,11 @@ static void cfg_create_ini() "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" @@ -967,7 +948,7 @@ static void cfg_create_ini() "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" - "resolutions=2\n" + "resolutions=2\n" "stronghold_hack=true\n" "adjmouse=true\n" "\n" @@ -993,7 +974,6 @@ static void cfg_create_ini() "\n" "; Shadow Flare\n" "[ShadowFlare]\n" - "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" @@ -1026,14 +1006,12 @@ static void cfg_create_ini() "\n" "; Twisted Metal\n" "[TWISTED]\n" - "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=25\n" "minfps=5\n" "\n" "; Twisted Metal 2\n" "[Tm2]\n" - "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" From 2171b4d42b37ef1a5cafdfe99651d8e1279d6c54 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 11:25:05 +0200 Subject: [PATCH 0555/1724] adjust dark reign preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index d686732..04128b5 100644 --- a/src/config.c +++ b/src/config.c @@ -704,7 +704,6 @@ static void cfg_create_ini() "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" - "renderer=opengl\n" "maxgameticks=60\n" "\n" "; Dungeon Keeper 2\n" From d329495b1ce8a556e750288d1617f0aa67c232f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 13:38:10 +0200 Subject: [PATCH 0556/1724] update war wind preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 04128b5..ec159e7 100644 --- a/src/config.c +++ b/src/config.c @@ -1047,7 +1047,7 @@ static void cfg_create_ini() "\n" "; War Wind\n" "[WW]\n" - "renderer=opengl\n" + "minfps=-1\n" "\n" "; Zeus and Poseidon\n" "[Zeus]\n" From 614febabf6ee776e6d9d4f0feb48ba4b552e673c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 15:38:50 +0200 Subject: [PATCH 0557/1724] allow only 1 instance per game folder --- config/ConfigFormUnit.cpp | 10 ++++++++++ config/ConfigFormUnit.h | 1 + config/cnc-ddraw config.cpp | 17 ++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 6bfd98b..0178e22 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -28,6 +29,15 @@ __fastcall TConfigForm::TConfigForm(TComponent* Owner) { } +void __fastcall TConfigForm::CreateParams(TCreateParams & Params) +{ + TForm::CreateParams(Params); + + StrCopy( + Params.WinClassName, + THashSHA1::GetHashString(Application->ExeName).w_str()); +} + void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { auto *ini = new TIniFile(".\\ddraw.ini"); diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 1abcb9e..2e16295 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -115,6 +115,7 @@ __published: // Von der IDE verwaltete Komponenten private: // Benutzer-Deklarationen + virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); void ApplyTranslation(TIniFile *ini); diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 958693d..df2488f 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -1,8 +1,9 @@ //--------------------------------------------------------------------------- #include -#include #pragma hdrstop +#include +#include #include //--------------------------------------------------------------------------- #include @@ -16,6 +17,20 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) Application->Initialize(); Application->MainFormOnTaskBar = true; + HWND hwnd = + FindWindow( + THashSHA1::GetHashString(Application->ExeName).w_str(), NULL); + + if (hwnd) { + + if (IsIconic(hwnd)) { + ShowWindow(hwnd, SW_RESTORE); + } + + SetForegroundWindow(hwnd); + return 0; + } + auto *ini = new TIniFile(".\\ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); From 59b4d83153432cdbad76eddd71774b3731cb2cc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 15:46:05 +0200 Subject: [PATCH 0558/1724] add directory name to window title --- config/ConfigFormUnit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 0178e22..3c0962f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -628,6 +628,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaximizeWindowKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; UnlockCursor1KeyLbl->Caption = GetKeyText(VK_CONTROL) + L" +"; UnlockCursor2KeyLbl->Caption = "R " + GetKeyText(VK_MENU) + L" +"; + + ConfigForm->Caption += + " (" + TPath::GetFileName( + TPath::GetDirectoryName(Application->ExeName)) + ")"; } void __fastcall TConfigForm::DisplayBtnClick(TObject *Sender) From 27f40a34062e198a2f8fc28e6a2b54a7ab063709 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 16:16:49 +0200 Subject: [PATCH 0559/1724] pass -restart arg --- config/ConfigFormUnit.cpp | 6 +++--- config/cnc-ddraw config.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3c0962f..3b1ff04 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -48,7 +48,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) NULL, L"open", Application->ExeName.w_str(), - NULL, + L"-restart", NULL, SW_SHOWNORMAL); @@ -69,7 +69,7 @@ void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) NULL, L"open", Application->ExeName.w_str(), - NULL, + L"-restart", NULL, SW_SHOWNORMAL); @@ -92,7 +92,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) NULL, L"open", Application->ExeName.w_str(), - NULL, + L"-restart", NULL, SW_SHOWNORMAL); diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index df2488f..7cb64d5 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -21,7 +21,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) FindWindow( THashSHA1::GetHashString(Application->ExeName).w_str(), NULL); - if (hwnd) { + if (hwnd && ParamStr(1) != L"-restart") { if (IsIconic(hwnd)) { ShowWindow(hwnd, SW_RESTORE); From b150e74d1c9f82acdc8bdfb578db78fa020cfefe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 15 Aug 2023 17:01:12 +0200 Subject: [PATCH 0560/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 5021cca..ec0f31c 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 5 +#define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b50f9fff7b2183f2f809b39d7c331111081f5c62 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Aug 2023 14:21:26 +0200 Subject: [PATCH 0561/1724] add hooks to fix blurry fonts --- inc/hook.h | 4 ++++ inc/winapi_hooks.h | 6 ++++++ src/hook.c | 27 +++++++++++++++++++++++++++ src/winapi_hooks.c | 24 ++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 95ba179..5a08f6b 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -37,6 +37,8 @@ typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); +typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); +typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); @@ -69,6 +71,8 @@ extern SHOWWINDOWPROC real_ShowWindow; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; +extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; +extern CREATEFONTAPROC real_CreateFontA; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index c112ec3..9c0a5b4 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -30,6 +30,12 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); +HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf); +HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, + DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, + DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, + LPCTSTR lpszFace); + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/hook.c b/src/hook.c index 3a3406a..66af624 100644 --- a/src/hook.c +++ b/src/hook.c @@ -43,12 +43,15 @@ SHOWWINDOWPROC real_ShowWindow = ShowWindow; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; +CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; +CREATEFONTAPROC real_CreateFontA = CreateFontA; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; + static HOOKLIST g_hooks[] = { { @@ -497,6 +500,20 @@ void hook_init() { BOOL initial_hook = !g_hook_active; + if (initial_hook) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA); + DetourTransactionCommit(); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA); + DetourTransactionCommit(); + } + + #ifdef _MSC_VER if (initial_hook && g_hook_dinput) { @@ -577,6 +594,16 @@ void hook_exit() { g_hook_active = FALSE; + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA); + DetourTransactionCommit(); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA); + DetourTransactionCommit(); + #ifdef _MSC_VER if (g_hook_dinput) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2ffeab5..7ab3324 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -560,6 +560,30 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return real_GetDeviceCaps(hdc, index); } +HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf) +{ + LOGFONTA lf; + memcpy(&lf, lplf, sizeof(lf)); + lf.lfQuality = NONANTIALIASED_QUALITY; + + return real_CreateFontIndirectA(&lf); +} + +HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, + DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, + DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, + LPCTSTR lpszFace) +{ + fdwQuality = NONANTIALIASED_QUALITY; + + return + real_CreateFontA( + nHeight, nWidth, nEscapement, nOrientation, fnWeight, + fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, + fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, + lpszFace); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); From e32fffef203fa6eb6fa98676a06ca8b5acd7f23b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 13:42:26 +0200 Subject: [PATCH 0562/1724] improve logs --- inc/debug.h | 1 + src/debug.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index 31d0501..988a525 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -13,6 +13,7 @@ void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); int dbg_printf(const char* fmt, ...); void dbg_init(); +void dbg_dump_swp_flags(DWORD flags); void dbg_dump_ddp_flags(DWORD flags); void dbg_dump_scl_flags(DWORD flags); void dbg_dump_edm_flags(DWORD flags); diff --git a/src/debug.c b/src/debug.c index 290aa63..fba6cfd 100644 --- a/src/debug.c +++ b/src/debug.c @@ -256,6 +256,51 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } +void dbg_dump_swp_flags(DWORD flags) +{ +#ifdef _DEBUG + if (flags & SWP_NOSIZE) { + TRACE(" SWP_NOSIZE\n"); + } + if (flags & SWP_NOMOVE) { + TRACE(" SWP_NOMOVE\n"); + } + if (flags & SWP_NOZORDER) { + TRACE(" SWP_NOZORDER\n"); + } + if (flags & SWP_NOREDRAW) { + TRACE(" SWP_NOREDRAW\n"); + } + if (flags & SWP_NOACTIVATE) { + TRACE(" SWP_NOACTIVATE\n"); + } + if (flags & SWP_FRAMECHANGED) { + TRACE(" SWP_FRAMECHANGED\n"); + } + if (flags & SWP_SHOWWINDOW) { + TRACE(" SWP_SHOWWINDOW\n"); + } + if (flags & SWP_HIDEWINDOW) { + TRACE(" SWP_HIDEWINDOW\n"); + } + if (flags & SWP_NOCOPYBITS) { + TRACE(" SWP_NOCOPYBITS\n"); + } + if (flags & SWP_NOOWNERZORDER) { + TRACE(" SWP_NOOWNERZORDER\n"); + } + if (flags & SWP_NOSENDCHANGING) { + TRACE(" SWP_NOSENDCHANGING\n"); + } + if (flags & SWP_DEFERERASE) { + TRACE(" SWP_DEFERERASE\n"); + } + if (flags & SWP_ASYNCWINDOWPOS) { + TRACE(" SWP_ASYNCWINDOWPOS\n"); + } +#endif +} + void dbg_dump_ddp_flags(DWORD flags) { #ifdef _DEBUG @@ -991,6 +1036,8 @@ char* dbg_mes_to_str(int id) case 673: return "WM_MOUSEHOVER"; case 674: return "WM_NCMOUSELEAVE"; case 675: return "WM_MOUSELEAVE"; + case 736: return "WM_DPICHANGED"; + case 740: return "WM_GETDPISCALEDSIZE"; case 768: return "WM_CUT"; case 769: return "WM_COPY"; case 770: return "WM_PASTE"; From 185c90c67fb4c0caaacc953680cdaa2e12db377c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 13:42:35 +0200 Subject: [PATCH 0563/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index ec0f31c..44edfe4 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From bcfe2a6c4df5b79da494dfafb91f8f4d4aff5e19 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 13:50:21 +0200 Subject: [PATCH 0564/1724] fix util_get_lowest_resolution --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index eb6a96f..c599efd 100644 --- a/src/utils.c +++ b/src/utils.c @@ -218,8 +218,8 @@ BOOL util_get_lowest_resolution( m.dmPelsHeight >= min_height && m.dmPelsWidth <= max_width && m.dmPelsHeight <= max_height && - m.dmPelsWidth < lowest.cx && - m.dmPelsHeight < lowest.cy) + m.dmPelsWidth <= lowest.cx && + m.dmPelsHeight <= lowest.cy) { int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10); From 38e17b072033ba354b7fe9279a0b79b7b5f417eb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 13:55:30 +0200 Subject: [PATCH 0565/1724] fix 1280x540 res --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 2b36771..c0d7d79 100644 --- a/src/dd.c +++ b/src/dd.c @@ -102,7 +102,7 @@ HRESULT dd_EnumDisplayModes( { rlf ? 1920 : 0, rlf ? 1080 : 0 }, { rlf ? 2560 : 0, rlf ? 1440 : 0 }, /* 21:9 */ - { rlf ? 1280 : 0, rlf ? 544 : 0 }, + { rlf ? 1280 : 0, rlf ? 540 : 0 }, { rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 }, { max_w, max_h }, From 0458b765ac3662ff078248d23f60743be1a875bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 14:17:36 +0200 Subject: [PATCH 0566/1724] #160 log WM_WINDOWPOSCHANGING --- src/wndproc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 1d70959..55bf0f1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -479,11 +479,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_WINDOWPOSCHANGING: { + WINDOWPOS* pos = (WINDOWPOS*)lParam; + + dbg_dump_swp_flags(pos->flags); + TRACE( + " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", + pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); + /* workaround for a bug where sometimes a background window steals the focus */ if (g_mouse_locked) { - WINDOWPOS* pos = (WINDOWPOS*)lParam; - if (pos->flags == SWP_NOMOVE + SWP_NOSIZE) { mouse_unlock(); From 0013c746afcffb1a06279e2ca71e279625926a69 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 14:30:02 +0200 Subject: [PATCH 0567/1724] disable log --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 55bf0f1..1e7634d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -481,10 +481,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { WINDOWPOS* pos = (WINDOWPOS*)lParam; + /* dbg_dump_swp_flags(pos->flags); TRACE( " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); + */ /* workaround for a bug where sometimes a background window steals the focus */ if (g_mouse_locked) From 84a06f8fe39cce36cea35f9d6ce54fcbd09910dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Aug 2023 18:41:19 +0200 Subject: [PATCH 0568/1724] adjust RESLIST_MINI --- src/dd.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index c0d7d79..021e8b4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -72,19 +72,20 @@ HRESULT dd_EnumDisplayModes( } BOOL rlf = g_ddraw->resolutions == RESLIST_FULL; + BOOL rlm = g_ddraw->resolutions == RESLIST_MINI; SIZE resolutions[] = { { 320, 200 }, { 320, 240 }, - { 512, 384 }, + { rlm ? 0 : 512, rlm ? 0 : 384 }, { 640, 400 }, { 640, 480 }, { 800, 600 }, { 1024, 768 }, { 1280, 1024 }, - { 1600, 1200 }, - { 1280, 720 }, + { rlm ? 0 : 1600, rlm ? 0 : 1200 }, + { rlm ? 0 : 1280, rlm ? 0 : 720 }, { rlf ? 1024 : 0, rlf ? 600 : 0 }, /* 4:3 */ { rlf ? 1280 : 0, rlf ? 960 : 0 }, From 9f91719057d62c3ad3e9f4159efe409f4e2022f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 11:18:15 +0200 Subject: [PATCH 0569/1724] add 1280x720 to defaulrt list --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 021e8b4..9f33904 100644 --- a/src/dd.c +++ b/src/dd.c @@ -85,7 +85,7 @@ HRESULT dd_EnumDisplayModes( { 1024, 768 }, { 1280, 1024 }, { rlm ? 0 : 1600, rlm ? 0 : 1200 }, - { rlm ? 0 : 1280, rlm ? 0 : 720 }, + { 1280, 720 }, { rlf ? 1024 : 0, rlf ? 600 : 0 }, /* 4:3 */ { rlf ? 1280 : 0, rlf ? 960 : 0 }, From e0556dbaf0f242e0a5dc12cfa915cc65e258cc96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 11:22:09 +0200 Subject: [PATCH 0570/1724] add TA Kingdoms preset --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ec159e7..2d94392 100644 --- a/src/config.c +++ b/src/config.c @@ -990,6 +990,10 @@ static void cfg_create_ini() "lock_surfaces=true\n" "singlecpu=false\n" "\n" + "; Total Annihilation: Kingdoms\n" + "[Kingdoms]\n" + "game_handles_close=true\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From 81f8d3dbc1a8b1bd34dc624392419628d46bfdec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 13:33:41 +0200 Subject: [PATCH 0571/1724] adjust TAK preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 2d94392..a7900eb 100644 --- a/src/config.c +++ b/src/config.c @@ -993,6 +993,7 @@ static void cfg_create_ini() "; Total Annihilation: Kingdoms\n" "[Kingdoms]\n" "game_handles_close=true\n" + "max_resolutions=32\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" From 84ad3995d4bd1b3d6436139b97946867feaca812 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 14:04:37 +0200 Subject: [PATCH 0572/1724] update TA presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index a7900eb..231e46c 100644 --- a/src/config.c +++ b/src/config.c @@ -980,13 +980,13 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" - "resolutions=2\n" + "max_resolutions=32\n" "lock_surfaces=true\n" "singlecpu=false\n" "\n" "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" "[Viewer]\n" - "resolutions=2\n" + "max_resolutions=32\n" "lock_surfaces=true\n" "singlecpu=false\n" "\n" From b25223bf3a94a4a8800d04db952c8ec376762877 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 16:48:59 +0200 Subject: [PATCH 0573/1724] #219 add new "refresh_rate" setting --- inc/dd.h | 1 + src/config.c | 2 ++ src/dd.c | 6 ++++++ src/render_d3d9.c | 2 ++ 4 files changed, 11 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 630378d..fe0038f 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -157,6 +157,7 @@ typedef struct CNCDDRAW int guard_lines; int resolutions; int max_resolutions; + int refresh_rate; BOOL limit_bltfast; BOOL armadahack; BOOL tshack; diff --git a/src/config.c b/src/config.c index 231e46c..b76aece 100644 --- a/src/config.c +++ b/src/config.c @@ -45,6 +45,7 @@ void cfg_load() g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); + g_ddraw->refresh_rate = cfg_get_int("refresh_rate", 0); g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); @@ -362,6 +363,7 @@ static void cfg_create_ini() "fixmousehook=false\n" "rgb555=false\n" "no_dinput_hook=false\n" + "refresh_rate=0\n" "\n" "\n" "\n" diff --git a/src/dd.c b/src/dd.c index 9f33904..5d67a52 100644 --- a/src/dd.c +++ b/src/dd.c @@ -637,6 +637,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + if (g_ddraw->refresh_rate) + { + g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; + g_ddraw->render.mode.dmDisplayFrequency = g_ddraw->refresh_rate; + } + if (!g_ddraw->windowed) { /* Making sure the chosen resolution is valid */ diff --git a/src/render_d3d9.c b/src/render_d3d9.c index bbffb0c..29c0c26 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -115,6 +115,7 @@ BOOL d3d9_create() g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_ddraw->refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; @@ -160,6 +161,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.Windowed = windowed || g_ddraw->nonexclusive; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_ddraw->refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) From 1440142d407d973da2d544d352eb0d717865fb7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Aug 2023 18:01:53 +0200 Subject: [PATCH 0574/1724] check if chosen refresh rate is supported --- src/dd.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 5d67a52..64e4c5d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -631,18 +631,26 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_unlock(); memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); - g_ddraw->render.mode.dmSize = sizeof(DEVMODE); - g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; if (g_ddraw->refresh_rate) { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; g_ddraw->render.mode.dmDisplayFrequency = g_ddraw->refresh_rate; + + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + { + g_ddraw->refresh_rate = 0; + + g_ddraw->render.mode.dmFields = 0; + g_ddraw->render.mode.dmDisplayFrequency = 0; + } } + g_ddraw->render.mode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + if (!g_ddraw->windowed) { /* Making sure the chosen resolution is valid */ From ae8ecb529de70fa860c1c6dc4cd8f25ce41fe8f0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Aug 2023 18:03:00 +0200 Subject: [PATCH 0575/1724] add oreset for Icewind Dale 2 --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index b76aece..dc3ae64 100644 --- a/src/config.c +++ b/src/config.c @@ -789,6 +789,11 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" + "; Icewind Dale 2\n" + "; Note: 'Full Screen' must be enabled in Config.exe\n" + "[iwd2]\n" + "resolutions=2\n" + "\n" "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" From 2d41949f29117cc4a70c5e5a57cd5eabd91551c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Aug 2023 18:19:30 +0200 Subject: [PATCH 0576/1724] add custom resolution 1070x602 for Icewind Dale 2 widescreen patch --- inc/dd.h | 2 ++ src/config.c | 5 +++++ src/dd.c | 2 ++ 3 files changed, 9 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index fe0038f..ec198ea 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -158,6 +158,8 @@ typedef struct CNCDDRAW int resolutions; int max_resolutions; int refresh_rate; + int custom_width; + int custom_height; BOOL limit_bltfast; BOOL armadahack; BOOL tshack; diff --git a/src/config.c b/src/config.c index dc3ae64..a6f30a5 100644 --- a/src/config.c +++ b/src/config.c @@ -46,6 +46,8 @@ void cfg_load() g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); g_ddraw->refresh_rate = cfg_get_int("refresh_rate", 0); + g_ddraw->custom_width = cfg_get_int("custom_width", 0); + g_ddraw->custom_height = cfg_get_int("custom_height", 0); g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); @@ -791,8 +793,11 @@ static void cfg_create_ini() "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" + "; Note: Custom width/height is the lowest possible 16:9 res for the WS patch (600/601 height will crash)\n" "[iwd2]\n" "resolutions=2\n" + "custom_width=1070\n" + "custom_height=602\n" "\n" "; Invictus\n" "[Invictus]\n" diff --git a/src/dd.c b/src/dd.c index 64e4c5d..797c48b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -106,6 +106,8 @@ HRESULT dd_EnumDisplayModes( { rlf ? 1280 : 0, rlf ? 540 : 0 }, { rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 }, + /* Inject custom resolution */ + { g_ddraw->custom_width, g_ddraw->custom_height }, { max_w, max_h }, }; From 8943a2c207832cb7bc963102f62bbf8ebbc3ef9d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Aug 2023 19:11:20 +0200 Subject: [PATCH 0577/1724] update comments --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index a6f30a5..5896202 100644 --- a/src/config.c +++ b/src/config.c @@ -793,7 +793,7 @@ static void cfg_create_ini() "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" - "; Note: Custom width/height is the lowest possible 16:9 res for the WS patch (600/601 height will crash)\n" + "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" "[iwd2]\n" "resolutions=2\n" "custom_width=1070\n" From eb2040a3c548353f0c56574a70117fc3e0fbc04f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Aug 2023 21:27:22 +0200 Subject: [PATCH 0578/1724] log DisplayVersion and add missing RegCloseKey --- src/debug.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index fba6cfd..8ac493d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -104,11 +104,17 @@ void dbg_init() DWORD name_size = sizeof(name); RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size); + char dversion[256] = { 0 }; + DWORD dversion_size = sizeof(dversion); + RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&dversion, &dversion_size); + char build[256] = { 0 }; DWORD build_size = sizeof(build); RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - TRACE("%s (%s)\n", name, build); + TRACE("%s %s (%s)\n", name, dversion, build); + + RegCloseKey(hkey); } const char* (CDECL * wine_get_version)() = From c0f8d4a16495a5efc097d64557940dbd11d8f8db Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Aug 2023 23:14:34 +0200 Subject: [PATCH 0579/1724] log affinity mask --- src/config.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 5896202..ebf5c2f 100644 --- a/src/config.c +++ b/src/config.c @@ -115,18 +115,22 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } + DWORD system_affinity; + DWORD proc_affinity; + HANDLE proc = GetCurrentProcess(); + if (cfg_get_bool("singlecpu", TRUE)) { - SetProcessAffinityMask(GetCurrentProcess(), 1); + SetProcessAffinityMask(proc, 1); } - else + else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) { - DWORD system_affinity; - DWORD proc_affinity; - HANDLE proc = GetCurrentProcess(); + SetProcessAffinityMask(proc, system_affinity); + } - if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) - SetProcessAffinityMask(proc, system_affinity); + if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + { + TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); } /* to do: read .glslp config file instead of the shader and apply the correct settings */ From 37f55db308f78d79188cb3fc83544cf3f1fd11cd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 00:36:35 +0200 Subject: [PATCH 0580/1724] Revert "#225 don't increase ref count in EnumAttachedSurfaces" This reverts commit a33169eb6370df1587066d2f1467bef60b8a4163. --- src/ddsurface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8571cd4..c8bbcff 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -732,6 +732,7 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); + IDirectDrawSurface_AddRef(This->backbuffer); lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); } From 5d338dd57e4edf901263defb2ad7d9336bebe380 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 01:15:37 +0200 Subject: [PATCH 0581/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fb039af..2505635 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Red Alert - Command & Conquer: Tiberian Sun - Command & Conquer: Red Alert 2 + - Captain Claw - Carmageddon - Carmageddon 2 - Warcraft 2 From b62b435c37b4119ed490ca68fa16cb482b57d787 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 01:39:02 +0200 Subject: [PATCH 0582/1724] add workaround for westwood nox --- inc/dd.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index ec198ea..bfddd0a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -175,6 +175,7 @@ typedef struct CNCDDRAW RECT bnet_win_rect; POINT bnet_pos; void* last_freed_palette; /* Dungeon Keeper hack */ + void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 973b5ba..ebe71b7 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -111,8 +111,10 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->mapping) CloseHandle(This->mapping); - if (This->backbuffer) + if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface)) + { IDirectDrawSurface_Release(This->backbuffer); + } if (This->clipper) IDirectDrawClipper_Release(This->clipper); @@ -124,6 +126,9 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) DeleteCriticalSection(&This->cs); + if (g_ddraw) + g_ddraw->last_freed_surface = This; + HeapFree(GetProcessHeap(), 0, This); } From d95c29d8b64de1b40c55bb079e6db2e38c3769a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 01:40:27 +0200 Subject: [PATCH 0583/1724] Revert "Revert "#225 don't increase ref count in EnumAttachedSurfaces"" This reverts commit 37f55db308f78d79188cb3fc83544cf3f1fd11cd. --- src/ddsurface.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c8bbcff..8571cd4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -732,7 +732,6 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); - IDirectDrawSurface_AddRef(This->backbuffer); lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); } From d4b80ac48de2c58fb89cd6639227d0eee4e13bdf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 17:54:06 +0200 Subject: [PATCH 0584/1724] don't hook DirectInputCreateW --- src/hook.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index b7a06df..a0c9b3e 100644 --- a/src/hook.c +++ b/src/hook.c @@ -105,7 +105,7 @@ HOOKLIST g_hook_hooklist[] = "dinput.dll", { { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 }, - { "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, + //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 }, { "", NULL, NULL, 0 } } @@ -573,6 +573,11 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_hook_method = 3; } + + if (g_hook_method == 2) + { + //dinput_hook_init(); + } } if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) From bbd430bd1e6d1786831efc0a38995f3c94e0467c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 17:54:41 +0200 Subject: [PATCH 0585/1724] remove test code --- src/hook.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index a0c9b3e..3392066 100644 --- a/src/hook.c +++ b/src/hook.c @@ -573,11 +573,6 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_hook_method = 3; } - - if (g_hook_method == 2) - { - //dinput_hook_init(); - } } if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) From 85563ef06b08d222f375c107519e04f0d7a6f6da Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 22:15:06 +0200 Subject: [PATCH 0586/1724] fix d3d9 alt+tab and alt+enter on windows 7 --- src/utils.c | 11 +++++++++++ src/wndproc.c | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index c599efd..2282c26 100644 --- a/src/utils.c +++ b/src/utils.c @@ -371,6 +371,17 @@ void util_toggle_fullscreen() } else { + if (g_ddraw->render.thread) + { + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); + + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; + } + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } diff --git a/src/wndproc.c b/src/wndproc.c index 1e7634d..122baa5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -487,7 +487,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - + /* workaround for a bug where sometimes a background window steals the focus */ if (g_mouse_locked) { @@ -529,6 +529,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { + if (g_ddraw->renderer == d3d9_render_main) /* Needed for Windows 7 */ + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); From 5c23d2d8a508adcd61e2ac201aef0917a2189916 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 22:27:46 +0200 Subject: [PATCH 0587/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 44edfe4..6c0e8b7 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 66e86aa37c76c12b3d62ab365f85bbec2d3190ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 23:12:00 +0200 Subject: [PATCH 0588/1724] replace IsIconic with custom function --- inc/utils.h | 1 + src/dd.c | 6 +++--- src/debug.c | 2 +- src/mouse.c | 3 ++- src/utils.c | 7 +++++++ src/winapi_hooks.c | 2 +- src/wndproc.c | 4 ++-- 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 98b51fc..fdb6b7f 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +BOOL util_is_minimized(HWND hwnd); BOOL util_is_avx_supported(); void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); diff --git a/src/dd.c b/src/dd.c index 797c48b..66519e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -861,7 +861,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl x = y = 0; } - if (IsIconic(g_ddraw->hwnd)) + if (util_is_minimized(g_ddraw->hwnd)) real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; @@ -930,7 +930,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { if (g_ddraw->nonexclusive) { - if (IsIconic(g_ddraw->hwnd)) + if (util_is_minimized(g_ddraw->hwnd)) real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); real_SetWindowPos( @@ -972,7 +972,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } - if (IsIconic(g_ddraw->hwnd)) + if (util_is_minimized(g_ddraw->hwnd)) real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); real_SetWindowPos( diff --git a/src/debug.c b/src/debug.c index 8ac493d..a840939 100644 --- a/src/debug.c +++ b/src/debug.c @@ -206,7 +206,7 @@ int dbg_printf(const char* fmt, ...) void dbg_print_rect(char* info, LPRECT rect) { -#ifdef _DEBUG_X +#ifdef _DEBUG if (rect) { TRACE( diff --git a/src/mouse.c b/src/mouse.c index 1a805da..4cbed30 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -3,6 +3,7 @@ #include "winapi_hooks.h" #include "dd.h" #include "hook.h" +#include "utils.h" BOOL g_mouse_locked; @@ -14,7 +15,7 @@ void mouse_lock() if (g_ddraw->devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) return; - if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd)) + if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) { int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; diff --git a/src/utils.c b/src/utils.c index 2282c26..ec231d4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -11,6 +11,13 @@ #include "config.h" +BOOL util_is_minimized(HWND hwnd) +{ + RECT rc = { 0 }; + + return IsIconic(hwnd) || (real_GetClientRect(hwnd, &rc) && (rc.right - rc.left == 0 || rc.bottom - rc.top == 0)); +} + BOOL util_is_avx_supported() { const DWORD XMM_STATE_BIT = 1 << 1; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ea0f5cf..9925179 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -170,7 +170,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) CopyRect(&g_ddraw->mouse.rc, &dst_rc); - if (g_mouse_locked && !IsIconic(g_ddraw->hwnd)) + if (g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) { real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); diff --git a/src/wndproc.c b/src/wndproc.c index 122baa5..9b524f2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -137,7 +137,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !IsIconic(g_ddraw->hwnd)) && + if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) && g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) { @@ -531,7 +531,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->renderer == d3d9_render_main) /* Needed for Windows 7 */ real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); - + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); From 149a9d1ebe0ec2c979a478d916acbfda8ec25e38 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 20 Aug 2023 23:15:48 +0200 Subject: [PATCH 0589/1724] remove old patch --- src/wndproc.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 9b524f2..a77ffa1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -529,9 +529,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { - if (g_ddraw->renderer == d3d9_render_main) /* Needed for Windows 7 */ - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); From c7ec33a4ef727e3f640113d6ff566d3c09e3ff51 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Aug 2023 12:34:45 +0200 Subject: [PATCH 0590/1724] add "Developer settings" to ddraw.ini --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index ebf5c2f..0215716 100644 --- a/src/config.c +++ b/src/config.c @@ -395,6 +395,18 @@ static void cfg_create_ini() "\n" "\n" "\n" + "; ### Developer settings ###\n" + "; The following settings are for developers who like to share their custom preset with others\n" + "\n" + "\n" + "; Hide the 'Compatibility Settings' tab in cnc-ddraw config\n" + "hide_compat_tab=false\n" + "\n" + "; Allow the users to 'Restore default settings' via cnc-ddraw config\n" + "allow_reset=true\n" + "\n" + "\n" + "\n" "; ### Game specific settings ###\n" "; The following settings override all settings shown above, section name = executable name\n" "\n" From bb07483c582aa22290a9b17754ce75dc4a31f004 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Aug 2023 17:09:06 +0200 Subject: [PATCH 0591/1724] revert change to resolution list --- src/dd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 66519e0..532414d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -72,19 +72,18 @@ HRESULT dd_EnumDisplayModes( } BOOL rlf = g_ddraw->resolutions == RESLIST_FULL; - BOOL rlm = g_ddraw->resolutions == RESLIST_MINI; SIZE resolutions[] = { { 320, 200 }, { 320, 240 }, - { rlm ? 0 : 512, rlm ? 0 : 384 }, + { 512, 384 }, { 640, 400 }, { 640, 480 }, { 800, 600 }, { 1024, 768 }, { 1280, 1024 }, - { rlm ? 0 : 1600, rlm ? 0 : 1200 }, + { 1600, 1200 }, { 1280, 720 }, { rlf ? 1024 : 0, rlf ? 600 : 0 }, /* 4:3 */ From c636336243d5cd90fd6682542882573e1550b742 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Aug 2023 17:56:01 +0200 Subject: [PATCH 0592/1724] Revert "revert change to resolution list" This reverts commit bb07483c582aa22290a9b17754ce75dc4a31f004. --- src/dd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 532414d..66519e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -72,18 +72,19 @@ HRESULT dd_EnumDisplayModes( } BOOL rlf = g_ddraw->resolutions == RESLIST_FULL; + BOOL rlm = g_ddraw->resolutions == RESLIST_MINI; SIZE resolutions[] = { { 320, 200 }, { 320, 240 }, - { 512, 384 }, + { rlm ? 0 : 512, rlm ? 0 : 384 }, { 640, 400 }, { 640, 480 }, { 800, 600 }, { 1024, 768 }, { 1280, 1024 }, - { 1600, 1200 }, + { rlm ? 0 : 1600, rlm ? 0 : 1200 }, { 1280, 720 }, { rlf ? 1024 : 0, rlf ? 600 : 0 }, /* 4:3 */ From f349c4a9eb9d1b975ed2d3724fbfc3fdfef454c1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Aug 2023 22:32:56 +0200 Subject: [PATCH 0593/1724] always create dc for backbuffers --- src/ddsurface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8571cd4..cda7ef0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1436,7 +1436,8 @@ HRESULT dd_CreateSurface( } - if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)) + if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || + (dst_surface->caps & (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP))) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); From d2c4fc47d9f1a0950bc851e411166ceeab26b3e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 11:24:18 +0200 Subject: [PATCH 0594/1724] create dc for DDSCAPS_OFFSCREENPLAIN backbuffers as well --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index cda7ef0..e9a2eb8 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1437,7 +1437,7 @@ HRESULT dd_CreateSurface( if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->caps & (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP))) + (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height)) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); From 634ec34aacc94c27a644f5ffe983529efacb78ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 16:01:14 +0200 Subject: [PATCH 0595/1724] add partial support for Aero Snap --- src/wndproc.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index a77ffa1..82aaf42 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -49,6 +49,28 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { return DefWindowProc(hWnd, uMsg, wParam, lParam); } + case WM_GETMINMAXINFO: + { + if (g_ddraw->windowed && g_ddraw->width) + { + MINMAXINFO* mmi = (MINMAXINFO*)lParam; + + RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + + AdjustWindowRectEx( + &rc, + real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), + GetMenu(g_ddraw->hwnd) != NULL, + real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + + mmi->ptMinTrackSize.x = rc.right - rc.left; + mmi->ptMinTrackSize.y = rc.bottom - rc.top; + + return 0; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } case WM_NCACTIVATE: { if (g_ddraw->noactivateapp) @@ -377,10 +399,25 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { - if (in_size_move && !g_ddraw->render.thread) + if (in_size_move) + { + /* User resized window */ + if (!g_ddraw->render.thread) + { + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); + } + else /* Aero Snap resized window */ { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); + + if (g_config.window_rect.right != g_ddraw->render.width || + g_config.window_rect.bottom != g_ddraw->render.height) + { + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + } + } } /* else if (g_ddraw->wine) From d222992d5ad8964b9aa60f2bfdd90f22a19fec93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 16:01:31 +0200 Subject: [PATCH 0596/1724] fix for last commit --- src/wndproc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 82aaf42..bf76255 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -39,7 +39,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { - case WM_GETMINMAXINFO: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: From d0cf8c64619a5702d11fd28366c3b69096494fdc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 16:01:58 +0200 Subject: [PATCH 0597/1724] another fix for aero snap --- src/wndproc.c | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index bf76255..a7e377d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -465,31 +465,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } - case WM_NCMOUSELEAVE: - { - if (!g_ddraw->wine) /* hack: disable aero snap */ - { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - - if (!(style & WS_MAXIMIZEBOX)) - { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); - } - } - break; - } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ - { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - - if ((style & WS_MAXIMIZEBOX)) - { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); - } - } - if (wParam == SC_MAXIMIZE) { if (g_ddraw->resizable) From 9fc68ba6cad7ca6e5d68bace7dca8ebb58811391 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 16:04:50 +0200 Subject: [PATCH 0598/1724] improve logging --- src/wndproc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index a7e377d..d393ff5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -24,13 +24,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg != WM_D3D9DEVICELOST) { TRACE( - " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", + " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", dbg_mes_to_str(uMsg), uMsg, wParam, wParam, lParam, - lParam); + lParam, + (int)(short)LOWORD(lParam), + (int)(short)HIWORD(lParam)); } #endif @@ -203,6 +205,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { WINDOWPOS* pos = (WINDOWPOS*)lParam; + /* + dbg_dump_swp_flags(pos->flags); + TRACE( + " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", + pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); + */ + if (g_ddraw->wine && !g_ddraw->windowed && (pos->x > 0 || pos->y > 0) && @@ -407,9 +416,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = HIWORD(lParam); } else /* Aero Snap resized window */ - { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + { + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); if (g_config.window_rect.right != g_ddraw->render.width || g_config.window_rect.bottom != g_ddraw->render.height) From d875c33822f87f0bb19103d884a41e42b3160acd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 18:06:36 +0200 Subject: [PATCH 0599/1724] Revert "improve logging" This reverts commit 9fc68ba6cad7ca6e5d68bace7dca8ebb58811391. --- src/wndproc.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index d393ff5..a7e377d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -24,15 +24,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg != WM_D3D9DEVICELOST) { TRACE( - " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", + " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", dbg_mes_to_str(uMsg), uMsg, wParam, wParam, lParam, - lParam, - (int)(short)LOWORD(lParam), - (int)(short)HIWORD(lParam)); + lParam); } #endif @@ -205,13 +203,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { WINDOWPOS* pos = (WINDOWPOS*)lParam; - /* - dbg_dump_swp_flags(pos->flags); - TRACE( - " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", - pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); - */ - if (g_ddraw->wine && !g_ddraw->windowed && (pos->x > 0 || pos->y > 0) && @@ -416,9 +407,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = HIWORD(lParam); } else /* Aero Snap resized window */ - { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + { + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); if (g_config.window_rect.right != g_ddraw->render.width || g_config.window_rect.bottom != g_ddraw->render.height) From 7bc89de9264bc68fea3ebd21d3cbe6de54cf7ef9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 18:06:39 +0200 Subject: [PATCH 0600/1724] Revert "another fix for aero snap" This reverts commit d0cf8c64619a5702d11fd28366c3b69096494fdc. --- src/wndproc.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index a7e377d..bf76255 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -465,8 +465,31 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } + case WM_NCMOUSELEAVE: + { + if (!g_ddraw->wine) /* hack: disable aero snap */ + { + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + + if (!(style & WS_MAXIMIZEBOX)) + { + real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); + } + } + break; + } case WM_SYSCOMMAND: { + if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ + { + LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + + if ((style & WS_MAXIMIZEBOX)) + { + real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); + } + } + if (wParam == SC_MAXIMIZE) { if (g_ddraw->resizable) From 4fab846bca8028f6d2f276074b88330ba7a30156 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 18:06:45 +0200 Subject: [PATCH 0601/1724] Revert "fix for last commit" This reverts commit d222992d5ad8964b9aa60f2bfdd90f22a19fec93. --- src/wndproc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wndproc.c b/src/wndproc.c index bf76255..82aaf42 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -39,6 +39,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { + case WM_GETMINMAXINFO: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: From 23c9f19ff7549c75a911a3bc1fc49b29e9c4cab8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 18:06:49 +0200 Subject: [PATCH 0602/1724] Revert "add partial support for Aero Snap" This reverts commit 634ec34aacc94c27a644f5ffe983529efacb78ff. --- src/wndproc.c | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 82aaf42..a77ffa1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -49,28 +49,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { return DefWindowProc(hWnd, uMsg, wParam, lParam); } - case WM_GETMINMAXINFO: - { - if (g_ddraw->windowed && g_ddraw->width) - { - MINMAXINFO* mmi = (MINMAXINFO*)lParam; - - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; - - AdjustWindowRectEx( - &rc, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), - GetMenu(g_ddraw->hwnd) != NULL, - real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); - - mmi->ptMinTrackSize.x = rc.right - rc.left; - mmi->ptMinTrackSize.y = rc.bottom - rc.top; - - return 0; - } - - return DefWindowProc(hWnd, uMsg, wParam, lParam); - } case WM_NCACTIVATE: { if (g_ddraw->noactivateapp) @@ -399,25 +377,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { - if (in_size_move) - { - /* User resized window */ - if (!g_ddraw->render.thread) - { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); - } - else /* Aero Snap resized window */ + if (in_size_move && !g_ddraw->render.thread) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); - - if (g_config.window_rect.right != g_ddraw->render.width || - g_config.window_rect.bottom != g_ddraw->render.height) - { - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); - } - } } /* else if (g_ddraw->wine) From f564fa840e0c649daf5ae37286937e4dc2c8185e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 16:04:50 +0200 Subject: [PATCH 0603/1724] improve logging --- src/wndproc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index a77ffa1..64058c7 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -24,13 +24,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg != WM_D3D9DEVICELOST) { TRACE( - " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", + " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", dbg_mes_to_str(uMsg), uMsg, wParam, wParam, lParam, - lParam); + lParam, + (int)(short)LOWORD(lParam), + (int)(short)HIWORD(lParam)); } #endif @@ -182,6 +184,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { WINDOWPOS* pos = (WINDOWPOS*)lParam; + /* + dbg_dump_swp_flags(pos->flags); + TRACE( + " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", + pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); + */ + if (g_ddraw->wine && !g_ddraw->windowed && (pos->x > 0 || pos->y > 0) && From ceb3a88149340776459c7598bb917873e5204c84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 22 Aug 2023 22:38:26 +0200 Subject: [PATCH 0604/1724] fix bilinear shader --- inc/d3d9shader.h | 325 +++++++++++++++++++++++------------------------ 1 file changed, 162 insertions(+), 163 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index f453597..c97dd6f 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -134,10 +134,7 @@ const BYTE D3D9_PALETTE_SHADER[] = mov r0.y, c1.y rcp r1.x, c0.x rcp r1.y, c0.y - mul r0.zw, t0.wzyx, c0.wzyx - frc r0.zw, r0 - add r2.xy, -r0.wzyx, c1.x - mad r2.xy, r2, r1, t0 + mad r2.xy, r1, c1.x, t0 add r3.xy, r1, r2 mov r1.z, c1.y add r4.x, r1.z, r2.x @@ -145,26 +142,28 @@ const BYTE D3D9_PALETTE_SHADER[] = add r1.x, r1.x, r2.x add r1.y, r1.z, r2.y texld r3, r3, s0 - texld r2, r2, s0 texld r1, r1, s0 texld r4, r4, s0 + texld r5, r2, s0 mad r0.x, r3.x, c1.z, c1.w - mov r3.y, c1.y - mad r2.x, r2.x, c1.z, c1.w mad r1.x, r1.x, c1.z, c1.w mad r3.x, r4.x, c1.z, c1.w + mov r3.y, c1.y + mad r4.x, r5.x, c1.z, c1.w + mov r4.y, c1.y mov r1.y, c1.y - mov r2.y, c1.y - texld r4, r0, s1 + texld r0, r0, s1 texld r3, r3, s1 + texld r4, r4, s1 texld r1, r1, s1 - texld r2, r2, s1 - lrp r5, r0.w, r4, r3 - lrp r3, r0.w, r1, r2 - lrp r1, r0.z, r5, r3 + mul r2.xy, r2, c0 + frc r2.xy, r2 + lrp r5, r2.x, r0, r3 + lrp r0, r2.x, r1, r4 + lrp r1, r2.y, r5, r0 mov oC0, r1 -// approximately 32 instruction slots used (8 texture, 24 arithmetic) + // approximately 31 instruction slots used (8 texture, 23 arithmetic) // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* @@ -176,24 +175,23 @@ float4 TextureSize : register(c0); float4 bilinear(float2 coord) { float2 size = 1.0 / TextureSize.xy; - float2 f = frac(coord * TextureSize.xy); - - coord += (.5 - f) * size; - - float tli = tex2D(SurfaceTex, coord).r; - float tri = tex2D(SurfaceTex, coord + float2(size.x, 0.0) ).r; - float bli = tex2D(SurfaceTex, coord + float2(0.0, size.y)).r; - float bri = tex2D(SurfaceTex, coord + float2(size.x, size.y)).r; - + float2 pos = coord + size * 0.5; + float2 f = frac(pos / size); + + float tli = tex2D(SurfaceTex, pos).r; + float tri = tex2D(SurfaceTex, pos + float2(size.x, 0.0) ).r; + float bli = tex2D(SurfaceTex, pos + float2(0.0, size.y)).r; + float bri = tex2D(SurfaceTex, pos + float2(size.x, size.y)).r; + float4 tl = tex2D(PaletteTex, float2(tli * (255./256) + (0.5/256), 0)); float4 tr = tex2D(PaletteTex, float2(tri * (255./256) + (0.5/256), 0)); float4 bl = tex2D(PaletteTex, float2(bli * (255./256) + (0.5/256), 0)); float4 br = tex2D(PaletteTex, float2(bri * (255./256) + (0.5/256), 0)); - float4 top = lerp(tl, tr, f.x); - float4 bot = lerp(bl, br, f.x); - - return lerp(top, bot, f.y); + float4 t = lerp(tl, tr, f.x); + float4 b = lerp(bl, br, f.x); + + return lerp(t, b, f.y); } float4 main(float2 texCoords : TEXCOORD) : COLOR @@ -204,142 +202,143 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR #endif const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = -{ - 0, 2, 255, 255, 254, 255, - 56, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 179, 0, - 0, 0, 0, 2, 255, 255, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 172, 0, 0, 0, 88, 0, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 100, 0, - 0, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 2, 0, 156, 0, 0, 0, - 0, 0, 0, 0, 80, 97, - 108, 101, 116, 116, 101, 84, - 101, 120, 0, 171, 4, 0, - 12, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 127, 63, - 0, 0, 0, 59, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 2, 128, - 1, 0, 85, 160, 6, 0, - 0, 2, 1, 0, 1, 128, - 0, 0, 0, 160, 6, 0, - 0, 2, 1, 0, 2, 128, - 0, 0, 85, 160, 5, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 176, 0, 0, - 27, 160, 19, 0, 0, 2, - 0, 0, 12, 128, 0, 0, - 228, 128, 2, 0, 0, 3, - 2, 0, 3, 128, 0, 0, - 27, 129, 1, 0, 0, 160, - 4, 0, 0, 4, 2, 0, - 3, 128, 2, 0, 228, 128, - 1, 0, 228, 128, 0, 0, - 228, 176, 2, 0, 0, 3, - 3, 0, 3, 128, 1, 0, - 228, 128, 2, 0, 228, 128, - 1, 0, 0, 2, 1, 0, - 4, 128, 1, 0, 85, 160, - 2, 0, 0, 3, 4, 0, - 1, 128, 1, 0, 170, 128, - 2, 0, 0, 128, 2, 0, - 0, 3, 4, 0, 2, 128, - 1, 0, 85, 128, 2, 0, - 85, 128, 2, 0, 0, 3, - 1, 0, 1, 128, 1, 0, - 0, 128, 2, 0, 0, 128, - 2, 0, 0, 3, 1, 0, - 2, 128, 1, 0, 170, 128, - 2, 0, 85, 128, 66, 0, - 0, 3, 3, 0, 15, 128, - 3, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 2, 0, 15, 128, 2, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 4, 0, 228, 128, 0, 8, - 228, 160, 4, 0, 0, 4, - 0, 0, 1, 128, 3, 0, - 0, 128, 1, 0, 170, 160, - 1, 0, 255, 160, 1, 0, - 0, 2, 3, 0, 2, 128, - 1, 0, 85, 160, 4, 0, - 0, 4, 2, 0, 1, 128, - 2, 0, 0, 128, 1, 0, - 170, 160, 1, 0, 255, 160, - 4, 0, 0, 4, 1, 0, - 1, 128, 1, 0, 0, 128, - 1, 0, 170, 160, 1, 0, - 255, 160, 4, 0, 0, 4, - 3, 0, 1, 128, 4, 0, - 0, 128, 1, 0, 170, 160, - 1, 0, 255, 160, 1, 0, - 0, 2, 1, 0, 2, 128, - 1, 0, 85, 160, 1, 0, - 0, 2, 2, 0, 2, 128, - 1, 0, 85, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 0, 0, 228, 128, 1, 8, - 228, 160, 66, 0, 0, 3, - 3, 0, 15, 128, 3, 0, - 228, 128, 1, 8, 228, 160, - 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 1, 8, 228, 160, 66, 0, - 0, 3, 2, 0, 15, 128, - 2, 0, 228, 128, 1, 8, - 228, 160, 18, 0, 0, 4, - 5, 0, 15, 128, 0, 0, - 255, 128, 4, 0, 228, 128, - 3, 0, 228, 128, 18, 0, - 0, 4, 3, 0, 15, 128, - 0, 0, 255, 128, 1, 0, - 228, 128, 2, 0, 228, 128, - 18, 0, 0, 4, 1, 0, - 15, 128, 0, 0, 170, 128, - 5, 0, 228, 128, 3, 0, - 228, 128, 1, 0, 0, 2, - 0, 8, 15, 128, 1, 0, - 228, 128, 255, 255, 0, 0 -}; + { + 0, 2, 255, 255, 254, 255, + 56, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 179, 0, + 0, 0, 0, 2, 255, 255, + 3, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 172, 0, 0, 0, 88, 0, + 0, 0, 3, 0, 1, 0, + 1, 0, 0, 0, 100, 0, + 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 128, 0, 0, 0, 0, 0, + 0, 0, 144, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 2, 0, 156, 0, 0, 0, + 0, 0, 0, 0, 80, 97, + 108, 101, 116, 116, 101, 84, + 101, 120, 0, 171, 4, 0, + 12, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 127, 63, + 0, 0, 0, 59, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 31, 0, + 0, 2, 0, 0, 0, 144, + 1, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 2, 128, + 1, 0, 85, 160, 6, 0, + 0, 2, 1, 0, 1, 128, + 0, 0, 0, 160, 6, 0, + 0, 2, 1, 0, 2, 128, + 0, 0, 85, 160, 4, 0, + 0, 4, 2, 0, 3, 128, + 1, 0, 228, 128, 1, 0, + 0, 160, 0, 0, 228, 176, + 2, 0, 0, 3, 3, 0, + 3, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 1, 0, + 0, 2, 1, 0, 4, 128, + 1, 0, 85, 160, 2, 0, + 0, 3, 4, 0, 1, 128, + 1, 0, 170, 128, 2, 0, + 0, 128, 2, 0, 0, 3, + 4, 0, 2, 128, 1, 0, + 85, 128, 2, 0, 85, 128, + 2, 0, 0, 3, 1, 0, + 1, 128, 1, 0, 0, 128, + 2, 0, 0, 128, 2, 0, + 0, 3, 1, 0, 2, 128, + 1, 0, 170, 128, 2, 0, + 85, 128, 66, 0, 0, 3, + 3, 0, 15, 128, 3, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 1, 0, + 15, 128, 1, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 4, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 5, 0, 15, 128, 2, 0, + 228, 128, 0, 8, 228, 160, + 4, 0, 0, 4, 0, 0, + 1, 128, 3, 0, 0, 128, + 1, 0, 170, 160, 1, 0, + 255, 160, 4, 0, 0, 4, + 1, 0, 1, 128, 1, 0, + 0, 128, 1, 0, 170, 160, + 1, 0, 255, 160, 4, 0, + 0, 4, 3, 0, 1, 128, + 4, 0, 0, 128, 1, 0, + 170, 160, 1, 0, 255, 160, + 1, 0, 0, 2, 3, 0, + 2, 128, 1, 0, 85, 160, + 4, 0, 0, 4, 4, 0, + 1, 128, 5, 0, 0, 128, + 1, 0, 170, 160, 1, 0, + 255, 160, 1, 0, 0, 2, + 4, 0, 2, 128, 1, 0, + 85, 160, 1, 0, 0, 2, + 1, 0, 2, 128, 1, 0, + 85, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 128, 1, 8, 228, 160, + 66, 0, 0, 3, 3, 0, + 15, 128, 3, 0, 228, 128, + 1, 8, 228, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 4, 0, 228, 128, 1, 8, + 228, 160, 66, 0, 0, 3, + 1, 0, 15, 128, 1, 0, + 228, 128, 1, 8, 228, 160, + 5, 0, 0, 3, 2, 0, + 3, 128, 2, 0, 228, 128, + 0, 0, 228, 160, 19, 0, + 0, 2, 2, 0, 3, 128, + 2, 0, 228, 128, 18, 0, + 0, 4, 5, 0, 15, 128, + 2, 0, 0, 128, 0, 0, + 228, 128, 3, 0, 228, 128, + 18, 0, 0, 4, 0, 0, + 15, 128, 2, 0, 0, 128, + 1, 0, 228, 128, 4, 0, + 228, 128, 18, 0, 0, 4, + 1, 0, 15, 128, 2, 0, + 85, 128, 5, 0, 228, 128, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 8, 15, 128, + 1, 0, 228, 128, 255, 255, + 0, 0 + }; + + + /* catmull rom upscaling */ From b5be29f6f13224688911f19efb5eae94342b60eb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 00:23:52 +0200 Subject: [PATCH 0605/1724] Revert "fix bilinear shader" This reverts commit ceb3a88149340776459c7598bb917873e5204c84. --- inc/d3d9shader.h | 325 ++++++++++++++++++++++++----------------------- 1 file changed, 163 insertions(+), 162 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index c97dd6f..f453597 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -134,7 +134,10 @@ const BYTE D3D9_PALETTE_SHADER[] = mov r0.y, c1.y rcp r1.x, c0.x rcp r1.y, c0.y - mad r2.xy, r1, c1.x, t0 + mul r0.zw, t0.wzyx, c0.wzyx + frc r0.zw, r0 + add r2.xy, -r0.wzyx, c1.x + mad r2.xy, r2, r1, t0 add r3.xy, r1, r2 mov r1.z, c1.y add r4.x, r1.z, r2.x @@ -142,28 +145,26 @@ const BYTE D3D9_PALETTE_SHADER[] = add r1.x, r1.x, r2.x add r1.y, r1.z, r2.y texld r3, r3, s0 + texld r2, r2, s0 texld r1, r1, s0 texld r4, r4, s0 - texld r5, r2, s0 mad r0.x, r3.x, c1.z, c1.w + mov r3.y, c1.y + mad r2.x, r2.x, c1.z, c1.w mad r1.x, r1.x, c1.z, c1.w mad r3.x, r4.x, c1.z, c1.w - mov r3.y, c1.y - mad r4.x, r5.x, c1.z, c1.w - mov r4.y, c1.y mov r1.y, c1.y - texld r0, r0, s1 + mov r2.y, c1.y + texld r4, r0, s1 texld r3, r3, s1 - texld r4, r4, s1 texld r1, r1, s1 - mul r2.xy, r2, c0 - frc r2.xy, r2 - lrp r5, r2.x, r0, r3 - lrp r0, r2.x, r1, r4 - lrp r1, r2.y, r5, r0 + texld r2, r2, s1 + lrp r5, r0.w, r4, r3 + lrp r3, r0.w, r1, r2 + lrp r1, r0.z, r5, r3 mov oC0, r1 - // approximately 31 instruction slots used (8 texture, 23 arithmetic) +// approximately 32 instruction slots used (8 texture, 24 arithmetic) // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* @@ -175,23 +176,24 @@ float4 TextureSize : register(c0); float4 bilinear(float2 coord) { float2 size = 1.0 / TextureSize.xy; - float2 pos = coord + size * 0.5; - float2 f = frac(pos / size); - - float tli = tex2D(SurfaceTex, pos).r; - float tri = tex2D(SurfaceTex, pos + float2(size.x, 0.0) ).r; - float bli = tex2D(SurfaceTex, pos + float2(0.0, size.y)).r; - float bri = tex2D(SurfaceTex, pos + float2(size.x, size.y)).r; - + float2 f = frac(coord * TextureSize.xy); + + coord += (.5 - f) * size; + + float tli = tex2D(SurfaceTex, coord).r; + float tri = tex2D(SurfaceTex, coord + float2(size.x, 0.0) ).r; + float bli = tex2D(SurfaceTex, coord + float2(0.0, size.y)).r; + float bri = tex2D(SurfaceTex, coord + float2(size.x, size.y)).r; + float4 tl = tex2D(PaletteTex, float2(tli * (255./256) + (0.5/256), 0)); float4 tr = tex2D(PaletteTex, float2(tri * (255./256) + (0.5/256), 0)); float4 bl = tex2D(PaletteTex, float2(bli * (255./256) + (0.5/256), 0)); float4 br = tex2D(PaletteTex, float2(bri * (255./256) + (0.5/256), 0)); - float4 t = lerp(tl, tr, f.x); - float4 b = lerp(bl, br, f.x); - - return lerp(t, b, f.y); + float4 top = lerp(tl, tr, f.x); + float4 bot = lerp(bl, br, f.x); + + return lerp(top, bot, f.y); } float4 main(float2 texCoords : TEXCOORD) : COLOR @@ -202,143 +204,142 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR #endif const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = - { - 0, 2, 255, 255, 254, 255, - 56, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 179, 0, - 0, 0, 0, 2, 255, 255, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 172, 0, 0, 0, 88, 0, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 100, 0, - 0, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 2, 0, 156, 0, 0, 0, - 0, 0, 0, 0, 80, 97, - 108, 101, 116, 116, 101, 84, - 101, 120, 0, 171, 4, 0, - 12, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 127, 63, - 0, 0, 0, 59, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 2, 128, - 1, 0, 85, 160, 6, 0, - 0, 2, 1, 0, 1, 128, - 0, 0, 0, 160, 6, 0, - 0, 2, 1, 0, 2, 128, - 0, 0, 85, 160, 4, 0, - 0, 4, 2, 0, 3, 128, - 1, 0, 228, 128, 1, 0, - 0, 160, 0, 0, 228, 176, - 2, 0, 0, 3, 3, 0, - 3, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 1, 0, - 0, 2, 1, 0, 4, 128, - 1, 0, 85, 160, 2, 0, - 0, 3, 4, 0, 1, 128, - 1, 0, 170, 128, 2, 0, - 0, 128, 2, 0, 0, 3, - 4, 0, 2, 128, 1, 0, - 85, 128, 2, 0, 85, 128, - 2, 0, 0, 3, 1, 0, - 1, 128, 1, 0, 0, 128, - 2, 0, 0, 128, 2, 0, - 0, 3, 1, 0, 2, 128, - 1, 0, 170, 128, 2, 0, - 85, 128, 66, 0, 0, 3, - 3, 0, 15, 128, 3, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 4, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 5, 0, 15, 128, 2, 0, - 228, 128, 0, 8, 228, 160, - 4, 0, 0, 4, 0, 0, - 1, 128, 3, 0, 0, 128, - 1, 0, 170, 160, 1, 0, - 255, 160, 4, 0, 0, 4, - 1, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 170, 160, - 1, 0, 255, 160, 4, 0, - 0, 4, 3, 0, 1, 128, - 4, 0, 0, 128, 1, 0, - 170, 160, 1, 0, 255, 160, - 1, 0, 0, 2, 3, 0, - 2, 128, 1, 0, 85, 160, - 4, 0, 0, 4, 4, 0, - 1, 128, 5, 0, 0, 128, - 1, 0, 170, 160, 1, 0, - 255, 160, 1, 0, 0, 2, - 4, 0, 2, 128, 1, 0, - 85, 160, 1, 0, 0, 2, - 1, 0, 2, 128, 1, 0, - 85, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 1, 8, 228, 160, - 66, 0, 0, 3, 3, 0, - 15, 128, 3, 0, 228, 128, - 1, 8, 228, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 4, 0, 228, 128, 1, 8, - 228, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 1, 8, 228, 160, - 5, 0, 0, 3, 2, 0, - 3, 128, 2, 0, 228, 128, - 0, 0, 228, 160, 19, 0, - 0, 2, 2, 0, 3, 128, - 2, 0, 228, 128, 18, 0, - 0, 4, 5, 0, 15, 128, - 2, 0, 0, 128, 0, 0, - 228, 128, 3, 0, 228, 128, - 18, 0, 0, 4, 0, 0, - 15, 128, 2, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 228, 128, 18, 0, 0, 4, - 1, 0, 15, 128, 2, 0, - 85, 128, 5, 0, 228, 128, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, - 1, 0, 228, 128, 255, 255, - 0, 0 - }; - - - +{ + 0, 2, 255, 255, 254, 255, + 56, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 179, 0, + 0, 0, 0, 2, 255, 255, + 3, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 172, 0, 0, 0, 88, 0, + 0, 0, 3, 0, 1, 0, + 1, 0, 0, 0, 100, 0, + 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 128, 0, 0, 0, 0, 0, + 0, 0, 144, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 2, 0, 156, 0, 0, 0, + 0, 0, 0, 0, 80, 97, + 108, 101, 116, 116, 101, 84, + 101, 120, 0, 171, 4, 0, + 12, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 127, 63, + 0, 0, 0, 59, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 31, 0, + 0, 2, 0, 0, 0, 144, + 1, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 2, 128, + 1, 0, 85, 160, 6, 0, + 0, 2, 1, 0, 1, 128, + 0, 0, 0, 160, 6, 0, + 0, 2, 1, 0, 2, 128, + 0, 0, 85, 160, 5, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 176, 0, 0, + 27, 160, 19, 0, 0, 2, + 0, 0, 12, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 2, 0, 3, 128, 0, 0, + 27, 129, 1, 0, 0, 160, + 4, 0, 0, 4, 2, 0, + 3, 128, 2, 0, 228, 128, + 1, 0, 228, 128, 0, 0, + 228, 176, 2, 0, 0, 3, + 3, 0, 3, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 1, 0, 0, 2, 1, 0, + 4, 128, 1, 0, 85, 160, + 2, 0, 0, 3, 4, 0, + 1, 128, 1, 0, 170, 128, + 2, 0, 0, 128, 2, 0, + 0, 3, 4, 0, 2, 128, + 1, 0, 85, 128, 2, 0, + 85, 128, 2, 0, 0, 3, + 1, 0, 1, 128, 1, 0, + 0, 128, 2, 0, 0, 128, + 2, 0, 0, 3, 1, 0, + 2, 128, 1, 0, 170, 128, + 2, 0, 85, 128, 66, 0, + 0, 3, 3, 0, 15, 128, + 3, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 2, 0, 15, 128, 2, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 1, 0, + 15, 128, 1, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 4, 0, 228, 128, 0, 8, + 228, 160, 4, 0, 0, 4, + 0, 0, 1, 128, 3, 0, + 0, 128, 1, 0, 170, 160, + 1, 0, 255, 160, 1, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 160, 4, 0, + 0, 4, 2, 0, 1, 128, + 2, 0, 0, 128, 1, 0, + 170, 160, 1, 0, 255, 160, + 4, 0, 0, 4, 1, 0, + 1, 128, 1, 0, 0, 128, + 1, 0, 170, 160, 1, 0, + 255, 160, 4, 0, 0, 4, + 3, 0, 1, 128, 4, 0, + 0, 128, 1, 0, 170, 160, + 1, 0, 255, 160, 1, 0, + 0, 2, 1, 0, 2, 128, + 1, 0, 85, 160, 1, 0, + 0, 2, 2, 0, 2, 128, + 1, 0, 85, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 0, 0, 228, 128, 1, 8, + 228, 160, 66, 0, 0, 3, + 3, 0, 15, 128, 3, 0, + 228, 128, 1, 8, 228, 160, + 66, 0, 0, 3, 1, 0, + 15, 128, 1, 0, 228, 128, + 1, 8, 228, 160, 66, 0, + 0, 3, 2, 0, 15, 128, + 2, 0, 228, 128, 1, 8, + 228, 160, 18, 0, 0, 4, + 5, 0, 15, 128, 0, 0, + 255, 128, 4, 0, 228, 128, + 3, 0, 228, 128, 18, 0, + 0, 4, 3, 0, 15, 128, + 0, 0, 255, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 18, 0, 0, 4, 1, 0, + 15, 128, 0, 0, 170, 128, + 5, 0, 228, 128, 3, 0, + 228, 128, 1, 0, 0, 2, + 0, 8, 15, 128, 1, 0, + 228, 128, 255, 255, 0, 0 +}; /* catmull rom upscaling */ From afb3d2dea3b92b8881a3bc48799168d27d15b973 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 01:59:51 +0200 Subject: [PATCH 0606/1724] fix bilinear shader (for real this time!) --- inc/d3d9shader.h | 399 +++++++++++++++++++++++++---------------------- 1 file changed, 216 insertions(+), 183 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index f453597..5aa0349 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -127,44 +127,48 @@ const BYTE D3D9_PALETTE_SHADER[] = // ps_2_0 - def c1, 0.5, 0, 0.99609375, 0.001953125 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - mov r0.y, c1.y - rcp r1.x, c0.x - rcp r1.y, c0.y - mul r0.zw, t0.wzyx, c0.wzyx - frc r0.zw, r0 - add r2.xy, -r0.wzyx, c1.x - mad r2.xy, r2, r1, t0 - add r3.xy, r1, r2 - mov r1.z, c1.y - add r4.x, r1.z, r2.x - add r4.y, r1.y, r2.y - add r1.x, r1.x, r2.x - add r1.y, r1.z, r2.y - texld r3, r3, s0 - texld r2, r2, s0 - texld r1, r1, s0 - texld r4, r4, s0 - mad r0.x, r3.x, c1.z, c1.w - mov r3.y, c1.y - mad r2.x, r2.x, c1.z, c1.w - mad r1.x, r1.x, c1.z, c1.w - mad r3.x, r4.x, c1.z, c1.w - mov r1.y, c1.y - mov r2.y, c1.y - texld r4, r0, s1 - texld r3, r3, s1 - texld r1, r1, s1 - texld r2, r2, s1 - lrp r5, r0.w, r4, r3 - lrp r3, r0.w, r1, r2 - lrp r1, r0.z, r5, r3 - mov oC0, r1 + def c1, -0.5, 0.5, 1.5, 0 + def c2, 0.99609375, 0.001953125, 0, 0 + dcl t0.xy + dcl_2d s0 + dcl_2d s1 + mov r0.w, c1.x + mad r0.xy, t0, c0, r0.w + frc r0.zw, r0.wzyx + add r0.xy, -r0.wzyx, r0 + add r0.zw, r0.wzyx, c1.z + add r0.xy, r0, c1.y + rcp r1.x, c0.x + rcp r1.y, c0.y + mul r2.xy, r0.wzyx, r1 + mul r1.xy, r0, r1 + mad r0.xy, t0, c0, -r0 + mov r3.x, r2.x + mov r3.y, r1.y + mov r4.x, r1.x + mov r4.y, r2.y + texld r3, r3, s0 + texld r1, r1, s0 + texld r2, r2, s0 + texld r4, r4, s0 + mad r3.x, r3.x, c2.x, c2.y + mov r3.y, c1.w + mad r1.x, r1.x, c2.x, c2.y + mov r1.y, c1.w + mad r2.x, r2.x, c2.x, c2.y + mad r4.x, r4.x, c2.x, c2.y + mov r4.y, c1.w + mov r2.y, c1.w + texld r3, r3, s1 + texld r1, r1, s1 + texld r4, r4, s1 + texld r2, r2, s1 + lrp r5, r0.x, r3, r1 + lrp r1, r0.x, r2, r4 + lrp r2, r0.y, r1, r5 + mov oC0, r2 -// approximately 32 instruction slots used (8 texture, 24 arithmetic) + // approximately 35 instruction slots used (8 texture, 27 arithmetic) // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* @@ -173,18 +177,24 @@ uniform sampler2D PaletteTex; float4 TextureSize : register(c0); +#define SourceSize float4(TextureSize.xy, 1.0 / TextureSize.xy) + float4 bilinear(float2 coord) { - float2 size = 1.0 / TextureSize.xy; - float2 f = frac(coord * TextureSize.xy); - - coord += (.5 - f) * size; - - float tli = tex2D(SurfaceTex, coord).r; - float tri = tex2D(SurfaceTex, coord + float2(size.x, 0.0) ).r; - float bli = tex2D(SurfaceTex, coord + float2(0.0, size.y)).r; - float bri = tex2D(SurfaceTex, coord + float2(size.x, size.y)).r; - + float2 samplePos = coord * SourceSize.xy; + float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; + float2 texPos2 = texPos1 + 1.0f; + + float2 f = samplePos - texPos1; + + texPos1 *= SourceSize.zw; + texPos2 *= SourceSize.zw; + + float tli = tex2D(SurfaceTex, float2(texPos1.x, texPos1.y)).r; + float tri = tex2D(SurfaceTex, float2(texPos2.x, texPos1.y)).r; + float bli = tex2D(SurfaceTex, float2(texPos1.x, texPos2.y)).r; + float bri = tex2D(SurfaceTex, float2(texPos2.x, texPos2.y)).r; + float4 tl = tex2D(PaletteTex, float2(tli * (255./256) + (0.5/256), 0)); float4 tr = tex2D(PaletteTex, float2(tri * (255./256) + (0.5/256), 0)); float4 bl = tex2D(PaletteTex, float2(bli * (255./256) + (0.5/256), 0)); @@ -192,7 +202,7 @@ float4 bilinear(float2 coord) float4 top = lerp(tl, tr, f.x); float4 bot = lerp(bl, br, f.x); - + return lerp(top, bot, f.y); } @@ -204,142 +214,165 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR #endif const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = -{ - 0, 2, 255, 255, 254, 255, - 56, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 179, 0, - 0, 0, 0, 2, 255, 255, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 172, 0, 0, 0, 88, 0, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 100, 0, - 0, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 2, 0, 156, 0, 0, 0, - 0, 0, 0, 0, 80, 97, - 108, 101, 116, 116, 101, 84, - 101, 120, 0, 171, 4, 0, - 12, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 127, 63, - 0, 0, 0, 59, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 2, 128, - 1, 0, 85, 160, 6, 0, - 0, 2, 1, 0, 1, 128, - 0, 0, 0, 160, 6, 0, - 0, 2, 1, 0, 2, 128, - 0, 0, 85, 160, 5, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 176, 0, 0, - 27, 160, 19, 0, 0, 2, - 0, 0, 12, 128, 0, 0, - 228, 128, 2, 0, 0, 3, - 2, 0, 3, 128, 0, 0, - 27, 129, 1, 0, 0, 160, - 4, 0, 0, 4, 2, 0, - 3, 128, 2, 0, 228, 128, - 1, 0, 228, 128, 0, 0, - 228, 176, 2, 0, 0, 3, - 3, 0, 3, 128, 1, 0, - 228, 128, 2, 0, 228, 128, - 1, 0, 0, 2, 1, 0, - 4, 128, 1, 0, 85, 160, - 2, 0, 0, 3, 4, 0, - 1, 128, 1, 0, 170, 128, - 2, 0, 0, 128, 2, 0, - 0, 3, 4, 0, 2, 128, - 1, 0, 85, 128, 2, 0, - 85, 128, 2, 0, 0, 3, - 1, 0, 1, 128, 1, 0, - 0, 128, 2, 0, 0, 128, - 2, 0, 0, 3, 1, 0, - 2, 128, 1, 0, 170, 128, - 2, 0, 85, 128, 66, 0, - 0, 3, 3, 0, 15, 128, - 3, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 2, 0, 15, 128, 2, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 4, 0, 228, 128, 0, 8, - 228, 160, 4, 0, 0, 4, - 0, 0, 1, 128, 3, 0, - 0, 128, 1, 0, 170, 160, - 1, 0, 255, 160, 1, 0, - 0, 2, 3, 0, 2, 128, - 1, 0, 85, 160, 4, 0, - 0, 4, 2, 0, 1, 128, - 2, 0, 0, 128, 1, 0, - 170, 160, 1, 0, 255, 160, - 4, 0, 0, 4, 1, 0, - 1, 128, 1, 0, 0, 128, - 1, 0, 170, 160, 1, 0, - 255, 160, 4, 0, 0, 4, - 3, 0, 1, 128, 4, 0, - 0, 128, 1, 0, 170, 160, - 1, 0, 255, 160, 1, 0, - 0, 2, 1, 0, 2, 128, - 1, 0, 85, 160, 1, 0, - 0, 2, 2, 0, 2, 128, - 1, 0, 85, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 0, 0, 228, 128, 1, 8, - 228, 160, 66, 0, 0, 3, - 3, 0, 15, 128, 3, 0, - 228, 128, 1, 8, 228, 160, - 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 1, 8, 228, 160, 66, 0, - 0, 3, 2, 0, 15, 128, - 2, 0, 228, 128, 1, 8, - 228, 160, 18, 0, 0, 4, - 5, 0, 15, 128, 0, 0, - 255, 128, 4, 0, 228, 128, - 3, 0, 228, 128, 18, 0, - 0, 4, 3, 0, 15, 128, - 0, 0, 255, 128, 1, 0, - 228, 128, 2, 0, 228, 128, - 18, 0, 0, 4, 1, 0, - 15, 128, 0, 0, 170, 128, - 5, 0, 228, 128, 3, 0, - 228, 128, 1, 0, 0, 2, - 0, 8, 15, 128, 1, 0, + { + 0, 2, 255, 255, 254, 255, + 56, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 179, 0, + 0, 0, 0, 2, 255, 255, + 3, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 172, 0, 0, 0, 88, 0, + 0, 0, 3, 0, 1, 0, + 1, 0, 0, 0, 100, 0, + 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 128, 0, 0, 0, 0, 0, + 0, 0, 144, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 2, 0, 156, 0, 0, 0, + 0, 0, 0, 0, 80, 97, + 108, 101, 116, 116, 101, 84, + 101, 120, 0, 171, 4, 0, + 12, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 191, 0, 0, + 0, 63, 0, 0, 192, 63, + 0, 0, 0, 0, 81, 0, + 0, 5, 2, 0, 15, 160, + 0, 0, 127, 63, 0, 0, + 0, 59, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 31, 0, + 0, 2, 0, 0, 0, 144, + 1, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 8, 128, + 1, 0, 0, 160, 4, 0, + 0, 4, 0, 0, 3, 128, + 0, 0, 228, 176, 0, 0, + 228, 160, 0, 0, 255, 128, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 27, 128, + 2, 0, 0, 3, 0, 0, + 3, 128, 0, 0, 27, 129, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 128, 1, 0, + 170, 160, 2, 0, 0, 3, + 0, 0, 3, 128, 0, 0, + 228, 128, 1, 0, 85, 160, + 6, 0, 0, 2, 1, 0, + 1, 128, 0, 0, 0, 160, + 6, 0, 0, 2, 1, 0, + 2, 128, 0, 0, 85, 160, + 5, 0, 0, 3, 2, 0, + 3, 128, 0, 0, 27, 128, + 1, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 3, 128, + 0, 0, 228, 128, 1, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 3, 128, 0, 0, + 228, 176, 0, 0, 228, 160, + 0, 0, 228, 129, 1, 0, + 0, 2, 3, 0, 1, 128, + 2, 0, 0, 128, 1, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 128, 1, 0, + 0, 2, 4, 0, 1, 128, + 1, 0, 0, 128, 1, 0, + 0, 2, 4, 0, 2, 128, + 2, 0, 85, 128, 66, 0, + 0, 3, 3, 0, 15, 128, + 3, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 1, 0, 15, 128, 1, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 2, 0, + 15, 128, 2, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 4, 0, 228, 128, 0, 8, + 228, 160, 4, 0, 0, 4, + 3, 0, 1, 128, 3, 0, + 0, 128, 2, 0, 0, 160, + 2, 0, 85, 160, 1, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 255, 160, 4, 0, + 0, 4, 1, 0, 1, 128, + 1, 0, 0, 128, 2, 0, + 0, 160, 2, 0, 85, 160, + 1, 0, 0, 2, 1, 0, + 2, 128, 1, 0, 255, 160, + 4, 0, 0, 4, 2, 0, + 1, 128, 2, 0, 0, 128, + 2, 0, 0, 160, 2, 0, + 85, 160, 4, 0, 0, 4, + 4, 0, 1, 128, 4, 0, + 0, 128, 2, 0, 0, 160, + 2, 0, 85, 160, 1, 0, + 0, 2, 4, 0, 2, 128, + 1, 0, 255, 160, 1, 0, + 0, 2, 2, 0, 2, 128, + 1, 0, 255, 160, 66, 0, + 0, 3, 3, 0, 15, 128, + 3, 0, 228, 128, 1, 8, + 228, 160, 66, 0, 0, 3, + 1, 0, 15, 128, 1, 0, + 228, 128, 1, 8, 228, 160, + 66, 0, 0, 3, 4, 0, + 15, 128, 4, 0, 228, 128, + 1, 8, 228, 160, 66, 0, + 0, 3, 2, 0, 15, 128, + 2, 0, 228, 128, 1, 8, + 228, 160, 18, 0, 0, 4, + 5, 0, 15, 128, 0, 0, + 0, 128, 3, 0, 228, 128, + 1, 0, 228, 128, 18, 0, + 0, 4, 1, 0, 15, 128, + 0, 0, 0, 128, 2, 0, + 228, 128, 4, 0, 228, 128, + 18, 0, 0, 4, 2, 0, + 15, 128, 0, 0, 85, 128, + 1, 0, 228, 128, 5, 0, + 228, 128, 1, 0, 0, 2, + 0, 8, 15, 128, 2, 0, 228, 128, 255, 255, 0, 0 -}; + }; + + + + + + + + + + + + + /* catmull rom upscaling */ From 8e138829cd40a3ce5cbe78e443a50b1dc6b2ec61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 02:01:21 +0200 Subject: [PATCH 0607/1724] align --- inc/d3d9shader.h | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 5aa0349..9cc1a13 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -168,7 +168,7 @@ const BYTE D3D9_PALETTE_SHADER[] = lrp r2, r0.y, r1, r5 mov oC0, r2 - // approximately 35 instruction slots used (8 texture, 27 arithmetic) +// approximately 35 instruction slots used (8 texture, 27 arithmetic) // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* @@ -362,19 +362,6 @@ const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = }; - - - - - - - - - - - - - /* catmull rom upscaling */ #if 0 From 2a5bd91629c3a360c3f4bbd01efaccaa61f74e95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 02:08:24 +0200 Subject: [PATCH 0608/1724] align --- inc/d3d9shader.h | 80 ++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 9cc1a13..31002fa 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -127,46 +127,46 @@ const BYTE D3D9_PALETTE_SHADER[] = // ps_2_0 - def c1, -0.5, 0.5, 1.5, 0 - def c2, 0.99609375, 0.001953125, 0, 0 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - mov r0.w, c1.x - mad r0.xy, t0, c0, r0.w - frc r0.zw, r0.wzyx - add r0.xy, -r0.wzyx, r0 - add r0.zw, r0.wzyx, c1.z - add r0.xy, r0, c1.y - rcp r1.x, c0.x - rcp r1.y, c0.y - mul r2.xy, r0.wzyx, r1 - mul r1.xy, r0, r1 - mad r0.xy, t0, c0, -r0 - mov r3.x, r2.x - mov r3.y, r1.y - mov r4.x, r1.x - mov r4.y, r2.y - texld r3, r3, s0 - texld r1, r1, s0 - texld r2, r2, s0 - texld r4, r4, s0 - mad r3.x, r3.x, c2.x, c2.y - mov r3.y, c1.w - mad r1.x, r1.x, c2.x, c2.y - mov r1.y, c1.w - mad r2.x, r2.x, c2.x, c2.y - mad r4.x, r4.x, c2.x, c2.y - mov r4.y, c1.w - mov r2.y, c1.w - texld r3, r3, s1 - texld r1, r1, s1 - texld r4, r4, s1 - texld r2, r2, s1 - lrp r5, r0.x, r3, r1 - lrp r1, r0.x, r2, r4 - lrp r2, r0.y, r1, r5 - mov oC0, r2 + def c1, -0.5, 0.5, 1.5, 0 + def c2, 0.99609375, 0.001953125, 0, 0 + dcl t0.xy + dcl_2d s0 + dcl_2d s1 + mov r0.w, c1.x + mad r0.xy, t0, c0, r0.w + frc r0.zw, r0.wzyx + add r0.xy, -r0.wzyx, r0 + add r0.zw, r0.wzyx, c1.z + add r0.xy, r0, c1.y + rcp r1.x, c0.x + rcp r1.y, c0.y + mul r2.xy, r0.wzyx, r1 + mul r1.xy, r0, r1 + mad r0.xy, t0, c0, -r0 + mov r3.x, r2.x + mov r3.y, r1.y + mov r4.x, r1.x + mov r4.y, r2.y + texld r3, r3, s0 + texld r1, r1, s0 + texld r2, r2, s0 + texld r4, r4, s0 + mad r3.x, r3.x, c2.x, c2.y + mov r3.y, c1.w + mad r1.x, r1.x, c2.x, c2.y + mov r1.y, c1.w + mad r2.x, r2.x, c2.x, c2.y + mad r4.x, r4.x, c2.x, c2.y + mov r4.y, c1.w + mov r2.y, c1.w + texld r3, r3, s1 + texld r1, r1, s1 + texld r4, r4, s1 + texld r2, r2, s1 + lrp r5, r0.x, r3, r1 + lrp r1, r0.x, r2, r4 + lrp r2, r0.y, r1, r5 + mov oC0, r2 // approximately 35 instruction slots used (8 texture, 27 arithmetic) From e2ed1930c3e974c4ab556c0c672f75504adb118d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 16:44:14 +0200 Subject: [PATCH 0609/1724] add d3d9 lanczos2 shader --- inc/d3d9shader.h | 1241 ++++++++++++++++++++++++++++++++++++++------- inc/dd.h | 1 + src/config.c | 2 +- src/render_d3d9.c | 40 +- 4 files changed, 1094 insertions(+), 190 deletions(-) diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 31002fa..130d33f 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -2,36 +2,6 @@ #define D3D9SHADER_H #if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// Parameters: -// -// sampler2D PaletteTex; -// sampler2D SurfaceTex; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// SurfaceTex s0 1 -// PaletteTex s1 1 -// - - ps_2_0 - def c0, 0.99609375, 0.001953125, 0, 0 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - texld r0, t0, s0 - mad r0.x, r0.x, c0.x, c0.y - mov r0.y, c0.z - texld r0, r0, s1 - mov oC0, r0 - -// approximately 5 instruction slots used (2 texture, 3 arithmetic) - // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* uniform sampler2D SurfaceTex; @@ -107,69 +77,6 @@ const BYTE D3D9_PALETTE_SHADER[] = /* bilinear upscaling */ #if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// Parameters: -// -// sampler2D PaletteTex; -// sampler2D SurfaceTex; -// float4 TextureSize; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// TextureSize c0 1 -// SurfaceTex s0 1 -// PaletteTex s1 1 -// - - ps_2_0 - def c1, -0.5, 0.5, 1.5, 0 - def c2, 0.99609375, 0.001953125, 0, 0 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - mov r0.w, c1.x - mad r0.xy, t0, c0, r0.w - frc r0.zw, r0.wzyx - add r0.xy, -r0.wzyx, r0 - add r0.zw, r0.wzyx, c1.z - add r0.xy, r0, c1.y - rcp r1.x, c0.x - rcp r1.y, c0.y - mul r2.xy, r0.wzyx, r1 - mul r1.xy, r0, r1 - mad r0.xy, t0, c0, -r0 - mov r3.x, r2.x - mov r3.y, r1.y - mov r4.x, r1.x - mov r4.y, r2.y - texld r3, r3, s0 - texld r1, r1, s0 - texld r2, r2, s0 - texld r4, r4, s0 - mad r3.x, r3.x, c2.x, c2.y - mov r3.y, c1.w - mad r1.x, r1.x, c2.x, c2.y - mov r1.y, c1.w - mad r2.x, r2.x, c2.x, c2.y - mad r4.x, r4.x, c2.x, c2.y - mov r4.y, c1.w - mov r2.y, c1.w - texld r3, r3, s1 - texld r1, r1, s1 - texld r4, r4, s1 - texld r2, r2, s1 - lrp r5, r0.x, r3, r1 - lrp r1, r0.x, r2, r4 - lrp r2, r0.y, r1, r5 - mov oC0, r2 - -// approximately 35 instruction slots used (8 texture, 27 arithmetic) - // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* uniform sampler2D SurfaceTex; @@ -365,91 +272,15 @@ const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = /* catmull rom upscaling */ #if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 10.1 -// -// Parameters: -// -// sampler2D SurfaceTex; -// float4 TextureSize; -// -// -// Registers: -// -// Name Reg Size -// ------------ ----- ---- -// TextureSize c0 1 -// SurfaceTex s0 1 -// - - ps_2_0 - def c1, -0.5, 0.5, 1, 2.5 - def c2, 1.5, -2.5, 2, 0 - dcl t0.xy - dcl_2d s0 - mov r0.w, c1.x - mad r0.xy, t0, c0, r0.w - frc r0.zw, r0.wzyx - add r0.xy, -r0.wzyx, r0 - add r0.zw, r0.wzyx, c1.x - rcp r1.x, c0.x - rcp r1.y, c0.y - mul r2.xy, r0.wzyx, r1 - mov r3.x, r2.x - add r0.zw, r0.wzyx, c1.y - add r0.xy, r0, c1.w - mul r0.xy, r1, r0 - mad r1.zw, t0.wzyx, c0.wzyx, -r0 - mad r2.zw, r1, -c2.x, c2.z - mad r2.zw, r1, r2, c1.y - mul r3.zw, r1, r2 - mad r4.xy, r1.wzyx, c2.x, c2.y - mul r4.zw, r1, r1 - mad r4.xy, r4.wzyx, r4, c1.z - mad r2.zw, r1, r2, r4.wzyx - rcp r4.x, r2.w - rcp r4.y, r2.z - mad r0.zw, r3, r4.wzyx, r0 - mul r1.xy, r1, r0.wzyx - mov r3.y, r1.y - mov r4.y, r3.y - mov r2.x, r1.x - mov r5.x, r2.x - mov r4.x, r0.x - mov r5.y, r0.y - texld r0, r3, s0 - texld r3, r1, s0 - texld r6, r2, s0 - texld r5, r5, s0 - texld r7, r4, s0 - mad r1.xy, r1.wzyx, -c1.y, c1.z - mad r1.xy, r1.wzyx, r1, c1.x - mul r1.xy, r1, r1.wzyx - mad r1.zw, r1, c1.y, c1.x - mul r1.zw, r1, r4 - mul r0.w, r2.z, r1.x - mul r0.xyz, r0.w, r0 - mad r0.w, r2.w, r1.y, r0.w - mul r3.w, r1.y, r2.w - mad r0.w, r2.w, r2.z, r0.w - mad r0.w, r1.w, r2.z, r0.w - mad r0.w, r2.w, r1.z, r0.w - rcp r0.w, r0.w - mad r0.xyz, r6, r3.w, r0 - mul r3.w, r2.z, r2.w - mad r0.xyz, r3, r3.w, r0 - mul r5.w, r2.z, r1.w - mul r7.w, r1.z, r2.w - mad r0.xyz, r7, r5.w, r0 - mad r0.xyz, r5, r7.w, r0 - mul r0.xyz, r0.w, r0 - mov r0.w, c1.z - mov oC0, r0 - -// approximately 58 instruction slots used (5 texture, 53 arithmetic) - // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* +// The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae +// Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 +// Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. +// See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details + +// Modified to use 5 texture fetches + uniform sampler2D SurfaceTex; float4 TextureSize : register(c0); @@ -458,13 +289,6 @@ float4 TextureSize : register(c0); float4 catmull_rom(float2 coord) { - // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae - - // Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. - // See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details - - // Modified to use 5 texture fetches - float2 samplePos = coord * SourceSize.xy; float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; @@ -716,5 +540,1056 @@ const BYTE D3D9_CATMULL_ROM_SHADER[] = }; +/* lanczos2 upscaling */ + +#if 0 +// fxc.exe /Tps_3_0 shader.hlsl /Fhshader.h +/* +// The following code is licensed under the MIT license: +// Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader +// Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com +// Ported from: https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl + +uniform sampler2D SurfaceTex; + +float4 TextureSize : register(c0); + +#define JINC2_WINDOW_SINC 0.5 +#define JINC2_SINC 1.0 +#define JINC2_AR_STRENGTH 0.8 + +static const float pi = 3.1415926535897932384626433832795; +static const float wa = JINC2_WINDOW_SINC*pi; +static const float wb = JINC2_SINC*pi; + +// Calculates the distance between two points +float d(float2 pt1, float2 pt2) +{ + float2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +float3 min4(float3 a, float3 b, float3 c, float3 d) +{ + return min(a, min(b, min(c, d))); +} + +float3 max4(float3 a, float3 b, float3 c, float3 d) +{ + return max(a, max(b, max(c, d))); +} + +float4 resampler(float4 x) +{ + float4 res; + + res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x); + res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y); + res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z); + res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w); + + return res; +} + +float4 lanczos2(float2 coord) +{ + float3 color; + float4 weights[4]; + + float2 dx = float2(1.0, 0.0); + float2 dy = float2(0.0, 1.0); + + float2 pc = coord*TextureSize.xy; + + float2 tc = (floor(pc-float2(0.5,0.5))+float2(0.5,0.5)); + + weights[0] = resampler(float4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(float4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(float4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(float4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + dx = dx/TextureSize.xy; + dy = dy/TextureSize.xy; + tc = tc/TextureSize.xy; + + float3 c00 = tex2D(SurfaceTex, tc -dx -dy).xyz; + float3 c10 = tex2D(SurfaceTex, tc -dy).xyz; + float3 c20 = tex2D(SurfaceTex, tc +dx -dy).xyz; + float3 c30 = tex2D(SurfaceTex, tc+2.0*dx -dy).xyz; + float3 c01 = tex2D(SurfaceTex, tc -dx ).xyz; + float3 c11 = tex2D(SurfaceTex, tc ).xyz; + float3 c21 = tex2D(SurfaceTex, tc +dx ).xyz; + float3 c31 = tex2D(SurfaceTex, tc+2.0*dx ).xyz; + float3 c02 = tex2D(SurfaceTex, tc -dx +dy).xyz; + float3 c12 = tex2D(SurfaceTex, tc +dy).xyz; + float3 c22 = tex2D(SurfaceTex, tc +dx +dy).xyz; + float3 c32 = tex2D(SurfaceTex, tc+2.0*dx +dy).xyz; + float3 c03 = tex2D(SurfaceTex, tc -dx+2.0*dy).xyz; + float3 c13 = tex2D(SurfaceTex, tc +2.0*dy).xyz; + float3 c23 = tex2D(SurfaceTex, tc +dx+2.0*dy).xyz; + float3 c33 = tex2D(SurfaceTex, tc+2.0*dx+2.0*dy).xyz; + + color = tex2D(SurfaceTex, coord).xyz; + + // Get min/max samples + float3 min_sample = min4(c11, c21, c12, c22); + float3 max_sample = max4(c11, c21, c12, c22); + + color = float3(dot(weights[0], float4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], float4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], float4(c00.z, c10.z, c20.z, c30.z))); + color+= float3(dot(weights[1], float4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], float4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], float4(c01.z, c11.z, c21.z, c31.z))); + color+= float3(dot(weights[2], float4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], float4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], float4(c02.z, c12.z, c22.z, c32.z))); + color+= float3(dot(weights[3], float4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], float4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], float4(c03.z, c13.z, c23.z, c33.z))); + color = color/(dot(weights[0], float4(1,1,1,1)) + dot(weights[1], float4(1,1,1,1)) + dot(weights[2], float4(1,1,1,1)) + dot(weights[3], float4(1,1,1,1))); + + // Anti-ringing + float3 aux = color; + color = clamp(color, min_sample, max_sample); + color = lerp(aux, color, JINC2_AR_STRENGTH); + + // final sum and weight normalization + return float4(color, 1.0); +} + +float4 main(float2 texCoords : TEXCOORD) : COLOR +{ + return lanczos2(texCoords); +} + +*/ +#endif + +const BYTE D3D9_LANCZOS2_SHADER[] = + { + 0, 3, 255, 255, 254, 255, + 44, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 131, 0, + 0, 0, 0, 3, 255, 255, + 2, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 124, 0, 0, 0, 68, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 2, 0, + 0, 0, 1, 0, 2, 0, + 108, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 51, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 230, 233, 157, 64, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 81, 0, + 0, 5, 2, 0, 15, 160, + 0, 0, 128, 62, 0, 0, + 0, 63, 219, 15, 201, 64, + 219, 15, 73, 192, 81, 0, + 0, 5, 3, 0, 15, 160, + 0, 0, 0, 191, 0, 0, + 0, 63, 0, 0, 0, 0, + 0, 0, 192, 63, 81, 0, + 0, 5, 4, 0, 15, 160, + 0, 0, 32, 64, 0, 0, + 0, 191, 0, 0, 192, 63, + 0, 0, 0, 63, 81, 0, + 0, 5, 5, 0, 15, 160, + 205, 204, 76, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 3, 144, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 1, 128, + 3, 0, 0, 160, 4, 0, + 0, 4, 0, 0, 3, 128, + 0, 0, 228, 144, 0, 0, + 228, 160, 0, 0, 0, 128, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 68, 128, + 2, 0, 0, 3, 0, 0, + 3, 128, 0, 0, 238, 129, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 68, 128, 3, 0, + 0, 160, 4, 0, 0, 4, + 0, 0, 12, 128, 0, 0, + 68, 144, 0, 0, 68, 161, + 0, 0, 228, 128, 90, 0, + 0, 4, 0, 0, 4, 128, + 0, 0, 238, 128, 0, 0, + 238, 128, 3, 0, 170, 160, + 7, 0, 0, 2, 0, 0, + 4, 128, 0, 0, 170, 128, + 6, 0, 0, 2, 0, 0, + 4, 128, 0, 0, 170, 128, + 4, 0, 0, 4, 1, 0, + 3, 128, 0, 0, 170, 128, + 2, 0, 228, 160, 2, 0, + 85, 160, 19, 0, 0, 2, + 1, 0, 3, 128, 1, 0, + 228, 128, 4, 0, 0, 4, + 1, 0, 3, 128, 1, 0, + 228, 128, 2, 0, 170, 160, + 2, 0, 255, 160, 37, 0, + 0, 2, 2, 0, 2, 128, + 1, 0, 0, 128, 37, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 128, 5, 0, + 0, 3, 0, 0, 8, 128, + 2, 0, 85, 128, 3, 0, + 85, 128, 5, 0, 0, 3, + 1, 0, 1, 128, 0, 0, + 170, 128, 0, 0, 170, 128, + 6, 0, 0, 2, 1, 0, + 1, 128, 1, 0, 0, 128, + 5, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 255, 128, + 1, 0, 0, 128, 88, 0, + 0, 4, 1, 0, 1, 128, + 0, 0, 170, 129, 1, 0, + 0, 160, 0, 0, 255, 128, + 4, 0, 0, 4, 0, 0, + 12, 128, 0, 0, 68, 144, + 0, 0, 68, 161, 0, 0, + 68, 128, 2, 0, 0, 3, + 2, 0, 15, 128, 0, 0, + 68, 128, 3, 0, 84, 160, + 2, 0, 0, 3, 3, 0, + 15, 128, 0, 0, 238, 128, + 3, 0, 49, 160, 90, 0, + 0, 4, 0, 0, 1, 128, + 3, 0, 228, 128, 3, 0, + 228, 128, 3, 0, 170, 160, + 90, 0, 0, 4, 0, 0, + 2, 128, 3, 0, 238, 128, + 3, 0, 238, 128, 3, 0, + 170, 160, 7, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 7, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 6, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 4, 0, 0, 4, + 3, 0, 3, 128, 0, 0, + 0, 128, 2, 0, 228, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 3, 0, 3, 128, + 3, 0, 228, 128, 4, 0, + 0, 4, 3, 0, 3, 128, + 3, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 4, 0, + 2, 128, 3, 0, 0, 128, + 37, 0, 0, 2, 5, 0, + 2, 128, 3, 0, 85, 128, + 5, 0, 0, 3, 3, 0, + 1, 128, 4, 0, 85, 128, + 5, 0, 85, 128, 5, 0, + 0, 3, 3, 0, 2, 128, + 0, 0, 0, 128, 0, 0, + 0, 128, 6, 0, 0, 2, + 3, 0, 2, 128, 3, 0, + 85, 128, 5, 0, 0, 3, + 3, 0, 1, 128, 3, 0, + 85, 128, 3, 0, 0, 128, + 88, 0, 0, 4, 1, 0, + 2, 128, 0, 0, 0, 129, + 1, 0, 0, 160, 3, 0, + 0, 128, 4, 0, 0, 4, + 3, 0, 3, 128, 0, 0, + 85, 128, 2, 0, 228, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 3, 0, 3, 128, + 3, 0, 228, 128, 4, 0, + 0, 4, 3, 0, 3, 128, + 3, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 4, 0, + 2, 128, 3, 0, 0, 128, + 37, 0, 0, 2, 5, 0, + 2, 128, 3, 0, 85, 128, + 5, 0, 0, 3, 0, 0, + 1, 128, 4, 0, 85, 128, + 5, 0, 85, 128, 5, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 85, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 3, 0, 1, 128, 3, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 3, 0, 0, 128, + 88, 0, 0, 4, 1, 0, + 4, 128, 0, 0, 85, 129, + 1, 0, 0, 160, 0, 0, + 0, 128, 2, 0, 0, 3, + 3, 0, 15, 128, 0, 0, + 238, 128, 4, 0, 228, 160, + 90, 0, 0, 4, 0, 0, + 1, 128, 3, 0, 228, 128, + 3, 0, 228, 128, 3, 0, + 170, 160, 90, 0, 0, 4, + 0, 0, 2, 128, 3, 0, + 238, 128, 3, 0, 238, 128, + 3, 0, 170, 160, 7, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 6, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 7, 0, + 0, 2, 0, 0, 1, 128, + 0, 0, 0, 128, 6, 0, + 0, 2, 0, 0, 1, 128, + 0, 0, 0, 128, 4, 0, + 0, 4, 3, 0, 3, 128, + 0, 0, 0, 128, 2, 0, + 228, 160, 2, 0, 85, 160, + 19, 0, 0, 2, 3, 0, + 3, 128, 3, 0, 228, 128, + 4, 0, 0, 4, 3, 0, + 3, 128, 3, 0, 228, 128, + 2, 0, 170, 160, 2, 0, + 255, 160, 37, 0, 0, 2, + 4, 0, 2, 128, 3, 0, + 0, 128, 37, 0, 0, 2, + 5, 0, 2, 128, 3, 0, + 85, 128, 5, 0, 0, 3, + 3, 0, 1, 128, 4, 0, + 85, 128, 5, 0, 85, 128, + 5, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 0, 128, + 0, 0, 0, 128, 6, 0, + 0, 2, 3, 0, 2, 128, + 3, 0, 85, 128, 5, 0, + 0, 3, 3, 0, 1, 128, + 3, 0, 85, 128, 3, 0, + 0, 128, 88, 0, 0, 4, + 1, 0, 8, 128, 0, 0, + 0, 129, 1, 0, 0, 160, + 3, 0, 0, 128, 1, 0, + 0, 2, 3, 0, 2, 128, + 3, 0, 170, 160, 6, 0, + 0, 2, 4, 0, 1, 128, + 0, 0, 0, 160, 1, 0, + 0, 2, 3, 0, 1, 128, + 4, 0, 0, 128, 6, 0, + 0, 2, 4, 0, 2, 128, + 0, 0, 85, 160, 4, 0, + 0, 4, 3, 0, 12, 128, + 2, 0, 228, 128, 4, 0, + 68, 128, 3, 0, 68, 129, + 4, 0, 0, 4, 3, 0, + 3, 128, 2, 0, 238, 128, + 4, 0, 228, 128, 3, 0, + 228, 128, 4, 0, 0, 4, + 4, 0, 12, 128, 4, 0, + 68, 128, 1, 0, 148, 161, + 3, 0, 228, 128, 66, 0, + 0, 3, 5, 0, 15, 128, + 4, 0, 238, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 6, 0, 1, 128, 5, 0, + 0, 128, 4, 0, 0, 4, + 4, 0, 12, 128, 4, 0, + 68, 128, 1, 0, 148, 161, + 3, 0, 68, 128, 66, 0, + 0, 3, 7, 0, 15, 128, + 4, 0, 238, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 6, 0, 4, 128, 7, 0, + 0, 128, 5, 0, 0, 3, + 4, 0, 12, 128, 2, 0, + 228, 128, 4, 0, 68, 128, + 4, 0, 0, 4, 5, 0, + 9, 128, 4, 0, 100, 128, + 1, 0, 103, 160, 4, 0, + 230, 128, 66, 0, 0, 3, + 8, 0, 15, 128, 4, 0, + 238, 128, 0, 8, 228, 160, + 4, 0, 0, 4, 4, 0, + 12, 128, 4, 0, 68, 128, + 1, 0, 148, 161, 5, 0, + 196, 128, 66, 0, 0, 3, + 9, 0, 15, 128, 4, 0, + 238, 128, 0, 8, 228, 160, + 1, 0, 0, 2, 6, 0, + 8, 128, 9, 0, 0, 128, + 5, 0, 0, 3, 4, 0, + 12, 128, 4, 0, 68, 128, + 1, 0, 148, 160, 4, 0, + 0, 4, 9, 0, 9, 128, + 2, 0, 230, 128, 4, 0, + 100, 128, 4, 0, 230, 129, + 4, 0, 0, 4, 4, 0, + 12, 128, 2, 0, 228, 128, + 4, 0, 68, 128, 4, 0, + 228, 128, 66, 0, 0, 3, + 10, 0, 15, 128, 4, 0, + 238, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 11, 0, + 15, 128, 9, 0, 236, 128, + 0, 8, 228, 160, 1, 0, + 0, 2, 6, 0, 2, 128, + 11, 0, 0, 128, 9, 0, + 0, 3, 6, 0, 1, 128, + 1, 0, 228, 128, 6, 0, + 228, 128, 1, 0, 0, 2, + 12, 0, 1, 128, 5, 0, + 85, 128, 1, 0, 0, 2, + 7, 0, 1, 128, 5, 0, + 170, 128, 1, 0, 0, 2, + 12, 0, 4, 128, 7, 0, + 85, 128, 1, 0, 0, 2, + 12, 0, 2, 128, 11, 0, + 85, 128, 1, 0, 0, 2, + 7, 0, 2, 128, 11, 0, + 170, 128, 1, 0, 0, 2, + 12, 0, 8, 128, 9, 0, + 85, 128, 1, 0, 0, 2, + 7, 0, 8, 128, 9, 0, + 170, 128, 9, 0, 0, 3, + 6, 0, 4, 128, 1, 0, + 228, 128, 7, 0, 228, 128, + 9, 0, 0, 3, 6, 0, + 2, 128, 1, 0, 228, 128, + 12, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 170, 160, 4, 0, 0, 4, + 1, 0, 15, 128, 0, 0, + 68, 144, 0, 0, 68, 161, + 2, 0, 228, 128, 90, 0, + 0, 4, 1, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 3, 0, 170, 160, + 90, 0, 0, 4, 1, 0, + 2, 128, 1, 0, 238, 128, + 1, 0, 238, 128, 3, 0, + 170, 160, 7, 0, 0, 2, + 1, 0, 2, 128, 1, 0, + 85, 128, 6, 0, 0, 2, + 1, 0, 2, 128, 1, 0, + 85, 128, 7, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 6, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 4, 0, 0, 4, + 1, 0, 12, 128, 1, 0, + 0, 128, 2, 0, 68, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 1, 0, 12, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 12, 128, + 1, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 7, 0, + 2, 128, 1, 0, 170, 128, + 37, 0, 0, 2, 9, 0, + 2, 128, 1, 0, 255, 128, + 5, 0, 0, 3, 1, 0, + 4, 128, 7, 0, 85, 128, + 9, 0, 85, 128, 5, 0, + 0, 3, 1, 0, 8, 128, + 1, 0, 0, 128, 1, 0, + 0, 128, 6, 0, 0, 2, + 1, 0, 8, 128, 1, 0, + 255, 128, 5, 0, 0, 3, + 1, 0, 4, 128, 1, 0, + 255, 128, 1, 0, 170, 128, + 88, 0, 0, 4, 7, 0, + 1, 128, 1, 0, 0, 129, + 1, 0, 0, 160, 1, 0, + 170, 128, 4, 0, 0, 4, + 1, 0, 5, 128, 1, 0, + 85, 128, 2, 0, 212, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 1, 0, 5, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 5, 128, + 1, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 9, 0, + 2, 128, 1, 0, 0, 128, + 37, 0, 0, 2, 11, 0, + 2, 128, 1, 0, 170, 128, + 5, 0, 0, 3, 1, 0, + 1, 128, 9, 0, 85, 128, + 11, 0, 85, 128, 5, 0, + 0, 3, 1, 0, 4, 128, + 1, 0, 85, 128, 1, 0, + 85, 128, 6, 0, 0, 2, + 1, 0, 4, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 1, 128, 1, 0, + 170, 128, 1, 0, 0, 128, + 88, 0, 0, 4, 7, 0, + 2, 128, 1, 0, 85, 129, + 1, 0, 0, 160, 1, 0, + 0, 128, 4, 0, 0, 4, + 1, 0, 3, 128, 0, 0, + 85, 128, 2, 0, 228, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 1, 0, 3, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 3, 128, + 1, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 9, 0, + 2, 128, 1, 0, 0, 128, + 37, 0, 0, 2, 11, 0, + 2, 128, 1, 0, 85, 128, + 5, 0, 0, 3, 1, 0, + 1, 128, 9, 0, 85, 128, + 11, 0, 85, 128, 5, 0, + 0, 3, 1, 0, 2, 128, + 0, 0, 85, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 1, 0, 2, 128, 1, 0, + 85, 128, 5, 0, 0, 3, + 1, 0, 1, 128, 1, 0, + 85, 128, 1, 0, 0, 128, + 88, 0, 0, 4, 7, 0, + 4, 128, 0, 0, 85, 129, + 1, 0, 0, 160, 1, 0, + 0, 128, 2, 0, 0, 3, + 1, 0, 15, 128, 0, 0, + 238, 128, 4, 0, 156, 160, + 90, 0, 0, 4, 0, 0, + 2, 128, 1, 0, 228, 128, + 1, 0, 228, 128, 3, 0, + 170, 160, 90, 0, 0, 4, + 1, 0, 1, 128, 1, 0, + 238, 128, 1, 0, 238, 128, + 3, 0, 170, 160, 7, 0, + 0, 2, 1, 0, 1, 128, + 1, 0, 0, 128, 6, 0, + 0, 2, 1, 0, 1, 128, + 1, 0, 0, 128, 7, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 6, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 4, 0, + 0, 4, 1, 0, 6, 128, + 0, 0, 85, 128, 2, 0, + 208, 160, 2, 0, 85, 160, + 19, 0, 0, 2, 1, 0, + 6, 128, 1, 0, 228, 128, + 4, 0, 0, 4, 1, 0, + 6, 128, 1, 0, 228, 128, + 2, 0, 170, 160, 2, 0, + 255, 160, 37, 0, 0, 2, + 9, 0, 2, 128, 1, 0, + 85, 128, 37, 0, 0, 2, + 11, 0, 2, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 2, 128, 9, 0, + 85, 128, 11, 0, 85, 128, + 5, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 85, 128, + 0, 0, 85, 128, 6, 0, + 0, 2, 1, 0, 4, 128, + 1, 0, 170, 128, 5, 0, + 0, 3, 1, 0, 2, 128, + 1, 0, 170, 128, 1, 0, + 85, 128, 88, 0, 0, 4, + 7, 0, 8, 128, 0, 0, + 85, 129, 1, 0, 0, 160, + 1, 0, 85, 128, 66, 0, + 0, 3, 9, 0, 15, 128, + 3, 0, 238, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 11, 0, 1, 128, 9, 0, + 0, 128, 66, 0, 0, 3, + 12, 0, 15, 128, 3, 0, + 228, 128, 0, 8, 228, 160, + 1, 0, 0, 2, 11, 0, + 4, 128, 12, 0, 0, 128, + 66, 0, 0, 3, 13, 0, + 15, 128, 5, 0, 236, 128, + 0, 8, 228, 160, 1, 0, + 0, 2, 11, 0, 8, 128, + 13, 0, 0, 128, 1, 0, + 0, 2, 11, 0, 2, 128, + 8, 0, 0, 128, 9, 0, + 0, 3, 11, 0, 1, 128, + 7, 0, 228, 128, 11, 0, + 228, 128, 1, 0, 0, 2, + 14, 0, 1, 128, 9, 0, + 85, 128, 1, 0, 0, 2, + 9, 0, 1, 128, 9, 0, + 170, 128, 1, 0, 0, 2, + 14, 0, 8, 128, 13, 0, + 85, 128, 1, 0, 0, 2, + 9, 0, 8, 128, 13, 0, + 170, 128, 1, 0, 0, 2, + 14, 0, 4, 128, 12, 0, + 85, 128, 1, 0, 0, 2, + 14, 0, 2, 128, 8, 0, + 85, 128, 9, 0, 0, 3, + 11, 0, 2, 128, 7, 0, + 228, 128, 14, 0, 228, 128, + 1, 0, 0, 2, 9, 0, + 4, 128, 12, 0, 170, 128, + 1, 0, 0, 2, 9, 0, + 2, 128, 8, 0, 170, 128, + 9, 0, 0, 3, 11, 0, + 4, 128, 7, 0, 228, 128, + 9, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 2, 128, + 7, 0, 228, 128, 1, 0, + 170, 160, 2, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 85, 128, 0, 0, 0, 128, + 2, 0, 0, 3, 1, 0, + 14, 128, 6, 0, 144, 128, + 11, 0, 144, 128, 4, 0, + 0, 4, 2, 0, 3, 128, + 1, 0, 0, 128, 2, 0, + 228, 160, 2, 0, 85, 160, + 19, 0, 0, 2, 2, 0, + 3, 128, 2, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 3, 128, 2, 0, 228, 128, + 2, 0, 170, 160, 2, 0, + 255, 160, 37, 0, 0, 2, + 6, 0, 2, 128, 2, 0, + 0, 128, 37, 0, 0, 2, + 7, 0, 2, 128, 2, 0, + 85, 128, 5, 0, 0, 3, + 0, 0, 2, 128, 6, 0, + 85, 128, 7, 0, 85, 128, + 5, 0, 0, 3, 2, 0, + 1, 128, 1, 0, 0, 128, + 1, 0, 0, 128, 6, 0, + 0, 2, 2, 0, 1, 128, + 2, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 85, 128, 2, 0, + 0, 128, 88, 0, 0, 4, + 6, 0, 1, 128, 1, 0, + 0, 129, 1, 0, 0, 160, + 0, 0, 85, 128, 2, 0, + 0, 3, 7, 0, 15, 128, + 0, 0, 238, 128, 3, 0, + 253, 160, 90, 0, 0, 4, + 0, 0, 2, 128, 7, 0, + 228, 128, 7, 0, 228, 128, + 3, 0, 170, 160, 90, 0, + 0, 4, 1, 0, 1, 128, + 7, 0, 238, 128, 7, 0, + 238, 128, 3, 0, 170, 160, + 7, 0, 0, 2, 1, 0, + 1, 128, 1, 0, 0, 128, + 6, 0, 0, 2, 1, 0, + 1, 128, 1, 0, 0, 128, + 7, 0, 0, 2, 0, 0, + 2, 128, 0, 0, 85, 128, + 6, 0, 0, 2, 0, 0, + 2, 128, 0, 0, 85, 128, + 4, 0, 0, 4, 2, 0, + 3, 128, 0, 0, 85, 128, + 2, 0, 228, 160, 2, 0, + 85, 160, 19, 0, 0, 2, + 2, 0, 3, 128, 2, 0, + 228, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 2, 0, + 228, 128, 2, 0, 170, 160, + 2, 0, 255, 160, 37, 0, + 0, 2, 7, 0, 2, 128, + 2, 0, 0, 128, 37, 0, + 0, 2, 9, 0, 2, 128, + 2, 0, 85, 128, 5, 0, + 0, 3, 2, 0, 1, 128, + 7, 0, 85, 128, 9, 0, + 85, 128, 5, 0, 0, 3, + 2, 0, 2, 128, 0, 0, + 85, 128, 0, 0, 85, 128, + 6, 0, 0, 2, 2, 0, + 2, 128, 2, 0, 85, 128, + 5, 0, 0, 3, 2, 0, + 1, 128, 2, 0, 85, 128, + 2, 0, 0, 128, 88, 0, + 0, 4, 6, 0, 2, 128, + 0, 0, 85, 129, 1, 0, + 0, 160, 2, 0, 0, 128, + 4, 0, 0, 4, 2, 0, + 3, 128, 1, 0, 0, 128, + 2, 0, 228, 160, 2, 0, + 85, 160, 19, 0, 0, 2, + 2, 0, 3, 128, 2, 0, + 228, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 2, 0, + 228, 128, 2, 0, 170, 160, + 2, 0, 255, 160, 37, 0, + 0, 2, 7, 0, 2, 128, + 2, 0, 0, 128, 37, 0, + 0, 2, 9, 0, 2, 128, + 2, 0, 85, 128, 5, 0, + 0, 3, 0, 0, 2, 128, + 7, 0, 85, 128, 9, 0, + 85, 128, 5, 0, 0, 3, + 2, 0, 1, 128, 1, 0, + 0, 128, 1, 0, 0, 128, + 6, 0, 0, 2, 2, 0, + 1, 128, 2, 0, 0, 128, + 5, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 85, 128, + 2, 0, 0, 128, 88, 0, + 0, 4, 6, 0, 4, 128, + 1, 0, 0, 129, 1, 0, + 0, 160, 0, 0, 85, 128, + 2, 0, 0, 3, 7, 0, + 15, 128, 0, 0, 238, 128, + 4, 0, 24, 160, 90, 0, + 0, 4, 0, 0, 2, 128, + 7, 0, 228, 128, 7, 0, + 228, 128, 3, 0, 170, 160, + 90, 0, 0, 4, 1, 0, + 1, 128, 7, 0, 238, 128, + 7, 0, 238, 128, 3, 0, + 170, 160, 7, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 6, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 7, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 0, 0, + 85, 128, 2, 0, 228, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 2, 0, 3, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 2, 0, 3, 128, + 2, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 7, 0, + 2, 128, 2, 0, 0, 128, + 37, 0, 0, 2, 9, 0, + 2, 128, 2, 0, 85, 128, + 5, 0, 0, 3, 2, 0, + 1, 128, 7, 0, 85, 128, + 9, 0, 85, 128, 5, 0, + 0, 3, 2, 0, 2, 128, + 0, 0, 85, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 2, 0, 2, 128, 2, 0, + 85, 128, 5, 0, 0, 3, + 2, 0, 1, 128, 2, 0, + 85, 128, 2, 0, 0, 128, + 88, 0, 0, 4, 6, 0, + 8, 128, 0, 0, 85, 129, + 1, 0, 0, 160, 2, 0, + 0, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 4, 0, + 228, 128, 1, 0, 233, 160, + 3, 0, 238, 128, 4, 0, + 0, 4, 3, 0, 12, 128, + 4, 0, 68, 128, 1, 0, + 212, 160, 3, 0, 228, 128, + 66, 0, 0, 3, 7, 0, + 15, 128, 3, 0, 238, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 9, 0, 15, 128, + 2, 0, 228, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 11, 0, 1, 128, 9, 0, + 0, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 4, 0, + 228, 128, 1, 0, 233, 160, + 5, 0, 236, 128, 4, 0, + 0, 4, 3, 0, 12, 128, + 4, 0, 68, 128, 1, 0, + 212, 160, 5, 0, 196, 128, + 66, 0, 0, 3, 5, 0, + 15, 128, 3, 0, 238, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 13, 0, 15, 128, + 2, 0, 228, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 11, 0, 8, 128, 13, 0, + 0, 128, 4, 0, 0, 4, + 2, 0, 3, 128, 4, 0, + 228, 128, 1, 0, 233, 160, + 3, 0, 228, 128, 4, 0, + 0, 4, 3, 0, 3, 128, + 4, 0, 228, 128, 1, 0, + 237, 160, 3, 0, 228, 128, + 66, 0, 0, 3, 3, 0, + 15, 128, 3, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 14, 0, 15, 128, + 2, 0, 228, 128, 0, 8, + 228, 160, 1, 0, 0, 2, + 11, 0, 4, 128, 14, 0, + 0, 128, 1, 0, 0, 2, + 11, 0, 2, 128, 10, 0, + 0, 128, 9, 0, 0, 3, + 11, 0, 1, 128, 6, 0, + 228, 128, 11, 0, 228, 128, + 1, 0, 0, 2, 15, 0, + 1, 128, 9, 0, 85, 128, + 1, 0, 0, 2, 9, 0, + 1, 128, 9, 0, 170, 128, + 1, 0, 0, 2, 15, 0, + 8, 128, 13, 0, 85, 128, + 1, 0, 0, 2, 9, 0, + 8, 128, 13, 0, 170, 128, + 1, 0, 0, 2, 15, 0, + 4, 128, 14, 0, 85, 128, + 1, 0, 0, 2, 15, 0, + 2, 128, 10, 0, 85, 128, + 9, 0, 0, 3, 11, 0, + 2, 128, 6, 0, 228, 128, + 15, 0, 228, 128, 1, 0, + 0, 2, 9, 0, 4, 128, + 14, 0, 170, 128, 1, 0, + 0, 2, 9, 0, 2, 128, + 10, 0, 170, 128, 9, 0, + 0, 3, 11, 0, 4, 128, + 6, 0, 228, 128, 9, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 2, 128, 6, 0, + 228, 128, 1, 0, 170, 160, + 2, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 85, 128, + 0, 0, 0, 128, 2, 0, + 0, 3, 1, 0, 14, 128, + 1, 0, 228, 128, 11, 0, + 144, 128, 5, 0, 0, 3, + 2, 0, 3, 128, 4, 0, + 228, 128, 1, 0, 237, 160, + 4, 0, 0, 4, 2, 0, + 3, 128, 2, 0, 238, 128, + 4, 0, 228, 128, 2, 0, + 228, 128, 66, 0, 0, 3, + 2, 0, 15, 128, 2, 0, + 228, 128, 0, 8, 228, 160, + 1, 0, 0, 2, 4, 0, + 2, 128, 2, 0, 0, 128, + 4, 0, 0, 4, 2, 0, + 9, 128, 1, 0, 0, 128, + 2, 0, 100, 160, 2, 0, + 85, 160, 19, 0, 0, 2, + 2, 0, 9, 128, 2, 0, + 228, 128, 4, 0, 0, 4, + 2, 0, 9, 128, 2, 0, + 228, 128, 2, 0, 170, 160, + 2, 0, 255, 160, 37, 0, + 0, 2, 6, 0, 2, 128, + 2, 0, 0, 128, 37, 0, + 0, 2, 9, 0, 2, 128, + 2, 0, 255, 128, 5, 0, + 0, 3, 0, 0, 2, 128, + 6, 0, 85, 128, 9, 0, + 85, 128, 5, 0, 0, 3, + 2, 0, 1, 128, 1, 0, + 0, 128, 1, 0, 0, 128, + 6, 0, 0, 2, 2, 0, + 1, 128, 2, 0, 0, 128, + 5, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 85, 128, + 2, 0, 0, 128, 88, 0, + 0, 4, 6, 0, 1, 128, + 1, 0, 0, 129, 1, 0, + 0, 160, 0, 0, 85, 128, + 2, 0, 0, 3, 2, 0, + 9, 128, 0, 0, 230, 128, + 4, 0, 0, 160, 2, 0, + 0, 3, 9, 0, 15, 128, + 0, 0, 238, 128, 4, 0, + 35, 160, 90, 0, 0, 4, + 0, 0, 2, 128, 2, 0, + 236, 128, 2, 0, 236, 128, + 3, 0, 170, 160, 7, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 6, 0, + 0, 2, 0, 0, 2, 128, + 0, 0, 85, 128, 4, 0, + 0, 4, 0, 0, 12, 128, + 0, 0, 85, 128, 2, 0, + 68, 160, 2, 0, 85, 160, + 19, 0, 0, 2, 0, 0, + 12, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 12, 128, 0, 0, 228, 128, + 2, 0, 170, 160, 2, 0, + 255, 160, 37, 0, 0, 2, + 11, 0, 2, 128, 0, 0, + 170, 128, 37, 0, 0, 2, + 13, 0, 2, 128, 0, 0, + 255, 128, 5, 0, 0, 3, + 0, 0, 4, 128, 11, 0, + 85, 128, 13, 0, 85, 128, + 5, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 85, 128, + 0, 0, 85, 128, 6, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 128, 5, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 255, 128, 0, 0, + 170, 128, 88, 0, 0, 4, + 6, 0, 8, 128, 0, 0, + 85, 129, 1, 0, 0, 160, + 0, 0, 170, 128, 90, 0, + 0, 4, 0, 0, 2, 128, + 9, 0, 228, 128, 9, 0, + 228, 128, 3, 0, 170, 160, + 90, 0, 0, 4, 0, 0, + 4, 128, 9, 0, 238, 128, + 9, 0, 238, 128, 3, 0, + 170, 160, 7, 0, 0, 2, + 0, 0, 4, 128, 0, 0, + 170, 128, 6, 0, 0, 2, + 0, 0, 4, 128, 0, 0, + 170, 128, 7, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 0, 0, 2, 128, 0, 0, + 85, 128, 4, 0, 0, 4, + 2, 0, 9, 128, 0, 0, + 85, 128, 2, 0, 100, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 2, 0, 9, 128, + 2, 0, 228, 128, 4, 0, + 0, 4, 2, 0, 9, 128, + 2, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 9, 0, + 2, 128, 2, 0, 0, 128, + 37, 0, 0, 2, 11, 0, + 2, 128, 2, 0, 255, 128, + 5, 0, 0, 3, 0, 0, + 8, 128, 9, 0, 85, 128, + 11, 0, 85, 128, 5, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 85, 128, 0, 0, + 85, 128, 6, 0, 0, 2, + 1, 0, 1, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 8, 128, 0, 0, + 255, 128, 1, 0, 0, 128, + 88, 0, 0, 4, 6, 0, + 2, 128, 0, 0, 85, 129, + 1, 0, 0, 160, 0, 0, + 255, 128, 4, 0, 0, 4, + 0, 0, 10, 128, 0, 0, + 170, 128, 2, 0, 96, 160, + 2, 0, 85, 160, 19, 0, + 0, 2, 0, 0, 10, 128, + 0, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 10, 128, + 0, 0, 228, 128, 2, 0, + 170, 160, 2, 0, 255, 160, + 37, 0, 0, 2, 9, 0, + 2, 128, 0, 0, 85, 128, + 37, 0, 0, 2, 11, 0, + 2, 128, 0, 0, 255, 128, + 5, 0, 0, 3, 0, 0, + 2, 128, 9, 0, 85, 128, + 11, 0, 85, 128, 5, 0, + 0, 3, 0, 0, 8, 128, + 0, 0, 170, 128, 0, 0, + 170, 128, 6, 0, 0, 2, + 0, 0, 8, 128, 0, 0, + 255, 128, 5, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 255, 128, 0, 0, 85, 128, + 88, 0, 0, 4, 6, 0, + 4, 128, 0, 0, 170, 129, + 1, 0, 0, 160, 0, 0, + 85, 128, 1, 0, 0, 2, + 4, 0, 1, 128, 7, 0, + 0, 128, 1, 0, 0, 2, + 4, 0, 4, 128, 3, 0, + 0, 128, 1, 0, 0, 2, + 4, 0, 8, 128, 5, 0, + 0, 128, 9, 0, 0, 3, + 4, 0, 1, 128, 6, 0, + 228, 128, 4, 0, 228, 128, + 1, 0, 0, 2, 9, 0, + 1, 128, 7, 0, 85, 128, + 1, 0, 0, 2, 3, 0, + 1, 128, 7, 0, 170, 128, + 1, 0, 0, 2, 9, 0, + 4, 128, 3, 0, 85, 128, + 1, 0, 0, 2, 9, 0, + 8, 128, 5, 0, 85, 128, + 1, 0, 0, 2, 3, 0, + 8, 128, 5, 0, 170, 128, + 1, 0, 0, 2, 9, 0, + 2, 128, 2, 0, 85, 128, + 1, 0, 0, 2, 3, 0, + 2, 128, 2, 0, 170, 128, + 9, 0, 0, 3, 4, 0, + 4, 128, 6, 0, 228, 128, + 3, 0, 228, 128, 9, 0, + 0, 3, 4, 0, 2, 128, + 6, 0, 228, 128, 9, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 2, 128, 6, 0, + 228, 128, 1, 0, 170, 160, + 2, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 85, 128, + 0, 0, 0, 128, 6, 0, + 0, 2, 0, 0, 1, 128, + 0, 0, 0, 128, 2, 0, + 0, 3, 0, 0, 14, 128, + 1, 0, 228, 128, 4, 0, + 144, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 0, 128, 0, 0, 249, 128, + 10, 0, 0, 3, 2, 0, + 7, 128, 14, 0, 228, 128, + 10, 0, 228, 128, 11, 0, + 0, 3, 3, 0, 7, 128, + 10, 0, 228, 128, 14, 0, + 228, 128, 11, 0, 0, 3, + 4, 0, 7, 128, 12, 0, + 228, 128, 3, 0, 228, 128, + 10, 0, 0, 3, 3, 0, + 7, 128, 2, 0, 228, 128, + 12, 0, 228, 128, 10, 0, + 0, 3, 2, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 228, 128, 11, 0, 0, 3, + 3, 0, 7, 128, 8, 0, + 228, 128, 4, 0, 228, 128, + 11, 0, 0, 3, 4, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 10, 0, + 0, 3, 2, 0, 7, 128, + 3, 0, 228, 128, 4, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 0, 0, + 249, 128, 0, 0, 0, 129, + 2, 0, 228, 128, 4, 0, + 0, 4, 0, 8, 7, 128, + 0, 0, 228, 128, 5, 0, + 0, 160, 1, 0, 228, 128, + 1, 0, 0, 2, 0, 8, + 8, 128, 1, 0, 170, 160, + 255, 255, 0, 0 + }; + + + #endif diff --git a/inc/dd.h b/inc/dd.h index bfddd0a..e8a96aa 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -39,6 +39,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define FILTER_NEAREST 0 #define FILTER_LINEAR 1 #define FILTER_CUBIC 2 +#define FILTER_LANCZOS 3 #define SDM_MODE_SET_BY_GAME 0x00000001l #define SDM_LEAVE_WINDOWED 0x00000002l diff --git a/src/config.c b/src/config.c index 0215716..7e185c9 100644 --- a/src/config.c +++ b/src/config.c @@ -298,7 +298,7 @@ static void cfg_create_ini() "resizable=true\n" "\n" "; Upscaling filter for the direct3d9* renderers\n" - "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic (16/32bit color depth games only)\n" + "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)\n" "d3d9_filter=2\n" "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 29c0c26..8e8ebcd 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -318,10 +318,27 @@ static BOOL d3d9_create_resources() } else { - IDirect3DDevice9_CreatePixelShader( - g_d3d9.device, - (DWORD*)D3D9_CATMULL_ROM_SHADER, - &g_d3d9.pixel_shader_upscale); + if (g_ddraw->d3d9_filter == FILTER_LANCZOS) + { + BOOL error = FAILED( + IDirect3DDevice9_CreatePixelShader( + g_d3d9.device, + (DWORD*)D3D9_LANCZOS2_SHADER, + &g_d3d9.pixel_shader_upscale)); + + if (error || !g_d3d9.pixel_shader_upscale) + { + g_ddraw->d3d9_filter = FILTER_CUBIC; + } + } + + if (g_ddraw->d3d9_filter == FILTER_CUBIC) + { + IDirect3DDevice9_CreatePixelShader( + g_d3d9.device, + (DWORD*)D3D9_CATMULL_ROM_SHADER, + &g_d3d9.pixel_shader_upscale); + } } return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err; @@ -359,11 +376,22 @@ static BOOL d3d9_set_states() { if (g_ddraw->d3d9_filter) { - if (SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && + if (g_ddraw->d3d9_filter == FILTER_LANCZOS && + g_d3d9.pixel_shader_upscale && + (g_ddraw->render.viewport.width != g_ddraw->width || + g_ddraw->render.viewport.height != g_ddraw->height) && + SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + { + float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; + err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + } + else if ( + SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && g_ddraw->d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && - (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && + (g_ddraw->render.viewport.width != g_ddraw->width || + g_ddraw->render.viewport.height != g_ddraw->height) && SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; From 37ce86839e87bd2985476233f3bb477bd75886ea Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 17:04:15 +0200 Subject: [PATCH 0610/1724] add lanczos setting to config tool --- config/ConfigFormUnit.cpp | 4 ++++ config/ConfigFormUnit.dfm | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3b1ff04..602b8c4 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -795,9 +795,13 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) case 1: ShaderD3DCbx->ItemIndex = 1; break; + case 2: default: ShaderD3DCbx->ItemIndex = 2; break; + case 3: + ShaderD3DCbx->ItemIndex = 3; + break; } Maxfps = ini->ReadInteger("ddraw", "maxfps", -1); diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index f914cc8..a69b94f 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3196,7 +3196,8 @@ object ConfigForm: TConfigForm Items.Strings = ( 'Nearest neighbor' 'Bilinear' - 'Bicubic Catmull-Rom') + 'Bicubic (Catmull-Rom)' + 'Lanczos') end object RendererCbx: TComboBox Left = 41 From b14b219be7459155657fa6b5f2f293d03eea5eed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 18:27:45 +0200 Subject: [PATCH 0611/1724] remove PostMessage call --- src/wndproc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 64058c7..87b67f2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -549,7 +549,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - PostMessageA(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0); } else { From 81285ee441ced0871261a86410c1ff02524838f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 18:40:43 +0200 Subject: [PATCH 0612/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 6c0e8b7..1a5d128 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 8bbc053e3019b9da2893ac3ec6e6d851a9491b03 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 19:02:21 +0200 Subject: [PATCH 0613/1724] add missing window messages --- src/debug.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/debug.c b/src/debug.c index a840939..3bd4213 100644 --- a/src/debug.c +++ b/src/debug.c @@ -876,6 +876,13 @@ char* dbg_mes_to_str(int id) case 134: return "WM_NCACTIVATE"; case 135: return "WM_GETDLGCODE"; case 136: return "WM_SYNCPAINT"; + case 144: return "WM_UAHDESTROYWINDOW"; + case 145: return "WM_UAHDRAWMENU"; + case 146: return "WM_UAHDRAWMENUITEM"; + case 147: return "WM_UAHINITMENU"; + case 148: return "WM_UAHMEASUREMENUITEM"; + case 149: return "WM_UAHNCPAINTMENUPOPUP"; + case 150: return "WM_UAHUPDATE"; case 160: return "WM_NCMOUSEMOVE"; case 161: return "WM_NCLBUTTONDOWN"; case 162: return "WM_NCLBUTTONUP"; From 12943c3b81a5604991b8b34a39e3c6a3c9e1665c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 19:23:43 +0200 Subject: [PATCH 0614/1724] rename Developer settings to Config program settings --- src/config.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index 7e185c9..35fdbeb 100644 --- a/src/config.c +++ b/src/config.c @@ -304,12 +304,6 @@ static void cfg_create_ini() "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" "vhack=false\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" - "configlang=auto\n" - "\n" - "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" - "configtheme=Windows10\n" - "\n" "; Where should screenshots be saved\n" "screenshotdir=.\\Screenshots\\\n" "\n" @@ -395,10 +389,16 @@ static void cfg_create_ini() "\n" "\n" "\n" - "; ### Developer settings ###\n" - "; The following settings are for developers who like to share their custom preset with others\n" + "; ### Config program settings ###\n" + "; The following settings are for cnc-ddraw config.exe\n" "\n" "\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" + "configlang=auto\n" + "\n" + "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" + "configtheme=Windows10\n" + "\n" "; Hide the 'Compatibility Settings' tab in cnc-ddraw config\n" "hide_compat_tab=false\n" "\n" From d849e6c333050da894b1597a1d5bbbed7100e536 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Aug 2023 19:42:42 +0200 Subject: [PATCH 0615/1724] add comment about opengl shader setting --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 35fdbeb..61f7cc7 100644 --- a/src/config.c +++ b/src/config.c @@ -275,6 +275,7 @@ static void cfg_create_ini() "\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" + "; Note: Defauls to Bicubic Catmull-Rom if no shader specified or file was not found\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" From 8372627b82d684c24380d9a5db3ff32e6c5370a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Aug 2023 17:09:50 +0200 Subject: [PATCH 0616/1724] bump version --- ddraw.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 1a5d128..88cc09a 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -2,9 +2,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 6 +#define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From aca18912b31055835608aabadd0203cd89e3b4ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Aug 2023 18:37:16 +0200 Subject: [PATCH 0617/1724] allow to have game window bigger than screen size --- ddraw.rc | 2 +- src/dd.c | 16 +++++++++++++++- src/wndproc.c | 30 +++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 88cc09a..bda5350 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/dd.c b/src/dd.c index 66519e0..1666a17 100644 --- a/src/dd.c +++ b/src/dd.c @@ -719,7 +719,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - /* everything failed, use windowed mode instead */ + /* everything failed, use windowed/borderless mode instead */ g_ddraw->render.width = g_ddraw->width; g_ddraw->render.height = g_ddraw->height; @@ -727,6 +727,20 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; g_ddraw->windowed = TRUE; + + if (g_ddraw->render.width <= real_GetSystemMetrics(SM_CXSCREEN) && + g_ddraw->render.height <= real_GetSystemMetrics(SM_CYSCREEN)) + { + /* Switch to borderless mode if window fits into screen */ + g_ddraw->fullscreen = TRUE; + } + else + { + /* Make window titlebar visible if window does not fit into screen */ + g_config.window_rect.left = -32000; + g_config.window_rect.top = + real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); + } } } } diff --git a/src/wndproc.c b/src/wndproc.c index 87b67f2..2475a95 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -41,7 +41,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { - case WM_GETMINMAXINFO: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -51,6 +50,35 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { return DefWindowProc(hWnd, uMsg, wParam, lParam); } + case WM_GETMINMAXINFO: + { + MINMAXINFO* mmi = (MINMAXINFO*)lParam; + + if (g_ddraw->windowed && g_ddraw->width) + { + RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + + AdjustWindowRectEx( + &rc, + real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), + GetMenu(g_ddraw->hwnd) != NULL, + real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + + // set minimum window size + //mmi->ptMinTrackSize.x = rc.right - rc.left; + //mmi->ptMinTrackSize.y = rc.bottom - rc.top; + + if (mmi->ptMaxTrackSize.x < rc.right - rc.left) + mmi->ptMaxTrackSize.x = rc.right - rc.left; + + if (mmi->ptMaxTrackSize.y < rc.bottom - rc.top) + mmi->ptMaxTrackSize.y = rc.bottom - rc.top; + + return 0; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } case WM_NCACTIVATE: { if (g_ddraw->noactivateapp) From 1a5fe96b287f087a77b773813ab7aee1a9e9fa68 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Aug 2023 19:05:20 +0200 Subject: [PATCH 0618/1724] some tweak for last commit --- src/dd.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 1666a17..99c9801 100644 --- a/src/dd.c +++ b/src/dd.c @@ -720,6 +720,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* everything failed, use windowed/borderless mode instead */ + ChangeDisplaySettings(NULL, 0); + g_ddraw->render.width = g_ddraw->width; g_ddraw->render.height = g_ddraw->height; @@ -728,11 +730,22 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->windowed = TRUE; - if (g_ddraw->render.width <= real_GetSystemMetrics(SM_CXSCREEN) && - g_ddraw->render.height <= real_GetSystemMetrics(SM_CYSCREEN)) + if (g_ddraw->render.width <= g_ddraw->mode.dmPelsWidth && + g_ddraw->render.height <= g_ddraw->mode.dmPelsHeight) { /* Switch to borderless mode if window fits into screen */ g_ddraw->fullscreen = TRUE; + border = FALSE; + + g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; + g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + + /* prevent OpenGL from going automatically into fullscreen exclusive mode */ + if (g_ddraw->renderer == ogl_render_main) + nonexclusive = TRUE; } else { From 3c4ec82617bb577883604e6a333cebfd67c182d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Aug 2023 19:18:12 +0200 Subject: [PATCH 0619/1724] make sure window titlebar is visible if window bigger than screen --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 99c9801..c729a1d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -887,6 +887,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { x = y = 0; } + else if (border && g_config.window_rect.top == -32000 && y < 0) + { + /* Make window titlebar visible if window does not fit into screen */ + y = real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); + } if (util_is_minimized(g_ddraw->hwnd)) real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); From ded6255a03ae37a12022be9c44457388520ade7f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Aug 2023 21:23:37 +0200 Subject: [PATCH 0620/1724] make util_get_lowest_resolution slightly more strict --- src/utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index ec231d4..f556bd6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -212,7 +212,7 @@ BOOL util_get_lowest_resolution( DWORD max_height) { BOOL result = FALSE; - int org_ratio = (int)((ratio + 0.005f) * 10); + int org_ratio = (int)((ratio + 0.005f) * 100); SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 }; DWORD i = 0; DEVMODE m; @@ -228,9 +228,9 @@ BOOL util_get_lowest_resolution( m.dmPelsWidth <= lowest.cx && m.dmPelsHeight <= lowest.cy) { - int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10); + int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100); - if (res_ratio == org_ratio) + if (abs(res_ratio - org_ratio) <= 5) { result = TRUE; out_res->cx = lowest.cx = m.dmPelsWidth; From 62bb150c7146458c8acbfd3975a98217a1b24a8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Aug 2023 21:39:30 +0200 Subject: [PATCH 0621/1724] don't add 1 to min height --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index c729a1d..ec4f38f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -685,7 +685,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl (float)g_ddraw->width / g_ddraw->height, &res, g_ddraw->width + 1, /* don't return the original resolution since we tested that one already */ - g_ddraw->height + 1, + g_ddraw->height, g_ddraw->mode.dmPelsWidth, g_ddraw->mode.dmPelsHeight); From e9f1023a3151fb970ffae3c80b154db1bed12a34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Aug 2023 21:28:53 +0200 Subject: [PATCH 0622/1724] add option to select built-in opengl shaders --- config/ConfigFormUnit.cpp | 17 +++++++++++++--- inc/openglshader.h | 36 ++++++++++++++++---------------- src/config.c | 3 ++- src/render_ogl.c | 43 ++++++++++++++++++++++++++++++--------- 4 files changed, 67 insertions(+), 32 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 602b8c4..7ae9420 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -778,14 +778,25 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) for (int i = 0; i < list.Length; i++) ShaderCbx->AddItem(list[i], NULL); - - auto shader = ini->ReadString("ddraw", "shader", ""); - ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); } catch (...) { } + if (ShaderCbx->Items->Count == 0) { + ShaderCbx->AddItem("Nearest neighbor", NULL); + ShaderCbx->AddItem("Bilinear", NULL); + ShaderCbx->AddItem("Bicubic", NULL); + } + + auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); + ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); + + if (ShaderCbx->ItemIndex == -1) { + ShaderCbx->AddItem(shader, NULL); + ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1; + } + int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); switch (d3d9_filter) { diff --git a/inc/openglshader.h b/inc/openglshader.h index 9502f8a..fce2c96 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -15,25 +15,25 @@ const char PASSTHROUGH_VERT_SHADER_110[] = const char PALETTE_FRAG_SHADER_110[] = "#version 110\n" - "uniform sampler2D SurfaceTex; \n" - "uniform sampler2D PaletteTex; \n" + "uniform sampler2D Texture; \n" + "uniform sampler2D PaletteTexture; \n" "varying vec2 TEX0; \n" "\n" "void main()\n" "{\n" - " vec4 pIndex = texture2D(SurfaceTex, TEX0); \n" - " gl_FragColor = texture2D(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n" + " vec4 pIndex = texture2D(Texture, TEX0); \n" + " gl_FragColor = texture2D(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n" "}\n"; const char PASSTHROUGH_FRAG_SHADER_110[] = "#version 110\n" - "uniform sampler2D SurfaceTex; \n" + "uniform sampler2D Texture; \n" "varying vec2 TEX0; \n" "\n" "void main()\n" "{\n" - " vec4 texel = texture2D(SurfaceTex, TEX0); \n" + " vec4 texel = texture2D(Texture, TEX0); \n" " gl_FragColor = texel; \n" "}\n"; @@ -59,26 +59,26 @@ const char PASSTHROUGH_VERT_SHADER[] = const char PALETTE_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" - "uniform sampler2D SurfaceTex;\n" - "uniform sampler2D PaletteTex;\n" + "uniform sampler2D Texture;\n" + "uniform sampler2D PaletteTexture;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" - " FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" + " vec4 pIndex = texture(Texture, TEX0.xy);\n" + " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" "}\n"; const char PASSTHROUGH_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" - "uniform sampler2D SurfaceTex;\n" + "uniform sampler2D Texture;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 texel = texture(SurfaceTex, TEX0.xy);\n" + " vec4 texel = texture(Texture, TEX0.xy);\n" " FragColor = texel;\n" "}\n"; @@ -104,26 +104,26 @@ const char PASSTHROUGH_VERT_SHADER_CORE[] = const char PALETTE_FRAG_SHADER_CORE[] = "#version 150\n" "out vec4 FragColor;\n" - "uniform sampler2D SurfaceTex;\n" - "uniform sampler2D PaletteTex;\n" + "uniform sampler2D Texture;\n" + "uniform sampler2D PaletteTexture;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" - " FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" + " vec4 pIndex = texture(Texture, TEX0.xy);\n" + " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" "}\n"; const char PASSTHROUGH_FRAG_SHADER_CORE[] = "#version 150\n" "out vec4 FragColor;\n" - "uniform sampler2D SurfaceTex;\n" + "uniform sampler2D Texture;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 texel = texture(SurfaceTex, TEX0.xy);\n" + " vec4 texel = texture(Texture, TEX0.xy);\n" " FragColor = texel;\n" "}\n"; diff --git a/src/config.c b/src/config.c index 61f7cc7..1432287 100644 --- a/src/config.c +++ b/src/config.c @@ -275,7 +275,8 @@ static void cfg_create_ini() "\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" - "; Note: Defauls to Bicubic Catmull-Rom if no shader specified or file was not found\n" + "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" + "; Possible values: Nearest neighbor, Bilinear, Bicubic\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" diff --git a/src/render_ogl.c b/src/render_ogl.c index 3ebe84a..1d5c963 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -185,15 +185,24 @@ static void ogl_build_programs() (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height)) { - g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, CATMULL_ROM_FRAG_SHADER); + g_ogl.scale_program = + oglu_build_program( + PASSTHROUGH_VERT_SHADER, + _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : + _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : + CATMULL_ROM_FRAG_SHADER); if (!g_ogl.scale_program) { g_ogl.scale_program = - oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, CATMULL_ROM_FRAG_SHADER_CORE); + oglu_build_program( + PASSTHROUGH_VERT_SHADER_CORE, + _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : + _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : + CATMULL_ROM_FRAG_SHADER_CORE); } - bilinear = TRUE; + bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0; } } } @@ -365,10 +374,10 @@ static void ogl_init_main_program() glUseProgram(g_ogl.main_program); - glUniform1i(glGetUniformLocation(g_ogl.main_program, "SurfaceTex"), 0); + glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0); if (g_ddraw->bpp == 8) - glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTex"), 1); + glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1); if (g_oglu_got_version3) { @@ -521,11 +530,25 @@ static void ogl_init_scale_program() output_size[0] = (float)g_ddraw->render.viewport.width; output_size[1] = (float)g_ddraw->render.viewport.height; - glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "OutputSize"), 1, output_size); - glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "TextureSize"), 1, texture_size); - glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "InputSize"), 1, input_size); - glUniform1i(glGetUniformLocation(g_ogl.scale_program, "FrameDirection"), 1); - glUniform1i(glGetUniformLocation(g_ogl.scale_program, "Texture"), 0); + GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize"); + if (loc != -1) + glUniform2fv(loc, 1, output_size); + + loc = glGetUniformLocation(g_ogl.scale_program, "TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + + loc = glGetUniformLocation(g_ogl.scale_program, "InputSize"); + if (loc != -1) + glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.scale_program, "FrameDirection"); + if (loc != -1) + glUniform1i(loc, 1); + + loc = glGetUniformLocation(g_ogl.scale_program, "Texture"); + if (loc != -1) + glUniform1i(loc, 0); const float mvp_matrix[16] = { 1,0,0,0, From 9d37c7169f9ee266a6013868ca937dbb32ddcd38 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Aug 2023 22:02:21 +0200 Subject: [PATCH 0623/1724] add Lanczos2 opengl shader --- config/ConfigFormUnit.cpp | 1 + inc/openglshader.h | 216 ++++++++++++++++++++++++++++++++++++++ src/opengl_utils.c | 4 +- src/render_ogl.c | 6 +- 4 files changed, 224 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 7ae9420..3a1564a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -787,6 +787,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) ShaderCbx->AddItem("Nearest neighbor", NULL); ShaderCbx->AddItem("Bilinear", NULL); ShaderCbx->AddItem("Bicubic", NULL); + ShaderCbx->AddItem("Lanczos", NULL); } auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); diff --git a/inc/openglshader.h b/inc/openglshader.h index fce2c96..94a9d22 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -250,6 +250,222 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" "}\n"; +/* +// The following code is licensed under the MIT license: +// Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader +// Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com +// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl +*/ +const char LANCZOS2_FRAG_SHADER[] = + "#version 130\n" + "#define JINC2_WINDOW_SINC 0.5\n" + "#define JINC2_SINC 1.0\n" + "#define JINC2_AR_STRENGTH 0.8\n" + "\n" + "out vec4 FragColor;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "uniform sampler2D Texture;\n" + "in vec4 TEX0;\n" + "\n" + "const float pi = 3.1415926535897932384626433832795;\n" + "const float wa = JINC2_WINDOW_SINC*pi;\n" + "const float wb = JINC2_SINC*pi;\n" + "\n" + "// Calculates the distance between two points\n" + "float d(vec2 pt1, vec2 pt2)\n" + "{\n" + " vec2 v = pt2 - pt1;\n" + " return sqrt(dot(v,v));\n" + "}\n" + "\n" + "vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)\n" + "{\n" + " return min(a, min(b, min(c, d)));\n" + "}\n" + "\n" + "vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)\n" + "{\n" + " return max(a, max(b, max(c, d)));\n" + "}\n" + "\n" + "vec4 resampler(vec4 x)\n" + "{\n" + " vec4 res;\n" + "\n" + " res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);\n" + " res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);\n" + " res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);\n" + " res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);\n" + "\n" + " return res;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec3 color;\n" + " vec4 weights[4];\n" + "\n" + " vec2 dx = vec2(1.0, 0.0);\n" + " vec2 dy = vec2(0.0, 1.0);\n" + "\n" + " vec2 pc = TEX0.xy*TextureSize;\n" + "\n" + " vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));\n" + " \n" + " weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));\n" + " weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));\n" + " weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));\n" + " weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));\n" + "\n" + " dx = dx/TextureSize;\n" + " dy = dy/TextureSize;\n" + " tc = tc/TextureSize;\n" + "\n" + " vec3 c00 = texture(Texture, tc -dx -dy).xyz;\n" + " vec3 c10 = texture(Texture, tc -dy).xyz;\n" + " vec3 c20 = texture(Texture, tc +dx -dy).xyz;\n" + " vec3 c30 = texture(Texture, tc+2.0*dx -dy).xyz;\n" + " vec3 c01 = texture(Texture, tc -dx ).xyz;\n" + " vec3 c11 = texture(Texture, tc ).xyz;\n" + " vec3 c21 = texture(Texture, tc +dx ).xyz;\n" + " vec3 c31 = texture(Texture, tc+2.0*dx ).xyz;\n" + " vec3 c02 = texture(Texture, tc -dx +dy).xyz;\n" + " vec3 c12 = texture(Texture, tc +dy).xyz;\n" + " vec3 c22 = texture(Texture, tc +dx +dy).xyz;\n" + " vec3 c32 = texture(Texture, tc+2.0*dx +dy).xyz;\n" + " vec3 c03 = texture(Texture, tc -dx+2.0*dy).xyz;\n" + " vec3 c13 = texture(Texture, tc +2.0*dy).xyz;\n" + " vec3 c23 = texture(Texture, tc +dx+2.0*dy).xyz;\n" + " vec3 c33 = texture(Texture, tc+2.0*dx+2.0*dy).xyz;\n" + " \n" + " // Get min/max samples\n" + " vec3 min_sample = min4(c11, c21, c12, c22);\n" + " vec3 max_sample = max4(c11, c21, c12, c22);\n" + " \n" + " color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));\n" + " color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));\n" + " color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));\n" + " color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));\n" + " color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));\n" + "\n" + " // Anti-ringing\n" + " vec3 aux = color;\n" + " color = clamp(color, min_sample, max_sample);\n" + " color = mix(aux, color, JINC2_AR_STRENGTH);\n" + "\n" + " // final sum and weight normalization\n" + " FragColor.xyz = color;\n" + "}\n"; + + +const char LANCZOS2_FRAG_SHADER_CORE[] = + "#version 150\n" + "#define JINC2_WINDOW_SINC 0.5\n" + "#define JINC2_SINC 1.0\n" + "#define JINC2_AR_STRENGTH 0.8\n" + "\n" + "out vec4 FragColor;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "uniform sampler2D Texture;\n" + "in vec4 TEX0;\n" + "\n" + "const float pi = 3.1415926535897932384626433832795;\n" + "const float wa = JINC2_WINDOW_SINC*pi;\n" + "const float wb = JINC2_SINC*pi;\n" + "\n" + "// Calculates the distance between two points\n" + "float d(vec2 pt1, vec2 pt2)\n" + "{\n" + " vec2 v = pt2 - pt1;\n" + " return sqrt(dot(v,v));\n" + "}\n" + "\n" + "vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)\n" + "{\n" + " return min(a, min(b, min(c, d)));\n" + "}\n" + "\n" + "vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)\n" + "{\n" + " return max(a, max(b, max(c, d)));\n" + "}\n" + "\n" + "vec4 resampler(vec4 x)\n" + "{\n" + " vec4 res;\n" + "\n" + " res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);\n" + " res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);\n" + " res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);\n" + " res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);\n" + "\n" + " return res;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec3 color;\n" + " vec4 weights[4];\n" + "\n" + " vec2 dx = vec2(1.0, 0.0);\n" + " vec2 dy = vec2(0.0, 1.0);\n" + "\n" + " vec2 pc = TEX0.xy*TextureSize;\n" + "\n" + " vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));\n" + " \n" + " weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));\n" + " weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));\n" + " weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));\n" + " weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));\n" + "\n" + " dx = dx/TextureSize;\n" + " dy = dy/TextureSize;\n" + " tc = tc/TextureSize;\n" + "\n" + " vec3 c00 = texture(Texture, tc -dx -dy).xyz;\n" + " vec3 c10 = texture(Texture, tc -dy).xyz;\n" + " vec3 c20 = texture(Texture, tc +dx -dy).xyz;\n" + " vec3 c30 = texture(Texture, tc+2.0*dx -dy).xyz;\n" + " vec3 c01 = texture(Texture, tc -dx ).xyz;\n" + " vec3 c11 = texture(Texture, tc ).xyz;\n" + " vec3 c21 = texture(Texture, tc +dx ).xyz;\n" + " vec3 c31 = texture(Texture, tc+2.0*dx ).xyz;\n" + " vec3 c02 = texture(Texture, tc -dx +dy).xyz;\n" + " vec3 c12 = texture(Texture, tc +dy).xyz;\n" + " vec3 c22 = texture(Texture, tc +dx +dy).xyz;\n" + " vec3 c32 = texture(Texture, tc+2.0*dx +dy).xyz;\n" + " vec3 c03 = texture(Texture, tc -dx+2.0*dy).xyz;\n" + " vec3 c13 = texture(Texture, tc +2.0*dy).xyz;\n" + " vec3 c23 = texture(Texture, tc +dx+2.0*dy).xyz;\n" + " vec3 c33 = texture(Texture, tc+2.0*dx+2.0*dy).xyz;\n" + " \n" + " // Get min/max samples\n" + " vec3 min_sample = min4(c11, c21, c12, c22);\n" + " vec3 max_sample = max4(c11, c21, c12, c22);\n" + " \n" + " color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));\n" + " color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));\n" + " color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));\n" + " color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));\n" + " color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));\n" + "\n" + " // Anti-ringing\n" + " vec3 aux = color;\n" + " color = clamp(color, min_sample, max_sample);\n" + " color = mix(aux, color, JINC2_AR_STRENGTH);\n" + "\n" + " // final sum and weight normalization\n" + " FragColor.xyz = color;\n" + "}\n"; #endif diff --git a/src/opengl_utils.c b/src/opengl_utils.c index f1bc32b..94dda4e 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -283,14 +283,14 @@ GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { - /* + /**/ GLint len = 0; glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); char* log = calloc(len + 50, 1); glGetShaderInfoLog(frag_shader, len, &len, &log[0]); TRACE("| GL_LOG: %s\n", log); free(log); - */ + if (glDeleteShader) { glDeleteShader(frag_shader); diff --git a/src/render_ogl.c b/src/render_ogl.c index 1d5c963..9a45936 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -190,6 +190,7 @@ static void ogl_build_programs() PASSTHROUGH_VERT_SHADER, _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : + _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : CATMULL_ROM_FRAG_SHADER); if (!g_ogl.scale_program) @@ -199,10 +200,13 @@ static void ogl_build_programs() PASSTHROUGH_VERT_SHADER_CORE, _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : + _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER_CORE : CATMULL_ROM_FRAG_SHADER_CORE); } - bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0; + bilinear = TRUE; + _stricmp(g_ddraw->shader, "Nearest neighbor") != 0 && + _stricmp(g_ddraw->shader, "Lanczos") != 0; } } } From 93e88793432da5f71780cd92e1a32268ac82b90c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Aug 2023 22:10:21 +0200 Subject: [PATCH 0624/1724] disable debug code --- config/ConfigFormUnit.cpp | 2 +- src/opengl_utils.c | 4 ++-- src/render_ogl.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3a1564a..547754a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -787,7 +787,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) ShaderCbx->AddItem("Nearest neighbor", NULL); ShaderCbx->AddItem("Bilinear", NULL); ShaderCbx->AddItem("Bicubic", NULL); - ShaderCbx->AddItem("Lanczos", NULL); + ShaderCbx->AddItem("Lanczos", NULL); } auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 94dda4e..f1bc32b 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -283,14 +283,14 @@ GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { - /**/ + /* GLint len = 0; glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); char* log = calloc(len + 50, 1); glGetShaderInfoLog(frag_shader, len, &len, &log[0]); TRACE("| GL_LOG: %s\n", log); free(log); - + */ if (glDeleteShader) { glDeleteShader(frag_shader); diff --git a/src/render_ogl.c b/src/render_ogl.c index 9a45936..74156a9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -204,7 +204,7 @@ static void ogl_build_programs() CATMULL_ROM_FRAG_SHADER_CORE); } - bilinear = TRUE; + bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0 && _stricmp(g_ddraw->shader, "Lanczos") != 0; } From 4e42b904665e5731e233c777757b0b2f87070a5c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Aug 2023 22:25:56 +0200 Subject: [PATCH 0625/1724] add Lanczos to Possible values comment --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 1432287..28c4bf9 100644 --- a/src/config.c +++ b/src/config.c @@ -276,7 +276,7 @@ static void cfg_create_ini() "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" - "; Possible values: Nearest neighbor, Bilinear, Bicubic\n" + "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" From 88160d7f60a5b855830ddbf12ccff253f54b0084 Mon Sep 17 00:00:00 2001 From: Kappa971 <62349018+Kappa971@users.noreply.github.com> Date: Mon, 28 Aug 2023 18:51:57 +0200 Subject: [PATCH 0626/1724] Update Italian translation (two little fix) --- config/ConfigFormUnit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 547754a..ed1c372 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -469,7 +469,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) AdvancedBtn->Caption = L"Impostazioni avanzate"; HotkeyBtn->Caption = L"Tasti di scelta rapida"; CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; - RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni di default"; + RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni predefinite"; PresentationLbl->Caption = L"Presentazione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; @@ -485,7 +485,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaximizeWindowLbl->Caption = L"Ingrandisci finestra"; UnlockCursor1Lbl->Caption = L"Sblocca cursore 1"; UnlockCursor2Lbl->Caption = L"Sblocca cursore 2"; - ScreenshotLbl->Caption = L"Immagine dello schermo"; + ScreenshotLbl->Caption = L"Istantanea dello schermo"; MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; ResolutionsLbl->Caption = L"Sblocca ulteriori risoluzioni dello schermo"; From 3716807d3d5644559024906cf5923ae54d9f38a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 29 Aug 2023 14:19:49 +0200 Subject: [PATCH 0627/1724] add glGetShaderInfoLog output to logs --- src/opengl_utils.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index f1bc32b..f7b7dce 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -216,7 +216,7 @@ void oglu_init() g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } - + if (g_ddraw->opengl_core) { wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); @@ -270,6 +270,22 @@ GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) glGetShaderiv(vert_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { +#ifdef _DEBUG + GLint len = 0; + glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); + if (len > 0) + { + char* log = calloc(len + 50, 1); + + if (log) + { + glGetShaderInfoLog(frag_shader, len, &len, &log[0]); + TRACE("glGetShaderInfoLog (Vertex):\n%s", log); + free(log); + } + } +#endif + if (glDeleteShader) glDeleteShader(vert_shader); @@ -283,14 +299,22 @@ GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { - /* +#ifdef _DEBUG GLint len = 0; glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); - char* log = calloc(len + 50, 1); - glGetShaderInfoLog(frag_shader, len, &len, &log[0]); - TRACE("| GL_LOG: %s\n", log); - free(log); - */ + if (len > 0) + { + char* log = calloc(len + 50, 1); + + if (log) + { + glGetShaderInfoLog(frag_shader, len, &len, &log[0]); + TRACE("glGetShaderInfoLog (Fragment):\n%s", log); + free(log); + } + } +#endif + if (glDeleteShader) { glDeleteShader(frag_shader); From f85ffee65ab59ff9ea8a4b1b86c6dd16da643bdb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 29 Aug 2023 17:35:09 +0200 Subject: [PATCH 0628/1724] remove duplicate shaders --- inc/opengl_utils.h | 2 +- inc/openglshader.h | 223 ++------------------------------------------- src/opengl_utils.c | 29 +++++- src/render_ogl.c | 36 ++------ 4 files changed, 44 insertions(+), 246 deletions(-) diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index ccccb75..63d2a73 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -36,7 +36,7 @@ extern PFNGLVERTEX2FPROC glVertex2f; BOOL oglu_load_dll(); void oglu_init(); BOOL oglu_ext_exists(char* ext, HDC hdc); -GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source); +GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile); GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile); extern PFNGLVIEWPORTPROC glViewport; diff --git a/inc/openglshader.h b/inc/openglshader.h index 94a9d22..e84b60c 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -3,7 +3,7 @@ /* OpenGL 2.0 */ -const char PASSTHROUGH_VERT_SHADER_110[] = +static char PASSTHROUGH_VERT_SHADER_110[] = "#version 110\n" "varying vec2 TEX0; \n" "\n" @@ -13,7 +13,8 @@ const char PASSTHROUGH_VERT_SHADER_110[] = " TEX0 = gl_MultiTexCoord0.xy; \n" "}\n"; -const char PALETTE_FRAG_SHADER_110[] = + +static char PALETTE_FRAG_SHADER_110[] = "#version 110\n" "uniform sampler2D Texture; \n" "uniform sampler2D PaletteTexture; \n" @@ -26,7 +27,7 @@ const char PALETTE_FRAG_SHADER_110[] = "}\n"; -const char PASSTHROUGH_FRAG_SHADER_110[] = +static char PASSTHROUGH_FRAG_SHADER_110[] = "#version 110\n" "uniform sampler2D Texture; \n" "varying vec2 TEX0; \n" @@ -39,7 +40,7 @@ const char PASSTHROUGH_FRAG_SHADER_110[] = /* OpenGL 3.0 */ -const char PASSTHROUGH_VERT_SHADER[] = +static char PASSTHROUGH_VERT_SHADER[] = "#version 130\n" "in vec4 VertexCoord;\n" "in vec4 COLOR;\n" @@ -56,7 +57,7 @@ const char PASSTHROUGH_VERT_SHADER[] = "}\n"; -const char PALETTE_FRAG_SHADER[] = +static char PALETTE_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" "uniform sampler2D Texture;\n" @@ -70,7 +71,7 @@ const char PALETTE_FRAG_SHADER[] = "}\n"; -const char PASSTHROUGH_FRAG_SHADER[] = +static char PASSTHROUGH_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" "uniform sampler2D Texture;\n" @@ -82,50 +83,6 @@ const char PASSTHROUGH_FRAG_SHADER[] = " FragColor = texel;\n" "}\n"; -/* OpenGL 3.2 (Core Profile) */ - -const char PASSTHROUGH_VERT_SHADER_CORE[] = - "#version 150\n" - "in vec4 VertexCoord;\n" - "in vec4 COLOR;\n" - "in vec4 TexCoord;\n" - "out vec4 COL0;\n" - "out vec4 TEX0;\n" - "uniform mat4 MVPMatrix;\n" - "\n" - "void main()\n" - "{\n" - " gl_Position = MVPMatrix * VertexCoord;\n" - " COL0 = COLOR;\n" - " TEX0.xy = TexCoord.xy;\n" - "}\n"; - - -const char PALETTE_FRAG_SHADER_CORE[] = - "#version 150\n" - "out vec4 FragColor;\n" - "uniform sampler2D Texture;\n" - "uniform sampler2D PaletteTexture;\n" - "in vec4 TEX0;\n" - "\n" - "void main()\n" - "{\n" - " vec4 pIndex = texture(Texture, TEX0.xy);\n" - " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" - "}\n"; - - -const char PASSTHROUGH_FRAG_SHADER_CORE[] = - "#version 150\n" - "out vec4 FragColor;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "void main()\n" - "{\n" - " vec4 texel = texture(Texture, TEX0.xy);\n" - " FragColor = texel;\n" - "}\n"; /* // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae @@ -135,7 +92,7 @@ const char PASSTHROUGH_FRAG_SHADER_CORE[] = // Modified to use 5 texture fetches */ -const char CATMULL_ROM_FRAG_SHADER[] = +static char CATMULL_ROM_FRAG_SHADER[] = "#version 130\n" "out mediump vec4 FragColor;\n" "uniform int FrameDirection;\n" @@ -193,63 +150,6 @@ const char CATMULL_ROM_FRAG_SHADER[] = "}\n"; -const char CATMULL_ROM_FRAG_SHADER_CORE[] = - "#version 150\n" - "out mediump vec4 FragColor;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "#define Source Texture\n" - "#define vTexCoord TEX0.xy\n" - "\n" - "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" - "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" - "\n" - "void main()\n" - "{\n" - " vec2 samplePos = vTexCoord * SourceSize.xy;\n" - " vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n" - "\n" - " vec2 f = samplePos - texPos1;\n" - "\n" - " vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));\n" - " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" - " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" - " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" - "\n" - " vec2 w12 = w1 + w2;\n" - " vec2 offset12 = w2 / (w1 + w2);\n" - "\n" - " vec2 texPos0 = texPos1 - 1.;\n" - " vec2 texPos3 = texPos1 + 2.;\n" - " vec2 texPos12 = texPos1 + offset12;\n" - "\n" - " texPos0 *= SourceSize.zw;\n" - " texPos3 *= SourceSize.zw;\n" - " texPos12 *= SourceSize.zw;\n" - "\n" - " float wtm = w12.x * w0.y;\n" - " float wml = w0.x * w12.y;\n" - " float wmm = w12.x * w12.y;\n" - " float wmr = w3.x * w12.y;\n" - " float wbm = w12.x * w3.y;\n" - "\n" - " vec3 result = vec3(0.0f);\n" - "\n" - " result += texture(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" - " result += texture(Source, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" - " result += texture(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" - " result += texture(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" - " result += texture(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" - "\n" - " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" - "}\n"; - /* // The following code is licensed under the MIT license: // Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader @@ -257,7 +157,7 @@ const char CATMULL_ROM_FRAG_SHADER_CORE[] = // https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl */ -const char LANCZOS2_FRAG_SHADER[] = +static char LANCZOS2_FRAG_SHADER[] = "#version 130\n" "#define JINC2_WINDOW_SINC 0.5\n" "#define JINC2_SINC 1.0\n" @@ -363,109 +263,4 @@ const char LANCZOS2_FRAG_SHADER[] = "}\n"; -const char LANCZOS2_FRAG_SHADER_CORE[] = - "#version 150\n" - "#define JINC2_WINDOW_SINC 0.5\n" - "#define JINC2_SINC 1.0\n" - "#define JINC2_AR_STRENGTH 0.8\n" - "\n" - "out vec4 FragColor;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "const float pi = 3.1415926535897932384626433832795;\n" - "const float wa = JINC2_WINDOW_SINC*pi;\n" - "const float wb = JINC2_SINC*pi;\n" - "\n" - "// Calculates the distance between two points\n" - "float d(vec2 pt1, vec2 pt2)\n" - "{\n" - " vec2 v = pt2 - pt1;\n" - " return sqrt(dot(v,v));\n" - "}\n" - "\n" - "vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)\n" - "{\n" - " return min(a, min(b, min(c, d)));\n" - "}\n" - "\n" - "vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)\n" - "{\n" - " return max(a, max(b, max(c, d)));\n" - "}\n" - "\n" - "vec4 resampler(vec4 x)\n" - "{\n" - " vec4 res;\n" - "\n" - " res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);\n" - " res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);\n" - " res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);\n" - " res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);\n" - "\n" - " return res;\n" - "}\n" - "\n" - "void main()\n" - "{\n" - " vec3 color;\n" - " vec4 weights[4];\n" - "\n" - " vec2 dx = vec2(1.0, 0.0);\n" - " vec2 dy = vec2(0.0, 1.0);\n" - "\n" - " vec2 pc = TEX0.xy*TextureSize;\n" - "\n" - " vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));\n" - " \n" - " weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));\n" - " weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));\n" - " weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));\n" - " weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));\n" - "\n" - " dx = dx/TextureSize;\n" - " dy = dy/TextureSize;\n" - " tc = tc/TextureSize;\n" - "\n" - " vec3 c00 = texture(Texture, tc -dx -dy).xyz;\n" - " vec3 c10 = texture(Texture, tc -dy).xyz;\n" - " vec3 c20 = texture(Texture, tc +dx -dy).xyz;\n" - " vec3 c30 = texture(Texture, tc+2.0*dx -dy).xyz;\n" - " vec3 c01 = texture(Texture, tc -dx ).xyz;\n" - " vec3 c11 = texture(Texture, tc ).xyz;\n" - " vec3 c21 = texture(Texture, tc +dx ).xyz;\n" - " vec3 c31 = texture(Texture, tc+2.0*dx ).xyz;\n" - " vec3 c02 = texture(Texture, tc -dx +dy).xyz;\n" - " vec3 c12 = texture(Texture, tc +dy).xyz;\n" - " vec3 c22 = texture(Texture, tc +dx +dy).xyz;\n" - " vec3 c32 = texture(Texture, tc+2.0*dx +dy).xyz;\n" - " vec3 c03 = texture(Texture, tc -dx+2.0*dy).xyz;\n" - " vec3 c13 = texture(Texture, tc +2.0*dy).xyz;\n" - " vec3 c23 = texture(Texture, tc +dx+2.0*dy).xyz;\n" - " vec3 c33 = texture(Texture, tc+2.0*dx+2.0*dy).xyz;\n" - " \n" - " // Get min/max samples\n" - " vec3 min_sample = min4(c11, c21, c12, c22);\n" - " vec3 max_sample = max4(c11, c21, c12, c22);\n" - " \n" - " color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));\n" - " color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));\n" - " color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));\n" - " color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));\n" - " color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));\n" - "\n" - " // Anti-ringing\n" - " vec3 aux = color;\n" - " color = clamp(color, min_sample, max_sample);\n" - " color = mix(aux, color, JINC2_AR_STRENGTH);\n" - "\n" - " // final sum and weight normalization\n" - " FragColor.xyz = color;\n" - "}\n"; - #endif diff --git a/src/opengl_utils.c b/src/opengl_utils.c index f7b7dce..988c5a1 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -247,12 +247,33 @@ BOOL oglu_ext_exists(char* ext, HDC hdc) return FALSE; } -GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) +GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile) { if (!glCreateShader || !glShaderSource || !glCompileShader || !glCreateProgram || - !glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader) + !glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader || + !vert_source || !frag_source) return 0; + char* version_start = strstr(vert_source, "#version"); + if (version_start && core_profile) + { + if (_strnicmp(version_start, "#version 130", 12) == 0 || + _strnicmp(version_start, "#version 140", 12) == 0) + { + memcpy(version_start, "#version 150", 12); + } + } + + version_start = strstr(frag_source, "#version"); + if (version_start && core_profile) + { + if (_strnicmp(version_start, "#version 130", 12) == 0 || + _strnicmp(version_start, "#version 140", 12) == 0) + { + memcpy(version_start, "#version 150", 12); + } + } + GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER); GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER); @@ -401,7 +422,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile) strcat(vert_source, version + strlen(version) + 1); strcat(frag_source, version + strlen(version) + 1); - program = oglu_build_program(vert_source, frag_source); + program = oglu_build_program(vert_source, frag_source, core_profile); } else { @@ -412,7 +433,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile) strcat(vert_source, source); strcat(frag_source, source); - program = oglu_build_program(vert_source, frag_source); + program = oglu_build_program(vert_source, frag_source, core_profile); } free(vert_source); diff --git a/src/render_ogl.c b/src/render_ogl.c index 74156a9..2a9871c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -133,25 +133,17 @@ static void ogl_build_programs() { g_ogl.main_program = g_ogl.scale_program = 0; + BOOL core_profile = wglCreateContextAttribsARB != NULL; + if (g_oglu_got_version3) { if (g_ddraw->bpp == 8) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER); - - if (!g_ogl.main_program) - { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PALETTE_FRAG_SHADER_CORE); - } + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); } else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER); - - if (!g_ogl.main_program) - { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PASSTHROUGH_FRAG_SHADER_CORE); - } + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile); } BOOL bilinear = FALSE; @@ -179,7 +171,7 @@ static void ogl_build_programs() g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) { - g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); + g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); if (!g_ogl.scale_program && (g_ddraw->render.viewport.width != g_ddraw->width || @@ -191,18 +183,8 @@ static void ogl_build_programs() _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : - CATMULL_ROM_FRAG_SHADER); - - if (!g_ogl.scale_program) - { - g_ogl.scale_program = - oglu_build_program( - PASSTHROUGH_VERT_SHADER_CORE, - _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : - _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE : - _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER_CORE : - CATMULL_ROM_FRAG_SHADER_CORE); - } + CATMULL_ROM_FRAG_SHADER, + core_profile); bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0 && @@ -222,11 +204,11 @@ static void ogl_build_programs() { if (g_ddraw->bpp == 8) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110); + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE); } else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110); + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE); } } } From 1cfa20802c59775785e8da0452251dbcd3287add Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 29 Aug 2023 18:24:32 +0200 Subject: [PATCH 0629/1724] add xBR-lv2 opengl shader --- config/ConfigFormUnit.cpp | 1 + inc/openglshader.h | 346 ++++++++++++++++++++++++++++++++++++++ src/config.c | 2 +- src/render_ogl.c | 5 +- 4 files changed, 352 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index ed1c372..1e5bdac 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -788,6 +788,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) ShaderCbx->AddItem("Bilinear", NULL); ShaderCbx->AddItem("Bicubic", NULL); ShaderCbx->AddItem("Lanczos", NULL); + ShaderCbx->AddItem("xBR-lv2", NULL); } auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); diff --git a/inc/openglshader.h b/inc/openglshader.h index e84b60c..2e2875a 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -262,5 +262,351 @@ static char LANCZOS2_FRAG_SHADER[] = " FragColor.xyz = color;\n" "}\n"; +/* +// The following code is licensed under the MIT license: +// Hyllian's xBR-lv2 Shader +// Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com +// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/xbr/shaders/xbr-lv2.glsl +*/ + +static char XBR_LV2_VERT_SHADER[] = + "#version 130\n" + " \n" + "#define texCoord TEX0\n" + "#define t1 TEX1\n" + "#define t2 TEX2\n" + "#define t3 TEX3\n" + "#define t4 TEX4\n" + "#define t5 TEX5\n" + "#define t6 TEX6\n" + "#define t7 TEX7\n" + "\n" + "in vec4 VertexCoord;\n" + "in vec4 Color;\n" + "in vec2 TexCoord;\n" + "\n" + "out vec4 color;\n" + "out vec2 texCoord;\n" + "out vec4 t1;\n" + "out vec4 t2;\n" + "out vec4 t3;\n" + "out vec4 t4;\n" + "out vec4 t5;\n" + "out vec4 t6;\n" + "out vec4 t7;\n" + "\n" + "uniform mat4 MVPMatrix;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = MVPMatrix * VertexCoord;\n" + " color = Color;\n" + "\n" + " float dx = (1.0/TextureSize.x);\n" + " float dy = (1.0/TextureSize.y);\n" + "\n" + " texCoord = TexCoord;\n" + " texCoord.x *= 1.00000001;\n" + " t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1\n" + " t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C\n" + " t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F\n" + " t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I\n" + " t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5\n" + " t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0\n" + " t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4\n" + "}\n"; + +static char XBR_LV2_FRAG_SHADER[] = + "#version 130\n" + "\n" + "//#pragma parameter XBR_SCALE \"xBR Scale\" 3.0 1.0 5.0 1.0\n" + "#pragma parameter XBR_Y_WEIGHT \"Y Weight\" 48.0 0.0 100.0 1.0\n" + "#pragma parameter XBR_EQ_THRESHOLD \"Eq Threshold\" 15.0 0.0 50.0 1.0\n" + "#pragma parameter XBR_LV1_COEFFICIENT \"Lv1 Coefficient\" 0.5 0.0 30.0 0.5\n" + "#pragma parameter XBR_LV2_COEFFICIENT \"Lv2 Coefficient\" 2.0 1.0 3.0 0.1\n" + "#pragma parameter small_details \"Preserve Small Details\" 0.0 0.0 1.0 1.0\n" + "\n" + "#define mul(a,b) (b*a)\n" + "\n" + "// Uncomment just one of the three params below to choose the corner detection\n" + "//#define CORNER_A\n" + "//#define CORNER_B\n" + "#define CORNER_C\n" + "//#define CORNER_D\n" + "\n" + "#ifndef CORNER_A\n" + " #define SMOOTH_TIPS\n" + "#endif\n" + "\n" + "#define XBR_SCALE 3.0\n" + "\n" + "#define lv2_cf XBR_LV2_COEFFICIENT\n" + " \n" + "#define texCoord TEX0\n" + "#define t1 TEX1\n" + "#define t2 TEX2\n" + "#define t3 TEX3\n" + "#define t4 TEX4\n" + "#define t5 TEX5\n" + "#define t6 TEX6\n" + "#define t7 TEX7\n" + "\n" + "\n" + "//#pragma parameter XBR_SCALE \"xBR Scale\" 3.0 1.0 5.0 1.0\n" + "#pragma parameter XBR_Y_WEIGHT \"Y Weight\" 48.0 0.0 100.0 1.0\n" + "#pragma parameter XBR_EQ_THRESHOLD \"Eq Threshold\" 15.0 0.0 50.0 1.0\n" + "#pragma parameter XBR_LV1_COEFFICIENT \"Lv1 Coefficient\" 0.5 0.0 30.0 0.5\n" + "#pragma parameter XBR_LV2_COEFFICIENT \"Lv2 Coefficient\" 2.0 1.0 3.0 0.1\n" + "#pragma parameter small_details \"Preserve Small Details\" 0.0 0.0 1.0 1.0\n" + "\n" + "#define mul(a,b) (b*a)\n" + "\n" + "// Uncomment just one of the three params below to choose the corner detection\n" + "//#define CORNER_A\n" + "//#define CORNER_B\n" + "#define CORNER_C\n" + "//#define CORNER_D\n" + "\n" + "#ifndef CORNER_A\n" + " #define SMOOTH_TIPS\n" + "#endif\n" + "\n" + "#define XBR_SCALE 3.0\n" + "\n" + "#define lv2_cf XBR_LV2_COEFFICIENT\n" + " \n" + "#define texCoord TEX0\n" + "#define t1 TEX1\n" + "#define t2 TEX2\n" + "#define t3 TEX3\n" + "#define t4 TEX4\n" + "#define t5 TEX5\n" + "#define t6 TEX6\n" + "#define t7 TEX7\n" + "\n" + "out vec4 FragColor;\n" + "uniform int FrameDirection;\n" + "uniform int FrameCount;\n" + "uniform vec2 OutputSize;\n" + "uniform vec2 TextureSize;\n" + "uniform vec2 InputSize;\n" + "uniform sampler2D decal;\n" + "in vec2 texCoord;\n" + "in vec4 t1;\n" + "in vec4 t2;\n" + "in vec4 t3;\n" + "in vec4 t4;\n" + "in vec4 t5;\n" + "in vec4 t6;\n" + "in vec4 t7;\n" + "\n" + "#ifdef PARAMETER_UNIFORM\n" + "uniform float XBR_Y_WEIGHT;\n" + "uniform float XBR_EQ_THRESHOLD;\n" + "uniform float XBR_LV1_COEFFICIENT;\n" + "uniform float XBR_LV2_COEFFICIENT;\n" + "uniform float small_details;\n" + "#else\n" + "#define XBR_Y_WEIGHT 48.0\n" + "#define XBR_EQ_THRESHOLD 15.0\n" + "#define XBR_LV1_COEFFICIENT 0.5\n" + "#define XBR_LV2_COEFFICIENT 2.0\n" + "#define small_details 0.0\n" + "#endif\n" + "// END PARAMETERS //\n" + "\n" + "const float coef = 2.0;\n" + "const vec3 rgbw = vec3(14.352, 28.176, 5.472);\n" + "const vec4 eq_threshold = vec4(15.0, 15.0, 15.0, 15.0);\n" + "\n" + "vec4 delta = vec4(1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE);\n" + "vec4 delta_l = vec4(0.5/XBR_SCALE, 1.0/XBR_SCALE, 0.5/XBR_SCALE, 1.0/XBR_SCALE);\n" + "vec4 delta_u = delta_l.yxwz;\n" + "\n" + "const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 );\n" + "const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 );\n" + "const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 );\n" + "const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 );\n" + "const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 );\n" + "const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 );\n" + "const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 );\n" + "const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 );\n" + "const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 );\n" + "const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25);\n" + "\n" + "const vec3 Y = vec3(0.2126, 0.7152, 0.0722);\n" + "\n" + "// Difference between vector components.\n" + "vec4 df(vec4 A, vec4 B)\n" + "{\n" + " return vec4(abs(A-B));\n" + "}\n" + "\n" + "// Compare two vectors and return their components are different.\n" + "vec4 diff(vec4 A, vec4 B)\n" + "{\n" + " return vec4(notEqual(A, B));\n" + "}\n" + "\n" + "// Determine if two vector components are equal based on a threshold.\n" + "vec4 eq(vec4 A, vec4 B)\n" + "{\n" + " return (step(df(A, B), vec4(XBR_EQ_THRESHOLD)));\n" + "}\n" + "\n" + "// Determine if two vector components are NOT equal based on a threshold.\n" + "vec4 neq(vec4 A, vec4 B)\n" + "{\n" + " return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B));\n" + "}\n" + "\n" + "// Weighted distance.\n" + "vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h)\n" + "{\n" + " return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h));\n" + "}\n" + "\n" + "vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l)\n" + "{\n" + " return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h));\n" + "}\n" + "\n" + "float c_df(vec3 c1, vec3 c2) \n" + "{\n" + " vec3 df = abs(c1 - c2);\n" + " return df.r + df.g + df.b;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec4 edri, edr, edr_l, edr_u, px; // px = pixel, edr = edge detection rule\n" + " vec4 irlv0, irlv1, irlv2l, irlv2u, block_3d;\n" + " vec4 fx, fx_l, fx_u; // inequations of straight lines.\n" + "\n" + " vec2 fp = fract(texCoord*TextureSize);\n" + "\n" + " vec3 A1 = texture(decal, t1.xw ).xyz;\n" + " vec3 B1 = texture(decal, t1.yw ).xyz;\n" + " vec3 C1 = texture(decal, t1.zw ).xyz;\n" + " vec3 A = texture(decal, t2.xw ).xyz;\n" + " vec3 B = texture(decal, t2.yw ).xyz;\n" + " vec3 C = texture(decal, t2.zw ).xyz;\n" + " vec3 D = texture(decal, t3.xw ).xyz;\n" + " vec3 E = texture(decal, t3.yw ).xyz;\n" + " vec3 F = texture(decal, t3.zw ).xyz;\n" + " vec3 G = texture(decal, t4.xw ).xyz;\n" + " vec3 H = texture(decal, t4.yw ).xyz;\n" + " vec3 I = texture(decal, t4.zw ).xyz;\n" + " vec3 G5 = texture(decal, t5.xw ).xyz;\n" + " vec3 H5 = texture(decal, t5.yw ).xyz;\n" + " vec3 I5 = texture(decal, t5.zw ).xyz;\n" + " vec3 A0 = texture(decal, t6.xy ).xyz;\n" + " vec3 D0 = texture(decal, t6.xz ).xyz;\n" + " vec3 G0 = texture(decal, t6.xw ).xyz;\n" + " vec3 C4 = texture(decal, t7.xy ).xyz;\n" + " vec3 F4 = texture(decal, t7.xz ).xyz;\n" + " vec3 I4 = texture(decal, t7.xw ).xyz;\n" + "\n" + " vec4 b = vec4(dot(B ,rgbw), dot(D ,rgbw), dot(H ,rgbw), dot(F ,rgbw));\n" + " vec4 c = vec4(dot(C ,rgbw), dot(A ,rgbw), dot(G ,rgbw), dot(I ,rgbw));\n" + " vec4 d = b.yzwx;\n" + " vec4 e = vec4(dot(E,rgbw));\n" + " vec4 f = b.wxyz;\n" + " vec4 g = c.zwxy;\n" + " vec4 h = b.zwxy;\n" + " vec4 i = c.wxyz;\n" + " \n" + " vec4 i4, i5, h5, f4;\n" + " \n" + " float y_weight = XBR_Y_WEIGHT;\n" + " \n" + " if (small_details < 0.5)\n" + " {\n" + " i4 = vec4(dot(I4,rgbw), dot(C1,rgbw), dot(A0,rgbw), dot(G5,rgbw));\n" + " i5 = vec4(dot(I5,rgbw), dot(C4,rgbw), dot(A1,rgbw), dot(G0,rgbw));\n" + " h5 = vec4(dot(H5,rgbw), dot(F4,rgbw), dot(B1,rgbw), dot(D0,rgbw));\n" + " }\n" + " else\n" + " {\n" + " i4 = mul( mat4x3(I4, C1, A0, G5), y_weight * Y );\n" + " i5 = mul( mat4x3(I5, C4, A1, G0), y_weight * Y );\n" + " h5 = mul( mat4x3(H5, F4, B1, D0), y_weight * Y );\n" + " }\n" + "\n" + " // These inequations define the line below which interpolation occurs.\n" + " fx = (Ao*fp.y+Bo*fp.x); \n" + " fx_l = (Ax*fp.y+Bx*fp.x);\n" + " fx_u = (Ay*fp.y+By*fp.x);\n" + "\n" + " irlv1 = irlv0 = diff(e,f) * diff(e,h);\n" + "\n" + "#ifdef CORNER_B\n" + " irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) );\n" + "#endif\n" + "#ifdef CORNER_D\n" + " vec4 c1 = i4.yzwx;\n" + " vec4 g0 = i5.wxyz;\n" + " irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0)));\n" + "#endif\n" + "#ifdef CORNER_C\n" + " irlv1 = (irlv0 * ( neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)) );\n" + "#endif\n" + "\n" + " irlv2l = diff(e,g) * diff(d,g);\n" + " irlv2u = diff(e,c) * diff(b,c);\n" + "\n" + " vec4 fx45i = clamp((fx + delta -Co - Ci)/(2.0*delta ), 0.0, 1.0);\n" + " vec4 fx45 = clamp((fx + delta -Co )/(2.0*delta ), 0.0, 1.0);\n" + " vec4 fx30 = clamp((fx_l + delta_l -Cx )/(2.0*delta_l), 0.0, 1.0);\n" + " vec4 fx60 = clamp((fx_u + delta_u -Cy )/(2.0*delta_u), 0.0, 1.0);\n" + "\n" + " vec4 wd1, wd2;\n" + " if (small_details < 0.5)\n" + " {\n" + " wd1 = wd( e, c, g, i, h5, f4, h, f);\n" + " wd2 = wd( h, d, i5, f, i4, b, e, i);\n" + " }\n" + " else\n" + " {\n" + " wd1 = weighted_distance( e, c, g, i, f4, h5, h, f, b, d, i4, i5);\n" + " wd2 = weighted_distance( h, d, i5, f, b, i4, e, i, g, h5, c, f4);\n" + " }\n" + "\n" + " edri = step(wd1, wd2) * irlv0;\n" + " edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1);\n" + " edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr;\n" + " edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr;\n" + "\n" + " fx45 = edr * fx45;\n" + " fx30 = edr_l * fx30;\n" + " fx60 = edr_u * fx60;\n" + " fx45i = edri * fx45i;\n" + "\n" + " px = step(df(e,f), df(e,h));\n" + "\n" + "#ifdef SMOOTH_TIPS\n" + " vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i));\n" + "#endif\n" + "#ifndef SMOOTH_TIPS\n" + " vec4 maximos = max(max(fx30, fx60), fx45);\n" + "#endif\n" + "\n" + " vec3 res1 = E;\n" + " res1 = mix(res1, mix(H, F, px.x), maximos.x);\n" + " res1 = mix(res1, mix(B, D, px.z), maximos.z);\n" + " \n" + " vec3 res2 = E;\n" + " res2 = mix(res2, mix(F, B, px.y), maximos.y);\n" + " res2 = mix(res2, mix(D, H, px.w), maximos.w);\n" + " \n" + " vec3 res = mix(res1, res2, step(c_df(E, res1), c_df(E, res2)));\n" + "\n" + " FragColor.xyz = res;\n" + "}\n"; #endif diff --git a/src/config.c b/src/config.c index 28c4bf9..5756745 100644 --- a/src/config.c +++ b/src/config.c @@ -276,7 +276,7 @@ static void cfg_create_ini() "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" - "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos\n" + "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" diff --git a/src/render_ogl.c b/src/render_ogl.c index 2a9871c..160e0bd 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -179,16 +179,19 @@ static void ogl_build_programs() { g_ogl.scale_program = oglu_build_program( + _stricmp(g_ddraw->shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : PASSTHROUGH_VERT_SHADER, _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : + _stricmp(g_ddraw->shader, "xBR-lv2") == 0 ? XBR_LV2_FRAG_SHADER : CATMULL_ROM_FRAG_SHADER, core_profile); bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0 && - _stricmp(g_ddraw->shader, "Lanczos") != 0; + _stricmp(g_ddraw->shader, "Lanczos") != 0 && + _stricmp(g_ddraw->shader, "xBR-lv2") != 0; } } } From ccea9911b58e0d103c0c10f43140075a8a9f462c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 29 Aug 2023 18:27:47 +0200 Subject: [PATCH 0630/1724] fix texture name --- inc/openglshader.h | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index 2e2875a..b67ed92 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -395,7 +395,7 @@ static char XBR_LV2_FRAG_SHADER[] = "uniform vec2 OutputSize;\n" "uniform vec2 TextureSize;\n" "uniform vec2 InputSize;\n" - "uniform sampler2D decal;\n" + "uniform sampler2D Texture;\n" "in vec2 texCoord;\n" "in vec4 t1;\n" "in vec4 t2;\n" @@ -490,27 +490,27 @@ static char XBR_LV2_FRAG_SHADER[] = "\n" " vec2 fp = fract(texCoord*TextureSize);\n" "\n" - " vec3 A1 = texture(decal, t1.xw ).xyz;\n" - " vec3 B1 = texture(decal, t1.yw ).xyz;\n" - " vec3 C1 = texture(decal, t1.zw ).xyz;\n" - " vec3 A = texture(decal, t2.xw ).xyz;\n" - " vec3 B = texture(decal, t2.yw ).xyz;\n" - " vec3 C = texture(decal, t2.zw ).xyz;\n" - " vec3 D = texture(decal, t3.xw ).xyz;\n" - " vec3 E = texture(decal, t3.yw ).xyz;\n" - " vec3 F = texture(decal, t3.zw ).xyz;\n" - " vec3 G = texture(decal, t4.xw ).xyz;\n" - " vec3 H = texture(decal, t4.yw ).xyz;\n" - " vec3 I = texture(decal, t4.zw ).xyz;\n" - " vec3 G5 = texture(decal, t5.xw ).xyz;\n" - " vec3 H5 = texture(decal, t5.yw ).xyz;\n" - " vec3 I5 = texture(decal, t5.zw ).xyz;\n" - " vec3 A0 = texture(decal, t6.xy ).xyz;\n" - " vec3 D0 = texture(decal, t6.xz ).xyz;\n" - " vec3 G0 = texture(decal, t6.xw ).xyz;\n" - " vec3 C4 = texture(decal, t7.xy ).xyz;\n" - " vec3 F4 = texture(decal, t7.xz ).xyz;\n" - " vec3 I4 = texture(decal, t7.xw ).xyz;\n" + " vec3 A1 = texture(Texture, t1.xw ).xyz;\n" + " vec3 B1 = texture(Texture, t1.yw ).xyz;\n" + " vec3 C1 = texture(Texture, t1.zw ).xyz;\n" + " vec3 A = texture(Texture, t2.xw ).xyz;\n" + " vec3 B = texture(Texture, t2.yw ).xyz;\n" + " vec3 C = texture(Texture, t2.zw ).xyz;\n" + " vec3 D = texture(Texture, t3.xw ).xyz;\n" + " vec3 E = texture(Texture, t3.yw ).xyz;\n" + " vec3 F = texture(Texture, t3.zw ).xyz;\n" + " vec3 G = texture(Texture, t4.xw ).xyz;\n" + " vec3 H = texture(Texture, t4.yw ).xyz;\n" + " vec3 I = texture(Texture, t4.zw ).xyz;\n" + " vec3 G5 = texture(Texture, t5.xw ).xyz;\n" + " vec3 H5 = texture(Texture, t5.yw ).xyz;\n" + " vec3 I5 = texture(Texture, t5.zw ).xyz;\n" + " vec3 A0 = texture(Texture, t6.xy ).xyz;\n" + " vec3 D0 = texture(Texture, t6.xz ).xyz;\n" + " vec3 G0 = texture(Texture, t6.xw ).xyz;\n" + " vec3 C4 = texture(Texture, t7.xy ).xyz;\n" + " vec3 F4 = texture(Texture, t7.xz ).xyz;\n" + " vec3 I4 = texture(Texture, t7.xw ).xyz;\n" "\n" " vec4 b = vec4(dot(B ,rgbw), dot(D ,rgbw), dot(H ,rgbw), dot(F ,rgbw));\n" " vec4 c = vec4(dot(C ,rgbw), dot(A ,rgbw), dot(G ,rgbw), dot(I ,rgbw));\n" From 6f07809c862a19db161847a7aabfdf5e2bd92e9a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 30 Aug 2023 21:41:34 +0200 Subject: [PATCH 0631/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index bda5350..9254fa8 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 5fd49993c0f96d574a5dfc2e8e9a27ca8e93c97d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 30 Aug 2023 21:45:49 +0200 Subject: [PATCH 0632/1724] center claw DVD movies --- src/winapi_hooks.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9925179..7aa231d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1128,6 +1128,24 @@ HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { + /* Center Claw DVD movies */ + if (HIWORD(lpClassName) && + _strcmpi(lpClassName, "Afx:400000:3") == 0 && + g_ddraw && g_ddraw->hwnd && g_ddraw->width && + (dwStyle & WS_POPUP | WS_CHILD) == WS_POPUP | WS_CHILD) + { + POINT pt = { 0, 0 }; + real_ClientToScreen(g_ddraw->hwnd, &pt); + + int added_height = g_ddraw->render.height - g_ddraw->height; + int added_width = g_ddraw->render.width - g_ddraw->width; + int align_y = added_height > 0 ? added_height / 2 : 0; + int align_x = added_width > 0 ? added_width / 2 : 0; + + X = pt.x + align_x; + Y = pt.y + align_y; + } + /* Fix for SMACKW32.DLL creating another window that steals the focus */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd) { From bae11e7f9feb88c40e71678570ce175623614a44 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 31 Aug 2023 02:46:04 +0200 Subject: [PATCH 0633/1724] cleanup shader code --- inc/openglshader.h | 67 +++++++++++----------------------------------- 1 file changed, 15 insertions(+), 52 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index b67ed92..84c0748 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -94,7 +94,7 @@ static char PASSTHROUGH_FRAG_SHADER[] = static char CATMULL_ROM_FRAG_SHADER[] = "#version 130\n" - "out mediump vec4 FragColor;\n" + "out vec4 FragColor;\n" "uniform int FrameDirection;\n" "uniform int FrameCount;\n" "uniform vec2 OutputSize;\n" @@ -103,15 +103,11 @@ static char CATMULL_ROM_FRAG_SHADER[] = "uniform sampler2D Texture;\n" "in vec4 TEX0;\n" "\n" - "#define Source Texture\n" - "#define vTexCoord TEX0.xy\n" - "\n" "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" - "#define outsize vec4(OutputSize, 1.0 / OutputSize)\n" "\n" "void main()\n" "{\n" - " vec2 samplePos = vTexCoord * SourceSize.xy;\n" + " vec2 samplePos = TEX0.xy * SourceSize.xy;\n" " vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n" "\n" " vec2 f = samplePos - texPos1;\n" @@ -140,11 +136,11 @@ static char CATMULL_ROM_FRAG_SHADER[] = "\n" " vec3 result = vec3(0.0f);\n" "\n" - " result += texture(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" - " result += texture(Source, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" - " result += texture(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" - " result += texture(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" - " result += texture(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" + " result += texture(Texture, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" + " result += texture(Texture, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" + " result += texture(Texture, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" + " result += texture(Texture, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" + " result += texture(Texture, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" "\n" " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" "}\n"; @@ -271,7 +267,7 @@ static char LANCZOS2_FRAG_SHADER[] = static char XBR_LV2_VERT_SHADER[] = "#version 130\n" - " \n" + "\n" "#define texCoord TEX0\n" "#define t1 TEX1\n" "#define t2 TEX2\n" @@ -281,9 +277,9 @@ static char XBR_LV2_VERT_SHADER[] = "#define t6 TEX6\n" "#define t7 TEX7\n" "\n" - "in vec4 VertexCoord;\n" - "in vec4 Color;\n" - "in vec2 TexCoord;\n" + "in vec4 VertexCoord;\n" + "in vec4 Color;\n" + "in vec2 TexCoord;\n" "\n" "out vec4 color;\n" "out vec2 texCoord;\n" @@ -311,7 +307,7 @@ static char XBR_LV2_VERT_SHADER[] = " float dy = (1.0/TextureSize.y);\n" "\n" " texCoord = TexCoord;\n" - " texCoord.x *= 1.00000001;\n" + " texCoord.x *= 1.00000001;\n" " t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1\n" " t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C\n" " t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F\n" @@ -346,40 +342,7 @@ static char XBR_LV2_FRAG_SHADER[] = "#define XBR_SCALE 3.0\n" "\n" "#define lv2_cf XBR_LV2_COEFFICIENT\n" - " \n" - "#define texCoord TEX0\n" - "#define t1 TEX1\n" - "#define t2 TEX2\n" - "#define t3 TEX3\n" - "#define t4 TEX4\n" - "#define t5 TEX5\n" - "#define t6 TEX6\n" - "#define t7 TEX7\n" "\n" - "\n" - "//#pragma parameter XBR_SCALE \"xBR Scale\" 3.0 1.0 5.0 1.0\n" - "#pragma parameter XBR_Y_WEIGHT \"Y Weight\" 48.0 0.0 100.0 1.0\n" - "#pragma parameter XBR_EQ_THRESHOLD \"Eq Threshold\" 15.0 0.0 50.0 1.0\n" - "#pragma parameter XBR_LV1_COEFFICIENT \"Lv1 Coefficient\" 0.5 0.0 30.0 0.5\n" - "#pragma parameter XBR_LV2_COEFFICIENT \"Lv2 Coefficient\" 2.0 1.0 3.0 0.1\n" - "#pragma parameter small_details \"Preserve Small Details\" 0.0 0.0 1.0 1.0\n" - "\n" - "#define mul(a,b) (b*a)\n" - "\n" - "// Uncomment just one of the three params below to choose the corner detection\n" - "//#define CORNER_A\n" - "//#define CORNER_B\n" - "#define CORNER_C\n" - "//#define CORNER_D\n" - "\n" - "#ifndef CORNER_A\n" - " #define SMOOTH_TIPS\n" - "#endif\n" - "\n" - "#define XBR_SCALE 3.0\n" - "\n" - "#define lv2_cf XBR_LV2_COEFFICIENT\n" - " \n" "#define texCoord TEX0\n" "#define t1 TEX1\n" "#define t2 TEX2\n" @@ -520,11 +483,11 @@ static char XBR_LV2_FRAG_SHADER[] = " vec4 g = c.zwxy;\n" " vec4 h = b.zwxy;\n" " vec4 i = c.wxyz;\n" - " \n" + "\n" " vec4 i4, i5, h5, f4;\n" - " \n" + "\n" " float y_weight = XBR_Y_WEIGHT;\n" - " \n" + "\n" " if (small_details < 0.5)\n" " {\n" " i4 = vec4(dot(I4,rgbw), dot(C1,rgbw), dot(A0,rgbw), dot(G5,rgbw));\n" From af75abf0266c7eaa5bbdee626e142abbb3af5711 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 31 Aug 2023 19:30:51 +0200 Subject: [PATCH 0634/1724] add hack for Metal Gear Solid --- inc/dd.h | 1 + src/config.c | 1 + src/dd.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index e8a96aa..846904a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -166,6 +166,7 @@ typedef struct CNCDDRAW BOOL tshack; BOOL infantryhack; BOOL stronghold_hack; + BOOL mgs_hack; BOOL remove_menu; int maxgameticks; BOOL alt_key_down; diff --git a/src/config.c b/src/config.c index 5756745..77d8878 100644 --- a/src/config.c +++ b/src/config.c @@ -59,6 +59,7 @@ void cfg_load() g_ddraw->tshack = cfg_get_bool("tshack", FALSE); g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); g_ddraw->stronghold_hack = cfg_get_bool("stronghold_hack", FALSE); + g_ddraw->mgs_hack = cfg_get_bool("mgs_hack", FALSE); if (cfg_get_bool("game_handles_close", FALSE) || g_ddraw->infantryhack) { diff --git a/src/dd.c b/src/dd.c index ec4f38f..cf167d8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -544,6 +544,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; + if (g_ddraw->mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ + if (g_ddraw->render.thread) { EnterCriticalSection(&g_ddraw->cs); From 28511a368e5a5a618cd3395690b5d7dd43ec1f4c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 1 Sep 2023 23:24:51 +0200 Subject: [PATCH 0635/1724] add preset for Nox --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 77d8878..f683611 100644 --- a/src/config.c +++ b/src/config.c @@ -918,6 +918,13 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" + "; Nox\n" + "[NOX]\n" + "checkfile=.\\NOX.ICD\n" + "renderer=direct3d9\n" + "nonexclusive=false\n" + "windowed=false\n" + "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" From 5edeaeed510d30a68ee41e956ec20ad403bc6d02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Sep 2023 23:09:10 +0200 Subject: [PATCH 0636/1724] remove const --- src/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/debug.c b/src/debug.c index 3bd4213..3ef9a2d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -130,8 +130,8 @@ void dbg_init() if (wine_get_host_version) { - const char* sysname = NULL; - const char* release = NULL; + char* sysname = NULL; + char* release = NULL; wine_get_host_version(&sysname, &release); From 971bcb39851d7c9507abfb02c33fdd5bd7283d66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Sep 2023 23:11:51 +0200 Subject: [PATCH 0637/1724] update config to latest version --- config/ConfigFormUnit.cpp | 594 +++++++++++++++-- config/ConfigFormUnit.dfm | 955 ++++++++++++++++++--------- config/ConfigFormUnit.h | 44 +- config/Resources/IT.png | Bin 0 -> 420 bytes config/cnc-ddraw config.cbproj | 836 ++++++++++++----------- config/cnc-ddraw config.cpp | 26 +- config/cnc-ddraw config.manifest | 34 + config/cnc-ddraw config_resources.rc | 1 + 8 files changed, 1682 insertions(+), 808 deletions(-) create mode 100644 config/Resources/IT.png create mode 100644 config/cnc-ddraw config.manifest diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 82f9920..3c704e2 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -18,7 +20,7 @@ bool IsEnglish; /* Save previous settings so we don't override custom settings */ int Maxfps; int Savesettings; -int Hook; +int Resolutions; int Minfps; //--------------------------------------------------------------------------- @@ -27,9 +29,18 @@ __fastcall TConfigForm::TConfigForm(TComponent* Owner) { } +void __fastcall TConfigForm::CreateParams(TCreateParams & Params) +{ + TForm::CreateParams(Params); + + StrCopy( + Params.WinClassName, + THashSHA1::GetHashString(Application->ExeName).w_str()); +} + void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(".\\dd-hd.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -37,7 +48,51 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) NULL, L"open", Application->ExeName.w_str(), + L"-restart", NULL, + SW_SHOWNORMAL); + + Application->Terminate(); +} + +void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) +{ + auto *ini = new TIniFile(".\\dd-hd.ini"); + auto theme = + ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; + + ini->WriteString("ddraw", "configtheme", theme); + + delete ini; + + ShellExecute( + NULL, + L"open", + Application->ExeName.w_str(), + L"-restart", + NULL, + SW_SHOWNORMAL); + + Application->Terminate(); +} + +void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) +{ + if (Application->MessageBox( + (RestoreDefaultsBtn->Caption + "?").w_str(), + L"cnc-ddraw", + MB_YESNO) == IDNO) { + + return; + } + + DeleteFile(".\\dd-hd.ini"); + + ShellExecute( + NULL, + L"open", + Application->ExeName.w_str(), + L"-restart", NULL, SW_SHOWNORMAL); @@ -57,7 +112,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw 配置"; DisplayBtn->Caption = L"显示设置"; AdvancedBtn->Caption = L"高级设置"; + HotkeyBtn->Caption = L"热键设置"; CompatibilityBtn->Caption = L"兼容性设置"; + RestoreDefaultsBtn->Caption = L"恢复默认设置"; PresentationLbl->Caption = L"显示方式"; MaintasLbl->Caption = L"保持纵横比"; VsyncLbl->Caption = L"打开垂直同步"; @@ -69,11 +126,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL着色器"; MaxfpsLbl->Caption = L"限制帧率"; BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; + ToggleWindowedLbl->Caption = L"切换窗口模式"; + MaximizeWindowLbl->Caption = L"最大化窗口"; + UnlockCursor1Lbl->Caption = L"解锁光标 1"; + UnlockCursor2Lbl->Caption = L"解锁光标 2"; + ScreenshotLbl->Caption = L"截屏"; MaxgameticksLbl->Caption = L"限制游戏速率"; NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; - HookLbl->Caption = L"修复损坏的窗口模式或拉伸"; + ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; - FixpitchLbl->Caption = L"修复倾斜撕裂显示的问题"; + SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; RendererCbx->Items->Clear(); @@ -94,6 +156,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL); MaxgameticksCbx->AddItem(L"1000tick每秒", NULL); MaxgameticksCbx->AddItem(L"500tick每秒", NULL); + MaxgameticksCbx->AddItem(L"250tick每秒", NULL); + MaxgameticksCbx->AddItem(L"125tick每秒", NULL); MaxgameticksCbx->AddItem(L"60tick每秒", NULL); MaxgameticksCbx->AddItem(L"30tick每秒", NULL); MaxgameticksCbx->AddItem(L"25tick每秒", NULL); @@ -107,7 +171,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Ajustes de cnc-ddraw"; DisplayBtn->Caption = L"Ajustes de pantalla"; AdvancedBtn->Caption = L"Ajustes avanzados"; + HotkeyBtn->Caption = L"Teclas de acceso rápido"; CompatibilityBtn->Caption = L"Ajustes de compatibilidad"; + RestoreDefaultsBtn->Caption = L"Restaurar la configuración predeterminada"; PresentationLbl->Caption = L"Presentación"; MaintasLbl->Caption = L"Mantener la relación de aspecto"; VsyncLbl->Caption = L"Activar VSync"; @@ -119,11 +185,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Sombreador OpenGL"; MaxfpsLbl->Caption = L"Limitar velocidad de fotogramas"; BoxingLbl->Caption = L"Activar encajado de ventanas / escalado de enteros"; + ToggleWindowedLbl->Caption = L"Alternar modo de ventana"; + MaximizeWindowLbl->Caption = L"Maximizar ventana"; + UnlockCursor1Lbl->Caption = L"Desbloquear cursor 1"; + UnlockCursor2Lbl->Caption = L"Desbloquear cursor 2"; + ScreenshotLbl->Caption = L"Captura de pantalla"; MaxgameticksLbl->Caption = L"Limitar velocidad de juego"; NoactivateappLbl->Caption = L"Corregir Alt+Tab roto"; - HookLbl->Caption = L"Corregir modo ventana o ampliación de escala"; + ResolutionsLbl->Caption = L"Desbloquear resoluciones de pantalla adicionales"; MinfpsLbl->Caption = L"Forzar un alto FPS / Corregir retrasos en Freesync/G-Sync"; - FixpitchLbl->Caption = L"Corregir problemas de visualización de dibujos en diagonal"; + SinglecpuLbl->Caption = L"Solucione el mal rendimiento y los problemas de sonido"; NonexclusiveLbl->Caption = L"Corregir vídeos / elementos de interfaz invisibles"; RendererCbx->Items->Clear(); @@ -144,6 +215,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emular monitor con tasa de refresco de 60hz", NULL); MaxgameticksCbx->AddItem(L"1000 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"500 tics por segundo", NULL); + MaxgameticksCbx->AddItem(L"250 tics por segundo", NULL); + MaxgameticksCbx->AddItem(L"125 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"60 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); @@ -157,23 +230,30 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw Konfiguration"; DisplayBtn->Caption = L"Anzeigeeinstellungen"; AdvancedBtn->Caption = L"Erweiterte Einstellungen"; + HotkeyBtn->Caption = L"Tastenkürzel-Einstellungen"; CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen"; - PresentationLbl->Caption = L"Presentation"; - MaintasLbl->Caption = L"Erhalte Seitenverhältnis"; + RestoreDefaultsBtn->Caption = L"Standardeinstellungen wiederherstellen"; + PresentationLbl->Caption = L"Darstellung"; + MaintasLbl->Caption = L"Seitenverhältnis beibehalten"; VsyncLbl->Caption = L"VSync aktiveren"; AdjmouseLbl->Caption = L"Mausempfindlichkeit anpassen"; DevmodeLbl->Caption = L"Sperre Cursor zu Fenster / Bildschirm"; //Not 100% sure, if not a better translation exists RendererLbl->Caption = L"Renderer"; BorderLbl->Caption = L"Zeige Fensterränder in Fenstermodus"; SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; - ShaderLbl->Caption = L"OpenGL shader"; + ShaderLbl->Caption = L"OpenGL Shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. + ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; + MaximizeWindowLbl->Caption = L"Fenster maximieren"; + UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; + UnlockCursor2Lbl->Caption = L"Cursor entsperren 2"; + ScreenshotLbl->Caption = L"Bildschirmfoto"; MaxgameticksLbl->Caption = L"Spielgeschwindigkeit limitieren"; NoactivateappLbl->Caption = L"Fehlerhaftes Alt+Tab reparieren"; //The first word can be ignored if its to long (eng word "Fix" - HookLbl->Caption = L"Fehlerhafter Fenstermodus oder Hochskalierung reparieren"; //The first word can be ignored if its to long (eng word "Fix") + ResolutionsLbl->Caption = L"Zusätzliche Bildschirmauflösungen freischalten"; MinfpsLbl->Caption = L"Erzwinge Hohe FPS / Repariere Stottern bei Freesync/G-Sync"; - FixpitchLbl->Caption = L"Diagonal dargestellte Zeichnungsfehler reparieren"; + SinglecpuLbl->Caption = L"Schlechte Leistung und Soundprobleme reparieren"; NonexclusiveLbl->Caption = L"Unsichtbare Videos / UI Elemente reparieren"; RendererCbx->Items->Clear(); @@ -186,7 +266,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->AddItem(L"Vollbild", NULL); PresentationCbx->AddItem(L"Hochskaliertes Vollbild", NULL); PresentationCbx->AddItem(L"Ränderfreies Fenster", NULL); - PresentationCbx->AddItem(L"Fenster", NULL); + PresentationCbx->AddItem(L"Fenstermodus", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"Unlimitiert", NULL); @@ -194,6 +274,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emuliere 60hz Bildschirmaktualisierungsrate", NULL); MaxgameticksCbx->AddItem(L"1000 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"500 Ticks pro Sekunde", NULL); + MaxgameticksCbx->AddItem(L"250 Ticks pro Sekunde", NULL); + MaxgameticksCbx->AddItem(L"125 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"60 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); @@ -202,16 +284,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; ClientWidth *= 1.13; - DisplayPnl->Width *= 1.184; - AdvancedPnl->Width *= 1.184; - CompatibilityPnl->Width *= 1.184; /* -Russian- made by shikulja @ github */ ConfigForm->Caption = L"Настройки cnc-ddraw"; DisplayBtn->Caption = L"Настройки отображения"; AdvancedBtn->Caption = L"Расширенные настройки"; + HotkeyBtn->Caption = L"Настройки горячих клавиш"; CompatibilityBtn->Caption = L"Настройки совместимости"; + RestoreDefaultsBtn->Caption = L"Восстановить настройки по умолчанию"; PresentationLbl->Caption = L"Отображение"; MaintasLbl->Caption = L"Сохранять соотношение сторон"; VsyncLbl->Caption = L"Включить VSync"; @@ -223,11 +304,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Шейдер OpenGL"; MaxfpsLbl->Caption = L"Ограничить частоту кадров"; BoxingLbl->Caption = L"Включить windowboxing / целочисленное масштабирование"; + ToggleWindowedLbl->Caption = L"Переключить оконный режим"; + MaximizeWindowLbl->Caption = L"Развернуть окно"; + UnlockCursor1Lbl->Caption = L"Разблокировать курсор 1"; + UnlockCursor2Lbl->Caption = L"Разблокировать курсор 2"; + ScreenshotLbl->Caption = L"Скриншот"; MaxgameticksLbl->Caption = L"Ограничить скорость игры"; NoactivateappLbl->Caption = L"Исправить сломанный Alt+Tab"; - HookLbl->Caption = L"Исправить сломанный оконный режим или масштабированние"; + ResolutionsLbl->Caption = L"Разблокировать дополнительные разрешения экрана"; MinfpsLbl->Caption = L"Принудительно высокий FPS / Исправить заикание при Freesync/G-Sync"; - FixpitchLbl->Caption = L"Исправить проблемы с отображением отрисовки по диагонали"; + SinglecpuLbl->Caption = L"Исправление проблем с производительностью и звуком"; NonexclusiveLbl->Caption = L"Исправить невидимые видео / элементы пользовательского интерфейса"; RendererCbx->Items->Clear(); @@ -248,6 +334,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Эмуляция частоты обновления монитора 60 Гц", NULL); MaxgameticksCbx->AddItem(L"1000 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"500 тиков в секунду", NULL); + MaxgameticksCbx->AddItem(L"250 тиков в секунду", NULL); + MaxgameticksCbx->AddItem(L"125 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"60 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); @@ -261,7 +349,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw Beállító"; DisplayBtn->Caption = L"Képbeállítások"; AdvancedBtn->Caption = L"Haladó Beállítások"; + HotkeyBtn->Caption = L"Gyorsbillentyűk beállításai"; CompatibilityBtn->Caption = L"Kompatibilitás Beállítások"; + RestoreDefaultsBtn->Caption = L"Visszaállítja az alapértelmezett beállításokat"; PresentationLbl->Caption = L"Bemutató"; MaintasLbl->Caption = L"Képarány megtartása"; VsyncLbl->Caption = L"VSync bekapcsolása"; @@ -273,11 +363,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL árnyaló"; MaxfpsLbl->Caption = L"Képkockaszám korlátozás"; BoxingLbl->Caption = L"Ablakos mód / felskálázás bekapcsolása"; + ToggleWindowedLbl->Caption = L"Az ablakos mód váltása"; + MaximizeWindowLbl->Caption = L"Az ablak maximalizálása"; + UnlockCursor1Lbl->Caption = L"A kurzor feloldása 1"; + UnlockCursor2Lbl->Caption = L"A kurzor feloldása 2"; + ScreenshotLbl->Caption = L"Képernyőkép"; MaxgameticksLbl->Caption = L"Játéksebesség korlátozás"; NoactivateappLbl->Caption = L"Alt+Tab hiba kiküszöbölése"; - HookLbl->Caption = L"Hibás ablakos mód, vagy felskálázás javítása"; + ResolutionsLbl->Caption = L"További képernyőfelbontások feloldása"; MinfpsLbl->Caption = L"Magas FPS kényszerítés / Akadozásjavítás Freesync/G-Sync esetén"; - FixpitchLbl->Caption = L"Átlós rajzolási gondok kiküszöbölése"; + SinglecpuLbl->Caption = L"Javítsa ki a rossz teljesítmény- és hangproblémákat"; NonexclusiveLbl->Caption = L"Láthatatlan videók / kezelőfelületi elemek javítása"; RendererCbx->Items->Clear(); @@ -298,6 +393,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"60hz képfrissítésű kijelző emulálása", NULL); MaxgameticksCbx->AddItem(L"1000 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"500 tick másodpercenként", NULL); + MaxgameticksCbx->AddItem(L"250 tick másodpercenként", NULL); + MaxgameticksCbx->AddItem(L"125 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"60 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); @@ -311,7 +408,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Configuration cnc-ddraw"; DisplayBtn->Caption = L"Paramètres d'Affichage"; AdvancedBtn->Caption = L"Paramètres Avancés"; + HotkeyBtn->Caption = L"Paramètres de raccourci"; CompatibilityBtn->Caption = L"Paramètres de Compatibilité"; + RestoreDefaultsBtn->Caption = L"Restaurer les paramètres par défaut"; PresentationLbl->Caption = L"Présentation"; MaintasLbl->Caption = L"Conserver les proportions de l'image"; VsyncLbl->Caption = L"Activer la synchro verticale (VSync)"; @@ -323,11 +422,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"Shader OpenGL"; MaxfpsLbl->Caption = L"Limiter les images par seconde (FPS)"; BoxingLbl->Caption = L"Activer windowboxing / mise à l'échelle par nombres entiers"; + ToggleWindowedLbl->Caption = L"Basculer en mode fenêtré"; + MaximizeWindowLbl->Caption = L"Agrandir la fenêtre"; + UnlockCursor1Lbl->Caption = L"Déverrouiller le curseur 1"; + UnlockCursor2Lbl->Caption = L"Déverrouiller le curseur 2"; + ScreenshotLbl->Caption = L"Capture d'écran"; MaxgameticksLbl->Caption = L"Limiter la vitesse du jeu"; NoactivateappLbl->Caption = L"Corriger Alt+Tab défaillant"; - HookLbl->Caption = L"Corriger mode fenêtré ou mise à l'échelle défaillant"; + ResolutionsLbl->Caption = L"Déverrouiller des résolutions d'écran supplémentaires"; MinfpsLbl->Caption = L"Forcer FPS élevé / Corriger saccades en Freesync/G-Sync"; - FixpitchLbl->Caption = L"Corriger défauts d'affichage diagonaux"; + SinglecpuLbl->Caption = L"Résoudre les problèmes de mauvaise performance et de son"; NonexclusiveLbl->Caption = L"Corriger vidéos et éléments d'interface invisibles"; RendererCbx->Items->Clear(); @@ -348,11 +452,72 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Émuler un écran à 60Hz", NULL); MaxgameticksCbx->AddItem(L"1000 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"500 tics par seconde", NULL); + MaxgameticksCbx->AddItem(L"250 tics par seconde", NULL); + MaxgameticksCbx->AddItem(L"125 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"60 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); } + else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { + LanguageImg->Visible = true; + + /* -Italian - made by Kappa971 @ github */ + + ConfigForm->Caption = L"Configurazione di cnc-ddraw"; + DisplayBtn->Caption = L"Impostazioni dello schermo"; + AdvancedBtn->Caption = L"Impostazioni avanzate"; + HotkeyBtn->Caption = L"Tasti di scelta rapida"; + CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; + RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni predefinite"; + PresentationLbl->Caption = L"Presentazione"; + MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; + VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; + AdjmouseLbl->Caption = L"Regola la sensibilità del mouse"; + DevmodeLbl->Caption = L"Cattura il cursore nella finestra / schermo"; + RendererLbl->Caption = L"Renderer"; + BorderLbl->Caption = L"Mostra i bordi della finestra in modalità finestra"; + SavesettingsLbl->Caption = L"Ricorda la posizione e le dimensioni della finestra"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Limita la frequenza dei fotogrammi (FPS)"; + BoxingLbl->Caption = L"Abilita il ridimensionamento dei numeri interi"; + ToggleWindowedLbl->Caption = L"Attiva/disattiva la modalità finestra"; + MaximizeWindowLbl->Caption = L"Ingrandisci finestra"; + UnlockCursor1Lbl->Caption = L"Sblocca cursore 1"; + UnlockCursor2Lbl->Caption = L"Sblocca cursore 2"; + ScreenshotLbl->Caption = L"Istantanea dello schermo"; + MaxgameticksLbl->Caption = L"Limita la velocità di gioco"; + NoactivateappLbl->Caption = L"Correggi il funzionamento di Alt+Tab"; + ResolutionsLbl->Caption = L"Sblocca ulteriori risoluzioni dello schermo"; + MinfpsLbl->Caption = L"Forza FPS elevati / Correggi balbuzie su Freesync/G-Sync"; + SinglecpuLbl->Caption = L"Risolvi problemi di prestazioni e audio scadenti"; + NonexclusiveLbl->Caption = L"Correggi video / elementi dell'interfaccia utente invisibili"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Automatico", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Schermo Intero", NULL); + PresentationCbx->AddItem(L"Schermo Intero Ridimensionato", NULL); + PresentationCbx->AddItem(L"Senza Bordi", NULL); + PresentationCbx->AddItem(L"In Finestra", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Senza Limiti", NULL); + MaxgameticksCbx->AddItem(L"Sincronizza con la frequenza dello schermo", NULL); + MaxgameticksCbx->AddItem(L"Emula uno schermo a 60Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"500 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"250 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"125 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"60 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); + MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); + } else { IsEnglish = true; @@ -393,6 +558,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_ITALIAN) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_IT"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } @@ -400,7 +571,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw config"; DisplayBtn->Caption = L"Display Settings"; AdvancedBtn->Caption = L"Advanced Settings"; + HotkeyBtn->Caption = L"Hotkey Settings"; CompatibilityBtn->Caption = L"Compatibility Settings"; + RestoreDefaultsBtn->Caption = L"Restore default settings"; PresentationLbl->Caption = L"Presentation"; MaintasLbl->Caption = L"Maintain aspect ratio"; VsyncLbl->Caption = L"Enable VSync"; @@ -412,11 +585,16 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ShaderLbl->Caption = L"OpenGL shader"; MaxfpsLbl->Caption = L"Limit frame rate"; BoxingLbl->Caption = L"Enable windowboxing / integer scaling"; + ToggleWindowedLbl->Caption = L"Toggle windowed mode"; + MaximizeWindowLbl->Caption = L"Maximize window"; + UnlockCursor1Lbl->Caption = L"Unlock cursor 1"; + UnlockCursor2Lbl->Caption = L"Unlock cursor 2"; + ScreenshotLbl->Caption = L"Screenshot"; MaxgameticksLbl->Caption = L"Limit game speed"; NoactivateappLbl->Caption = L"Fix broken Alt+Tab"; - HookLbl->Caption = L"Fix broken windowed mode or upscaling"; + ResolutionsLbl->Caption = L"Unlock additional screen resolutions"; MinfpsLbl->Caption = L"Force high FPS / Fix stuttering on Freesync/G-Sync"; - FixpitchLbl->Caption = L"Fix diagonally displayed drawing issues"; + SinglecpuLbl->Caption = L"Fix bad performance and sound issues"; NonexclusiveLbl->Caption = L"Fix invisible videos / UI elements"; RendererCbx->Items->Clear(); @@ -437,18 +615,30 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"Emulate 60hz refresh rate monitor", NULL); MaxgameticksCbx->AddItem(L"1000 ticks per second", NULL); MaxgameticksCbx->AddItem(L"500 ticks per second", NULL); + MaxgameticksCbx->AddItem(L"250 ticks per second", NULL); + MaxgameticksCbx->AddItem(L"125 ticks per second", NULL); MaxgameticksCbx->AddItem(L"60 ticks per second", NULL); MaxgameticksCbx->AddItem(L"30 ticks per second", NULL); MaxgameticksCbx->AddItem(L"25 ticks per second", NULL); MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ } + + ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; + MaximizeWindowKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; + UnlockCursor1KeyLbl->Caption = GetKeyText(VK_CONTROL) + L" +"; + UnlockCursor2KeyLbl->Caption = "R " + GetKeyText(VK_MENU) + L" +"; + + ConfigForm->Caption += + " (" + TPath::GetFileName( + TPath::GetDirectoryName(Application->ExeName)) + ")"; } void __fastcall TConfigForm::DisplayBtnClick(TObject *Sender) { DisplayPnl->Visible = true; AdvancedPnl->Visible = false; + HotkeyPnl->Visible = false; CompatibilityPnl->Visible = false; } @@ -456,6 +646,15 @@ void __fastcall TConfigForm::AdvancedBtnClick(TObject *Sender) { AdvancedPnl->Visible = true; DisplayPnl->Visible = false; + HotkeyPnl->Visible = false; + CompatibilityPnl->Visible = false; +} + +void __fastcall TConfigForm::HotkeyBtnClick(TObject *Sender) +{ + HotkeyPnl->Visible = true; + AdvancedPnl->Visible = false; + DisplayPnl->Visible = false; CompatibilityPnl->Visible = false; } @@ -464,11 +663,49 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) CompatibilityPnl->Visible = true; AdvancedPnl->Visible = false; DisplayPnl->Visible = false; + HotkeyPnl->Visible = false; } void __fastcall TConfigForm::FormCreate(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + /* Let cnc-ddraw create a new dd-hd.ini if it doesn't exist */ + if (FileExists(".\\ddraw.dll") && !FileExists(".\\dd-hd.ini")) { + + SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); + + HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + + if (ddraw) { + + void (WINAPI* dd_create)(void*, void**, void*); + + dd_create = + (void (WINAPI*)(void*, void**, void*)) + GetProcAddress(ddraw, "DirectDrawCreate"); + + if (dd_create && GetProcAddress(ddraw, "GameHandlesClose")) { + + void *buf; + dd_create(NULL, &buf, NULL); + } + + FreeLibrary(ddraw); + } + } + + auto *ini = new TIniFile(".\\dd-hd.ini"); + + if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { + + ThemePnl->Color = (TColor)RGB(243, 243, 243); + DisplayPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + AdvancedPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + HotkeyPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + CompatibilityPnl->StyleElements = TStyleElements(seFont + seClient + seBorder); + + MenuPnl->StyleElements = TStyleElements(seFont); + MenuPnl->Color = (TColor)RGB(31, 31, 31); + } ApplyTranslation(ini); @@ -499,8 +736,28 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) auto renderer = LowerCase(ini->ReadString("ddraw", "renderer", "auto")); - if (StartsStr("d", renderer)) { + if (renderer == "direct3d9on12") { + RendererCbx->AddItem(L"Direct3D 12 (9On12)", NULL); + RendererCbx->ItemIndex = 4; + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; + } + else if (renderer == "openglcore") { + RendererCbx->AddItem(L"OpenGL Core", NULL); + RendererCbx->ItemIndex = 4; + } + else if (StartsStr("d", renderer)) { RendererCbx->ItemIndex = 1; + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; } else if (StartsStr("o", renderer)) { RendererCbx->ItemIndex = 2; @@ -521,14 +778,45 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) for (int i = 0; i < list.Length; i++) ShaderCbx->AddItem(list[i], NULL); - - auto shader = ini->ReadString("ddraw", "shader", ""); - ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); } catch (...) { } + if (ShaderCbx->Items->Count == 0) { + ShaderCbx->AddItem("Nearest neighbor", NULL); + ShaderCbx->AddItem("Bilinear", NULL); + ShaderCbx->AddItem("Bicubic", NULL); + ShaderCbx->AddItem("Lanczos", NULL); + ShaderCbx->AddItem("xBR-lv2", NULL); + } + + auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); + ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); + + if (ShaderCbx->ItemIndex == -1) { + ShaderCbx->AddItem(shader, NULL); + ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1; + } + + int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); + + switch (d3d9_filter) { + case 0: + ShaderD3DCbx->ItemIndex = 0; + break; + case 1: + ShaderD3DCbx->ItemIndex = 1; + break; + case 2: + default: + ShaderD3DCbx->ItemIndex = 2; + break; + case 3: + ShaderD3DCbx->ItemIndex = 3; + break; + } + Maxfps = ini->ReadInteger("ddraw", "maxfps", -1); MaxfpsChk->State = Maxfps != 0 ? tssOn : tssOff; @@ -538,6 +826,23 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) Savesettings = ini->ReadInteger("ddraw", "savesettings", 1); SavesettingsChk->State = Savesettings != 0 ? tssOn : tssOff; + /* Hotkey Settings */ + + ToggleWindowedEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keytogglefullscreen", 0x0D))); + + MaximizeWindowEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keytogglemaximize", 0x22))); + + UnlockCursor1Edt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyunlockcursor1", 0x09))); + + UnlockCursor2Edt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyunlockcursor2", 0xA3))); + + ScreenshotEdt->Text = + GetKeyText(Byte(ini->ReadInteger("ddraw", "keyscreenshot", 0x2C))); + /* Compatibility Settings */ int maxgameticks = ini->ReadInteger("ddraw", "maxgameticks", 0); @@ -558,35 +863,48 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) case 500: MaxgameticksCbx->ItemIndex = 4; break; - case 60: + case 250: MaxgameticksCbx->ItemIndex = 5; break; - case 30: + case 125: MaxgameticksCbx->ItemIndex = 6; break; - case 25: + case 60: MaxgameticksCbx->ItemIndex = 7; break; - case 15: + case 30: MaxgameticksCbx->ItemIndex = 8; break; + case 25: + MaxgameticksCbx->ItemIndex = 9; + break; + case 15: + MaxgameticksCbx->ItemIndex = 10; + break; default: MaxgameticksCbx->AddItem(IntToStr(maxgameticks), NULL); - MaxgameticksCbx->ItemIndex = 9; + MaxgameticksCbx->ItemIndex = 11; break; } NoactivateappChk->State = GetBool(ini, "noactivateapp", false) ? tssOn : tssOff; - Hook = ini->ReadInteger("ddraw", "hook", 4); - HookChk->State = Hook == 2 ? tssOn : tssOff; + Resolutions = ini->ReadInteger("ddraw", "resolutions", 0); + ResolutionsChk->State = Resolutions == 2 ? tssOn : tssOff; Minfps = ini->ReadInteger("ddraw", "minfps", 0); MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; - FixpitchChk->State = GetBool(ini, "fixpitch", false) ? tssOn : tssOff; + SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; + CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); + + RestoreDefaultsBtn->Visible = + FileExists(".\\ddraw.dll") && + FileExists(".\\dd-hd.ini") && + GetBool(ini, "allow_reset", true); + delete ini; Initialized = true; @@ -597,7 +915,7 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(".\\dd-hd.ini"); /* Display Settings */ @@ -605,6 +923,7 @@ void TConfigForm::SaveSettings() case 0: ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "false"); + ini->WriteString("ddraw", "toggle_borderless", "false"); break; case 1: ini->WriteString("ddraw", "windowed", "false"); @@ -613,6 +932,7 @@ void TConfigForm::SaveSettings() case 2: ini->WriteString("ddraw", "windowed", "true"); ini->WriteString("ddraw", "fullscreen", "true"); + ini->WriteString("ddraw", "toggle_borderless", "true"); break; case 3: ini->WriteString("ddraw", "windowed", "true"); @@ -657,12 +977,22 @@ void TConfigForm::SaveSettings() case 3: ini->WriteString("ddraw", "renderer", "gdi"); break; + case 4: + if (RendererCbx->Text == "OpenGL Core") { + ini->WriteString("ddraw", "renderer", "openglcore"); + } + else { + ini->WriteString("ddraw", "renderer", "direct3d9on12"); + } + break; default: break; } ini->WriteString("ddraw", "shader", ShaderCbx->Text); + ini->WriteInteger("ddraw", "d3d9_filter", ShaderD3DCbx->ItemIndex); + int maxfps = Maxfps == 0 ? -1 : Maxfps; ini->WriteInteger( @@ -694,6 +1024,33 @@ void TConfigForm::SaveSettings() ini->WriteInteger("ddraw", "posY", -32000); } + /* Hotkey Settings */ + + ini->WriteString( + "ddraw", + "keytogglefullscreen", + "0x" + IntToHex(Byte(GetKeyCode(ToggleWindowedEdt->Text)))); + + ini->WriteString( + "ddraw", + "keytogglemaximize", + "0x" + IntToHex(Byte(GetKeyCode(MaximizeWindowEdt->Text)))); + + ini->WriteString( + "ddraw", + "keyunlockcursor1", + "0x" + IntToHex(Byte(GetKeyCode(UnlockCursor1Edt->Text)))); + + ini->WriteString( + "ddraw", + "keyunlockcursor2", + "0x" + IntToHex(Byte(GetKeyCode(UnlockCursor2Edt->Text)))); + + ini->WriteString( + "ddraw", + "keyscreenshot", + "0x" + IntToHex(Byte(GetKeyCode(ScreenshotEdt->Text)))); + /* Compatibility Settings */ switch(MaxgameticksCbx->ItemIndex) { @@ -713,18 +1070,24 @@ void TConfigForm::SaveSettings() ini->WriteInteger("ddraw", "maxgameticks", 500); break; case 5: - ini->WriteInteger("ddraw", "maxgameticks", 60); + ini->WriteInteger("ddraw", "maxgameticks", 250); break; case 6: - ini->WriteInteger("ddraw", "maxgameticks", 30); + ini->WriteInteger("ddraw", "maxgameticks", 125); break; case 7: - ini->WriteInteger("ddraw", "maxgameticks", 25); + ini->WriteInteger("ddraw", "maxgameticks", 60); break; case 8: - ini->WriteInteger("ddraw", "maxgameticks", 15); + ini->WriteInteger("ddraw", "maxgameticks", 30); break; case 9: + ini->WriteInteger("ddraw", "maxgameticks", 25); + break; + case 10: + ini->WriteInteger("ddraw", "maxgameticks", 15); + break; + case 11: ini->WriteString("ddraw", "maxgameticks", MaxgameticksCbx->Text); break; default: @@ -736,15 +1099,12 @@ void TConfigForm::SaveSettings() "noactivateapp", NoactivateappChk->State == tssOn ? "true" : "false"); - int hook = Hook != 2 ? Hook : 4; + int resolutions = Resolutions != 2 ? Resolutions : 0; ini->WriteInteger( "ddraw", - "hook", - HookChk->State == tssOn ? 2 : hook); - - if (HookChk->State == tssOn && Hook != 2) - ini->WriteString("ddraw", "renderer", "gdi"); + "resolutions", + ResolutionsChk->State == tssOn ? 2 : resolutions); int minfps = Minfps == 0 ? -1 : Minfps; @@ -755,8 +1115,8 @@ void TConfigForm::SaveSettings() ini->WriteString( "ddraw", - "fixpitch", - FixpitchChk->State == tssOn ? "true" : "false"); + "singlecpu", + SinglecpuChk->State == tssOn ? "false" : "true"); ini->WriteString( "ddraw", @@ -766,6 +1126,110 @@ void TConfigForm::SaveSettings() delete ini; } +void __fastcall TConfigForm::FormActivate(TObject *Sender) +{ + /* Detect wine (Linux/macOS) and create the needed dll override */ + if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) + return; + + TRegistry* reg = new TRegistry(KEY_READ); + reg->RootKey = HKEY_CURRENT_USER; + + if (reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { + + if (!reg->ValueExists("ddraw")) { + + reg->CloseKey(); + + if (Application->MessageBox( + L"cnc-ddraw requires a dll override in winecfg, " + "would you like to add it now?", + L"cnc-ddraw", + MB_YESNO) == IDNO) { + + reg->Free(); + return; + } + + reg->Access = KEY_WRITE; + + if (reg->OpenKey("Software\\Wine\\DllOverrides\\", true)) { + + reg->WriteString("ddraw", "native,builtin"); + reg->CloseKey(); + } + } + else + reg->CloseKey(); + } + + reg->Free(); +} + +void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + TEdit *edit = static_cast(Sender); + + if (Key == VK_DELETE || Key == VK_BACK) { + edit->Text = L""; + } + else if (GetAsyncKeyState(VK_RCONTROL) & 0x8000) { + edit->Text = GetKeyText(VK_RCONTROL); + } + else { + edit->Text = GetKeyText(Key); + } +} + +void __fastcall TConfigForm::HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) +{ + TEdit *edit = static_cast(Sender); + + if (Key == VK_SNAPSHOT || Key == VK_TAB) { + edit->Text = GetKeyText(Key); + } + + SaveSettings(); +} + +WORD TConfigForm::GetKeyCode(System::UnicodeString key) +{ + if (key == L"PrtScn") { + return VK_SNAPSHOT; + } + + if (key == L"Pause_") { + return VK_PAUSE; + } + + if (key == L"R " + ShortCutToText(VK_CONTROL)) { + return VK_RCONTROL; + } + + return TextToShortCut(key); +} + +System::UnicodeString TConfigForm::GetKeyText(WORD key) +{ + if (key == VK_SNAPSHOT) { + return L"PrtScn"; + } + + if (key == VK_PAUSE) { + return L"Pause_"; + } + + if (key == VK_RCONTROL) { + return L"R " + ShortCutToText(VK_CONTROL); + } + + if (key == VK_RSHIFT) { + return ShortCutToText(VK_SHIFT); + } + + return ShortCutToText(key); +} + bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) { auto s = LowerCase(ini->ReadString("ddraw", key, defValue ? "true" : "false")); @@ -799,12 +1263,36 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender) void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) { + if (ContainsStr(RendererCbx->Text, "Direct3D")) { + + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "OpenGL", "Direct3D"); + + ShaderD3DCbx->Visible = true; + ShaderCbx->Visible = false; + } + else { + ShaderLbl->Caption = + ReplaceStr(ShaderLbl->Caption, "Direct3D", "OpenGL"); + + ShaderCbx->Visible = true; + ShaderD3DCbx->Visible = false; + } + SaveSettings(); } void __fastcall TConfigForm::ShaderCbxChange(TObject *Sender) { - RendererCbx->ItemIndex = 2; + if (RendererCbx->Text != "OpenGL Core") { + RendererCbx->ItemIndex = 2; + } + + SaveSettings(); +} + +void __fastcall TConfigForm::ShaderD3DCbxChange(TObject *Sender) +{ SaveSettings(); } @@ -838,7 +1326,7 @@ void __fastcall TConfigForm::NoactivateappChkClick(TObject *Sender) SaveSettings(); } -void __fastcall TConfigForm::HookChkClick(TObject *Sender) +void __fastcall TConfigForm::ResolutionsChkClick(TObject *Sender) { SaveSettings(); } @@ -848,7 +1336,7 @@ void __fastcall TConfigForm::MinfpsChkClick(TObject *Sender) SaveSettings(); } -void __fastcall TConfigForm::FixpitchChkClick(TObject *Sender) +void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) { SaveSettings(); } @@ -861,6 +1349,6 @@ void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) void __fastcall TConfigForm::PboxPaint(TObject *Sender) { TPaintBox *pbox = static_cast(Sender); - pbox->Canvas->Rectangle(pbox->ClientRect); + //pbox->Canvas->Rectangle(pbox->ClientRect); } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 0e04389..a69b94f 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,9 +4,9 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 475 - ClientWidth = 708 - Color = clBlack + ClientHeight = 476 + ClientWidth = 741 + Color = clMenu Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -2677,16 +2677,397 @@ object ConfigForm: TConfigForm 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} - OldCreateOrder = False Position = poDesktopCenter + OnActivate = FormActivate OnCreate = FormCreate - PixelsPerInch = 96 + DesignSize = ( + 741 + 476) TextHeight = 13 - object AdvancedPnl: TPanel - Left = 201 + object DisplayPnl: TPanel + Left = 233 Top = 8 Width = 499 Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 1 + StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 + DesignSize = ( + 499 + 465) + object PresentationLbl: TLabel + Left = 40 + Top = 28 + Width = 87 + Height = 21 + Caption = 'Presentation' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MaintasLbl: TLabel + Left = 40 + Top = 105 + Width = 145 + Height = 21 + Margins.Top = 18 + Caption = 'Maintain aspect ratio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object VsyncLbl: TLabel + Left = 40 + Top = 173 + Width = 93 + Height = 21 + Margins.Top = 18 + Caption = 'Enable VSync' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object AdjmouseLbl: TLabel + Left = 40 + Top = 241 + Width = 168 + Height = 21 + Margins.Top = 18 + Caption = 'Adjust mouse sensitivity' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object DevmodeLbl: TLabel + Left = 40 + Top = 309 + Width = 216 + Height = 21 + Margins.Top = 18 + Caption = 'Lock cursor to window / screen' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object PresentationPbox: TPaintBox + Left = 40 + Top = 54 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end + object LanguageImg: TImage + Left = 453 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 + 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 + 455874536F6674776172650041646F626520496D616765526561647971C9653C + 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 + 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 + B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D + C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 + C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 + 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF + 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE + ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 + 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 + F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 + B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 + 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 + CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 + 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 + 00000049454E44AE426082} + Stretch = True + Visible = False + OnClick = LanguageImgClick + end + object PresentationCbx: TComboBox + Left = 41 + Top = 55 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = PresentationCbxChange + Items.Strings = ( + 'Fullscreen' + 'Fullscreen Upscaled' + 'Borderless' + 'Windowed') + end + object MaintasChk: TToggleSwitch + Left = 40 + Top = 132 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 0 + OnClick = MaintasChkClick + end + object VsyncChk: TToggleSwitch + Left = 40 + Top = 200 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 2 + OnClick = VsyncChkClick + end + object AdjmouseChk: TToggleSwitch + Left = 40 + Top = 268 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 3 + OnClick = AdjmouseChkClick + end + object DevmodeChk: TToggleSwitch + Left = 40 + Top = 336 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 4 + OnClick = DevmodeChkClick + end + object ThemePnl: TPanel + Left = 475 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + BevelOuter = bvNone + Color = 2039583 + ParentBackground = False + TabOrder = 5 + StyleElements = [seFont, seBorder] + OnClick = ThemePnlClick + ExplicitLeft = 471 + end + end + object CompatibilityPnl: TPanel + Left = 233 + Top = 8 + Width = 499 + Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 3 + Visible = False + StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 + object MaxgameticksLbl: TLabel + Left = 40 + Top = 28 + Width = 123 + Height = 21 + Caption = 'Limit game speed' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object NoactivateappLbl: TLabel + Left = 40 + Top = 105 + Width = 129 + Height = 21 + Margins.Top = 18 + Caption = 'Fix broken Alt+Tab' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object ResolutionsLbl: TLabel + Left = 40 + Top = 173 + Width = 251 + Height = 21 + Margins.Top = 18 + Caption = 'Unlock additional screen resolutions' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MinfpsLbl: TLabel + Left = 40 + Top = 241 + Width = 350 + Height = 21 + Margins.Top = 18 + Caption = 'Force high FPS / Fix stuttering on Freesync/G-Sync' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object SinglecpuLbl: TLabel + Left = 40 + Top = 309 + Width = 265 + Height = 21 + Margins.Top = 18 + Caption = 'Fix bad performance and sound issues' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object NonexclusiveLbl: TLabel + Left = 40 + Top = 377 + Width = 225 + Height = 21 + Margins.Top = 18 + Caption = 'Fix invisible videos / UI elements' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MaxgameticksPbox: TPaintBox + Left = 40 + Top = 54 + Width = 394 + Height = 31 + OnPaint = PboxPaint + end + object MaxgameticksCbx: TComboBox + Left = 41 + Top = 55 + Width = 392 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + DropDownCount = 12 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 0 + OnChange = MaxgameticksCbxChange + Items.Strings = ( + 'No limit' + 'Sync with monitor refresh rate' + 'Emulate 60hz refresh rate monitor' + '1000 ticks per second' + '500 ticks per second' + '250 ticks per second' + '125 ticks per second' + '60 ticks per second' + '30 ticks per second' + '25 ticks per second' + '15 ticks per second') + end + object NoactivateappChk: TToggleSwitch + Left = 40 + Top = 132 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 1 + OnClick = NoactivateappChkClick + end + object ResolutionsChk: TToggleSwitch + Left = 40 + Top = 200 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 2 + OnClick = ResolutionsChkClick + end + object MinfpsChk: TToggleSwitch + Left = 40 + Top = 268 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 3 + OnClick = MinfpsChkClick + end + object SinglecpuChk: TToggleSwitch + Left = 40 + Top = 336 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 4 + OnClick = SinglecpuChkClick + end + object NonexclusiveChk: TToggleSwitch + Left = 40 + Top = 404 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 5 + OnClick = NonexclusiveChkClick + end + end + object AdvancedPnl: TPanel + Left = 233 + Top = 8 + Width = 499 + Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite ParentBackground = False @@ -2694,6 +3075,8 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 495 + ExplicitHeight = 464 object RendererLbl: TLabel Left = 40 Top = 28 @@ -2706,7 +3089,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object SavesettingsLbl: TLabel Left = 40 @@ -2721,7 +3103,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object ShaderLbl: TLabel Left = 40 @@ -2736,7 +3117,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object MaxfpsLbl: TLabel Left = 40 @@ -2751,7 +3131,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object BorderLbl: TLabel Left = 40 @@ -2766,7 +3145,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object BoxingLbl: TLabel Left = 40 @@ -2781,7 +3159,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end object RendererPbox: TPaintBox Left = 40 @@ -2797,6 +3174,31 @@ object ConfigForm: TConfigForm Height = 31 OnPaint = PboxPaint end + object ShaderD3DCbx: TComboBox + Left = 41 + Top = 132 + Width = 425 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + DropDownCount = 10 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 6 + Visible = False + OnChange = ShaderD3DCbxChange + Items.Strings = ( + 'Nearest neighbor' + 'Bilinear' + 'Bicubic (Catmull-Rom)' + 'Lanczos') + end object RendererCbx: TComboBox Left = 41 Top = 55 @@ -2876,434 +3278,331 @@ object ConfigForm: TConfigForm OnClick = BoxingChkClick end end - object DisplayPnl: TPanel - Left = 201 + object HotkeyPnl: TPanel + Left = 233 Top = 8 Width = 499 Height = 465 + Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite ParentBackground = False ShowCaption = False - TabOrder = 1 - StyleElements = [seFont, seBorder] - DesignSize = ( - 499 - 465) - object PresentationLbl: TLabel - Left = 40 - Top = 28 - Width = 87 - Height = 21 - Caption = 'Presentation' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object MaintasLbl: TLabel - Left = 40 - Top = 105 - Width = 145 - Height = 21 - Margins.Top = 18 - Caption = 'Maintain aspect ratio' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object VsyncLbl: TLabel - Left = 40 - Top = 173 - Width = 93 - Height = 21 - Margins.Top = 18 - Caption = 'Enable VSync' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object AdjmouseLbl: TLabel - Left = 40 - Top = 241 - Width = 168 - Height = 21 - Margins.Top = 18 - Caption = 'Adjust mouse sensitivity' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object DevmodeLbl: TLabel - Left = 40 - Top = 309 - Width = 216 - Height = 21 - Margins.Top = 18 - Caption = 'Lock cursor to window / screen' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object PresentationPbox: TPaintBox - Left = 40 - Top = 54 - Width = 282 - Height = 31 - OnPaint = PboxPaint - end - object LanguageImg: TImage - Left = 477 - Top = 8 - Width = 16 - Height = 11 - Anchors = [akTop, akRight] - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 - 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 - 455874536F6674776172650041646F626520496D616765526561647971C9653C - 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 - 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 - B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D - C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 - C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 - 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF - 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE - ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 - 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 - F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 - B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 - 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 - CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 - 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 - 00000049454E44AE426082} - Stretch = True - Visible = False - OnClick = LanguageImgClick - ExplicitLeft = 569 - end - object PresentationCbx: TComboBox - Left = 41 - Top = 55 - Width = 280 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 1 - OnChange = PresentationCbxChange - Items.Strings = ( - 'Fullscreen' - 'Fullscreen Upscaled' - 'Borderless' - 'Windowed') - end - object MaintasChk: TToggleSwitch - Left = 40 - Top = 132 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 0 - OnClick = MaintasChkClick - end - object VsyncChk: TToggleSwitch - Left = 40 - Top = 200 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 2 - OnClick = VsyncChkClick - end - object AdjmouseChk: TToggleSwitch - Left = 40 - Top = 268 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 3 - OnClick = AdjmouseChkClick - end - object DevmodeChk: TToggleSwitch - Left = 40 - Top = 336 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 4 - OnClick = DevmodeChkClick - end - end - object CompatibilityPnl: TPanel - Left = 201 - Top = 8 - Width = 499 - Height = 465 - BevelOuter = bvNone - Color = clWhite - ParentBackground = False - ShowCaption = False - TabOrder = 3 + TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] - object MaxgameticksLbl: TLabel + ExplicitWidth = 495 + ExplicitHeight = 464 + object ToggleWindowedLbl: TLabel Left = 40 - Top = 28 - Width = 123 - Height = 21 - Caption = 'Limit game speed' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - StyleElements = [seClient, seBorder] - end - object NoactivateappLbl: TLabel - Left = 40 - Top = 105 - Width = 129 + Top = 27 + Width = 165 Height = 21 Margins.Top = 18 - Caption = 'Fix broken Alt+Tab' + Caption = 'Toggle windowed mode' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end - object HookLbl: TLabel + object ToggleWindowedKeyLbl: TLabel + Left = 50 + Top = 60 + Width = 34 + Height = 21 + Margins.Top = 8 + Caption = 'Alt +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MaximizeWindowLbl: TLabel Left = 40 - Top = 173 - Width = 281 + Top = 107 + Width = 125 Height = 21 Margins.Top = 18 - Caption = 'Fix broken windowed mode or upscaling' + Caption = 'Maximize window' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end - object MinfpsLbl: TLabel + object MaximizeWindowKeyLbl: TLabel + Left = 50 + Top = 139 + Width = 34 + Height = 21 + Margins.Top = 8 + Caption = 'Alt +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object UnlockCursor1Lbl: TLabel Left = 40 - Top = 241 - Width = 350 + Top = 186 + Width = 109 Height = 21 Margins.Top = 18 - Caption = 'Force high FPS / Fix stuttering on Freesync/G-Sync' + Caption = 'Unlock cursor 1' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end - object FixpitchLbl: TLabel + object UnlockCursor1KeyLbl: TLabel + Left = 50 + Top = 218 + Width = 40 + Height = 21 + Margins.Top = 8 + Caption = 'Ctrl +' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object UnlockCursor2Lbl: TLabel Left = 40 - Top = 309 - Width = 272 + Top = 265 + Width = 109 Height = 21 Margins.Top = 18 - Caption = 'Fix diagonally displayed drawing issues' + Caption = 'Unlock cursor 2' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end - object NonexclusiveLbl: TLabel - Left = 40 - Top = 377 - Width = 225 + object UnlockCursor2KeyLbl: TLabel + Left = 50 + Top = 297 + Width = 48 Height = 21 - Margins.Top = 18 - Caption = 'Fix invisible videos / UI elements' + Margins.Top = 8 + Caption = 'R Alt +' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - StyleElements = [seClient, seBorder] end - object MaxgameticksPbox: TPaintBox - Left = 40 - Top = 54 - Width = 394 - Height = 31 - OnPaint = PboxPaint - end - object MaxgameticksCbx: TComboBox + object ScreenshotLbl: TLabel Left = 41 - Top = 55 - Width = 392 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - DropDownCount = 10 + Top = 344 + Width = 77 + Height = 21 + Margins.Top = 18 + Caption = 'Screenshot' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + end + object ToggleWindowedEdt: TEdit + Left = 137 + Top = 57 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True TabOrder = 0 - OnChange = MaxgameticksCbxChange - Items.Strings = ( - 'No limit' - 'Sync with monitor refresh rate' - 'Emulate 60hz refresh rate monitor' - '1000 ticks per second' - '500 ticks per second' - '60 ticks per second' - '30 ticks per second' - '25 ticks per second' - '15 ticks per second') + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp end - object NoactivateappChk: TToggleSwitch - Left = 40 - Top = 132 - Width = 50 - Height = 20 - ShowStateCaption = False + object MaximizeWindowEdt: TEdit + Left = 137 + Top = 136 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True TabOrder = 1 - OnClick = NoactivateappChkClick + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp end - object HookChk: TToggleSwitch - Left = 40 - Top = 200 - Width = 50 - Height = 20 - ShowStateCaption = False + object UnlockCursor1Edt: TEdit + Left = 137 + Top = 215 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True TabOrder = 2 - OnClick = HookChkClick + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp end - object MinfpsChk: TToggleSwitch - Left = 40 - Top = 268 - Width = 50 - Height = 20 - ShowStateCaption = False + object UnlockCursor2Edt: TEdit + Left = 137 + Top = 294 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True TabOrder = 3 - OnClick = MinfpsChkClick + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp end - object FixpitchChk: TToggleSwitch - Left = 40 - Top = 336 - Width = 50 - Height = 20 - ShowStateCaption = False + object ScreenshotEdt: TEdit + Left = 137 + Top = 373 + Width = 217 + Height = 29 + Margins.Top = 5 + TabStop = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + ReadOnly = True TabOrder = 4 - OnClick = FixpitchChkClick - end - object NonexclusiveChk: TToggleSwitch - Left = 40 - Top = 404 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 5 - OnClick = NonexclusiveChkClick + OnKeyDown = HotkeyEdtKeyDown + OnKeyUp = HotkeyEdtKeyUp end end object MenuPnl: TPanel Left = 0 Top = 8 - Width = 201 - Height = 465 + Width = 233 + Height = 468 + Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone - Color = clBlack + Color = clMenu ParentBackground = False TabOrder = 0 + ExplicitHeight = 467 DesignSize = ( - 201 - 465) + 233 + 468) object DisplayBtn: TSpeedButton - Left = 5 + Left = 0 Top = 8 - Width = 187 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Display Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite - Font.Height = -13 + Font.Color = clBlack + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False - StyleElements = [seFont, seBorder] OnClick = DisplayBtnClick end object AdvancedBtn: TSpeedButton - Left = 5 + Left = 0 Top = 55 - Width = 187 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Advanced Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite - Font.Height = -13 + Font.Color = clBlack + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False OnClick = AdvancedBtnClick end object CompatibilityBtn: TSpeedButton - Left = 5 - Top = 102 - Width = 187 + Left = 0 + Top = 149 + Width = 227 Height = 41 Anchors = [akLeft, akTop, akRight] Caption = 'Compatibility Settings' Flat = True Font.Charset = DEFAULT_CHARSET - Font.Color = clWhite - Font.Height = -13 + Font.Color = clBlack + Font.Height = -16 Font.Name = 'Segoe UI' - Font.Style = [fsBold] + Font.Style = [] ParentFont = False OnClick = CompatibilityBtnClick end + object HotkeyBtn: TSpeedButton + Left = 0 + Top = 102 + Width = 227 + Height = 41 + Anchors = [akLeft, akTop, akRight] + Caption = 'Hotkey Settings' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + OnClick = HotkeyBtnClick + end + object RestoreDefaultsBtn: TSpeedButton + Left = 0 + Top = 440 + Width = 227 + Height = 22 + Anchors = [akLeft, akRight, akBottom] + Caption = 'Restore default settings' + Flat = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + OnClick = RestoreDefaultsBtnClick + end end end diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 689f83f..2e16295 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -49,12 +49,12 @@ __published: // Von der IDE verwaltete Komponenten TLabel *MaxgameticksLbl; TLabel *NoactivateappLbl; TToggleSwitch *NoactivateappChk; - TLabel *HookLbl; - TToggleSwitch *HookChk; + TLabel *ResolutionsLbl; + TToggleSwitch *ResolutionsChk; TLabel *MinfpsLbl; TToggleSwitch *MinfpsChk; - TToggleSwitch *FixpitchChk; - TLabel *FixpitchLbl; + TToggleSwitch *SinglecpuChk; + TLabel *SinglecpuLbl; TLabel *NonexclusiveLbl; TToggleSwitch *NonexclusiveChk; TPaintBox *PresentationPbox; @@ -62,6 +62,25 @@ __published: // Von der IDE verwaltete Komponenten TPaintBox *ShaderPbox; TPaintBox *MaxgameticksPbox; TImage *LanguageImg; + TPanel *HotkeyPnl; + TLabel *ToggleWindowedLbl; + TSpeedButton *HotkeyBtn; + TEdit *ToggleWindowedEdt; + TLabel *ToggleWindowedKeyLbl; + TLabel *MaximizeWindowLbl; + TEdit *MaximizeWindowEdt; + TLabel *MaximizeWindowKeyLbl; + TLabel *UnlockCursor1Lbl; + TEdit *UnlockCursor1Edt; + TLabel *UnlockCursor1KeyLbl; + TLabel *UnlockCursor2Lbl; + TEdit *UnlockCursor2Edt; + TLabel *UnlockCursor2KeyLbl; + TLabel *ScreenshotLbl; + TEdit *ScreenshotEdt; + TComboBox *ShaderD3DCbx; + TSpeedButton *RestoreDefaultsBtn; + TPanel *ThemePnl; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -79,16 +98,29 @@ __published: // Von der IDE verwaltete Komponenten void __fastcall SavesettingsChkClick(TObject *Sender); void __fastcall MaxgameticksCbxChange(TObject *Sender); void __fastcall NoactivateappChkClick(TObject *Sender); - void __fastcall HookChkClick(TObject *Sender); + void __fastcall ResolutionsChkClick(TObject *Sender); void __fastcall MinfpsChkClick(TObject *Sender); - void __fastcall FixpitchChkClick(TObject *Sender); + void __fastcall SinglecpuChkClick(TObject *Sender); void __fastcall NonexclusiveChkClick(TObject *Sender); void __fastcall PboxPaint(TObject *Sender); void __fastcall LanguageImgClick(TObject *Sender); + void __fastcall FormActivate(TObject *Sender); + void __fastcall HotkeyBtnClick(TObject *Sender); + void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall ShaderD3DCbxChange(TObject *Sender); + void __fastcall RestoreDefaultsBtnClick(TObject *Sender); + void __fastcall ThemePnlClick(TObject *Sender); + + + private: // Benutzer-Deklarationen + virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); void ApplyTranslation(TIniFile *ini); + System::UnicodeString GetKeyText(WORD key); + WORD GetKeyCode(System::UnicodeString key); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; diff --git a/config/Resources/IT.png b/config/Resources/IT.png new file mode 100644 index 0000000000000000000000000000000000000000..89692f74f051cd43503744c3dab65c8ba773b7e2 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~o!2~3KHq6QcQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFq(O~IEGZ*N=lh=;=qSyMwWku z27eMOW_|f0uQeek^e_9g7KH|eq{JVG0^UaP2Jy4}|L^JL_3uCblfVD@mnS9t`~UCn z|MT(+KT|KOfz%~1cG~~^_2vEk{SFNQ?Cjg~|NsBWy<%2im{vp^YdeS=hk-Cyo6U`Hgs{l4FR(w#{P`G0;a3G2@YSmzI~fu(ZE1> L{an^LB{Ts58L6#6 literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 3ac67c6..dbd448c 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -1,7 +1,7 @@  {E020D5C7-AE07-4DB9-9688-6D289E9FFF1A} - 18.8 + 19.5 VCL Application cnc-ddraw config.cpp @@ -9,6 +9,7 @@ Release Win32 1 + c true @@ -18,6 +19,11 @@ Base true + + true + Base + true + true Base @@ -29,6 +35,12 @@ true true + + true + Cfg_1 + true + true + true Base @@ -40,6 +52,12 @@ true true + + true + Cfg_2 + true + true + JPHNE true @@ -52,7 +70,7 @@ $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) CppVCLApplication System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib;bindengine.lib <_TCHARMapping>wchar_t true $(BDS)\bin\cbuilder_PROJECTICON.ico @@ -61,7 +79,7 @@ cnc-ddraw\config\;$(IncludePath) cnc-ddraw\config\;$(ILINK_LibraryPath) cnc-ddraw_config - "Windows10 Blue|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10Blue.vsf" + Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf;"Cobalt XEMedia|VCLSTYLE|$(BDSCOMMONDIR)\Styles\CobaltXEMedia.vsf" adortl;appanalytics;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;FireDAC;FireDACADSDriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACIBDriver;FireDACMSAccDriver;FireDACMySQLDriver;FireDACPgDriver;FireDACSqliteDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;tethering;vcl;vclactnband;vcldb;vcldsnap;vclFireDAC;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) @@ -71,6 +89,16 @@ true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + cnc-ddraw config.manifest + 5.0 + 5.0 + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 $(BDS)\bin\default_app.manifest @@ -105,21 +133,33 @@ false false rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + 5.0 + 5.0 + cnc-ddraw config.manifest + + + PerMonitorV2 NDEBUG;$(Defines) None - true PerMonitorV2 false false false true - rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib + rtl.lib;vcl.lib;vclwinx.lib;vclimg.lib;bindengine.lib 1033 cnc-ddraw.ico + 5.0 + 5.0 + cnc-ddraw config.manifest + + + PerMonitorV2 @@ -151,6 +191,10 @@ RCDATA PngImage_HU + + RCDATA + PngImage_IT + RCDATA PngImage_RU @@ -160,10 +204,6 @@ PngImage_US - - Cfg_2 - Base - Base @@ -171,6 +211,10 @@ Cfg_1 Base + + Cfg_2 + Base + CPlusPlusBuilder.Personality.12 @@ -187,125 +231,79 @@ cnc-ddraw config.cpp - Embarcadero C++Builder-Package für Office 2000-Server - Embarcadero C++Builder-Package für Office XP-Server + Embarcadero C++Builder-Package für Office 2000-Server + Embarcadero C++Builder-Package für Office XP-Server - - - - true - - + true - - - true - - - - - true - - - - - true - - true - - - true - - + + true - + + + true - - - cnc-ddraw_config.exe - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - cnc-ddraw_config.exe - true - - - - - .\ - true - - - + true - + true - + + + - .\ true - - - true - - - + - .\ true + + + + + true + + + + + true + + + + + + + + + + + + 1 @@ -318,14 +316,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -446,6 +444,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -609,6 +617,11 @@ 1 .framework + + Contents\MacOS + 1 + .framework + 0 @@ -622,7 +635,7 @@ 1 .dylib - + 1 .dylib @@ -636,6 +649,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .dll;.bpl @@ -650,7 +668,7 @@ 1 .dylib - + 1 .dylib @@ -664,6 +682,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .bpl @@ -682,7 +705,7 @@ 0 - + 0 @@ -693,272 +716,12 @@ Contents\Resources\StartUp\ 0 - + + Contents\Resources\StartUp\ 0 - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 + + 0 @@ -969,61 +732,15 @@ 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - 1 - - - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + @@ -1034,6 +751,10 @@ ..\ 1 + + ..\ + 1 + @@ -1044,6 +765,10 @@ Contents 1 + + Contents + 1 + @@ -1054,6 +779,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -1070,7 +799,7 @@ 1 - + 1 @@ -1084,6 +813,10 @@ Contents\MacOS 1 + + Contents\MacOS + 1 + 0 @@ -1102,6 +835,66 @@ 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + Assets @@ -1122,19 +915,222 @@ 1 - - - - - - + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + - - + + + + + + + + + + True + False 12 diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index e98fba6..f88df0c 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -2,6 +2,8 @@ #include #pragma hdrstop +#include +#include #include //--------------------------------------------------------------------------- #include @@ -14,7 +16,29 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { Application->Initialize(); Application->MainFormOnTaskBar = true; - TStyleManager::TrySetStyle("Windows10 Blue"); + + HWND hwnd = + FindWindow( + THashSHA1::GetHashString(Application->ExeName).w_str(), NULL); + + if (hwnd && ParamStr(1) != L"-restart") { + + if (IsIconic(hwnd)) { + ShowWindow(hwnd, SW_RESTORE); + } + + SetForegroundWindow(hwnd); + return 0; + } + + auto *ini = new TIniFile(".\\dd-hd.ini"); + auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); + + TStyleManager::TrySetStyle( + theme == "Cobalt XEMedia" ? "Cobalt XEMedia" : "Windows10"); + + delete ini; + Application->CreateForm(__classid(TConfigForm), &ConfigForm); Application->Run(); } diff --git a/config/cnc-ddraw config.manifest b/config/cnc-ddraw config.manifest new file mode 100644 index 0000000..35c0fea --- /dev/null +++ b/config/cnc-ddraw config.manifest @@ -0,0 +1,34 @@ + + + + + true/pm + PerMonitorV2 + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index 15a55fd..a2ed1e5 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -3,5 +3,6 @@ PngImage_DE RCDATA "Resources\\DE.png" PngImage_ES RCDATA "Resources\\ES.png" PngImage_FR RCDATA "Resources\\fr.png" PngImage_HU RCDATA "Resources\\hu.png" +PngImage_IT RCDATA "Resources\\IT.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" From c9d5e1015cb564f7599c55516bd16979c7108728 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Sep 2023 23:22:04 +0200 Subject: [PATCH 0638/1724] remove new filter settings to keep config compatible with old cnc-ddraw build --- config/ConfigFormUnit.cpp | 40 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3c704e2..db2464d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -781,15 +781,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } catch (...) { - } - - if (ShaderCbx->Items->Count == 0) { - ShaderCbx->AddItem("Nearest neighbor", NULL); - ShaderCbx->AddItem("Bilinear", NULL); - ShaderCbx->AddItem("Bicubic", NULL); - ShaderCbx->AddItem("Lanczos", NULL); - ShaderCbx->AddItem("xBR-lv2", NULL); - } + } auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); @@ -799,24 +791,15 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1; } - int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); + bool d3d9_filter = GetBool(ini, "d3d9linear", true); - switch (d3d9_filter) { - case 0: - ShaderD3DCbx->ItemIndex = 0; - break; - case 1: + if (d3d9_filter) { ShaderD3DCbx->ItemIndex = 1; - break; - case 2: - default: - ShaderD3DCbx->ItemIndex = 2; - break; - case 3: - ShaderD3DCbx->ItemIndex = 3; - break; } - + else { + ShaderD3DCbx->ItemIndex = 0; + } + Maxfps = ini->ReadInteger("ddraw", "maxfps", -1); MaxfpsChk->State = Maxfps != 0 ? tssOn : tssOff; @@ -991,8 +974,13 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "shader", ShaderCbx->Text); - ini->WriteInteger("ddraw", "d3d9_filter", ShaderD3DCbx->ItemIndex); - + if (ShaderD3DCbx->ItemIndex == 0) { + ini->WriteString("ddraw", "d3d9linear", "false"); + } + else { + ini->WriteString("ddraw", "d3d9linear", "true"); + } + int maxfps = Maxfps == 0 ? -1 : Maxfps; ini->WriteInteger( From 19ed60642ff7546475852016f5bb0a370def7dec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Sep 2023 00:08:14 +0200 Subject: [PATCH 0639/1724] add Resolution setting --- config/ConfigFormUnit.cpp | 37 +++++++++++++++++++++++ config/ConfigFormUnit.dfm | 63 ++++++++++++++++++++++++++++++++------- config/ConfigFormUnit.h | 3 ++ 3 files changed, 93 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index db2464d..e64166b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -116,6 +116,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; PresentationLbl->Caption = L"显示方式"; + ResolutionLbl->Caption = L"解决"; MaintasLbl->Caption = L"保持纵横比"; VsyncLbl->Caption = L"打开垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; @@ -175,6 +176,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Ajustes de compatibilidad"; RestoreDefaultsBtn->Caption = L"Restaurar la configuración predeterminada"; PresentationLbl->Caption = L"Presentación"; + ResolutionLbl->Caption = L"Resolución"; MaintasLbl->Caption = L"Mantener la relación de aspecto"; VsyncLbl->Caption = L"Activar VSync"; AdjmouseLbl->Caption = L"Ajustar sensibilidad de ratón"; @@ -234,6 +236,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen"; RestoreDefaultsBtn->Caption = L"Standardeinstellungen wiederherstellen"; PresentationLbl->Caption = L"Darstellung"; + ResolutionLbl->Caption = L"Auflösung"; MaintasLbl->Caption = L"Seitenverhältnis beibehalten"; VsyncLbl->Caption = L"VSync aktiveren"; AdjmouseLbl->Caption = L"Mausempfindlichkeit anpassen"; @@ -294,6 +297,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Настройки совместимости"; RestoreDefaultsBtn->Caption = L"Восстановить настройки по умолчанию"; PresentationLbl->Caption = L"Отображение"; + ResolutionLbl->Caption = L"Разрешение"; MaintasLbl->Caption = L"Сохранять соотношение сторон"; VsyncLbl->Caption = L"Включить VSync"; AdjmouseLbl->Caption = L"Регулировка чувствительности мыши"; @@ -353,6 +357,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Kompatibilitás Beállítások"; RestoreDefaultsBtn->Caption = L"Visszaállítja az alapértelmezett beállításokat"; PresentationLbl->Caption = L"Bemutató"; + ResolutionLbl->Caption = L"Felbontás"; MaintasLbl->Caption = L"Képarány megtartása"; VsyncLbl->Caption = L"VSync bekapcsolása"; AdjmouseLbl->Caption = L"Egérérzékenység beállítás"; @@ -412,6 +417,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Paramètres de Compatibilité"; RestoreDefaultsBtn->Caption = L"Restaurer les paramètres par défaut"; PresentationLbl->Caption = L"Présentation"; + ResolutionLbl->Caption = L"Résolution"; MaintasLbl->Caption = L"Conserver les proportions de l'image"; VsyncLbl->Caption = L"Activer la synchro verticale (VSync)"; AdjmouseLbl->Caption = L"Ajuster la sensibilité souris"; @@ -471,6 +477,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni predefinite"; PresentationLbl->Caption = L"Presentazione"; + ResolutionLbl->Caption = L"Risoluzione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; AdjmouseLbl->Caption = L"Regola la sensibilità del mouse"; @@ -575,6 +582,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Compatibility Settings"; RestoreDefaultsBtn->Caption = L"Restore default settings"; PresentationLbl->Caption = L"Presentation"; + ResolutionLbl->Caption = L"Resolution"; MaintasLbl->Caption = L"Maintain aspect ratio"; VsyncLbl->Caption = L"Enable VSync"; AdjmouseLbl->Caption = L"Adjust mouse sensitivity"; @@ -694,6 +702,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *hd_ini = new TIniFile(".\\Warcraft_II_HD.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -727,6 +736,18 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) PresentationCbx->ItemIndex = 0; } + int cwidth = hd_ini->ReadInteger("Warcraft_II_HD", "Width", 0); + int cheight = hd_ini->ReadInteger("Warcraft_II_HD", "Height", 0); + int reso = hd_ini->ReadInteger("Warcraft_II_HD", "Resolution", 3); + + if (!cwidth || !cheight) { + ResolutionCbx->ItemIndex = reso <= 5 ? reso : 3; + } + else { + ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL); + ResolutionCbx->ItemIndex = ResolutionCbx->Items->Count - 1; + } + MaintasChk->State = GetBool(ini, "maintas", false) ? tssOn : tssOff; VsyncChk->State = GetBool(ini, "vsync", false) ? tssOn : tssOff; AdjmouseChk->State = GetBool(ini, "adjmouse", true) ? tssOn : tssOff; @@ -889,6 +910,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) GetBool(ini, "allow_reset", true); delete ini; + delete hd_ini; Initialized = true; } @@ -899,6 +921,7 @@ void TConfigForm::SaveSettings() return; auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *hd_ini = new TIniFile(".\\Warcraft_II_HD.ini"); /* Display Settings */ @@ -925,6 +948,18 @@ void TConfigForm::SaveSettings() break; } + if (ResolutionCbx->ItemIndex <= 5) { + hd_ini->WriteInteger( + "Warcraft_II_HD", "Resolution", ResolutionCbx->ItemIndex); + + hd_ini->WriteInteger("Warcraft_II_HD", "Width", 0); + hd_ini->WriteInteger("Warcraft_II_HD", "Height", 0); + + if (ResolutionCbx->Items->Count == 7) { + ResolutionCbx->Items->Delete(6); + } + } + ini->WriteString( "ddraw", "maintas", @@ -1112,6 +1147,7 @@ void TConfigForm::SaveSettings() NonexclusiveChk->State == tssOn ? "true" : "false"); delete ini; + delete hd_ini; } void __fastcall TConfigForm::FormActivate(TObject *Sender) @@ -1340,3 +1376,4 @@ void __fastcall TConfigForm::PboxPaint(TObject *Sender) //pbox->Canvas->Rectangle(pbox->ClientRect); } + diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index a69b94f..29b86ff 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2696,8 +2696,6 @@ object ConfigForm: TConfigForm ShowCaption = False TabOrder = 1 StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 DesignSize = ( 499 465) @@ -2716,7 +2714,7 @@ object ConfigForm: TConfigForm end object MaintasLbl: TLabel Left = 40 - Top = 105 + Top = 182 Width = 145 Height = 21 Margins.Top = 18 @@ -2730,7 +2728,7 @@ object ConfigForm: TConfigForm end object VsyncLbl: TLabel Left = 40 - Top = 173 + Top = 250 Width = 93 Height = 21 Margins.Top = 18 @@ -2744,7 +2742,7 @@ object ConfigForm: TConfigForm end object AdjmouseLbl: TLabel Left = 40 - Top = 241 + Top = 318 Width = 168 Height = 21 Margins.Top = 18 @@ -2758,7 +2756,7 @@ object ConfigForm: TConfigForm end object DevmodeLbl: TLabel Left = 40 - Top = 309 + Top = 386 Width = 216 Height = 21 Margins.Top = 18 @@ -2806,6 +2804,26 @@ object ConfigForm: TConfigForm Visible = False OnClick = LanguageImgClick end + object ResolutionLbl: TLabel + Left = 40 + Top = 105 + Width = 74 + Height = 21 + Caption = 'Resolution' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object ResolutionPbox: TPaintBox + Left = 40 + Top = 131 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end object PresentationCbx: TComboBox Left = 41 Top = 55 @@ -2831,7 +2849,7 @@ object ConfigForm: TConfigForm end object MaintasChk: TToggleSwitch Left = 40 - Top = 132 + Top = 209 Width = 50 Height = 20 ShowStateCaption = False @@ -2840,7 +2858,7 @@ object ConfigForm: TConfigForm end object VsyncChk: TToggleSwitch Left = 40 - Top = 200 + Top = 277 Width = 50 Height = 20 ShowStateCaption = False @@ -2849,7 +2867,7 @@ object ConfigForm: TConfigForm end object AdjmouseChk: TToggleSwitch Left = 40 - Top = 268 + Top = 345 Width = 50 Height = 20 ShowStateCaption = False @@ -2858,7 +2876,7 @@ object ConfigForm: TConfigForm end object DevmodeChk: TToggleSwitch Left = 40 - Top = 336 + Top = 413 Width = 50 Height = 20 ShowStateCaption = False @@ -2879,6 +2897,31 @@ object ConfigForm: TConfigForm OnClick = ThemePnlClick ExplicitLeft = 471 end + object ResolutionCbx: TComboBox + Left = 41 + Top = 132 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnChange = PresentationCbxChange + Items.Strings = ( + '640x480 (4:3)' + '800x608 (4:3)' + '832x480 (16:9)' + '960x544 (16:9)' + '1280x704 (16:9)' + '1280x544 (21:9)') + end end object CompatibilityPnl: TPanel Left = 233 diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 2e16295..cb81a60 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -81,6 +81,9 @@ __published: // Von der IDE verwaltete Komponenten TComboBox *ShaderD3DCbx; TSpeedButton *RestoreDefaultsBtn; TPanel *ThemePnl; + TComboBox *ResolutionCbx; + TLabel *ResolutionLbl; + TPaintBox *ResolutionPbox; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); From 02d300c5193a90a8c18fd149d30e450a10d6ea25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Sep 2023 00:18:32 +0200 Subject: [PATCH 0640/1724] change default settings --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index ccdf8b1..1ddacc1 100644 --- a/src/config.c +++ b/src/config.c @@ -279,7 +279,7 @@ static void cfg_create_ini() "\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" - "shader=Shaders\\interpolation\\bilinear.glsl\n" + "shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" "posX=-32000\n" From c20fac3596c87c8932a6f680357b9b5df6856347 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Sep 2023 18:24:55 +0200 Subject: [PATCH 0641/1724] fix min size code (commented out for now) --- src/wndproc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 2475a95..fa753cf 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -56,7 +56,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->windowed && g_ddraw->width) { - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; AdjustWindowRectEx( &rc, @@ -64,16 +64,25 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam GetMenu(g_ddraw->hwnd) != NULL, real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); - // set minimum window size - //mmi->ptMinTrackSize.x = rc.right - rc.left; - //mmi->ptMinTrackSize.y = rc.bottom - rc.top; - if (mmi->ptMaxTrackSize.x < rc.right - rc.left) mmi->ptMaxTrackSize.x = rc.right - rc.left; if (mmi->ptMaxTrackSize.y < rc.bottom - rc.top) mmi->ptMaxTrackSize.y = rc.bottom - rc.top; + /* + RECT rcmin = { 0, 0, g_ddraw->width, g_ddraw->height }; + + AdjustWindowRectEx( + &rcmin, + real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), + GetMenu(g_ddraw->hwnd) != NULL, + real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + + mmi->ptMinTrackSize.x = rcmin.right - rcmin.left; + mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top; + */ + return 0; } From d50546218d0d23d84c4f040a07bf8c327e5db742 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 16:23:14 +0200 Subject: [PATCH 0642/1724] fix shader info log --- src/opengl_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 988c5a1..ac96581 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -293,14 +293,14 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr { #ifdef _DEBUG GLint len = 0; - glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); + glGetShaderiv(vert_shader, GL_INFO_LOG_LENGTH, &len); if (len > 0) { char* log = calloc(len + 50, 1); if (log) { - glGetShaderInfoLog(frag_shader, len, &len, &log[0]); + glGetShaderInfoLog(vert_shader, len, &len, &log[0]); TRACE("glGetShaderInfoLog (Vertex):\n%s", log); free(log); } From f4fd9bfe3d26ec213f8e9867c945a2007932e91e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 19:56:09 +0200 Subject: [PATCH 0643/1724] fix EV Nova performance issues on direct3d9 --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 8e8ebcd..895f9ab 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -281,7 +281,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? (g_ddraw->rgb555 ? D3DFMT_A1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + g_ddraw->bpp == 16 ? (g_ddraw->rgb555 ? D3DFMT_X1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); From 60d85725f5d2836253c76803c7e48d11180ed872 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 20:06:03 +0200 Subject: [PATCH 0644/1724] fix some compiler warnings --- inc/debug.h | 2 +- src/debug.c | 4 ++-- src/opengl_utils.c | 4 ++-- src/winapi_hooks.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 988a525..0786a3b 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -30,7 +30,7 @@ extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; -//#define _DEBUG 1 +#define _DEBUG 1 /* use OutputDebugStringA rather than printf */ //#define _DEBUG_S 1 diff --git a/src/debug.c b/src/debug.c index 3ef9a2d..3bd4213 100644 --- a/src/debug.c +++ b/src/debug.c @@ -130,8 +130,8 @@ void dbg_init() if (wine_get_host_version) { - char* sysname = NULL; - char* release = NULL; + const char* sysname = NULL; + const char* release = NULL; wine_get_host_version(&sysname, &release); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index ac96581..e775a90 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -280,8 +280,8 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr if (!vert_shader || !frag_shader) return 0; - glShaderSource(vert_shader, 1, &vert_source, NULL); - glShaderSource(frag_shader, 1, &frag_source, NULL); + glShaderSource(vert_shader, 1, (const GLchar**)&vert_source, NULL); + glShaderSource(frag_shader, 1, (const GLchar**)&frag_source, NULL); GLint is_compiled = 0; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7aa231d..f12c63b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1132,7 +1132,7 @@ HWND WINAPI fake_CreateWindowExA( if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw && g_ddraw->hwnd && g_ddraw->width && - (dwStyle & WS_POPUP | WS_CHILD) == WS_POPUP | WS_CHILD) + (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { POINT pt = { 0, 0 }; real_ClientToScreen(g_ddraw->hwnd, &pt); From a059fabf8942d01fa836b6cf03edadbde09ec93c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 20:06:26 +0200 Subject: [PATCH 0645/1724] comment out debug --- inc/debug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/debug.h b/inc/debug.h index 0786a3b..988a525 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -30,7 +30,7 @@ extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; -#define _DEBUG 1 +//#define _DEBUG 1 /* use OutputDebugStringA rather than printf */ //#define _DEBUG_S 1 From d93a78b2a0fd56ab131101fce48d31f560ded36d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 22:46:43 +0200 Subject: [PATCH 0646/1724] use shader for rgb555 color conversion --- inc/openglshader.h | 19 +++++++++++++++++++ src/render_ogl.c | 10 +++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index 84c0748..525b5c6 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -84,6 +84,25 @@ static char PASSTHROUGH_FRAG_SHADER[] = "}\n"; +static char RBG555_FRAG_SHADER[] = + "#version 130\n" + "out vec4 FragColor;\n" + "uniform sampler2D Texture;\n" + "in vec4 TEX0;\n" + "\n" + "void main()\n" + "{\n" + " vec4 texel = texture(Texture, TEX0.xy);\n" + " int bytes = int(texel.r * 255.0 + 0.5) | int(texel.g * 255.0 + 0.5) << 8;\n" + " vec4 color;\n" + " color.r = float((bytes >> 10) & 31) / 31.0;\n" + " color.g = float((bytes >> 5) & 31) / 31.0;\n" + " color.b = float(bytes & 31) / 31.0;\n" + " color.a = 1.0;\n" + " FragColor = color;\n" + "}\n"; + + /* // The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae // Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 diff --git a/src/render_ogl.c b/src/render_ogl.c index 160e0bd..c5d20db 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -141,6 +141,10 @@ static void ogl_build_programs() { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); } + else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) + { + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RBG555_FRAG_SHADER, core_profile); + } else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile); @@ -260,12 +264,12 @@ static void ogl_create_textures(int width, int height) glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGB5_A1, + GL_RG8, g_ogl.surface_tex_width, g_ogl.surface_tex_height, 0, - g_ogl.surface_format = GL_BGRA, - g_ogl.surface_type = GL_UNSIGNED_SHORT_1_5_5_5_REV, + g_ogl.surface_format = GL_RG, + g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } else if (g_ddraw->bpp == 16) From 0eda9d21e1b87b54a297b3ea97a691154a8fb256 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 22:55:54 +0200 Subject: [PATCH 0647/1724] make rgb555 hack working on older hardware as well --- src/opengl_utils.c | 2 +- src/render_ogl.c | 36 ++++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e775a90..0a0cfa7 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -205,7 +205,7 @@ void oglu_init() g_oglu_got_version2 = glGetUniformLocation && glActiveTexture && glUniform1i; - g_oglu_got_version3 = glGenFramebuffers && glBindFramebuffer && glFramebufferTexture2D && glDrawBuffers && + g_oglu_got_version3 = glGenFramebuffers&& glBindFramebuffer&& glFramebufferTexture2D&& glDrawBuffers&& glCheckFramebufferStatus && glUniform4f && glActiveTexture && glUniform1i && glGetAttribLocation && glGenBuffers && glBindBuffer && glBufferData && glVertexAttribPointer && glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && diff --git a/src/render_ogl.c b/src/render_ogl.c index c5d20db..8976833 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -261,16 +261,32 @@ static void ogl_create_textures(int width, int height) } else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) { - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RG8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - g_ogl.surface_format = GL_RG, - g_ogl.surface_type = GL_UNSIGNED_BYTE, - 0); + if (g_oglu_got_version3) + { + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RG8, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + g_ogl.surface_format = GL_RG, + g_ogl.surface_type = GL_UNSIGNED_BYTE, + 0); + } + else + { + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA8, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + g_ogl.surface_format = GL_BGRA, + g_ogl.surface_type = GL_UNSIGNED_SHORT_1_5_5_5_REV, + 0); + } } else if (g_ddraw->bpp == 16) { From 280747c03791e6332f71c741b2a2a41f8fd0771a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 22:56:26 +0200 Subject: [PATCH 0648/1724] align --- src/opengl_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 0a0cfa7..e775a90 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -205,7 +205,7 @@ void oglu_init() g_oglu_got_version2 = glGetUniformLocation && glActiveTexture && glUniform1i; - g_oglu_got_version3 = glGenFramebuffers&& glBindFramebuffer&& glFramebufferTexture2D&& glDrawBuffers&& + g_oglu_got_version3 = glGenFramebuffers && glBindFramebuffer && glFramebufferTexture2D && glDrawBuffers && glCheckFramebufferStatus && glUniform4f && glActiveTexture && glUniform1i && glGetAttribLocation && glGenBuffers && glBindBuffer && glBufferData && glVertexAttribPointer && glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && From 43fd64463b91b3093fbfc60ca8df3f004f6d9196 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 6 Sep 2023 23:46:50 +0200 Subject: [PATCH 0649/1724] fix typo --- inc/openglshader.h | 2 +- src/render_ogl.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/openglshader.h b/inc/openglshader.h index 525b5c6..33f94fd 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -84,7 +84,7 @@ static char PASSTHROUGH_FRAG_SHADER[] = "}\n"; -static char RBG555_FRAG_SHADER[] = +static char RGB555_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" "uniform sampler2D Texture;\n" diff --git a/src/render_ogl.c b/src/render_ogl.c index 8976833..6d4b0ba 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -143,7 +143,7 @@ static void ogl_build_programs() } else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RBG555_FRAG_SHADER, core_profile); + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile); } else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { From f3c57b477e25f05de2160ccc882102e97576e935 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Sep 2023 19:54:19 +0200 Subject: [PATCH 0650/1724] disable GameUX on windows 7 --- config/ConfigFormUnit.cpp | 47 +++++++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.h | 2 ++ 2 files changed, 49 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1e5bdac..0a82b95 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1127,6 +1127,12 @@ void TConfigForm::SaveSettings() } void __fastcall TConfigForm::FormActivate(TObject *Sender) +{ + DisableGameUX(); + AddDllOverride(); +} + +void TConfigForm::AddDllOverride() { /* Detect wine (Linux/macOS) and create the needed dll override */ if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) @@ -1166,6 +1172,47 @@ void __fastcall TConfigForm::FormActivate(TObject *Sender) reg->Free(); } +void TConfigForm::DisableGameUX() +{ + /* Prevent bug where some games don't start properly and run in the background */ + if (!(TOSVersion::Major == 6 && TOSVersion::Minor == 1)) + return; + + TRegistry* reg = new TRegistry(KEY_READ); + reg->RootKey = HKEY_CLASSES_ROOT; + + if (reg->OpenKey( + "Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\", + false)) { + + if (reg->ValueExists("Games") && + reg->ReadString("Games") != "127.0.0.1" && + LowerCase(reg->ReadString("Games")) != "localhost") { + + reg->CloseKey(); + + reg->Access = KEY_WRITE; + + if (reg->OpenKey( + "Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\", + false)) { + + try { + reg->WriteString("Games", "127.0.0.1"); + } catch (...) { + /* maybe restart with admin rights here? */ + } + + reg->CloseKey(); + } + } + else + reg->CloseKey(); + } + + reg->Free(); +} + void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { TEdit *edit = static_cast(Sender); diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 2e16295..eca5be1 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -121,6 +121,8 @@ private: // Benutzer-Deklarationen void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); + void DisableGameUX(); + void AddDllOverride(); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; From 5a76fc8f9fee4b69347153e13fb02e3a8fb36d0a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Sep 2023 19:55:21 +0200 Subject: [PATCH 0651/1724] align --- config/ConfigFormUnit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index eca5be1..7217b4a 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -122,7 +122,7 @@ private: // Benutzer-Deklarationen System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); void DisableGameUX(); - void AddDllOverride(); + void AddDllOverride(); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; From 77bd7aa3bbd40c8baba54de2a17f21fd92afced3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Aug 2023 14:21:26 +0200 Subject: [PATCH 0652/1724] add hooks to fix blurry fonts --- inc/hook.h | 4 ++++ inc/winapi_hooks.h | 3 +++ src/config.c | 1 + src/hook.c | 5 +++++ src/winapi_hooks.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 008ca2f..982064f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -49,6 +49,8 @@ typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); +typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); +typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); @@ -90,6 +92,8 @@ extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETDEVICECAPSPROC real_GetDeviceCaps; +extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; +extern CREATEFONTAPROC real_CreateFontA; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 0983b9b..b2962da 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -43,6 +43,9 @@ int WINAPI fake_SetDIBitsToDevice( int WINAPI fake_StretchDIBits( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); +HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); +HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/config.c b/src/config.c index f683611..15a0ba7 100644 --- a/src/config.c +++ b/src/config.c @@ -367,6 +367,7 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" + "non_anti_aliased_fonts=true\n" "\n" "\n" "\n" diff --git a/src/hook.c b/src/hook.c index 3392066..2294e65 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,8 @@ SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; +CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; +CREATEFONTAPROC real_CreateFontA = CreateFontA; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -124,6 +126,9 @@ HOOKLIST g_hook_hooklist[] = { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, + { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f12c63b..d95ef75 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -905,6 +905,54 @@ int WINAPI fake_StretchDIBits( rop); } +HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf) +{ + LOGFONTA lf; + memcpy(&lf, lplf, sizeof(lf)); + + if (cfg_get_bool("non_anti_aliased_fonts", TRUE)) + lf.lfQuality = NONANTIALIASED_QUALITY; + + return real_CreateFontIndirectA(&lf); +} + +HFONT WINAPI fake_CreateFontA( + int nHeight, + int nWidth, + int nEscapement, + int nOrientation, + int fnWeight, + DWORD fdwItalic, + DWORD fdwUnderline, + DWORD fdwStrikeOut, + DWORD fdwCharSet, + DWORD fdwOutputPrecision, + DWORD fdwClipPrecision, + DWORD fdwQuality, + DWORD fdwPitchAndFamily, + LPCTSTR lpszFace) +{ + if (cfg_get_bool("non_anti_aliased_fonts", TRUE)) + fdwQuality = NONANTIALIASED_QUALITY; + + return + real_CreateFontA( + nHeight, + nWidth, + nEscapement, + nOrientation, + fnWeight, + fdwItalic, + fdwUnderline, + fdwStrikeOut, + fdwCharSet, + fdwOutputPrecision, + fdwClipPrecision, + fdwQuality, + fdwPitchAndFamily, + lpszFace); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName); From bffcc0b0f9adaca8b288de22eb7ff4c59af7f397 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Sep 2023 18:23:57 +0200 Subject: [PATCH 0653/1724] fix for last commit --- src/hook.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index 2294e65..5f5e7e6 100644 --- a/src/hook.c +++ b/src/hook.c @@ -126,7 +126,6 @@ HOOKLIST g_hook_hooklist[] = { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } From a508ab9bb78d899a2b91f14934f5157fc3030d86 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Sep 2023 18:40:47 +0200 Subject: [PATCH 0654/1724] bump version --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 9254fa8..0d02eea 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6bdeaab161b1271936bdaba3690ca545999838b5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 9 Sep 2023 16:21:37 +0200 Subject: [PATCH 0655/1724] #241 add preset for Commandos --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 15a0ba7..2840e53 100644 --- a/src/config.c +++ b/src/config.c @@ -669,6 +669,14 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Commandos\n" + "[comandos]\n" + "maxgameticks=-1\n" + "\n" + "; Commandos\n" + "[comandos_w10]\n" + "maxgameticks=-1\n" + "\n" "; Caesar III\n" "[c3]\n" "nonexclusive=true\n" From 340febc65ecbdef992f039f5fbbad7125e4cd0a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 10 Sep 2023 02:31:28 +0200 Subject: [PATCH 0656/1724] fix flags --- src/dd.c | 3 ++- src/ddsurface.c | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index cf167d8..206cb8a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -406,7 +406,8 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) DDCAPS_BLTSTRETCH | DDCAPS_CANCLIP | DDCAPS_CANBLTSYSMEM | - DDCAPS_CANCLIPSTRETCHED; + DDCAPS_CANCLIPSTRETCHED | + DDCAPS_COLORKEY; lpDDDriverCaps->dwCaps2 = DDCAPS2_NOPAGELOCKREQUIRED | diff --git a/src/ddsurface.c b/src/ddsurface.c index e9a2eb8..ce4404e 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -686,8 +686,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | - DDSD_LPSURFACE | - DDSD_BACKBUFFERCOUNT; + DDSD_LPSURFACE; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; @@ -697,7 +696,12 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = This->bpp; lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; + + if (This->flags & DDSD_BACKBUFFERCOUNT) + { + lpDDSurfaceDesc->dwFlags |= DDSD_BACKBUFFERCOUNT; lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; + } if (This->bpp == 8) { From 6c0a639f1d99197dc07d1c1dea090e1a7fd76c8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 18:54:16 +0200 Subject: [PATCH 0657/1724] re-enable auto downscaling --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 206cb8a..b7005b8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -714,8 +714,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* try current display settings */ - g_ddraw->render.width = max(g_ddraw->width, g_ddraw->mode.dmPelsWidth); - g_ddraw->render.height = max(g_ddraw->height, g_ddraw->mode.dmPelsHeight); + g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; + g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; From f468788a9dc59243e49fa6eb2e982a9a629aa664 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 19:04:01 +0200 Subject: [PATCH 0658/1724] force "adjmouse = TRUE" when downscaling was detected --- inc/IDirectDrawSurface.h | 1 + src/dd.c | 10 ++++++++++ src/ddsurface.c | 13 ++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 5c1a26d..49823f2 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -42,6 +42,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD last_flip_tick; DWORD last_blt_tick; BOOL queried; + BOOL locked; struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/src/dd.c b/src/dd.c index b7005b8..30ab9a8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -713,6 +713,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!found_res || ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { + if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || + g_ddraw->height > g_ddraw->mode.dmPelsHeight) + { + /* Downscaling requires adjmouse to be enabled */ + g_ddraw->adjmouse = TRUE; + } + /* try current display settings */ g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; @@ -1171,6 +1178,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { + Sleep(5); + return DD_OK; + if (g_ddraw->maxgameticks == -2) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_ddraw->render.maxfps >= 0 && !g_ddraw->vsync)) diff --git a/src/ddsurface.c b/src/ddsurface.c index ce4404e..f591d0d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -700,7 +700,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur if (This->flags & DDSD_BACKBUFFERCOUNT) { lpDDSurfaceDesc->dwFlags |= DDSD_BACKBUFFERCOUNT; - lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; + lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; } if (This->bpp == 8) @@ -952,6 +952,8 @@ HRESULT dds_Lock( if (g_ddraw && g_ddraw->lock_surfaces) EnterCriticalSection(&This->cs); + This->locked = TRUE; + dbg_dump_dds_lock_flags(dwFlags); if (g_ddraw && g_ddraw->fixnotresponding && !g_ddraw->wine) @@ -978,6 +980,11 @@ HRESULT dds_Lock( (char*)dds_GetBuffer(This) + (lpDestRect->left * This->bytes_pp) + (lpDestRect->top * This->pitch); } + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && (dwFlags & DDLOCK_WAIT)) + { + Sleep(5); + } + return ret; } @@ -1070,6 +1077,8 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { + if (!This->locked) return DDERR_NOTLOCKED; + /* Hack for Warcraft II BNE and Diablo */ HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; @@ -1180,6 +1189,8 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } + This->locked = FALSE; + if (g_ddraw && g_ddraw->lock_surfaces) LeaveCriticalSection(&This->cs); From c73d1c43f77d2aa9ba935f45b7c2a1fe2c7f2397 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 19:04:44 +0200 Subject: [PATCH 0659/1724] Revert "force "adjmouse = TRUE" when downscaling was detected" This reverts commit f468788a9dc59243e49fa6eb2e982a9a629aa664. --- inc/IDirectDrawSurface.h | 1 - src/dd.c | 10 ---------- src/ddsurface.c | 13 +------------ 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 49823f2..5c1a26d 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -42,7 +42,6 @@ typedef struct IDirectDrawSurfaceImpl DWORD last_flip_tick; DWORD last_blt_tick; BOOL queried; - BOOL locked; struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/src/dd.c b/src/dd.c index 30ab9a8..b7005b8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -713,13 +713,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!found_res || ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || - g_ddraw->height > g_ddraw->mode.dmPelsHeight) - { - /* Downscaling requires adjmouse to be enabled */ - g_ddraw->adjmouse = TRUE; - } - /* try current display settings */ g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; @@ -1178,9 +1171,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - Sleep(5); - return DD_OK; - if (g_ddraw->maxgameticks == -2) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_ddraw->render.maxfps >= 0 && !g_ddraw->vsync)) diff --git a/src/ddsurface.c b/src/ddsurface.c index f591d0d..ce4404e 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -700,7 +700,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur if (This->flags & DDSD_BACKBUFFERCOUNT) { lpDDSurfaceDesc->dwFlags |= DDSD_BACKBUFFERCOUNT; - lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; + lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; } if (This->bpp == 8) @@ -952,8 +952,6 @@ HRESULT dds_Lock( if (g_ddraw && g_ddraw->lock_surfaces) EnterCriticalSection(&This->cs); - This->locked = TRUE; - dbg_dump_dds_lock_flags(dwFlags); if (g_ddraw && g_ddraw->fixnotresponding && !g_ddraw->wine) @@ -980,11 +978,6 @@ HRESULT dds_Lock( (char*)dds_GetBuffer(This) + (lpDestRect->left * This->bytes_pp) + (lpDestRect->top * This->pitch); } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && (dwFlags & DDLOCK_WAIT)) - { - Sleep(5); - } - return ret; } @@ -1077,8 +1070,6 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - if (!This->locked) return DDERR_NOTLOCKED; - /* Hack for Warcraft II BNE and Diablo */ HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; @@ -1189,8 +1180,6 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } - This->locked = FALSE; - if (g_ddraw && g_ddraw->lock_surfaces) LeaveCriticalSection(&This->cs); From 862f419d96eed99c80b1e920ae9715e5412d3672 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 19:05:49 +0200 Subject: [PATCH 0660/1724] force "adjmouse = TRUE" when downscaling was detected --- src/dd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/dd.c b/src/dd.c index b7005b8..b2d2462 100644 --- a/src/dd.c +++ b/src/dd.c @@ -713,6 +713,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!found_res || ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { + if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || + g_ddraw->height > g_ddraw->mode.dmPelsHeight) + { + /* Downscaling requires adjmouse to be enabled */ + g_ddraw->adjmouse = TRUE; + } + /* try current display settings */ g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; From 20fa6df6b5d2b997c245732200b6408cc173a27c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 19:08:31 +0200 Subject: [PATCH 0661/1724] align --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index ce4404e..dfa059f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -700,7 +700,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur if (This->flags & DDSD_BACKBUFFERCOUNT) { lpDDSurfaceDesc->dwFlags |= DDSD_BACKBUFFERCOUNT; - lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; + lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; } if (This->bpp == 8) From fb2b6092d715e81b662bd178a3d44bd682ae5bb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 19:26:30 +0200 Subject: [PATCH 0662/1724] Support downscaling in borderless mode --- src/dd.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dd.c b/src/dd.c index b2d2462..2f22561 100644 --- a/src/dd.c +++ b/src/dd.c @@ -770,6 +770,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } } + else if (g_ddraw->fullscreen) /* Support downscaling in borderless mode */ + { + if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || + g_ddraw->height > g_ddraw->mode.dmPelsHeight) + { + /* Downscaling requires adjmouse to be enabled */ + g_ddraw->adjmouse = TRUE; + + g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; + g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + } + } g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = g_ddraw->render.height; From a13cdc159e773950c3610a55019a5c6dfb0ac241 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Sep 2023 21:21:18 +0200 Subject: [PATCH 0663/1724] always switch to borderless on failure --- src/dd.c | 42 ++++++++++-------------------------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/src/dd.c b/src/dd.c index 2f22561..9ad7e68 100644 --- a/src/dd.c +++ b/src/dd.c @@ -729,48 +729,26 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - /* everything failed, use windowed/borderless mode instead */ + /* everything failed, use borderless mode instead */ ChangeDisplaySettings(NULL, 0); - g_ddraw->render.width = g_ddraw->width; - g_ddraw->render.height = g_ddraw->height; - - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - g_ddraw->windowed = TRUE; + g_ddraw->fullscreen = TRUE; + border = FALSE; - if (g_ddraw->render.width <= g_ddraw->mode.dmPelsWidth && - g_ddraw->render.height <= g_ddraw->mode.dmPelsHeight) - { - /* Switch to borderless mode if window fits into screen */ - g_ddraw->fullscreen = TRUE; - border = FALSE; - - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; - - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - - /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw->renderer == ogl_render_main) - nonexclusive = TRUE; - } - else - { - /* Make window titlebar visible if window does not fit into screen */ - g_config.window_rect.left = -32000; - g_config.window_rect.top = - real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); - } + /* prevent OpenGL from going automatically into fullscreen exclusive mode */ + if (g_ddraw->renderer == ogl_render_main) + nonexclusive = TRUE; + } } } } } } - else if (g_ddraw->fullscreen) /* Support downscaling in borderless mode */ + + /* Support downscaling in borderless mode */ + if (g_ddraw->windowed && g_ddraw->fullscreen) { if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || g_ddraw->height > g_ddraw->mode.dmPelsHeight) From 3d413c5d93fec9aee0fbcbff6710c8c9b8f20be5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 01:06:37 +0200 Subject: [PATCH 0664/1724] tweak custom resolution settings --- src/config.c | 2 ++ src/dd.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 2840e53..59d46ca 100644 --- a/src/config.c +++ b/src/config.c @@ -368,6 +368,8 @@ static void cfg_create_ini() "no_dinput_hook=false\n" "refresh_rate=0\n" "non_anti_aliased_fonts=true\n" + "custom_width=0\n" + "custom_height=0\n" "\n" "\n" "\n" diff --git a/src/dd.c b/src/dd.c index 9ad7e68..c1a0ea0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -179,6 +179,12 @@ HRESULT dd_EnumDisplayModes( while (--m.dmPelsWidth % 8); } + if (i == 0 && g_ddraw->custom_width && g_ddraw->custom_height) + { + m.dmPelsWidth = g_ddraw->custom_width; + m.dmPelsHeight = g_ddraw->custom_height; + } + TRACE( " %u: %ux%u@%u %u bpp\n", i, @@ -291,7 +297,8 @@ HRESULT dd_EnumDisplayModes( if (!resolutions[i].cx || !resolutions[i].cy) continue; - if ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h)) + if (!(resolutions[i].cx == g_ddraw->custom_width && resolutions[i].cy == g_ddraw->custom_height) && + ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) { DEVMODE m; memset(&m, 0, sizeof(DEVMODE)); @@ -304,7 +311,7 @@ HRESULT dd_EnumDisplayModes( if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) continue; } - + DebugBreak(); memset(&s, 0, sizeof(s)); s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); From 597cdd9b480e7029917744ad3dba0cd58a093d92 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 01:07:22 +0200 Subject: [PATCH 0665/1724] remove DebugBreak --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index c1a0ea0..d9d55d0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -311,7 +311,7 @@ HRESULT dd_EnumDisplayModes( if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) continue; } - DebugBreak(); + memset(&s, 0, sizeof(s)); s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); From accc47e37791976235c100d23608e4a8ac4c055d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 16:47:28 +0200 Subject: [PATCH 0666/1724] fix cursor position issues with downscaling --- inc/dd.h | 5 +++++ src/dd.c | 9 +++++++-- src/mouse.c | 8 ++++---- src/winapi_hooks.c | 20 ++++++++++---------- src/wndproc.c | 12 ++++++------ 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 846904a..e4f312c 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -109,6 +109,11 @@ typedef struct CNCDDRAW struct { + float scale_x; + float scale_y; + float unscale_x; + float unscale_y; + int y_adjust; int x_adjust; RECT rc; diff --git a/src/dd.c b/src/dd.c index d9d55d0..e49fc00 100644 --- a/src/dd.c +++ b/src/dd.c @@ -817,11 +817,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); + g_ddraw->mouse.scale_x = ((float)(g_ddraw->render.viewport.width - 1) / (g_ddraw->width - 1)); + g_ddraw->mouse.scale_y = ((float)(g_ddraw->render.viewport.height - 1) / (g_ddraw->height - 1)); + g_ddraw->mouse.unscale_x = ((float)(g_ddraw->width - 1) / (g_ddraw->render.viewport.width - 1)); + g_ddraw->mouse.unscale_y = ((float)(g_ddraw->height - 1) / (g_ddraw->render.viewport.height - 1)); + g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; - g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust;; - g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust;; + g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust; + g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust; g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->mouse.x_adjust; g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->mouse.y_adjust; diff --git a/src/mouse.c b/src/mouse.c index 4cbed30..e709784 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -41,8 +41,8 @@ void mouse_lock() int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); real_SetCursorPos( - g_ddraw->adjmouse ? (int)(rc.left + (cur_x * g_ddraw->render.scale_w)) : rc.left + cur_x, - g_ddraw->adjmouse ? (int)(rc.top + (cur_y * g_ddraw->render.scale_h)) : rc.top + cur_y); + g_ddraw->adjmouse ? (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)) : rc.left + cur_x, + g_ddraw->adjmouse ? (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)) : rc.top + cur_y); CopyRect(&rc, &g_ddraw->mouse.rc); real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); @@ -73,8 +73,8 @@ void mouse_unlock() int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); real_SetCursorPos( - (int)(rc.left + (cur_x * g_ddraw->render.scale_w)), - (int)(rc.top + (cur_y * g_ddraw->render.scale_h))); + (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)), + (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y))); real_SetCursor(LoadCursor(NULL, IDC_ARROW)); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d95ef75..aebecd4 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -74,8 +74,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (g_ddraw->adjmouse) { - x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width - 1); - y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height - 1); + x = min((DWORD)(roundf(pt.x * g_ddraw->mouse.unscale_x)), g_ddraw->width - 1); + y = min((DWORD)(roundf(pt.y * g_ddraw->mouse.unscale_y)), g_ddraw->height - 1); } else { @@ -299,8 +299,8 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y) if (g_ddraw->adjmouse) { - pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w)); - pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); + pt.x = (LONG)(roundf(pt.x * g_ddraw->mouse.scale_x)); + pt.y = (LONG)(roundf(pt.y * g_ddraw->mouse.scale_y)); } pt.x += g_ddraw->mouse.x_adjust; @@ -428,8 +428,8 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar if (g_ddraw->adjmouse) { - x = (int)(roundf(x * g_ddraw->render.scale_w)); - y = (int)(roundf(y * g_ddraw->render.scale_h)); + x = (int)(roundf(x * g_ddraw->mouse.scale_x)); + y = (int)(roundf(y * g_ddraw->mouse.scale_y)); } lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); @@ -620,8 +620,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w } else { - x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); - y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); + y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); } InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); @@ -667,8 +667,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w } else { - x = (DWORD)(roundf(x * g_ddraw->render.unscale_w)); - y = (DWORD)(roundf(y * g_ddraw->render.unscale_h)); + x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); } } diff --git a/src/wndproc.c b/src/wndproc.c index fa753cf..756e815 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -758,8 +758,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); - y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); + y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); } InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); @@ -804,8 +804,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - x = (DWORD)(roundf(x * g_ddraw->render.unscale_w)); - y = (DWORD)(roundf(y * g_ddraw->render.unscale_h)); + x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); } } @@ -833,8 +833,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_ddraw->devmode && !g_mouse_locked) { - int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); - int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); + int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); From b1600d5d51e65ae6612f9bacd5fcf6e66119b729 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 22:12:10 +0200 Subject: [PATCH 0667/1724] rotate log every 100MB --- inc/debug.h | 2 +- src/debug.c | 71 +++++++++++++++++++++++++++++++++++------------------ 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 988a525..1d3e6c4 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -11,7 +11,7 @@ void dbg_debug_string(const char* format, ...); void dbg_print_rect(char* info, LPRECT rect); void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); -int dbg_printf(const char* fmt, ...); +void dbg_printf(const char* fmt, ...); void dbg_init(); void dbg_dump_swp_flags(DWORD flags); void dbg_dump_ddp_flags(DWORD flags); diff --git a/src/debug.c b/src/debug.c index 3bd4213..2edced6 100644 --- a/src/debug.c +++ b/src/debug.c @@ -16,6 +16,8 @@ LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; static int g_dbg_crash_count = 0; +static FILE* g_log_file; +static BOOL g_log_rotate; #if _DEBUG int dbg_exception_handler(EXCEPTION_POINTERS* exception) @@ -85,14 +87,21 @@ int dbg_exception_handler(EXCEPTION_POINTERS* exception) void dbg_init() { - static int stdout_open = 0; + static BOOL once = 0; - if (!stdout_open) + if (!once) { - stdout_open = 1; + once = TRUE; - freopen("cnc-ddraw.log", "w", stdout); - setvbuf(stdout, NULL, _IOLBF, 1024); + remove("cnc-ddraw-1.dmp"); + remove("cnc-ddraw-2.dmp"); + + remove("cnc-ddraw-1.log"); + remove("cnc-ddraw-2.log"); + remove("cnc-ddraw-3.log"); + + g_log_file = fopen("cnc-ddraw-1.log", "w"); + setvbuf(g_log_file, NULL, _IOLBF, 1024); HKEY hkey; LONG status = @@ -165,7 +174,7 @@ void dbg_debug_string(const char* format, ...) OutputDebugStringA(buffer); } -int dbg_printf(const char* fmt, ...) +void dbg_printf(const char* fmt, ...) { static CRITICAL_SECTION cs; static BOOL initialized; @@ -178,30 +187,44 @@ int dbg_printf(const char* fmt, ...) EnterCriticalSection(&cs); - va_list args; - int ret; + if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ + { + char filename[MAX_PATH] = { 0 }; + _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_log_rotate ? 3 : 2); - SYSTEMTIME st; - GetLocalTime(&st); + g_log_rotate = !g_log_rotate; - fprintf( - stdout, - "[%lu] %02d:%02d:%02d.%03d ", - GetCurrentThreadId(), - st.wHour, - st.wMinute, - st.wSecond, - st.wMilliseconds); + if (g_log_file = freopen(filename, "w", g_log_file)) + { + setvbuf(g_log_file, NULL, _IOLBF, 1024); + } + } - va_start(args, fmt); - ret = vfprintf(stdout, fmt, args); - va_end(args); + if (g_log_file) + { + va_list args; + int ret; - fflush(stdout); + SYSTEMTIME st; + GetLocalTime(&st); + + fprintf( + g_log_file, + "[%lu] %02d:%02d:%02d.%03d ", + GetCurrentThreadId(), + st.wHour, + st.wMinute, + st.wSecond, + st.wMilliseconds); + + va_start(args, fmt); + vfprintf(g_log_file, fmt, args); + va_end(args); + + fflush(g_log_file); + } LeaveCriticalSection(&cs); - - return ret; } void dbg_print_rect(char* info, LPRECT rect) From 587e461ea59563a7ed20ce15a62439eba0598d8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 22:48:56 +0200 Subject: [PATCH 0668/1724] rotate every 50MB --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 2edced6..703259d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -187,7 +187,7 @@ void dbg_printf(const char* fmt, ...) EnterCriticalSection(&cs); - if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ + if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 50) /* rotate every 50MB */ { char filename[MAX_PATH] = { 0 }; _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_log_rotate ? 3 : 2); From 2a44107d8e97d9914538aca75aeb8f19d1aad9d6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Sep 2023 22:51:46 +0200 Subject: [PATCH 0669/1724] Revert "rotate every 50MB" This reverts commit 587e461ea59563a7ed20ce15a62439eba0598d8e. --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 703259d..2edced6 100644 --- a/src/debug.c +++ b/src/debug.c @@ -187,7 +187,7 @@ void dbg_printf(const char* fmt, ...) EnterCriticalSection(&cs); - if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 50) /* rotate every 50MB */ + if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ { char filename[MAX_PATH] = { 0 }; _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_log_rotate ? 3 : 2); From 02d70d9afd231300a90357a85c870c37b2598ce3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 15 Sep 2023 22:41:15 +0200 Subject: [PATCH 0670/1724] fix names --- src/debug.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/debug.c b/src/debug.c index 2edced6..fb8419b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -16,8 +16,8 @@ LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; static int g_dbg_crash_count = 0; -static FILE* g_log_file; -static BOOL g_log_rotate; +static FILE* g_dbg_log_file; +static BOOL g_dbg_log_rotate; #if _DEBUG int dbg_exception_handler(EXCEPTION_POINTERS* exception) @@ -100,8 +100,8 @@ void dbg_init() remove("cnc-ddraw-2.log"); remove("cnc-ddraw-3.log"); - g_log_file = fopen("cnc-ddraw-1.log", "w"); - setvbuf(g_log_file, NULL, _IOLBF, 1024); + g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); + setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); HKEY hkey; LONG status = @@ -187,20 +187,20 @@ void dbg_printf(const char* fmt, ...) EnterCriticalSection(&cs); - if (g_log_file && ftell(g_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ + if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ { char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_log_rotate ? 3 : 2); + _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_dbg_log_rotate ? 3 : 2); - g_log_rotate = !g_log_rotate; + g_dbg_log_rotate = !g_dbg_log_rotate; - if (g_log_file = freopen(filename, "w", g_log_file)) + if (g_dbg_log_file = freopen(filename, "w", g_dbg_log_file)) { - setvbuf(g_log_file, NULL, _IOLBF, 1024); + setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } } - if (g_log_file) + if (g_dbg_log_file) { va_list args; int ret; @@ -209,7 +209,7 @@ void dbg_printf(const char* fmt, ...) GetLocalTime(&st); fprintf( - g_log_file, + g_dbg_log_file, "[%lu] %02d:%02d:%02d.%03d ", GetCurrentThreadId(), st.wHour, @@ -218,10 +218,10 @@ void dbg_printf(const char* fmt, ...) st.wMilliseconds); va_start(args, fmt); - vfprintf(g_log_file, fmt, args); + vfprintf(g_dbg_log_file, fmt, args); va_end(args); - fflush(g_log_file); + fflush(g_dbg_log_file); } LeaveCriticalSection(&cs); From 3c264e2077fdbd3ddd308076195df53b736d6f99 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Sat, 16 Sep 2023 10:08:15 +1200 Subject: [PATCH 0671/1724] Add min_font_size setting --- src/config.c | 1 + src/winapi_hooks.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index 59d46ca..6498ac5 100644 --- a/src/config.c +++ b/src/config.c @@ -370,6 +370,7 @@ static void cfg_create_ini() "non_anti_aliased_fonts=true\n" "custom_width=0\n" "custom_height=0\n" + "min_font_size=0\n" "\n" "\n" "\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index aebecd4..6c956bb 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -935,6 +935,14 @@ HFONT WINAPI fake_CreateFontA( if (cfg_get_bool("non_anti_aliased_fonts", TRUE)) fdwQuality = NONANTIALIASED_QUALITY; + int minFontSize = cfg_get_int("min_font_size", 0); + if (nHeight < 0) { + nHeight = min(-minFontSize, nHeight); + } + else { + nHeight = max(minFontSize, nHeight); + } + return real_CreateFontA( nHeight, From 5ebda1fec7c32aa209027d7d196af9115c29c4d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 16 Sep 2023 01:11:03 +0200 Subject: [PATCH 0672/1724] allow to specify min size for anti-aliased fonts --- src/config.c | 2 +- src/winapi_hooks.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 6498ac5..c8e3bce 100644 --- a/src/config.c +++ b/src/config.c @@ -367,7 +367,7 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" - "non_anti_aliased_fonts=true\n" + "anti_aliased_fonts_min_size=13\n" "custom_width=0\n" "custom_height=0\n" "min_font_size=0\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6c956bb..3b0ec4c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -910,7 +910,15 @@ HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf) LOGFONTA lf; memcpy(&lf, lplf, sizeof(lf)); - if (cfg_get_bool("non_anti_aliased_fonts", TRUE)) + int minFontSize = cfg_get_int("min_font_size", 0); + if (lf.lfHeight < 0) { + lf.lfHeight = min(-minFontSize, lf.lfHeight); + } + else { + lf.lfHeight = max(minFontSize, lf.lfHeight); + } + + if (cfg_get_int("anti_aliased_fonts_min_size", 13) > abs(lf.lfHeight)) lf.lfQuality = NONANTIALIASED_QUALITY; return real_CreateFontIndirectA(&lf); @@ -932,9 +940,6 @@ HFONT WINAPI fake_CreateFontA( DWORD fdwPitchAndFamily, LPCTSTR lpszFace) { - if (cfg_get_bool("non_anti_aliased_fonts", TRUE)) - fdwQuality = NONANTIALIASED_QUALITY; - int minFontSize = cfg_get_int("min_font_size", 0); if (nHeight < 0) { nHeight = min(-minFontSize, nHeight); @@ -943,6 +948,9 @@ HFONT WINAPI fake_CreateFontA( nHeight = max(minFontSize, nHeight); } + if (cfg_get_int("anti_aliased_fonts_min_size", 13) > abs(nHeight)) + fdwQuality = NONANTIALIASED_QUALITY; + return real_CreateFontA( nHeight, From fa8cdbd0dfb642f2fa428cefd68743bd89120d77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Sep 2023 00:38:42 +0200 Subject: [PATCH 0673/1724] move all ini settings to c_config --- inc/config.h | 76 ++++++++++++++- inc/dd.h | 60 ++---------- inc/hook.h | 1 - src/config.c | 228 +++++++++++++++------------------------------ src/dd.c | 225 ++++++++++++++++++++++++++++++-------------- src/ddsurface.c | 23 ++--- src/directinput.c | 12 +-- src/dllmain.c | 2 + src/fps_limiter.c | 9 +- src/hook.c | 21 ++--- src/mouse.c | 11 ++- src/render_d3d9.c | 49 +++++----- src/render_gdi.c | 17 ++-- src/render_ogl.c | 54 +++++------ src/screenshot.c | 7 +- src/utils.c | 28 +++--- src/winapi_hooks.c | 88 +++++++++-------- src/wndproc.c | 100 ++++++++++---------- 18 files changed, 523 insertions(+), 488 deletions(-) diff --git a/inc/config.h b/inc/config.h index 1b40a22..bf2df31 100644 --- a/inc/config.h +++ b/inc/config.h @@ -14,7 +14,79 @@ typedef struct CNCDDRAWCONFIG char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; + + /* Optional settings */ + + BOOL fullscreen; + BOOL windowed; + BOOL maintas; + BOOL boxing; + int maxfps; + BOOL vsync; + BOOL adjmouse; + char shader[MAX_PATH]; + char renderer[256]; + BOOL devmode; + BOOL border; int save_settings; + BOOL resizable; + int d3d9_filter; + BOOL vhack; + char screenshot_dir[MAX_PATH]; + BOOL toggle_borderless; + + /* Compatibility settings */ + + BOOL noactivateapp; + int maxgameticks; + BOOL nonexclusive; + BOOL singlecpu; + int resolutions; + int fixchilds; + BOOL hook_peekmessage; + int minfps; + DWORD minfps_tick_len; + + /* Undocumented settings */ + + BOOL releasealt; + BOOL fixnotresponding; + int hook; + int guard_lines; + int max_resolutions; + BOOL limit_bltfast; + BOOL lock_surfaces; + BOOL allow_wmactivate; + BOOL flipclear; + BOOL fixmousehook; + BOOL rgb555; + BOOL no_dinput_hook; + int refresh_rate; + int anti_aliased_fonts_min_size; + int custom_width; + int custom_height; + int min_font_size; + + /* Hotkeys */ + + struct + { + int toggle_fullscreen; + int toggle_maximize; + int unlock_cursor1; + int unlock_cursor2; + int screenshot; + } hotkeys; + + /* Game specific settings */ + + BOOL remove_menu; + + BOOL armadahack; + BOOL tshack; + BOOL infantryhack; + BOOL stronghold_hack; + BOOL mgs_hack; } CNCDDRAWCONFIG; @@ -23,8 +95,4 @@ extern CNCDDRAWCONFIG g_config; void cfg_load(); void cfg_save(); -BOOL cfg_get_bool(LPCSTR key, BOOL default_value); -int cfg_get_int(LPCSTR key, int default_value); -DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); - #endif diff --git a/inc/dd.h b/inc/dd.h index e4f312c..46a95b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -65,13 +65,11 @@ typedef struct CNCDDRAW DWORD width; DWORD height; DWORD bpp; - BOOL windowed; - BOOL border; - BOOL boxing; + DEVMODE mode; struct IDirectDrawSurfaceImpl* primary; char title[128]; - char screenshot_dir[MAX_PATH]; + CRITICAL_SECTION cs; /* real export from system32\ddraw.dll */ @@ -81,9 +79,6 @@ typedef struct CNCDDRAW struct { - int maxfps; - int minfps; - DWORD minfps_tick_len; int width; int height; int opengl_y_align; @@ -119,63 +114,20 @@ typedef struct CNCDDRAW RECT rc; } mouse; - struct - { - int toggle_fullscreen; - int toggle_maximize; - int unlock_cursor1; - int unlock_cursor2; - int screenshot; - } hotkeys; - + DWORD(WINAPI* renderer)(void); HWND hwnd; WNDPROC wndproc; struct { DWORD x; DWORD y; } cursor; - BOOL adjmouse; - BOOL devmode; - BOOL vsync; - BOOL vhack; int upscale_hack_width; int upscale_hack_height; BOOL isredalert; BOOL iscnc1; BOOL iskkndx; LONG upscale_hack_active; - DWORD(WINAPI* renderer)(void); - BOOL fullscreen; - BOOL maintas; - BOOL noactivateapp; - char shader[MAX_PATH]; BOOL wine; HCURSOR old_cursor; int show_cursor_count; - BOOL allow_wmactivate; - BOOL opengl_core; - BOOL resizable; - BOOL toggle_borderless; - BOOL nonexclusive; - int fixchilds; - BOOL fixnotresponding; - BOOL flipclear; - BOOL lock_surfaces; - int d3d9_filter; - BOOL d3d9on12; - int guard_lines; - int resolutions; - int max_resolutions; - int refresh_rate; - int custom_width; - int custom_height; - BOOL limit_bltfast; - BOOL armadahack; - BOOL tshack; - BOOL infantryhack; - BOOL stronghold_hack; - BOOL mgs_hack; - BOOL remove_menu; - int maxgameticks; BOOL alt_key_down; - BOOL releasealt; BOOL bnet_active; BOOL bnet_was_fullscreen; BOOL bnet_was_upscaled; @@ -186,12 +138,12 @@ typedef struct CNCDDRAW BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ - BOOL show_driver_warning; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; DWORD gui_thread_id; - BOOL rgb555; - BOOL hook_peekmessage; + BOOL show_driver_warning; + BOOL d3d9on12; + BOOL opengl_core; } CNCDDRAW; diff --git a/inc/hook.h b/inc/hook.h index 982064f..908c832 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -103,7 +103,6 @@ extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; -extern int g_hook_method; extern BOOL g_hook_active; extern HOOKLIST g_hook_hooklist[]; diff --git a/src/config.c b/src/config.c index c8e3bce..9c976cd 100644 --- a/src/config.c +++ b/src/config.c @@ -13,6 +13,9 @@ static void cfg_init(); static void cfg_create_ini(); +static BOOL cfg_get_bool(LPCSTR key, BOOL default_value); +static int cfg_get_int(LPCSTR key, int default_value); +static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); CNCDDRAWCONFIG g_config = { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; @@ -21,171 +24,94 @@ void cfg_load() { cfg_init(); - /* load settings from ini */ - g_ddraw->windowed = cfg_get_bool("windowed", FALSE); - g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); - g_ddraw->border = cfg_get_bool("border", TRUE); - g_ddraw->boxing = cfg_get_bool("boxing", FALSE); - g_ddraw->maintas = cfg_get_bool("maintas", FALSE); - g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE); - g_ddraw->devmode = cfg_get_bool("devmode", FALSE); - g_ddraw->vsync = cfg_get_bool("vsync", FALSE); - g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE); - g_ddraw->vhack = cfg_get_bool("vhack", FALSE); - g_ddraw->resizable = cfg_get_bool("resizable", TRUE); - g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); - g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); - g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); - g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); - g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); - g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); - g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); - g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); - g_ddraw->guard_lines = cfg_get_int("guard_lines", 200); - g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0); - g_ddraw->refresh_rate = cfg_get_int("refresh_rate", 0); - g_ddraw->custom_width = cfg_get_int("custom_width", 0); - g_ddraw->custom_height = cfg_get_int("custom_height", 0); - g_ddraw->limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); - g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); - g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); - g_ddraw->remove_menu = cfg_get_bool("remove_menu", FALSE); - cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir)); - - - g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); - g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - g_ddraw->infantryhack = cfg_get_bool("infantryhack", FALSE); - g_ddraw->stronghold_hack = cfg_get_bool("stronghold_hack", FALSE); - g_ddraw->mgs_hack = cfg_get_bool("mgs_hack", FALSE); - - if (cfg_get_bool("game_handles_close", FALSE) || g_ddraw->infantryhack) - { - GameHandlesClose = TRUE; - } - - g_ddraw->hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); - g_ddraw->hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); - g_ddraw->hotkeys.unlock_cursor1 = cfg_get_int("keyunlockcursor1", VK_TAB); - g_ddraw->hotkeys.unlock_cursor2 = cfg_get_int("keyunlockcursor2", VK_RCONTROL); - g_ddraw->hotkeys.screenshot = cfg_get_int("keyscreenshot", VK_SNAPSHOT); + /* Optional settings */ g_config.window_rect.right = cfg_get_int("width", 0); g_config.window_rect.bottom = cfg_get_int("height", 0); + g_config.fullscreen = cfg_get_bool("fullscreen", FALSE); + g_config.windowed = cfg_get_bool("windowed", FALSE); + g_config.maintas = cfg_get_bool("maintas", FALSE); + g_config.boxing = cfg_get_bool("boxing", FALSE); + g_config.maxfps = cfg_get_int("maxfps", -1); + g_config.vsync = cfg_get_bool("vsync", FALSE); + g_config.adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE); + cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); g_config.window_rect.left = cfg_get_int("posX", -32000); g_config.window_rect.top = cfg_get_int("posY", -32000); - + cfg_get_string("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); + g_config.devmode = cfg_get_bool("devmode", FALSE); + g_config.border = cfg_get_bool("border", TRUE); g_config.save_settings = cfg_get_int("savesettings", 1); + g_config.resizable = cfg_get_bool("resizable", TRUE); + g_config.d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); + g_config.vhack = cfg_get_bool("vhack", FALSE); + cfg_get_string("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); + g_config.toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); - g_ddraw->render.maxfps = cfg_get_int("maxfps", -1); - g_ddraw->render.minfps = cfg_get_int("minfps", 0); + /* Compatibility settings */ - if (g_ddraw->render.minfps > 1000) + g_config.noactivateapp = cfg_get_bool("noactivateapp", FALSE); + g_config.maxgameticks = cfg_get_int("maxgameticks", 0); + g_config.nonexclusive = cfg_get_bool("nonexclusive", FALSE); + g_config.singlecpu = cfg_get_bool("singlecpu", TRUE); + g_config.resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); + g_config.fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); + g_config.hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); + + g_config.minfps = cfg_get_int("minfps", 0); + + if (g_config.minfps > 1000) { - g_ddraw->render.minfps = 1000; + g_config.minfps = 1000; } - if (g_ddraw->render.minfps > 0) + if (g_config.minfps > 0) { - g_ddraw->render.minfps_tick_len = (DWORD)(1000.0f / g_ddraw->render.minfps); + g_config.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); } - /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ - g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + /* Undocumented settings */ - g_ddraw->maxgameticks = cfg_get_int("maxgameticks", 0); + g_config.releasealt = cfg_get_bool("releasealt", FALSE); + GameHandlesClose = cfg_get_bool("game_handles_close", FALSE); + g_config.fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); + g_config.hook = cfg_get_int("hook", 4); + g_config.guard_lines = cfg_get_int("guard_lines", 200); + g_config.max_resolutions = cfg_get_int("max_resolutions", 0); + g_config.limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); + g_config.lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); + g_config.allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); + g_config.flipclear = cfg_get_bool("flipclear", FALSE); + g_config.fixmousehook = cfg_get_bool("fixmousehook", FALSE); + g_config.rgb555 = cfg_get_bool("rgb555", FALSE); + g_config.no_dinput_hook = cfg_get_bool("no_dinput_hook", FALSE); + g_config.refresh_rate = cfg_get_int("refresh_rate", 0); + g_config.anti_aliased_fonts_min_size = cfg_get_int("anti_aliased_fonts_min_size", 13); + g_config.custom_width = cfg_get_int("custom_width", 0); + g_config.custom_height = cfg_get_int("custom_height", 0); + g_config.min_font_size = cfg_get_int("min_font_size", 0); - if (g_ddraw->maxgameticks > 0 && g_ddraw->maxgameticks <= 1000) + /* Hotkeys */ + + g_config.hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); + g_config.hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); + g_config.hotkeys.unlock_cursor1 = cfg_get_int("keyunlockcursor1", VK_TAB); + g_config.hotkeys.unlock_cursor2 = cfg_get_int("keyunlockcursor2", VK_RCONTROL); + g_config.hotkeys.screenshot = cfg_get_int("keyscreenshot", VK_SNAPSHOT); + + /* Game specific settings */ + + g_config.remove_menu = cfg_get_bool("remove_menu", FALSE); /* Added for HoMM4 */ + + g_config.armadahack = cfg_get_bool("armadahack", FALSE); + g_config.tshack = cfg_get_bool("tshack", FALSE); + g_config.infantryhack = cfg_get_bool("infantryhack", FALSE); + g_config.stronghold_hack = cfg_get_bool("stronghold_hack", FALSE); + g_config.mgs_hack = cfg_get_bool("mgs_hack", FALSE); + + if (g_config.infantryhack) { - g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); - - float len = 1000.0f / g_ddraw->maxgameticks; - g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); - g_ddraw->ticks_limiter.tick_length = (DWORD)(len + 0.5f); - } - - if (g_ddraw->maxgameticks >= 0 || g_ddraw->maxgameticks == -2) - { - /* always using 60 fps for flip... */ - g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); - - float flip_len = 1000.0f / 60; - g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); - g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); - } - - DWORD system_affinity; - DWORD proc_affinity; - HANDLE proc = GetCurrentProcess(); - - if (cfg_get_bool("singlecpu", TRUE)) - { - SetProcessAffinityMask(proc, 1); - } - else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) - { - SetProcessAffinityMask(proc, system_affinity); - } - - if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) - { - TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); - } - - /* to do: read .glslp config file instead of the shader and apply the correct settings */ - cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_ddraw->shader, sizeof(g_ddraw->shader)); - - char renderer[256] = {0}; - cfg_get_string("renderer", "auto", renderer, sizeof(renderer)); - - TRACE(" Using %s renderer\n", renderer); - - if (_strcmpi(renderer, "direct3d9on12") == 0) - { - g_ddraw->d3d9on12 = TRUE; - } - else if (_strcmpi(renderer, "openglcore") == 0) - { - g_ddraw->opengl_core = TRUE; - } - - if (tolower(renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ - { - g_ddraw->renderer = d3d9_render_main; - } - else if (tolower(renderer[0]) == 's' || tolower(renderer[0]) == 'g') /* gdi */ - { - g_ddraw->renderer = gdi_render_main; - } - else if (tolower(renderer[0]) == 'o') /* opengl or openglcore */ - { - if (oglu_load_dll()) - { - g_ddraw->renderer = ogl_render_main; - } - else - { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; - } - } - else /* auto */ - { - if (!g_ddraw->wine && d3d9_is_available()) - { - g_ddraw->renderer = d3d9_render_main; - } - else if (oglu_load_dll()) - { - g_ddraw->renderer = ogl_render_main; - } - else - { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; - } + GameHandlesClose = TRUE; } } @@ -1161,7 +1087,7 @@ static void cfg_init() } } -DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) +static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) { if (!g_config.ini_path[0]) cfg_init(); @@ -1186,7 +1112,7 @@ DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD o return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); } -BOOL cfg_get_bool(LPCSTR key, BOOL default_value) +static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) { char value[8]; cfg_get_string(key, default_value ? "Yes" : "No", value, sizeof(value)); @@ -1194,7 +1120,7 @@ BOOL cfg_get_bool(LPCSTR key, BOOL default_value) return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); } -int cfg_get_int(LPCSTR key, int default_value) +static int cfg_get_int(LPCSTR key, int default_value) { char def_value[20]; _snprintf(def_value, sizeof(def_value), "%d", default_value); diff --git a/src/dd.c b/src/dd.c index e49fc00..b6241f8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -66,13 +66,13 @@ HRESULT dd_EnumDisplayModes( max_h = reg_m.dmPelsHeight; } - if (g_ddraw->stronghold_hack && max_w && (max_w % 8)) + if (g_config.stronghold_hack && max_w && (max_w % 8)) { while (--max_w % 8); } - BOOL rlf = g_ddraw->resolutions == RESLIST_FULL; - BOOL rlm = g_ddraw->resolutions == RESLIST_MINI; + BOOL rlf = g_config.resolutions == RESLIST_FULL; + BOOL rlm = g_config.resolutions == RESLIST_MINI; SIZE resolutions[] = { @@ -107,7 +107,7 @@ HRESULT dd_EnumDisplayModes( { rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 }, /* Inject custom resolution */ - { g_ddraw->custom_width, g_ddraw->custom_height }, + { g_config.custom_width, g_config.custom_height }, { max_w, max_h }, }; @@ -120,7 +120,7 @@ HRESULT dd_EnumDisplayModes( } } - if ((g_ddraw->bpp && g_ddraw->resolutions == RESLIST_NORMAL) || g_ddraw->resolutions == RESLIST_FULL) + if ((g_ddraw->bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) { TRACE(" g_ddraw->bpp=%u\n", g_ddraw->bpp); @@ -174,15 +174,15 @@ HRESULT dd_EnumDisplayModes( flags == m.dmDisplayFlags && fixed_output == m.dmDisplayFixedOutput) { - if (g_ddraw->stronghold_hack && m.dmPelsWidth && (m.dmPelsWidth % 8)) + if (g_config.stronghold_hack && m.dmPelsWidth && (m.dmPelsWidth % 8)) { while (--m.dmPelsWidth % 8); } - if (i == 0 && g_ddraw->custom_width && g_ddraw->custom_height) + if (i == 0 && g_config.custom_width && g_config.custom_height) { - m.dmPelsWidth = g_ddraw->custom_width; - m.dmPelsHeight = g_ddraw->custom_height; + m.dmPelsWidth = g_config.custom_width; + m.dmPelsHeight = g_config.custom_height; } TRACE( @@ -208,9 +208,9 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) + if (g_ddraw->bpp == 8 || g_config.resolutions == RESLIST_FULL) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -233,9 +233,9 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) + if (g_ddraw->bpp == 16 || g_config.resolutions == RESLIST_FULL) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -258,9 +258,9 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) + if (g_ddraw->bpp == 32 || g_config.resolutions == RESLIST_FULL) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -290,14 +290,14 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw->bpp || g_ddraw->resolutions != RESLIST_NORMAL) + if (!g_ddraw->bpp || g_config.resolutions != RESLIST_NORMAL) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { if (!resolutions[i].cx || !resolutions[i].cy) continue; - if (!(resolutions[i].cx == g_ddraw->custom_width && resolutions[i].cy == g_ddraw->custom_height) && + if (!(resolutions[i].cx == g_config.custom_width && resolutions[i].cy == g_config.custom_height) && ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) { DEVMODE m; @@ -327,7 +327,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -349,7 +349,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -362,7 +362,7 @@ HRESULT dd_EnumDisplayModes( } } - if (g_ddraw->resolutions == RESLIST_MINI) + if (g_config.resolutions == RESLIST_MINI) continue; s.ddpfPixelFormat.dwFlags = DDPF_RGB; @@ -374,7 +374,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions) + if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { TRACE(" resolution limit reached, stopping\n"); return DD_OK; @@ -531,9 +531,9 @@ HRESULT dd_RestoreDisplayMode() } } - if (!g_ddraw->windowed) + if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) + if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -552,7 +552,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; - if (g_ddraw->mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ + if (g_config.mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ if (g_ddraw->render.thread) { @@ -583,7 +583,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!g_ddraw->mode.dmPelsWidth || !g_ddraw->mode.dmPelsHeight) { - g_ddraw->fullscreen = FALSE; + g_config.fullscreen = FALSE; } } } @@ -592,7 +592,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if ((g_ddraw->width || g_ddraw->infantryhack) && + if ((g_ddraw->width || g_config.infantryhack) && (g_ddraw->width != dwWidth || g_ddraw->height != dwHeight) && (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) { @@ -607,15 +607,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl InterlockedExchange((LONG*)&g_ddraw->cursor.x, dwWidth / 2); InterlockedExchange((LONG*)&g_ddraw->cursor.y, dwHeight / 2); - BOOL border = g_ddraw->border; + BOOL border = g_config.border; BOOL nonexclusive = FALSE; - if (g_ddraw->fullscreen) + if (g_config.fullscreen) { g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; - if (g_ddraw->windowed) /* windowed-fullscreen aka borderless */ + if (g_config.windowed) /* windowed-fullscreen aka borderless */ { border = FALSE; @@ -645,14 +645,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); g_ddraw->render.mode.dmSize = sizeof(DEVMODE); - if (g_ddraw->refresh_rate) + if (g_config.refresh_rate) { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; - g_ddraw->render.mode.dmDisplayFrequency = g_ddraw->refresh_rate; + g_ddraw->render.mode.dmDisplayFrequency = g_config.refresh_rate; if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - g_ddraw->refresh_rate = 0; + g_config.refresh_rate = 0; g_ddraw->render.mode.dmFields = 0; g_ddraw->render.mode.dmDisplayFrequency = 0; @@ -663,7 +663,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (!g_ddraw->windowed) + if (!g_config.windowed) { /* Making sure the chosen resolution is valid */ if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) @@ -724,7 +724,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->height > g_ddraw->mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ - g_ddraw->adjmouse = TRUE; + g_config.adjmouse = TRUE; } /* try current display settings */ @@ -739,8 +739,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl /* everything failed, use borderless mode instead */ ChangeDisplaySettings(NULL, 0); - g_ddraw->windowed = TRUE; - g_ddraw->fullscreen = TRUE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ @@ -755,13 +755,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } /* Support downscaling in borderless mode */ - if (g_ddraw->windowed && g_ddraw->fullscreen) + if (g_config.windowed && g_config.fullscreen) { if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || g_ddraw->height > g_ddraw->mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ - g_ddraw->adjmouse = TRUE; + g_config.adjmouse = TRUE; g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; @@ -776,7 +776,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.viewport.x = 0; g_ddraw->render.viewport.y = 0; - if (g_ddraw->boxing) + if (g_config.boxing) { g_ddraw->render.viewport.width = g_ddraw->width; g_ddraw->render.viewport.height = g_ddraw->height; @@ -794,7 +794,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; } - else if (g_ddraw->maintas) + else if (g_config.maintas) { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = @@ -830,13 +830,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->mouse.x_adjust; g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->mouse.y_adjust; - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { g_ddraw->mouse.rc.right = g_ddraw->render.viewport.width + g_ddraw->mouse.x_adjust; g_ddraw->mouse.rc.bottom = g_ddraw->render.viewport.height + g_ddraw->mouse.y_adjust; } - if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) + if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw->renderer == ogl_render_main)) { g_ddraw->render.height++; g_ddraw->render.opengl_y_align = 1; @@ -846,9 +846,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.opengl_y_align = 0; } - if (g_ddraw->windowed) + if (g_config.windowed) { - if (g_ddraw->remove_menu && GetMenu(g_ddraw->hwnd)) + if (g_config.remove_menu && GetMenu(g_ddraw->hwnd)) SetMenu(g_ddraw->hwnd, NULL); if (!g_ddraw->wine) @@ -898,7 +898,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); - if (g_ddraw->fullscreen) + if (g_config.fullscreen) { x = y = 0; } @@ -942,7 +942,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (lock_mouse || (g_ddraw->fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)) + if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)) mouse_lock(); } else @@ -975,7 +975,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->renderer == d3d9_render_main) { - if (g_ddraw->nonexclusive) + if (g_config.nonexclusive) { if (util_is_minimized(g_ddraw->hwnd)) real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); @@ -1002,12 +1002,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if ((!d3d9_active || g_ddraw->nonexclusive) && + if ((!d3d9_active || g_config.nonexclusive) && ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { g_ddraw->render.run = FALSE; - g_ddraw->windowed = TRUE; - g_ddraw->fullscreen = TRUE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } @@ -1031,7 +1031,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.height, swp_flags); - if (d3d9_active && g_ddraw->nonexclusive) + if (d3d9_active && g_config.nonexclusive) d3d9_reset(TRUE); g_ddraw->last_set_window_pos_tick = timeGetTime(); @@ -1056,7 +1056,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl SetThreadPriority(g_ddraw->render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } - if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_ddraw->infantryhack) + if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) { real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); @@ -1106,7 +1106,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); } - if (!g_ddraw->devmode) + if (!g_config.devmode) { HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); @@ -1119,13 +1119,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ - if (g_ddraw->windowed && !g_ddraw->fullscreen && !g_ddraw->devmode && cursor_count < 0) + if (g_config.windowed && !g_config.fullscreen && !g_config.devmode && cursor_count < 0) { while (real_ShowCursor(TRUE) < 0); } /* Starcraft locks the cursor before ddraw.dll was loaded */ - if (g_ddraw->windowed) + if (g_config.windowed) { real_ClipCursor(NULL); } @@ -1147,31 +1147,31 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw->upscale_hack_height = 400; } - if (g_ddraw->vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) + if (g_config.vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) { - g_ddraw->vhack = 0; + g_config.vhack = 0; } } /* Infantry Online Zone List Window */ - if (g_ddraw->infantryhack) + if (g_config.infantryhack) { static BOOL windowed, fullscreen; if (dwFlags & DDSCL_FULLSCREEN) { - g_ddraw->windowed = windowed; - g_ddraw->fullscreen = fullscreen; + g_config.windowed = windowed; + g_config.fullscreen = fullscreen; } else if (dwFlags & DDSCL_NOWINDOWCHANGES) { - windowed = g_ddraw->windowed; - fullscreen = g_ddraw->fullscreen; + windowed = g_config.windowed; + fullscreen = g_config.fullscreen; if (GetMenu(g_ddraw->hwnd) != NULL) { - g_ddraw->windowed = TRUE; - g_ddraw->fullscreen = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = FALSE; } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); @@ -1183,9 +1183,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_ddraw->maxgameticks == -2) + if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_ddraw->render.maxfps >= 0 && !g_ddraw->vsync)) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_config.maxfps >= 0 && !g_config.vsync)) return DD_OK; } @@ -1267,9 +1267,9 @@ ULONG dd_Release() } } - if (!g_ddraw->windowed) + if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) + if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -1378,7 +1378,94 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; g_blt_use_avx = util_is_avx_supported(); - cfg_load(); + /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ + g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) + { + g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + float len = 1000.0f / g_config.maxgameticks; + g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); + g_ddraw->ticks_limiter.tick_length = (DWORD)(len + 0.5f); + } + + if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) + { + /* always using 60 fps for flip... */ + g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + float flip_len = 1000.0f / 60; + g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); + g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); + } + + + DWORD system_affinity; + DWORD proc_affinity; + HANDLE proc = GetCurrentProcess(); + + if (g_config.singlecpu) + { + SetProcessAffinityMask(proc, 1); + } + else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + { + SetProcessAffinityMask(proc, system_affinity); + } + + if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + { + TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); + } + + + if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) + { + g_ddraw->d3d9on12 = TRUE; + } + else if (_strcmpi(g_config.renderer, "openglcore") == 0) + { + g_ddraw->opengl_core = TRUE; + } + + if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ + { + g_ddraw->renderer = d3d9_render_main; + } + else if (tolower(g_config.renderer[0]) == 's' || tolower(g_config.renderer[0]) == 'g') /* gdi */ + { + g_ddraw->renderer = gdi_render_main; + } + else if (tolower(g_config.renderer[0]) == 'o') /* opengl or openglcore */ + { + if (oglu_load_dll()) + { + g_ddraw->renderer = ogl_render_main; + } + else + { + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; + } + } + else /* auto */ + { + if (!g_ddraw->wine && d3d9_is_available()) + { + g_ddraw->renderer = d3d9_render_main; + } + else if (oglu_load_dll()) + { + g_ddraw->renderer = ogl_render_main; + } + else + { + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; + } + } + g_ddraw->ref--; } diff --git a/src/ddsurface.c b/src/ddsurface.c index dfa059f..3ca910d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -10,6 +10,7 @@ #include "debug.h" #include "utils.h" #include "blt.h" +#include "config.h" LONG g_dds_gdi_handles; @@ -647,7 +648,7 @@ HRESULT dds_BltFast( { ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - if (g_ddraw->limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0) + if (g_config.limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0) { g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); @@ -761,7 +762,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa InterlockedExchangePointer(&backbuffer->hdc, dc); InterlockedExchangePointer(&backbuffer->mapping, map); - if (g_ddraw->flipclear) + if (g_config.flipclear) { blt_clear(buf, 0, backbuffer->size); } @@ -782,7 +783,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); SwitchToThread(); - if ((g_ddraw->maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_ddraw->maxgameticks == -2) + if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2) { dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } @@ -949,12 +950,12 @@ HRESULT dds_Lock( DWORD dwFlags, HANDLE hEvent) { - if (g_ddraw && g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) EnterCriticalSection(&This->cs); dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_ddraw->fixnotresponding && !g_ddraw->wine) + if (g_ddraw && g_config.fixnotresponding && !g_ddraw->wine) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); @@ -1126,7 +1127,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } /* Hack for Star Trek Armada */ - hwnd = g_ddraw && g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + hwnd = g_ddraw && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1180,7 +1181,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } - if (g_ddraw && g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) LeaveCriticalSection(&This->cs); return DD_OK; @@ -1364,7 +1365,7 @@ HRESULT dd_CreateSurface( } else { - if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY) || g_ddraw->tshack) + if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY) || g_config.tshack) { dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } @@ -1390,12 +1391,12 @@ HRESULT dd_CreateSurface( DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; - DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_ddraw->guard_lines); + DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_config.guard_lines); dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_ddraw->guard_lines); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; @@ -1420,7 +1421,7 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiColors[i].rgbReserved = 0; } } - else if (dst_surface->bpp == 16 && g_ddraw->rgb555) + else if (dst_surface->bpp == 16 && g_config.rgb555) { ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0x7C00; ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x03E0; diff --git a/src/directinput.c b/src/directinput.c index c73f7cf..2647d6a 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -47,7 +47,7 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) { - if (g_mouse_locked || g_ddraw->devmode) + if (g_mouse_locked || g_config.devmode) { while (real_ShowCursor(FALSE) >= 0); } @@ -202,7 +202,7 @@ HRESULT WINAPI fake_DirectInputCreateA( HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) + if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -238,7 +238,7 @@ HRESULT WINAPI fake_DirectInputCreateW( HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) + if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -275,7 +275,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) + if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); @@ -285,7 +285,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( !real_di_CreateDeviceEx && riidltf && (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) - && !cfg_get_bool("no_dinput_hook", FALSE)) + && !g_config.no_dinput_hook) { real_di_CreateDeviceEx = (DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx); @@ -322,7 +322,7 @@ HRESULT WINAPI fake_DirectInput8Create( HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !cfg_get_bool("no_dinput_hook", FALSE)) + if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { real_di_CreateDevice = (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); diff --git a/src/dllmain.c b/src/dllmain.c index 92e6d2d..c7a042f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -104,6 +104,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + cfg_load(); + timeBeginPeriod(1); hook_init(TRUE); break; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index ce76f93..094f902 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -3,17 +3,18 @@ #include "dd.h" #include "debug.h" #include "hook.h" +#include "config.h" FPSLIMITER g_fpsl; void fpsl_init() { - int max_fps = g_ddraw->render.maxfps; + int max_fps = g_config.maxfps; g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || g_ddraw->vsync) + if (max_fps < 0 || g_config.vsync) max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) @@ -124,7 +125,7 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_ddraw->render.maxfps < 0 || g_ddraw->vsync) + if (g_config.maxfps < 0 || g_config.vsync) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -134,7 +135,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_ddraw->vsync) + if (g_config.vsync) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; diff --git a/src/hook.c b/src/hook.c index 5f5e7e6..a1e3407 100644 --- a/src/hook.c +++ b/src/hook.c @@ -15,7 +15,6 @@ #endif BOOL g_hook_active; -int g_hook_method = 4; GETCURSORPOSPROC real_GetCursorPos = GetCursorPos; CLIPCURSORPROC real_ClipCursor = ClipCursor; @@ -410,7 +409,7 @@ BOOL hook_got_ddraw_import() void hook_create(HOOKLIST* hooks, BOOL initial_hook) { #ifdef _MSC_VER - if ((g_hook_method == 2) && initial_hook) + if ((g_config.hook == 2) && initial_hook) { for (int i = 0; hooks[i].module_name[0]; i++) { @@ -428,7 +427,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) } #endif - if (g_hook_method == 3 || g_hook_method == 4) + if (g_config.hook == 3 || g_config.hook == 4) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -486,7 +485,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) } } - if (g_hook_method == 1) + if (g_config.hook == 1) { hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks); } @@ -495,7 +494,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) void hook_revert(HOOKLIST* hooks) { #ifdef _MSC_VER - if (g_hook_method == 2) + if (g_config.hook == 2) { for (int i = 0; hooks[i].module_name[0]; i++) { @@ -513,7 +512,7 @@ void hook_revert(HOOKLIST* hooks) } #endif - if (g_hook_method == 3 || g_hook_method == 4) + if (g_config.hook == 3 || g_config.hook == 4) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -560,7 +559,7 @@ void hook_revert(HOOKLIST* hooks) } } - if (g_hook_method == 1) + if (g_config.hook == 1) { hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks); } @@ -570,16 +569,14 @@ void hook_init(BOOL initial_hook) { if (initial_hook) { - g_hook_method = cfg_get_int("hook", 4); - - if (g_hook_method == 4 && hook_got_ddraw_import()) + if (g_config.hook == 4 && hook_got_ddraw_import()) { /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ - g_hook_method = 3; + g_config.hook = 3; } } - if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) + if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) { #if defined(_DEBUG) && defined(_MSC_VER) if (initial_hook) diff --git a/src/mouse.c b/src/mouse.c index e709784..504ee92 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -4,6 +4,7 @@ #include "dd.h" #include "hook.h" #include "utils.h" +#include "config.h" BOOL g_mouse_locked; @@ -12,7 +13,7 @@ HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_ddraw->devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) + if (g_config.devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) return; if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) @@ -41,8 +42,8 @@ void mouse_lock() int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); real_SetCursorPos( - g_ddraw->adjmouse ? (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)) : rc.left + cur_x, - g_ddraw->adjmouse ? (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)) : rc.top + cur_y); + g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)) : rc.left + cur_x, + g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)) : rc.top + cur_y); CopyRect(&rc, &g_ddraw->mouse.rc); real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); @@ -54,7 +55,7 @@ void mouse_lock() void mouse_unlock() { - if (g_ddraw->devmode || !g_hook_active || !g_ddraw->hwnd) + if (g_config.devmode || !g_hook_active || !g_ddraw->hwnd) return; if (g_mouse_locked) @@ -87,7 +88,7 @@ LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) if (!g_ddraw) return g_mouse_proc(Code, wParam, lParam); - if (Code < 0 || (!g_ddraw->devmode && !g_mouse_locked)) + if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 895f9ab..82b1d64 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -12,6 +12,7 @@ #include "debug.h" #include "D3d9types.h" #include "hook.h" +#include "config.h" static BOOL d3d9_create_resources(); @@ -38,7 +39,7 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_ddraw->windowed)) + if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) { return TRUE; } @@ -109,13 +110,13 @@ BOOL d3d9_create() memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); - g_d3d9.params.Windowed = g_ddraw->windowed || g_ddraw->nonexclusive; + g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; - g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; + g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_ddraw->refresh_rate; + g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; @@ -150,7 +151,7 @@ BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) { - return d3d9_reset(g_ddraw->windowed); + return d3d9_reset(g_config.windowed); } return FALSE; @@ -158,10 +159,10 @@ BOOL d3d9_on_device_lost() BOOL d3d9_reset(BOOL windowed) { - g_d3d9.params.Windowed = windowed || g_ddraw->nonexclusive; + g_d3d9.params.Windowed = windowed || g_config.nonexclusive; g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; - g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_ddraw->refresh_rate; + g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) @@ -281,7 +282,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? (g_ddraw->rgb555 ? D3DFMT_X1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + g_ddraw->bpp == 16 ? (g_config.rgb555 ? D3DFMT_X1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); @@ -318,7 +319,7 @@ static BOOL d3d9_create_resources() } else { - if (g_ddraw->d3d9_filter == FILTER_LANCZOS) + if (g_config.d3d9_filter == FILTER_LANCZOS) { BOOL error = FAILED( IDirect3DDevice9_CreatePixelShader( @@ -328,11 +329,11 @@ static BOOL d3d9_create_resources() if (error || !g_d3d9.pixel_shader_upscale) { - g_ddraw->d3d9_filter = FILTER_CUBIC; + g_config.d3d9_filter = FILTER_CUBIC; } } - if (g_ddraw->d3d9_filter == FILTER_CUBIC) + if (g_config.d3d9_filter == FILTER_CUBIC) { IDirect3DDevice9_CreatePixelShader( g_d3d9.device, @@ -357,7 +358,7 @@ static BOOL d3d9_set_states() err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = - g_ddraw->d3d9_filter && + g_config.d3d9_filter && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); @@ -374,9 +375,9 @@ static BOOL d3d9_set_states() } else { - if (g_ddraw->d3d9_filter) + if (g_config.d3d9_filter) { - if (g_ddraw->d3d9_filter == FILTER_LANCZOS && + if (g_config.d3d9_filter == FILTER_LANCZOS && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && @@ -388,7 +389,7 @@ static BOOL d3d9_set_states() else if ( SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && - g_ddraw->d3d9_filter == FILTER_CUBIC && + g_config.d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && @@ -453,10 +454,10 @@ DWORD WINAPI d3d9_render_main(void) BOOL needs_update = FALSE; - DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; while (g_ddraw->render.run && - (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -474,10 +475,10 @@ DWORD WINAPI d3d9_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) EnterCriticalSection(&g_ddraw->primary->cs); - if (g_ddraw->vhack) + if (g_config.vhack) { if (util_detect_low_res_screen()) { @@ -493,7 +494,7 @@ DWORD WINAPI d3d9_render_main(void) D3DLOCKED_RECT lock_rc; - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_ddraw->render.minfps == -2) + if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= D3D9_TEXTURE_COUNT) tex_index = 0; @@ -521,7 +522,7 @@ DWORD WINAPI d3d9_render_main(void) } if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_ddraw->render.minfps == -2)) + (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= D3D9_TEXTURE_COUNT) pal_index = 0; @@ -537,7 +538,7 @@ DWORD WINAPI d3d9_render_main(void) } } - if (g_ddraw->fixchilds) + if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); @@ -559,7 +560,7 @@ DWORD WINAPI d3d9_render_main(void) } } - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) LeaveCriticalSection(&g_ddraw->primary->cs); } @@ -595,7 +596,7 @@ DWORD WINAPI d3d9_render_main(void) fpsl_frame_end(); } - if (g_ddraw->vhack) + if (g_config.vhack) InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); return 0; diff --git a/src/render_gdi.c b/src/render_gdi.c index f8dfb24..89b0502 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -8,6 +8,7 @@ #include "wndproc.h" #include "hook.h" #include "debug.h" +#include "config.h" DWORD WINAPI gdi_render_main(void) @@ -23,7 +24,7 @@ DWORD WINAPI gdi_render_main(void) warning_end_tick = timeGetTime() + (15 * 1000); - if (!g_ddraw->windowed) + if (!g_config.windowed) PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0); _snprintf( @@ -37,10 +38,10 @@ DWORD WINAPI gdi_render_main(void) fpsl_init(); - DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; while (g_ddraw->render.run && - (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -56,7 +57,7 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) EnterCriticalSection(&g_ddraw->primary->cs); if (warning_end_tick) @@ -75,12 +76,12 @@ DWORD WINAPI gdi_render_main(void) } } - BOOL upscale_hack = g_ddraw->vhack && util_detect_low_res_screen(); + BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen(); - if (g_ddraw->vhack) + if (g_config.vhack) InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack); - if (g_ddraw->fixchilds) + if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); @@ -154,7 +155,7 @@ DWORD WINAPI gdi_render_main(void) DIB_RGB_COLORS); } - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) LeaveCriticalSection(&g_ddraw->primary->cs); } diff --git a/src/render_ogl.c b/src/render_ogl.c index 6d4b0ba..7170346 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -45,7 +45,7 @@ DWORD WINAPI ogl_render_main(void) g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT) - wglSwapIntervalEXT(g_ddraw->vsync ? 1 : 0); + wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); ogl_build_programs(); @@ -141,7 +141,7 @@ static void ogl_build_programs() { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); } - else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) + else if (g_ddraw->bpp == 16 && g_config.rgb555) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile); } @@ -156,20 +156,20 @@ static void ogl_build_programs() { char shader_path[MAX_PATH] = { 0 }; - strncpy(shader_path, g_ddraw->shader, sizeof(shader_path) - 1); + strncpy(shader_path, g_config.shader, sizeof(shader_path) - 1); if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader); + _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_config.shader); } /* detect common upscaling shaders and disable them if no upscaling is required */ BOOL is_upscaler = - strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || - strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || - strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || - strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; + strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || + strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || + strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || g_ddraw->render.viewport.width != g_ddraw->width || @@ -183,19 +183,19 @@ static void ogl_build_programs() { g_ogl.scale_program = oglu_build_program( - _stricmp(g_ddraw->shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : + _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : PASSTHROUGH_VERT_SHADER, - _stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : - _stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : - _stricmp(g_ddraw->shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : - _stricmp(g_ddraw->shader, "xBR-lv2") == 0 ? XBR_LV2_FRAG_SHADER : + _stricmp(g_config.shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : + _stricmp(g_config.shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : + _stricmp(g_config.shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : + _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_FRAG_SHADER : CATMULL_ROM_FRAG_SHADER, core_profile); bilinear = - _stricmp(g_ddraw->shader, "Nearest neighbor") != 0 && - _stricmp(g_ddraw->shader, "Lanczos") != 0 && - _stricmp(g_ddraw->shader, "xBR-lv2") != 0; + _stricmp(g_config.shader, "Nearest neighbor") != 0 && + _stricmp(g_config.shader, "Lanczos") != 0 && + _stricmp(g_config.shader, "xBR-lv2") != 0; } } } @@ -204,7 +204,7 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } - g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != NULL || bilinear; + g_ogl.filter_bilinear = strstr(g_config.shader, "bilinear.glsl") != NULL || bilinear; } if (g_oglu_got_version2 && !g_ogl.main_program) @@ -259,7 +259,7 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } - else if (g_ddraw->bpp == 16 && g_ddraw->rgb555) + else if (g_ddraw->bpp == 16 && g_config.rgb555) { if (g_oglu_got_version3) { @@ -662,10 +662,10 @@ static void ogl_render() glEnable(GL_TEXTURE_2D); } - DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; while (g_ogl.use_opengl && g_ddraw->render.run && - (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -688,10 +688,10 @@ static void ogl_render() g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) EnterCriticalSection(&g_ddraw->primary->cs); - if (g_ddraw->vhack) + if (g_config.vhack) { if (util_detect_low_res_screen()) { @@ -709,7 +709,7 @@ static void ogl_render() } if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_ddraw->render.minfps == -2)) + (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= TEXTURE_COUNT) pal_index = 0; @@ -728,7 +728,7 @@ static void ogl_render() g_ddraw->primary->palette->data_bgr); } - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_ddraw->render.minfps == -2) + if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= TEXTURE_COUNT) tex_index = 0; @@ -767,7 +767,7 @@ static void ogl_render() g_ogl.use_opengl = FALSE; } - if (g_ddraw->fixchilds) + if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); @@ -797,7 +797,7 @@ static void ogl_render() } } - if (g_ddraw->lock_surfaces) + if (g_config.lock_surfaces) LeaveCriticalSection(&g_ddraw->primary->cs); } @@ -928,7 +928,7 @@ static void ogl_render() fpsl_frame_end(); } - if (g_ddraw->vhack) + if (g_config.vhack) InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); } diff --git a/src/screenshot.c b/src/screenshot.c index d9623c6..4ad3cfc 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -7,6 +7,7 @@ #include "ddsurface.h" #include "lodepng.h" #include "blt.h" +#include "config.h" static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) @@ -58,7 +59,7 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) if (buf) { - if (g_ddraw->rgb555) + if (g_config.rgb555) { blt_rgb555_to_rgba8888( buf, @@ -146,10 +147,10 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } } - CreateDirectoryA(g_ddraw->screenshot_dir, NULL); + CreateDirectoryA(g_config.screenshot_dir, NULL); strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); - _snprintf(filename, sizeof(filename), "%s%s-%s.png", g_ddraw->screenshot_dir, title, str_time); + _snprintf(filename, sizeof(filename), "%s%s-%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { diff --git a/src/utils.c b/src/utils.c index f556bd6..8477297 100644 --- a/src/utils.c +++ b/src/utils.c @@ -271,7 +271,7 @@ void util_toggle_maximize() AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } - else if (g_ddraw->boxing) + else if (g_config.boxing) { dst_rc.left = 0; dst_rc.top = 0; @@ -290,7 +290,7 @@ void util_toggle_maximize() AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } - else if (g_ddraw->maintas) + else if (g_config.maintas) { util_unadjust_window_rect(&dst_rc, style, got_menu, exstyle); @@ -334,13 +334,13 @@ void util_toggle_fullscreen() if (g_ddraw->bnet_active) return; - if (g_ddraw->toggle_borderless && g_ddraw->windowed) + if (g_config.toggle_borderless && g_config.windowed) { - if (!g_ddraw->fullscreen) + if (!g_config.fullscreen) { mouse_unlock(); - g_config.borderless_state = g_ddraw->fullscreen = TRUE; + g_config.borderless_state = g_config.fullscreen = TRUE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); @@ -349,7 +349,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_ddraw->fullscreen = FALSE; + g_config.borderless_state = g_config.fullscreen = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); @@ -357,11 +357,11 @@ void util_toggle_fullscreen() } else { - if (g_ddraw->windowed) + if (g_config.windowed) { mouse_unlock(); - g_config.window_state = g_ddraw->windowed = FALSE; + g_config.window_state = g_config.windowed = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); @@ -370,11 +370,11 @@ void util_toggle_fullscreen() else { mouse_unlock(); - g_config.window_state = g_ddraw->windowed = TRUE; + g_config.window_state = g_config.windowed = TRUE; - if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) + if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) { - d3d9_reset(g_ddraw->windowed); + d3d9_reset(g_config.windowed); } else { @@ -418,7 +418,7 @@ BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwEx void util_set_window_rect(int x, int y, int width, int height, UINT flags) { - if (g_ddraw->windowed) + if (g_config.windowed) { if (g_ddraw->render.thread) { @@ -470,7 +470,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) //TRACE_EXT(" AVIWINDOW class=%s\n", class_name); - if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || + if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) @@ -496,7 +496,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; - if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_PAINT) + if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT) { HDC dst_dc = GetDC(hwnd); HDC src_dc; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3b0ec4c..f795b27 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -31,13 +31,13 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) realpt.x = pt.x; realpt.y = pt.y; - if (g_mouse_locked && (!g_ddraw->windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) + if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) { /* fallback solution for possible ClipCursor failure */ int diffx = 0, diffy = 0; - int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; + int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; pt.x -= g_ddraw->mouse.x_adjust; pt.y -= g_ddraw->mouse.y_adjust; @@ -72,7 +72,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) int x = 0; int y = 0; - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { x = min((DWORD)(roundf(pt.x * g_ddraw->mouse.unscale_x)), g_ddraw->width - 1); y = min((DWORD)(roundf(pt.y * g_ddraw->mouse.unscale_y)), g_ddraw->height - 1); @@ -83,7 +83,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) y = min(pt.y, g_ddraw->height - 1); } - if (g_ddraw->vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) + if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) { diffx = 0; diffy = 0; @@ -149,7 +149,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) if (lpRect) CopyRect(&dst_rc, lpRect); - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w)); dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h)); @@ -157,8 +157,8 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w)); } - int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; + int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; dst_rc.bottom = min(dst_rc.bottom, max_height); dst_rc.right = min(dst_rc.right, max_width); @@ -185,7 +185,7 @@ int WINAPI fake_ShowCursor(BOOL bShow) { if (g_ddraw && g_ddraw->hwnd) { - if (g_mouse_locked || g_ddraw->devmode) + if (g_mouse_locked || g_config.devmode) { int count = real_ShowCursor(bShow); InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); @@ -208,7 +208,7 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); - if (!g_mouse_locked && !g_ddraw->devmode) + if (!g_mouse_locked && !g_config.devmode) return cursor; } @@ -220,7 +220,7 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) if (lpRect && g_ddraw && g_ddraw->hwnd && - (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) { if (g_ddraw->hwnd == hWnd) { @@ -252,7 +252,7 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) if (lpRect && g_ddraw && g_ddraw->hwnd == hWnd && - (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) { lpRect->bottom = g_ddraw->height; lpRect->left = 0; @@ -292,12 +292,12 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y) if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) return real_SetCursorPos(X, Y); - if (!g_mouse_locked && !g_ddraw->devmode) + if (!g_mouse_locked && !g_config.devmode) return TRUE; POINT pt = { X, Y }; - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { pt.x = (LONG)(roundf(pt.x * g_ddraw->mouse.scale_x)); pt.y = (LONG)(roundf(pt.y * g_ddraw->mouse.scale_y)); @@ -426,7 +426,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { x = (int)(roundf(x * g_ddraw->mouse.scale_x)); y = (int)(roundf(y * g_ddraw->mouse.scale_y)); @@ -435,7 +435,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); } - if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && g_hook_method != 2) + if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; } @@ -538,7 +538,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) if (nCmdShow == SW_MAXIMIZE) nCmdShow = SW_NORMAL; - if (nCmdShow == SW_MINIMIZE && g_hook_method != 2) + if (nCmdShow == SW_MINIMIZE && g_config.hook != 2) return TRUE; } @@ -547,7 +547,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) HWND WINAPI fake_GetTopWindow(HWND hWnd) { - if (g_ddraw && g_ddraw->windowed && g_ddraw->hwnd && !hWnd) + if (g_ddraw && g_config.windowed && g_ddraw->hwnd && !hWnd) { return g_ddraw->hwnd; } @@ -557,7 +557,7 @@ HWND WINAPI fake_GetTopWindow(HWND hWnd) HWND WINAPI fake_GetForegroundWindow() { - if (g_ddraw && g_ddraw->windowed && g_ddraw->hwnd) + if (g_ddraw && g_config.windowed && g_ddraw->hwnd) { return g_ddraw->hwnd; } @@ -584,7 +584,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return NULL; } - if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && cfg_get_bool("fixmousehook", FALSE)) + if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.fixmousehook) { g_mouse_proc = lpfn; return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); @@ -597,7 +597,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_ddraw && g_ddraw->width && g_ddraw->hook_peekmessage) + if (result && g_ddraw && g_ddraw->width && g_config.hook_peekmessage) { switch (lpMsg->message) { @@ -605,7 +605,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_ddraw->devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked) { int x = GET_X_LPARAM(lpMsg->lParam); int y = GET_Y_LPARAM(lpMsg->lParam); @@ -646,7 +646,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_ddraw->devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' //return FALSE; @@ -655,9 +655,9 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0); int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw->mouse.y_adjust, 0); - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { - if (g_ddraw->vhack && !g_ddraw->devmode) + if (g_config.vhack && !g_config.devmode) { POINT pt = { 0, 0 }; fake_GetCursorPos(&pt); @@ -695,7 +695,7 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) if (g_ddraw && g_ddraw->bpp && index == BITSPIXEL && - (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) { return g_ddraw->bpp; } @@ -703,7 +703,7 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) if (g_ddraw && g_ddraw->bpp == 8 && index == RASTERCAPS && - (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) { return RC_PALETTE | real_GetDeviceCaps(hdc, index); } @@ -735,8 +735,8 @@ BOOL WINAPI fake_StretchBlt( if (g_ddraw && g_ddraw->hwnd && (hwnd == g_ddraw->hwnd || - (g_ddraw->fixchilds && IsChild(g_ddraw->hwnd, hwnd) && - (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE || + (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { @@ -910,15 +910,14 @@ HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf) LOGFONTA lf; memcpy(&lf, lplf, sizeof(lf)); - int minFontSize = cfg_get_int("min_font_size", 0); if (lf.lfHeight < 0) { - lf.lfHeight = min(-minFontSize, lf.lfHeight); + lf.lfHeight = min(-g_config.min_font_size, lf.lfHeight); } else { - lf.lfHeight = max(minFontSize, lf.lfHeight); + lf.lfHeight = max(g_config.min_font_size, lf.lfHeight); } - if (cfg_get_int("anti_aliased_fonts_min_size", 13) > abs(lf.lfHeight)) + if (g_config.anti_aliased_fonts_min_size > abs(lf.lfHeight)) lf.lfQuality = NONANTIALIASED_QUALITY; return real_CreateFontIndirectA(&lf); @@ -940,15 +939,14 @@ HFONT WINAPI fake_CreateFontA( DWORD fdwPitchAndFamily, LPCTSTR lpszFace) { - int minFontSize = cfg_get_int("min_font_size", 0); if (nHeight < 0) { - nHeight = min(-minFontSize, nHeight); + nHeight = min(-g_config.min_font_size, nHeight); } else { - nHeight = max(minFontSize, nHeight); + nHeight = max(g_config.min_font_size, nHeight); } - if (cfg_get_int("anti_aliased_fonts_min_size", 13) > abs(nHeight)) + if (g_config.anti_aliased_fonts_min_size > abs(nHeight)) fdwQuality = NONANTIALIASED_QUALITY; return @@ -1077,7 +1075,7 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) FARPROC proc = real_GetProcAddress(hModule, lpProcName); - if (g_hook_method != 3 || !hModule || !HIWORD(lpProcName)) + if (g_config.hook != 3 || !hModule || !HIWORD(lpProcName)) return proc; for (int i = 0; g_hook_hooklist[i].module_name[0]; i++) @@ -1153,7 +1151,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) SetFocus(g_ddraw->hwnd); mouse_lock(); - if (g_ddraw->windowed) + if (g_config.windowed) { g_ddraw->bnet_pos.x = g_ddraw->bnet_pos.y = 0; real_ClientToScreen(g_ddraw->hwnd, &g_ddraw->bnet_pos); @@ -1176,11 +1174,11 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) flags); } - g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled; + g_config.fullscreen = g_ddraw->bnet_was_upscaled; SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); - g_ddraw->resizable = TRUE; + g_config.resizable = TRUE; } } } @@ -1220,10 +1218,10 @@ HWND WINAPI fake_CreateWindowExA( { if (!g_ddraw->bnet_active) { - g_ddraw->bnet_was_upscaled = g_ddraw->fullscreen; - g_ddraw->fullscreen = FALSE; + g_ddraw->bnet_was_upscaled = g_config.fullscreen; + g_config.fullscreen = FALSE; - if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) + if (!g_config.windowed && !g_ddraw->bnet_was_fullscreen) { int ws = g_config.window_state; util_toggle_fullscreen(); @@ -1246,7 +1244,7 @@ HWND WINAPI fake_CreateWindowExA( int dst_height = g_config.window_rect.bottom ? g_ddraw->height : 0; util_set_window_rect(x, y, dst_width, dst_height, flags); - g_ddraw->resizable = FALSE; + g_config.resizable = FALSE; g_ddraw->bnet_active = TRUE; mouse_unlock(); diff --git a/src/wndproc.c b/src/wndproc.c index 756e815..96cf44e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -54,7 +54,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { MINMAXINFO* mmi = (MINMAXINFO*)lParam; - if (g_ddraw->windowed && g_ddraw->width) + if (g_config.windowed && g_ddraw->width) { RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; @@ -90,7 +90,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCACTIVATE: { - if (g_ddraw->noactivateapp) + if (g_config.noactivateapp) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -101,7 +101,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); - if (!g_ddraw->resizable) + if (!g_config.resizable) { switch (result) { @@ -146,7 +146,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case HTTOPRIGHT: return DefWindowProc(hWnd, uMsg, wParam, lParam); case HTCLIENT: - if (!g_mouse_locked && !g_ddraw->devmode) + if (!g_mouse_locked && !g_config.devmode) { real_SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; @@ -176,11 +176,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) && + if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) && g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) { - if (!g_ddraw->windowed) + if (!g_config.windowed) mouse_lock(); } return 0; @@ -193,7 +193,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET); - if (!g_ddraw->windowed) + if (!g_config.windowed) g_ddraw->bnet_was_fullscreen = FALSE; if (!g_ddraw->bnet_active) @@ -229,7 +229,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam */ if (g_ddraw->wine && - !g_ddraw->windowed && + !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) { @@ -240,7 +240,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_WINEFULLSCREEN: { - if (!g_ddraw->windowed) + if (!g_config.windowed) { g_ddraw->last_set_window_pos_tick = timeGetTime(); @@ -266,7 +266,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_ENTERSIZEMOVE: { - if (g_ddraw->windowed) + if (g_config.windowed) { in_size_move = TRUE; } @@ -274,7 +274,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_EXITSIZEMOVE: { - if (g_ddraw->windowed) + if (g_config.windowed) { in_size_move = FALSE; @@ -287,7 +287,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { RECT* windowrc = (RECT*)lParam; - if (g_ddraw->windowed) + if (g_config.windowed) { if (in_size_move) { @@ -305,7 +305,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RECT clientrc = { 0 }; /* maintain aspect ratio */ - if (g_ddraw->maintas && + if (g_config.maintas && CopyRect(&clientrc, windowrc) && util_unadjust_window_rect( &clientrc, @@ -419,7 +419,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SIZE: { - if (g_ddraw->windowed) + if (g_config.windowed) { if (wParam == SIZE_RESTORED) { @@ -450,7 +450,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_MOVE: { - if (g_ddraw->windowed) + if (g_config.windowed) { int x = (int)(short)LOWORD(lParam); int y = (int)(short)HIWORD(lParam); @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_ddraw->wine && !g_ddraw->fullscreen && g_ddraw->render.thread)) + if (in_size_move || (g_ddraw->wine && !g_config.fullscreen && g_ddraw->render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -502,7 +502,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_MAXIMIZE) { - if (g_ddraw->resizable) + if (g_config.resizable) { util_toggle_maximize(); } @@ -562,7 +562,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam //if (g_ddraw->windowed || g_ddraw->noactivateapp) - if (!g_ddraw->allow_wmactivate) + if (!g_config.allow_wmactivate) return 0; break; @@ -571,16 +571,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam) { - if (!g_ddraw->windowed) + if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) + if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) { ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); } } - else if (g_ddraw->fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd) + else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd) { mouse_lock(); } @@ -589,7 +589,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - if (!g_ddraw->windowed && !g_mouse_locked && g_ddraw->noactivateapp && !g_ddraw->devmode) + if (!g_config.windowed && !g_mouse_locked && g_config.noactivateapp && !g_config.devmode) return 0; mouse_unlock(); @@ -597,9 +597,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) return 0; - if (!g_ddraw->windowed) + if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) + if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) { real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); @@ -607,7 +607,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam && g_ddraw->releasealt) + if (wParam && g_config.releasealt) { INPUT ip; memset(&ip, 0, sizeof(ip)); @@ -626,18 +626,18 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw->windowed || g_ddraw->noactivateapp) + if (g_config.windowed || g_config.noactivateapp) { /* let it pass through once (tiberian sun) */ static BOOL one_time; - if (wParam && !one_time && g_ddraw->tshack) + if (wParam && !one_time && g_config.tshack) { one_time = TRUE; break; } - if (wParam && g_ddraw->alt_key_down && !g_ddraw->releasealt) + if (wParam && g_ddraw->alt_key_down && !g_config.releasealt) PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0); return 0; @@ -654,7 +654,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCLBUTTONDBLCLK: { - if (g_ddraw->resizable) + if (g_config.resizable) { util_toggle_maximize(); } @@ -666,9 +666,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam BOOL context_code = (lParam & (1 << 29)) != 0; BOOL key_state = (lParam & (1 << 30)) != 0; - if (g_ddraw->hotkeys.toggle_fullscreen && - wParam == g_ddraw->hotkeys.toggle_fullscreen && - (!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) && + if (g_config.hotkeys.toggle_fullscreen && + wParam == g_config.hotkeys.toggle_fullscreen && + (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) && context_code && !key_state) { @@ -676,11 +676,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - if (g_ddraw->hotkeys.toggle_maximize && - wParam == g_ddraw->hotkeys.toggle_maximize && - g_ddraw->resizable && - g_ddraw->windowed && - !g_ddraw->fullscreen) + if (g_config.hotkeys.toggle_maximize && + wParam == g_config.hotkeys.toggle_maximize && + g_config.resizable && + g_config.windowed && + !g_config.fullscreen) { util_toggle_maximize(); return 0; @@ -700,7 +700,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_ddraw->alt_key_down = FALSE; } - if (wParam == VK_TAB || (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen)) + if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -709,20 +709,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { - if (g_ddraw->hotkeys.unlock_cursor1 && - (wParam == VK_CONTROL || wParam == g_ddraw->hotkeys.unlock_cursor1)) + if (g_config.hotkeys.unlock_cursor1 && + (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { - if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor1) & 0x8000) + if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) { mouse_unlock(); return 0; } } - if (g_ddraw->hotkeys.unlock_cursor2 && - (wParam == g_ddraw->hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) + if (g_config.hotkeys.unlock_cursor2 && + (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) { - if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor2) & 0x8000) + if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) { mouse_unlock(); return 0; @@ -733,7 +733,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYUP: { - if (g_ddraw->hotkeys.screenshot && wParam == g_ddraw->hotkeys.screenshot) + if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); break; @@ -743,7 +743,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_ddraw->devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); @@ -784,7 +784,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_ddraw->devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked) { return 0; } @@ -792,9 +792,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0); int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0); - if (g_ddraw->adjmouse) + if (g_config.adjmouse) { - if (g_ddraw->vhack && !g_ddraw->devmode) + if (g_config.vhack && !g_config.devmode) { POINT pt = { 0, 0 }; fake_GetCursorPos(&pt); @@ -831,7 +831,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONDOWN: case WM_XBUTTONDOWN: { - if (!g_ddraw->devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked) { int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); From 5fa50fda517cdd43c84f14dc0cf42951b11cd29f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Sep 2023 01:47:00 +0200 Subject: [PATCH 0674/1724] add ini settings to log --- src/config.c | 120 ++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/src/config.c b/src/config.c index 9c976cd..646f2ef 100644 --- a/src/config.c +++ b/src/config.c @@ -17,6 +17,10 @@ static BOOL cfg_get_bool(LPCSTR key, BOOL default_value); static int cfg_get_int(LPCSTR key, int default_value); static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); +#define GET_INT(a,b,c) a = cfg_get_int(b, c); TRACE("%s=%d\n", b, a) +#define GET_BOOL(a,b,c) a = cfg_get_bool(b, c); TRACE("%s=%s\n", b, a ? "true" : "false") +#define GET_STRING(a,b,c,d) cfg_get_string(a, b, c, d); TRACE("%s=%s\n", a, c) + CNCDDRAWCONFIG g_config = { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; @@ -26,39 +30,39 @@ void cfg_load() /* Optional settings */ - g_config.window_rect.right = cfg_get_int("width", 0); - g_config.window_rect.bottom = cfg_get_int("height", 0); - g_config.fullscreen = cfg_get_bool("fullscreen", FALSE); - g_config.windowed = cfg_get_bool("windowed", FALSE); - g_config.maintas = cfg_get_bool("maintas", FALSE); - g_config.boxing = cfg_get_bool("boxing", FALSE); - g_config.maxfps = cfg_get_int("maxfps", -1); - g_config.vsync = cfg_get_bool("vsync", FALSE); - g_config.adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE); - cfg_get_string("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); - g_config.window_rect.left = cfg_get_int("posX", -32000); - g_config.window_rect.top = cfg_get_int("posY", -32000); - cfg_get_string("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); - g_config.devmode = cfg_get_bool("devmode", FALSE); - g_config.border = cfg_get_bool("border", TRUE); - g_config.save_settings = cfg_get_int("savesettings", 1); - g_config.resizable = cfg_get_bool("resizable", TRUE); - g_config.d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); - g_config.vhack = cfg_get_bool("vhack", FALSE); - cfg_get_string("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); - g_config.toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); + GET_INT(g_config.window_rect.right, "width", 0); + GET_INT(g_config.window_rect.bottom, "height", 0); + GET_BOOL(g_config.fullscreen, "fullscreen", FALSE); + GET_BOOL(g_config.windowed, "windowed", FALSE); + GET_BOOL(g_config.maintas, "maintas", FALSE); + GET_BOOL(g_config.boxing, "boxing", FALSE); + GET_INT(g_config.maxfps, "maxfps", -1); + GET_BOOL(g_config.vsync, "vsync", FALSE); + GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); + GET_STRING("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); + GET_INT(g_config.window_rect.left, "posX", -32000); + GET_INT(g_config.window_rect.top, "posY", -32000); + GET_STRING("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); + GET_BOOL(g_config.devmode, "devmode", FALSE); + GET_BOOL(g_config.border, "border", TRUE); + GET_BOOL(g_config.save_settings, "savesettings", 1); + GET_BOOL(g_config.resizable, "resizable", TRUE); + GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); + GET_BOOL(g_config.vhack, "vhack", FALSE); + GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); + GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); /* Compatibility settings */ - g_config.noactivateapp = cfg_get_bool("noactivateapp", FALSE); - g_config.maxgameticks = cfg_get_int("maxgameticks", 0); - g_config.nonexclusive = cfg_get_bool("nonexclusive", FALSE); - g_config.singlecpu = cfg_get_bool("singlecpu", TRUE); - g_config.resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - g_config.fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); - g_config.hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE); + GET_BOOL(g_config.noactivateapp, "noactivateapp", FALSE); + GET_INT(g_config.maxgameticks, "maxgameticks", 0); + GET_BOOL(g_config.nonexclusive, "nonexclusive", FALSE); + GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); + GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); + GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); + GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - g_config.minfps = cfg_get_int("minfps", 0); + GET_INT(g_config.minfps, "minfps", 0); if (g_config.minfps > 1000) { @@ -72,42 +76,42 @@ void cfg_load() /* Undocumented settings */ - g_config.releasealt = cfg_get_bool("releasealt", FALSE); - GameHandlesClose = cfg_get_bool("game_handles_close", FALSE); - g_config.fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); - g_config.hook = cfg_get_int("hook", 4); - g_config.guard_lines = cfg_get_int("guard_lines", 200); - g_config.max_resolutions = cfg_get_int("max_resolutions", 0); - g_config.limit_bltfast = cfg_get_bool("limit_bltfast", FALSE); - g_config.lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); - g_config.allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); - g_config.flipclear = cfg_get_bool("flipclear", FALSE); - g_config.fixmousehook = cfg_get_bool("fixmousehook", FALSE); - g_config.rgb555 = cfg_get_bool("rgb555", FALSE); - g_config.no_dinput_hook = cfg_get_bool("no_dinput_hook", FALSE); - g_config.refresh_rate = cfg_get_int("refresh_rate", 0); - g_config.anti_aliased_fonts_min_size = cfg_get_int("anti_aliased_fonts_min_size", 13); - g_config.custom_width = cfg_get_int("custom_width", 0); - g_config.custom_height = cfg_get_int("custom_height", 0); - g_config.min_font_size = cfg_get_int("min_font_size", 0); + GET_BOOL(g_config.releasealt, "releasealt", FALSE); + GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); + GET_BOOL(g_config.fixnotresponding, "fixnotresponding", FALSE); + GET_INT(g_config.hook, "hook", 4); + GET_INT(g_config.guard_lines, "guard_lines", 200); + GET_INT(g_config.max_resolutions, "max_resolutions", 0); + GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); + GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); + GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); + GET_BOOL(g_config.flipclear, "flipclear", FALSE); + GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); + GET_BOOL(g_config.rgb555, "rgb555", FALSE); + GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); + GET_INT(g_config.refresh_rate, "refresh_rate", 0); + GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); + GET_INT(g_config.custom_width, "custom_width", 0); + GET_INT(g_config.custom_height, "custom_height", 0); + GET_INT(g_config.min_font_size, "min_font_size", 0); /* Hotkeys */ - g_config.hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); - g_config.hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); - g_config.hotkeys.unlock_cursor1 = cfg_get_int("keyunlockcursor1", VK_TAB); - g_config.hotkeys.unlock_cursor2 = cfg_get_int("keyunlockcursor2", VK_RCONTROL); - g_config.hotkeys.screenshot = cfg_get_int("keyscreenshot", VK_SNAPSHOT); + GET_INT(g_config.hotkeys.toggle_fullscreen, "keytogglefullscreen", VK_RETURN); + GET_INT(g_config.hotkeys.toggle_maximize, "keytogglemaximize", VK_NEXT); + GET_INT(g_config.hotkeys.unlock_cursor1, "keyunlockcursor1", VK_TAB); + GET_INT(g_config.hotkeys.unlock_cursor2, "keyunlockcursor2", VK_RCONTROL); + GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); /* Game specific settings */ - g_config.remove_menu = cfg_get_bool("remove_menu", FALSE); /* Added for HoMM4 */ + GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); /* Added for HoMM4 */ - g_config.armadahack = cfg_get_bool("armadahack", FALSE); - g_config.tshack = cfg_get_bool("tshack", FALSE); - g_config.infantryhack = cfg_get_bool("infantryhack", FALSE); - g_config.stronghold_hack = cfg_get_bool("stronghold_hack", FALSE); - g_config.mgs_hack = cfg_get_bool("mgs_hack", FALSE); + GET_BOOL(g_config.armadahack, "armadahack", FALSE); + GET_BOOL(g_config.tshack, "tshack", FALSE); + GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); + GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); + GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); if (g_config.infantryhack) { From b039d9d4d121dfe1a00f3b0946e53daf66cd1593 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Sep 2023 01:56:10 +0200 Subject: [PATCH 0675/1724] add cnc-ddraw version to log --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 +++ ddraw.rc | 11 +---------- inc/version.h | 16 ++++++++++++++++ src/debug.c | 3 +++ 5 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 inc/version.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 6fa674b..1627aef 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -103,6 +103,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 39187f8..11979b2 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -266,6 +266,9 @@ Header Files + + Header Files + diff --git a/ddraw.rc b/ddraw.rc index 0d02eea..551bfc0 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -1,13 +1,4 @@ -#define str(s) #s -#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) - -#define VERSION_MAJOR 5 -#define VERSION_MINOR 7 -#define VERSION_BUILD 0 -#define VERSION_REVISION 4 - -#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION -#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) +#include "inc/version.h" 1 VERSIONINFO FILEVERSION VERSION diff --git a/inc/version.h b/inc/version.h new file mode 100644 index 0000000..6b065cf --- /dev/null +++ b/inc/version.h @@ -0,0 +1,16 @@ +#ifndef VERSION_H +#define VERSION_H + +#define str(s) #s +#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) + +#define VERSION_MAJOR 5 +#define VERSION_MINOR 7 +#define VERSION_BUILD 0 +#define VERSION_REVISION 5 + +#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION +#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) + + +#endif diff --git a/src/debug.c b/src/debug.c index fb8419b..8ebeb12 100644 --- a/src/debug.c +++ b/src/debug.c @@ -7,6 +7,7 @@ #include "wndproc.h" #include "debug.h" #include "hook.h" +#include "version.h" double g_dbg_frame_time = 0; @@ -103,6 +104,8 @@ void dbg_init() g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); + TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + HKEY hkey; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); From 1338adea4108f79f690498440d08cc3368475041 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Sep 2023 01:56:57 +0200 Subject: [PATCH 0676/1724] fix warning --- src/debug.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/debug.c b/src/debug.c index 8ebeb12..c38c940 100644 --- a/src/debug.c +++ b/src/debug.c @@ -197,7 +197,7 @@ void dbg_printf(const char* fmt, ...) g_dbg_log_rotate = !g_dbg_log_rotate; - if (g_dbg_log_file = freopen(filename, "w", g_dbg_log_file)) + if ((g_dbg_log_file = freopen(filename, "w", g_dbg_log_file))) { setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } @@ -206,8 +206,6 @@ void dbg_printf(const char* fmt, ...) if (g_dbg_log_file) { va_list args; - int ret; - SYSTEMTIME st; GetLocalTime(&st); From 58d52e396c38ec10b14a22008ea5b3b778e17a34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Sep 2023 02:08:26 +0200 Subject: [PATCH 0677/1724] fix save_settings --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 646f2ef..3f00c17 100644 --- a/src/config.c +++ b/src/config.c @@ -45,7 +45,7 @@ void cfg_load() GET_STRING("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); GET_BOOL(g_config.devmode, "devmode", FALSE); GET_BOOL(g_config.border, "border", TRUE); - GET_BOOL(g_config.save_settings, "savesettings", 1); + GET_INT(g_config.save_settings, "savesettings", 1); GET_BOOL(g_config.resizable, "resizable", TRUE); GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); GET_BOOL(g_config.vhack, "vhack", FALSE); From 90dd010bbf49de8329713af99a9e003b2805975b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Sep 2023 17:48:06 +0200 Subject: [PATCH 0678/1724] clean up config.c --- inc/config.h | 3 +-- inc/dd.h | 1 + src/config.c | 18 ++---------------- src/dd.c | 6 ++++++ src/render_d3d9.c | 2 +- src/render_gdi.c | 2 +- src/render_ogl.c | 2 +- 7 files changed, 13 insertions(+), 21 deletions(-) diff --git a/inc/config.h b/inc/config.h index bf2df31..97d9755 100644 --- a/inc/config.h +++ b/inc/config.h @@ -39,13 +39,12 @@ typedef struct CNCDDRAWCONFIG BOOL noactivateapp; int maxgameticks; + int minfps; BOOL nonexclusive; BOOL singlecpu; int resolutions; int fixchilds; BOOL hook_peekmessage; - int minfps; - DWORD minfps_tick_len; /* Undocumented settings */ diff --git a/inc/dd.h b/inc/dd.h index 46a95b1..1d0aa8f 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -140,6 +140,7 @@ typedef struct CNCDDRAW DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; + DWORD minfps_tick_len; DWORD gui_thread_id; BOOL show_driver_warning; BOOL d3d9on12; diff --git a/src/config.c b/src/config.c index 3f00c17..cb8b656 100644 --- a/src/config.c +++ b/src/config.c @@ -56,24 +56,13 @@ void cfg_load() GET_BOOL(g_config.noactivateapp, "noactivateapp", FALSE); GET_INT(g_config.maxgameticks, "maxgameticks", 0); + GET_INT(g_config.minfps, "minfps", 0); GET_BOOL(g_config.nonexclusive, "nonexclusive", FALSE); GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_INT(g_config.minfps, "minfps", 0); - - if (g_config.minfps > 1000) - { - g_config.minfps = 1000; - } - - if (g_config.minfps > 0) - { - g_config.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); - } - /* Undocumented settings */ GET_BOOL(g_config.releasealt, "releasealt", FALSE); @@ -113,10 +102,7 @@ void cfg_load() GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - if (g_config.infantryhack) - { - GameHandlesClose = TRUE; - } + GameHandlesClose = GameHandlesClose || g_config.infantryhack; } void cfg_save() diff --git a/src/dd.c b/src/dd.c index b6241f8..eec1c62 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1378,6 +1378,12 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; g_blt_use_avx = util_is_avx_supported(); + if (g_config.minfps > 1000) + g_config.minfps = 1000; + + if (g_config.minfps > 0) + g_ddraw->minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); + /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 82b1d64..66511ad 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -454,7 +454,7 @@ DWORD WINAPI d3d9_render_main(void) BOOL needs_update = FALSE; - DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; while (g_ddraw->render.run && (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) diff --git a/src/render_gdi.c b/src/render_gdi.c index 89b0502..c3f339f 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -38,7 +38,7 @@ DWORD WINAPI gdi_render_main(void) fpsl_init(); - DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; while (g_ddraw->render.run && (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) diff --git a/src/render_ogl.c b/src/render_ogl.c index 7170346..cc87e92 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -662,7 +662,7 @@ static void ogl_render() glEnable(GL_TEXTURE_2D); } - DWORD timeout = g_config.minfps > 0 ? g_config.minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; while (g_ogl.use_opengl && g_ddraw->render.run && (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) From 99538c2b0d5727a3877ca201f16c4536205d1e12 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 24 Sep 2023 19:51:50 +0200 Subject: [PATCH 0679/1724] fix resolution list on some 144hz setups --- src/dd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index eec1c62..9027306 100644 --- a/src/dd.c +++ b/src/dd.c @@ -146,7 +146,11 @@ HRESULT dd_EnumDisplayModes( m.dmDisplayFlags, m.dmDisplayFixedOutput); - if (refresh_rate != 60 && m.dmDisplayFrequency >= 50) + if (refresh_rate != 60 && refresh_rate < 120 && m.dmDisplayFrequency >= 50) + refresh_rate = m.dmDisplayFrequency; + + /* Some setups with 144hz monitors only contain a very few 60hz resolutions so we can't use 60hz as filter */ + if (m.dmDisplayFrequency > refresh_rate && m.dmDisplayFrequency >= 120) refresh_rate = m.dmDisplayFrequency; if (bpp != 32 && m.dmBitsPerPel >= 16) From bebc935923035ade72daa5ac62868c650fde4c8f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 24 Sep 2023 20:13:20 +0200 Subject: [PATCH 0680/1724] make sure config tool can create a fresh ddraw.ini --- src/dllmain.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index c7a042f..ff55417 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -22,13 +22,15 @@ HMODULE g_ddraw_module; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) - return TRUE; - switch (dwReason) { case DLL_PROCESS_ATTACH: { + cfg_load(); + + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + return TRUE; + #ifdef _DEBUG dbg_init(); TRACE("cnc-ddraw = %p\n", hDll); @@ -104,14 +106,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } - cfg_load(); - timeBeginPeriod(1); hook_init(TRUE); break; } case DLL_PROCESS_DETACH: { + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + return TRUE; + TRACE("cnc-ddraw DLL_PROCESS_DETACH\n"); cfg_save(); From 01f5efd7345a495cae20ca6f5eccfd22e9caab8f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 24 Sep 2023 20:30:07 +0200 Subject: [PATCH 0681/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 6b065cf..510cf80 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From c6fecb81153ee4020fe3a47e9cafe453312fc9e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 00:42:45 +0200 Subject: [PATCH 0682/1724] use english key names for now --- config/ConfigFormUnit.cpp | 51 +++++++++++++++++++++++++++++++++++---- config/ConfigFormUnit.h | 1 + 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 0a82b95..844c64e 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1249,11 +1249,11 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_PAUSE; } - if (key == L"R " + ShortCutToText(VK_CONTROL)) { + if (key == L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL))) { return VK_RCONTROL; } - return TextToShortCut(key); + return TextToShortCut(TranslateShortCut(key)); } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1267,14 +1267,55 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) } if (key == VK_RCONTROL) { - return L"R " + ShortCutToText(VK_CONTROL); + return L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL)); } if (key == VK_RSHIFT) { - return ShortCutToText(VK_SHIFT); + return TranslateShortCut(ShortCutToText(VK_SHIFT)); } - return ShortCutToText(key); + return TranslateShortCut(ShortCutToText(key)); +} + +System::UnicodeString TConfigForm::TranslateShortCut(System::UnicodeString text) +{ + /* Hack: Allows building the config tool on a german OS */ + if (text == "Eingabe") return "Enter"; + if (text == "Enter") return "Eingabe"; + if (text == "Leer") return "Space"; + if (text == "Space") return "Leer"; + if (text == "BildAuf") return "PgUp"; + if (text == "PgUp") return "BildAuf"; + if (text == "BildAb") return "PgDn"; + if (text == "PgDn") return "BildAb"; + if (text == "Ende") return "End"; + if (text == "End") return "Ende"; + if (text == "Pos1") return "Home"; + if (text == "Home") return "Pos1"; + if (text == "Links") return "Left"; + if (text == "Left") return "Links"; + if (text == "Auf") return "Up"; + if (text == "Up") return "Auf"; + if (text == "Rechts") return "Right"; + if (text == "Right") return "Rechts"; + if (text == "Ab") return "Down"; + if (text == "Down") return "Ab"; + if (text == "Einfg") return "Ins"; + if (text == "Ins") return "Einfg"; + if (text == "UMSCHALT") return "Shift"; + if (text == "Shift") return "UMSCHALT"; + if (text == "STRG") return "Ctrl"; + if (text == "Ctrl") return "STRG"; + if (text == "ALT") return "Alt"; + if (text == "Alt") return "ALT"; + if (text == "CTRL") return "Ctrl"; + if (text == "Ctrl") return "CTRL"; + if (text == "ROLLEN-FESTSTELL") return "Scroll Lock"; + if (text == "Scroll Lock") return "ROLLEN-FESTSTELL"; + if (text == "FESTSTELL") return "Caps Lock"; + if (text == "Caps Lock") return "FESTSTELL"; + + return text; } bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 7217b4a..0df1bae 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -121,6 +121,7 @@ private: // Benutzer-Deklarationen void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); + System::UnicodeString TranslateShortCut(System::UnicodeString text); void DisableGameUX(); void AddDllOverride(); public: // Benutzer-Deklarationen From f202c47735cc4f49c43e7da29e27bceaf2960063 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 02:30:35 +0200 Subject: [PATCH 0683/1724] try to use translated key names --- config/ConfigFormUnit.cpp | 87 ++++++++++++++++++++------------------- config/ConfigFormUnit.h | 3 +- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 844c64e..2387f8f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -16,6 +16,7 @@ TConfigForm *ConfigForm; bool Initialized; bool IsEnglish; +System::UnicodeString KeyNames[256]; /* Save previous settings so we don't override custom settings */ int Maxfps; @@ -1249,11 +1250,11 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_PAUSE; } - if (key == L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL))) { + if (key == L"R " + KeyToText(VK_CONTROL)) { return VK_RCONTROL; } - return TextToShortCut(TranslateShortCut(key)); + return TextToKey(key); } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1267,55 +1268,57 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) } if (key == VK_RCONTROL) { - return L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL)); + return L"R " + KeyToText(VK_CONTROL); } if (key == VK_RSHIFT) { - return TranslateShortCut(ShortCutToText(VK_SHIFT)); + return KeyToText(VK_SHIFT); } - return TranslateShortCut(ShortCutToText(key)); + return KeyToText(key); } -System::UnicodeString TConfigForm::TranslateShortCut(System::UnicodeString text) +WORD TConfigForm::TextToKey(System::UnicodeString Text) { - /* Hack: Allows building the config tool on a german OS */ - if (text == "Eingabe") return "Enter"; - if (text == "Enter") return "Eingabe"; - if (text == "Leer") return "Space"; - if (text == "Space") return "Leer"; - if (text == "BildAuf") return "PgUp"; - if (text == "PgUp") return "BildAuf"; - if (text == "BildAb") return "PgDn"; - if (text == "PgDn") return "BildAb"; - if (text == "Ende") return "End"; - if (text == "End") return "Ende"; - if (text == "Pos1") return "Home"; - if (text == "Home") return "Pos1"; - if (text == "Links") return "Left"; - if (text == "Left") return "Links"; - if (text == "Auf") return "Up"; - if (text == "Up") return "Auf"; - if (text == "Rechts") return "Right"; - if (text == "Right") return "Rechts"; - if (text == "Ab") return "Down"; - if (text == "Down") return "Ab"; - if (text == "Einfg") return "Ins"; - if (text == "Ins") return "Einfg"; - if (text == "UMSCHALT") return "Shift"; - if (text == "Shift") return "UMSCHALT"; - if (text == "STRG") return "Ctrl"; - if (text == "Ctrl") return "STRG"; - if (text == "ALT") return "Alt"; - if (text == "Alt") return "ALT"; - if (text == "CTRL") return "Ctrl"; - if (text == "Ctrl") return "CTRL"; - if (text == "ROLLEN-FESTSTELL") return "Scroll Lock"; - if (text == "Scroll Lock") return "ROLLEN-FESTSTELL"; - if (text == "FESTSTELL") return "Caps Lock"; - if (text == "Caps Lock") return "FESTSTELL"; + for (WORD i = 0; i < 256; i++) { + if (KeyNames[i] == Text) { + return i; + } + } - return text; + return 0; +} + +System::UnicodeString TConfigForm::KeyToText(WORD key) +{ + WCHAR keyName[256] = {}; + + UINT scanCode = MapVirtualKeyW(key, MAPVK_VK_TO_VSC); + + switch (key) { + case VK_LEFT: + case VK_UP: + case VK_RIGHT: + case VK_DOWN: + case VK_PRIOR: + case VK_NEXT: + case VK_END: + case VK_HOME: + case VK_INSERT: + case VK_DELETE: + case VK_DIVIDE: + case VK_NUMLOCK: + { + scanCode |= 0x100; + break; + } + } + + GetKeyNameTextW(scanCode << 16, keyName, sizeof(keyName) / sizeof(WCHAR)); + + KeyNames[(BYTE)key] = keyName; + + return KeyNames[(BYTE)key]; } bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 0df1bae..7b0425f 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -121,7 +121,8 @@ private: // Benutzer-Deklarationen void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); - System::UnicodeString TranslateShortCut(System::UnicodeString text); + WORD TextToKey(System::UnicodeString Text); + System::UnicodeString KeyToText(WORD key); void DisableGameUX(); void AddDllOverride(); public: // Benutzer-Deklarationen From 77c69d7e23ba075169f69b62adb81c59b37af6b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 02:57:59 +0200 Subject: [PATCH 0684/1724] remove unneeded function --- config/ConfigFormUnit.cpp | 30 ++++++++++++------------------ config/ConfigFormUnit.h | 3 +-- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 2387f8f..5b51d7d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1240,21 +1240,27 @@ void __fastcall TConfigForm::HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftSt SaveSettings(); } -WORD TConfigForm::GetKeyCode(System::UnicodeString key) +WORD TConfigForm::GetKeyCode(System::UnicodeString text) { - if (key == L"PrtScn") { + if (text == L"PrtScn") { return VK_SNAPSHOT; } - if (key == L"Pause_") { + if (text == L"Pause_") { return VK_PAUSE; } - if (key == L"R " + KeyToText(VK_CONTROL)) { + if (text == L"R " + KeyToText(VK_CONTROL)) { return VK_RCONTROL; } - return TextToKey(key); + for (WORD i = 0; i < 256; i++) { + if (KeyNames[i] == text) { + return i; + } + } + + return 0; } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1278,21 +1284,8 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) return KeyToText(key); } -WORD TConfigForm::TextToKey(System::UnicodeString Text) -{ - for (WORD i = 0; i < 256; i++) { - if (KeyNames[i] == Text) { - return i; - } - } - - return 0; -} - System::UnicodeString TConfigForm::KeyToText(WORD key) { - WCHAR keyName[256] = {}; - UINT scanCode = MapVirtualKeyW(key, MAPVK_VK_TO_VSC); switch (key) { @@ -1314,6 +1307,7 @@ System::UnicodeString TConfigForm::KeyToText(WORD key) } } + WCHAR keyName[256] = {}; GetKeyNameTextW(scanCode << 16, keyName, sizeof(keyName) / sizeof(WCHAR)); KeyNames[(BYTE)key] = keyName; diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 7b0425f..8a8a14c 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -120,8 +120,7 @@ private: // Benutzer-Deklarationen bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); - WORD GetKeyCode(System::UnicodeString key); - WORD TextToKey(System::UnicodeString Text); + WORD GetKeyCode(System::UnicodeString text); System::UnicodeString KeyToText(WORD key); void DisableGameUX(); void AddDllOverride(); From b85ee1674fc7b62aa47c0e67b40806beb343f96e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 06:54:12 +0200 Subject: [PATCH 0685/1724] fix possible deadlock --- src/utils.c | 2 +- src/wndproc.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8477297..5aeadd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -488,7 +488,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) 0, 0, 0, - SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER ); } } diff --git a/src/wndproc.c b/src/wndproc.c index 96cf44e..961f33d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -854,9 +854,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - EnterCriticalSection(&g_ddraw->cs); ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); break; } case WM_ERASEBKGND: From e7867e1cd375a8de798202d66d11242194e87271 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 10:41:20 +0200 Subject: [PATCH 0686/1724] add new hook flag for local hooks --- inc/hook.h | 5 +++-- src/hook.c | 64 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 908c832..1663f99 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -5,7 +5,8 @@ #include -#define SKIP_HOOK2 0x00000001l +#define HOOK_SKIP_2 0x00000001l +#define HOOK_LOCAL_ONLY 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; @@ -109,7 +110,7 @@ extern HOOKLIST g_hook_hooklist[]; void hook_init(BOOL initial_hook); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); void hook_create(HOOKLIST* hooks, BOOL initial_hook); void hook_revert(HOOKLIST* hooks); diff --git a/src/hook.c b/src/hook.c index a1e3407..4aa653d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -98,33 +98,33 @@ HOOKLIST g_hook_hooklist[] = { "ole32.dll", { - { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 }, + { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput.dll", { - { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 }, - //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, - { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 }, + { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, HOOK_SKIP_2 }, + //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, HOOK_SKIP_2 }, + { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput8.dll", { - { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 }, + { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "gdi32.dll", { - { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, - { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, - { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, + { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, + { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } @@ -133,12 +133,12 @@ HOOKLIST g_hook_hooklist[] = { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 }, - { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 }, - { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 }, - { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 }, - { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, SKIP_HOOK2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 }, + { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 }, + { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 }, + { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, + { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, + { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, @@ -160,10 +160,10 @@ void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function strncpy(hooks[0].module_name, module_name, sizeof(hooks[0].module_name) - 1); strncpy(hooks[0].data[0].function_name, function_name, sizeof(hooks[0].data[0].function_name) - 1); - hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks); + hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks, FALSE); } -void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -212,6 +212,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!hooks[i].data[x].new_function || !org_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -268,9 +271,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) } } -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { - hook_patch_obfuscated_iat_list(hmod, unhook, hooks); + hook_patch_obfuscated_iat_list(hmod, unhook, hooks, is_local); if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -317,6 +320,9 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!unhook && !hooks[i].data[x].new_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -415,7 +421,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -470,12 +476,14 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "Shw32") == 0) continue; - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, FALSE, hooks); + hook_patch_iat_list(hmod, FALSE, hooks, is_local); } } } @@ -487,7 +495,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks, TRUE); } } @@ -500,7 +508,7 @@ void hook_revert(HOOKLIST* hooks) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -544,12 +552,14 @@ void hook_revert(HOOKLIST* hooks) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, TRUE, hooks); + hook_patch_iat_list(hmod, TRUE, hooks, is_local); } } } @@ -561,7 +571,7 @@ void hook_revert(HOOKLIST* hooks) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks, TRUE); } } From d8982faae75e82a253e8f1c972b7bd0fc7007d93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 27 Sep 2023 01:16:27 +0200 Subject: [PATCH 0687/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 510cf80..7f3cf32 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 7 +#define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From e7a9c5b0957521d5c4d3f21dcfcf50be93f97264 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:10:29 +0200 Subject: [PATCH 0688/1724] #245 allow to limit FPS below refresh rate with vsync enabled --- src/dd.c | 4 +++- src/fps_limiter.c | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9027306..37ffb2a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1189,7 +1189,9 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_config.maxfps >= 0 && !g_config.vsync)) + BOOL open = !(g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + + if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; } diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 094f902..d157612 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,7 +14,7 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || g_config.vsync) + if (max_fps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) @@ -125,7 +125,7 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_config.maxfps < 0 || g_config.vsync) + if (g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -135,7 +135,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync) + if (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From 5060752adb98737d6bfafff9ba46cecb4f44daf8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:12:47 +0200 Subject: [PATCH 0689/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7f3cf32..7403f60 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From bbf529f6efc39c3929d6695371a8ee6efcf30232 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:19:21 +0200 Subject: [PATCH 0690/1724] limit fps also with maxfps=0 --- src/dd.c | 4 +++- src/fps_limiter.c | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 37ffb2a..9e2fb7a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1189,7 +1189,9 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - BOOL open = !(g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + BOOL open = + !(g_config.maxfps < 0 || + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index d157612..b8a8ac0 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,7 +14,7 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) @@ -125,7 +125,8 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (g_config.maxfps < 0 || + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -135,7 +136,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From a95003fbc28ecd750b3505038529d6928c458216 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:21:20 +0200 Subject: [PATCH 0691/1724] fix for last commit --- src/dd.c | 2 +- src/fps_limiter.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9e2fb7a..173c846 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1191,7 +1191,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { BOOL open = !(g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))); if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index b8a8ac0..97c0ec1 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -126,7 +126,7 @@ void fpsl_frame_start() void fpsl_frame_end() { if (g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -136,7 +136,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From c17db0349ae5d016d863cba534898569a54d2fd0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 19:51:53 +0200 Subject: [PATCH 0692/1724] #247 fix color key issues in Kohan: Immortal Sovereigns --- src/dd.c | 2 +- src/ddsurface.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 173c846..4075076 100644 --- a/src/dd.c +++ b/src/dd.c @@ -653,7 +653,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; g_ddraw->render.mode.dmDisplayFrequency = g_config.refresh_rate; - + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { g_config.refresh_rate = 0; diff --git a/src/ddsurface.c b/src/ddsurface.c index 3ca910d..254e09f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1296,7 +1296,7 @@ HRESULT dd_CreateSurface( if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY) return DDERR_UNSUPPORTED; - if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && + if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && (lpDDSurfaceDesc->dwWidth > 16384 || lpDDSurfaceDesc->dwHeight > 16384)) { return DDERR_INVALIDPARAMS; @@ -1328,6 +1328,12 @@ HRESULT dd_CreateSurface( dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; dst_surface->ddraw = This; + if (dst_surface->flags & DDSD_CKSRCBLT) + { + dst_surface->color_key.dwColorSpaceHighValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue; + dst_surface->color_key.dwColorSpaceLowValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue; + } + if (dst_surface->flags & DDSD_PIXELFORMAT) { switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) From be8bf853d034ca88a8ddbc2f97dd3536f48b1e3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 19:52:26 +0200 Subject: [PATCH 0693/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7403f60..0759210 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b0e8acc03caf6331548c17b2de073792e75533d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 23:21:21 +0200 Subject: [PATCH 0694/1724] #246 make sure we set resolution before checking if chosen refrresh_rate is supported --- src/dd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 4075076..908fa88 100644 --- a/src/dd.c +++ b/src/dd.c @@ -649,6 +649,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); g_ddraw->render.mode.dmSize = sizeof(DEVMODE); + g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + if (g_config.refresh_rate) { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; @@ -658,15 +662,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_config.refresh_rate = 0; - g_ddraw->render.mode.dmFields = 0; + g_ddraw->render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; g_ddraw->render.mode.dmDisplayFrequency = 0; } } - g_ddraw->render.mode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (!g_config.windowed) { /* Making sure the chosen resolution is valid */ From cbeffa867f5d364e4c74c3afacc93a31f7ef4b4a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 01:47:43 +0200 Subject: [PATCH 0695/1724] avoid exceptions with obfuscated binaries in debug build --- src/hook.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/hook.c b/src/hook.c index 4aa653d..6ae412a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -323,6 +323,23 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; + /* avoid exceptions with obfuscated binaries in debug build */ +#if defined(_DEBUG) + MEMORY_BASIC_INFORMATION mbi = { 0 }; + if (VirtualQuery((void*)import->Name, & mbi, sizeof(mbi))) + { + DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY); + BOOL b = !(mbi.Protect & mask); + // check the page is not a guard page + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; + + if (b) + continue; + } + else + continue; +#endif + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; From d04ada54d920431456bb5999986fa9748676b300 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 02:02:07 +0200 Subject: [PATCH 0696/1724] use _exit to avoid issues on close --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 961f33d..a64b2cb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -512,7 +512,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { - exit(0); + _exit(0); } if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL) From ce84abfac06fc929b59da162ed4f41caa7ecd0c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 02:17:01 +0200 Subject: [PATCH 0697/1724] fix TA megamap mouse wheel zoom in windowed mode --- src/winapi_hooks.c | 7 +++++++ src/wndproc.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f795b27..a31e14b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -652,6 +652,13 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w //return FALSE; } + if (lpMsg->message == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; + real_ScreenToClient(g_ddraw->hwnd, &pt); + lpMsg->lParam = MAKELPARAM(pt.x, pt.y); + } + int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0); int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw->mouse.y_adjust, 0); diff --git a/src/wndproc.c b/src/wndproc.c index a64b2cb..5ff00c2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -789,6 +789,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + if (uMsg == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + real_ScreenToClient(g_ddraw->hwnd, &pt); + lParam = MAKELPARAM(pt.x, pt.y); + } + int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0); int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0); From 7e9be9709965afc5bffc0cd2c9e5f34aff4e626d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 21:14:22 +0200 Subject: [PATCH 0698/1724] #249 fix improper colorspace handling --- src/ddsurface.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 254e09f..d5bb5de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1034,8 +1034,16 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE if (lpColorKey) { - This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; + + if (dwFlags & DDCKEY_COLORSPACE) + { + This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; + } + else + { + This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceLowValue; + } } return DD_OK; From 77b969a33f2d0930fcf2771230fefcb56b715ada Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Oct 2023 00:15:44 +0200 Subject: [PATCH 0699/1724] fix debug log build --- src/dllmain.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ff55417..ed27aaa 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -26,16 +26,20 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { - cfg_load(); - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + { + cfg_load(); return TRUE; + } #ifdef _DEBUG dbg_init(); TRACE("cnc-ddraw = %p\n", hDll); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif + + cfg_load(); + g_ddraw_module = hDll; char buf[1024]; From 43aa290d1e0ff00af825d5896314d2706f817793 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Oct 2023 02:11:45 +0200 Subject: [PATCH 0700/1724] add temporary workaround to fix issues in claw custom levels --- src/ddsurface.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d5bb5de..e50fb21 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1454,9 +1454,10 @@ HRESULT dd_CreateSurface( ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; } - + /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height)) + (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) || + (dst_surface->width == 128 && dst_surface->height == 128)) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); From 24a73ccc6d3b94be99503d79cc0ac9c5daef0a04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:03:11 +0200 Subject: [PATCH 0701/1724] #251 hook GetMessage for Enemy Infestation --- inc/config.h | 1 + inc/hook.h | 3 ++- inc/winapi_hooks.h | 1 + src/config.c | 4 +++- src/hook.c | 2 ++ src/winapi_hooks.c | 28 +++++++++++++++++++++++----- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/inc/config.h b/inc/config.h index 97d9755..dc35419 100644 --- a/inc/config.h +++ b/inc/config.h @@ -45,6 +45,7 @@ typedef struct CNCDDRAWCONFIG int resolutions; int fixchilds; BOOL hook_peekmessage; + BOOL hook_getmessage; /* Undocumented settings */ diff --git a/inc/hook.h b/inc/hook.h index 1663f99..ed453fc 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -47,7 +47,7 @@ typedef int (WINAPI* STRETCHDIBITSPROC)( typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); - +typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); @@ -92,6 +92,7 @@ extern STRETCHDIBITSPROC real_StretchDIBits; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; +extern GETMESSAGEAPROC real_GetMessageA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index b2962da..a66f475 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -32,6 +32,7 @@ HWND WINAPI fake_GetForegroundWindow(void); BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); +BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( diff --git a/src/config.c b/src/config.c index cb8b656..cad0772 100644 --- a/src/config.c +++ b/src/config.c @@ -62,6 +62,7 @@ void cfg_load() GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); + GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); /* Undocumented settings */ @@ -264,8 +265,9 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" + "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" "hook_peekmessage=false\n" + "hook_getmessage=false\n" "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" diff --git a/src/hook.c b/src/hook.c index 6ae412a..1b654d0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -47,6 +47,7 @@ STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; +GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; @@ -90,6 +91,7 @@ HOOKLIST g_hook_hooklist[] = { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, + { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, { "", NULL, NULL, 0 } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a31e14b..7efbb76 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -593,11 +593,9 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); } -BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && g_ddraw && g_ddraw->width && g_config.hook_peekmessage) + if (g_ddraw && g_ddraw->width) { switch (lpMsg->message) { @@ -690,10 +688,30 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w break; } - + } } + return TRUE; +} + +BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +{ + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + + if (result && g_config.hook_getmessage) + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + + return result; +} + +BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +{ + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + if (result && g_config.hook_peekmessage) + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + return result; } From 620d413ab842ef4213ba96181039467e584d34b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:05:06 +0200 Subject: [PATCH 0702/1724] #251 add preset for Enemy Infestation --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index cad0772..46dd242 100644 --- a/src/config.c +++ b/src/config.c @@ -692,6 +692,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" + "; Enemy Infestation\n" + "[EI]\n" + "hook_getmessage=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" From ba82f44562a32ab92722433f15caff6f4f628723 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:06:24 +0200 Subject: [PATCH 0703/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 0759210..6054b33 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 351a0cf467f0bb9d0a79c9069bb6bb585765ff96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Oct 2023 10:56:31 +0200 Subject: [PATCH 0704/1724] fix PostBuildEvent so it doesn't copy to ProjectDir when LocalDebuggerWorkingDirectory is not set --- cnc-ddraw.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 1627aef..3133efa 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -308,7 +308,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) @@ -335,7 +335,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) From 995d1f294bcf868c56ac675940bdd930e3dfb9b5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:00:27 +0200 Subject: [PATCH 0705/1724] #252 add presets for Nox --- inc/config.h | 1 + src/config.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index dc35419..e0d6a72 100644 --- a/inc/config.h +++ b/inc/config.h @@ -4,6 +4,7 @@ #define WIN32_LEAN_AND_MEAN #include +#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) typedef struct CNCDDRAWCONFIG { diff --git a/src/config.c b/src/config.c index 46dd242..08508ae 100644 --- a/src/config.c +++ b/src/config.c @@ -858,6 +858,16 @@ static void cfg_create_ini() "renderer=direct3d9\n" "nonexclusive=false\n" "windowed=false\n" + "maxgameticks=-1\n" + "\n" + "; Nox Reloaded\n" + "[NoxReloaded]\n" + "maxgameticks=-1\n" + "\n" + "; Nox GOG\n" + "[Game/2]\n" + "checkfile=.\\nox.cfg\n" + "maxgameticks=-1\n" "\n" "; Outlaws\n" "[olwin]\n" @@ -1091,19 +1101,53 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD s = GetPrivateProfileStringA( g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + char buf[MAX_PATH] = { 0 }; + if (s > 0) { - char buf[MAX_PATH] = { 0 }; - if (GetPrivateProfileStringA( g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) { - if (GetFileAttributes(buf) != INVALID_FILE_ATTRIBUTES) + if (FILE_EXISTS(buf)) + { return s; + } + else + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section), "%s?%d", g_config.process_file_name, 2); + + s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) + { + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + } + } } else return s; } + else + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section), "%s/%d", g_config.process_file_name, 2); + + s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) + { + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + } + } return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); } From dfae3361a04309143f1b3e181d64627a4dae908d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:04:36 +0200 Subject: [PATCH 0706/1724] fix _snprintf calls --- src/config.c | 8 ++++---- src/dllmain.c | 2 +- src/render_gdi.c | 2 +- src/screenshot.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 08508ae..d71259d 100644 --- a/src/config.c +++ b/src/config.c @@ -1115,7 +1115,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section), "%s?%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s?%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); @@ -1135,7 +1135,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section), "%s/%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); @@ -1162,8 +1162,8 @@ static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) static int cfg_get_int(LPCSTR key, int default_value) { - char def_value[20]; - _snprintf(def_value, sizeof(def_value), "%d", default_value); + char def_value[24]; + _snprintf(def_value, sizeof(def_value) - 1, "%d", default_value); char value[20]; cfg_get_string(key, def_value, value, sizeof(value)); diff --git a/src/dllmain.c b/src/dllmain.c index ed27aaa..bf6c556 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -58,7 +58,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) _snprintf( mes, - sizeof(mes), + sizeof(mes) - 1, "Please disable the '%s' compatibility mode for all game executables and " "then try to start the game again.", s); diff --git a/src/render_gdi.c b/src/render_gdi.c index c3f339f..bd88fb6 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -29,7 +29,7 @@ DWORD WINAPI gdi_render_main(void) _snprintf( warning_text, - sizeof(warning_text), + sizeof(warning_text) - 1, "-WARNING- Using slow software rendering, please update your graphics card driver (%s)", strlen(g_oglu_version) > 10 ? "" : g_oglu_version); } diff --git a/src/screenshot.c b/src/screenshot.c index 4ad3cfc..d559101 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -150,7 +150,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); - _snprintf(filename, sizeof(filename), "%s%s-%s.png", g_config.screenshot_dir, title, str_time); + _snprintf(filename, sizeof(filename) - 1, "%s%s-%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { From 4c07a8defa48565d05b3d6351e653a41488881c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:05:53 +0200 Subject: [PATCH 0707/1724] replace questionmark --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index d71259d..e15355e 100644 --- a/src/config.c +++ b/src/config.c @@ -1115,7 +1115,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s?%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); From 75176119927942861bbe20fb50b6a68180fc7d5d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 11:00:58 +0200 Subject: [PATCH 0708/1724] remove duplicate code --- src/config.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/config.c b/src/config.c index e15355e..ba23739 100644 --- a/src/config.c +++ b/src/config.c @@ -1109,33 +1109,17 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) { if (FILE_EXISTS(buf)) - { return s; - } - else - { - char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); - - s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); - - if (s > 0) - { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } - } - } } else return s; } - else + + /* Only checking 1 additional section for now (it may be too slow otherwise) */ + for (int i = 2; i < 3; i++) { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); From 9256899b204fe4209bce0ae72e5807e3a7dc9563 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 12:41:52 +0200 Subject: [PATCH 0709/1724] improve ini performance --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 +++++ inc/ini.h | 6 +++++ src/config.c | 40 ++++++++++++++++++-------------- src/ini.c | 49 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 inc/ini.h create mode 100644 src/ini.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 3133efa..924f32f 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -49,6 +49,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 11979b2..5a253f1 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -156,6 +156,9 @@ Source Files + + Source Files + @@ -269,6 +272,9 @@ Header Files + + Header Files + diff --git a/inc/ini.h b/inc/ini.h new file mode 100644 index 0000000..9b73604 --- /dev/null +++ b/inc/ini.h @@ -0,0 +1,6 @@ +#ifndef INI_H +#define INI_H + +BOOL ini_section_exists(char* section); + +#endif diff --git a/src/config.c b/src/config.c index ba23739..1e89be9 100644 --- a/src/config.c +++ b/src/config.c @@ -10,6 +10,7 @@ #include "hook.h" #include "debug.h" #include "dllmain.h" +#include "ini.h" static void cfg_init(); static void cfg_create_ini(); @@ -1098,37 +1099,42 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, if (!g_config.ini_path[0]) cfg_init(); - DWORD s = GetPrivateProfileStringA( - g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); - char buf[MAX_PATH] = { 0 }; - if (s > 0) + if (ini_section_exists(g_config.process_file_name)) { - if (GetPrivateProfileStringA( - g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + DWORD s = GetPrivateProfileStringA( + g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) { - if (FILE_EXISTS(buf)) + if (GetPrivateProfileStringA( + g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + else return s; } - else - return s; } - /* Only checking 1 additional section for now (it may be too slow otherwise) */ - for (int i = 2; i < 3; i++) + for (int i = 2; i < 10; i++) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); - - if (s > 0) + if (ini_section_exists(section)) { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + DWORD s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) { - if (FILE_EXISTS(buf)) - return s; + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } } } } diff --git a/src/ini.c b/src/ini.c new file mode 100644 index 0000000..38c42bc --- /dev/null +++ b/src/ini.c @@ -0,0 +1,49 @@ +#include +#include "debug.h" +#include "config.h" +#include "crc32.h" + +static unsigned long g_ini_section_hashes[1024]; + +BOOL ini_section_exists(char* section) +{ + if (!g_ini_section_hashes[0]) + { + char* buf = calloc(8192, 1); + if (buf) + { + if (GetPrivateProfileSectionNamesA(buf, 8192, g_config.ini_path) > 0) + { + for (int i = 0; *buf && i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]); i++) + { + size_t len = strlen(buf); + + for (char* p = buf; *p; ++p) + *p = tolower(*p); + + g_ini_section_hashes[i] = Crc32_ComputeBuf(0, buf, len); + + buf += len + 1; + } + } + + free(buf); + } + } + + char s[MAX_PATH]; + strncpy(s, section, sizeof(s) - 1); + + for (char* p = s; *p; ++p) + *p = tolower(*p); + + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); + + for (int i = 0; i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]) && g_ini_section_hashes[i]; i++) + { + if (g_ini_section_hashes[i] == hash) + return TRUE; + } + + return FALSE; +} From b68cfd17ec344169fd04a8a17a860c2cb0be73ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 02:33:47 +0200 Subject: [PATCH 0710/1724] update makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index b10930b..233aa78 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ FILES = src/IDirect3D/IDirect3D.c \ src/IDirectDraw/IDirectDrawGammaControl.c \ src/IAMMediaStream/IAMMediaStream.c \ src/crc32.c \ + src/ini.c \ src/blt.c \ src/dd.c \ src/ddpalette.c \ From 8a99b5e0ad90fdf48858adde40489fa325ee0328 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 02:44:31 +0200 Subject: [PATCH 0711/1724] improve mingw build --- src/hook.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index 1b654d0..224e411 100644 --- a/src/hook.c +++ b/src/hook.c @@ -326,14 +326,22 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc continue; /* avoid exceptions with obfuscated binaries in debug build */ -#if defined(_DEBUG) +#if defined(_DEBUG) || defined(__GNUC__) MEMORY_BASIC_INFORMATION mbi = { 0 }; - if (VirtualQuery((void*)import->Name, & mbi, sizeof(mbi))) + if (VirtualQuery((void*)import->Name, &mbi, sizeof(mbi))) { - DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY); + DWORD mask = ( + PAGE_READONLY | + PAGE_READWRITE | + PAGE_WRITECOPY | + PAGE_EXECUTE_READ | + PAGE_EXECUTE_READWRITE | + PAGE_EXECUTE_WRITECOPY); + BOOL b = !(mbi.Protect & mask); - // check the page is not a guard page - if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; + + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + b = TRUE; if (b) continue; @@ -603,6 +611,13 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; } + +#if defined(__GNUC__) + if (g_config.hook == 4) + { + g_config.hook = 3; + } +#endif } if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) From 43a0e95a39b9e3beadc8f1f929160617836db831 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 03:55:27 +0200 Subject: [PATCH 0712/1724] remove warning from makefile --- Makefile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Makefile b/Makefile index 233aa78..332982d 100644 --- a/Makefile +++ b/Makefile @@ -40,12 +40,6 @@ FILES = src/IDirect3D/IDirect3D.c \ src/opengl_utils.c all: - $(info ) - $(info **********************************************************************************************) - $(info WARNING: This build is outdated and does not support all cnc-ddraw features [Detours/SEH]) - $(info WARNING: Some games that require hooks may crash or glitch, please use the msvc build instead) - $(info **********************************************************************************************) - $(info ) $(WINDRES) -J rc ddraw.rc ddraw.rc.o $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) # $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt From 07fe110b746886f3ccf7d5918875037a357d2f42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 04:22:29 +0200 Subject: [PATCH 0713/1724] update Nox presets --- src/config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 1e89be9..9eea32d 100644 --- a/src/config.c +++ b/src/config.c @@ -859,16 +859,16 @@ static void cfg_create_ini() "renderer=direct3d9\n" "nonexclusive=false\n" "windowed=false\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Nox Reloaded\n" "[NoxReloaded]\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Nox GOG\n" "[Game/2]\n" "checkfile=.\\nox.cfg\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Outlaws\n" "[olwin]\n" From 94afdc378b7b132b3a6ad08a8fb20f4a10c68677 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 01:02:42 +0200 Subject: [PATCH 0714/1724] #253 add preset for Jedi Knight Dark Forces 2 --- inc/config.h | 1 + src/IDirectDraw/IDirectDraw.c | 9 +++++---- src/config.c | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index e0d6a72..381df22 100644 --- a/inc/config.h +++ b/inc/config.h @@ -67,6 +67,7 @@ typedef struct CNCDDRAWCONFIG int custom_width; int custom_height; int min_font_size; + BOOL direct3d_passthrough; /* Hotkeys */ diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3bf3861..35cd482 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -8,6 +8,7 @@ #include "ddsurface.h" #include "debug.h" #include "hook.h" +#include "config.h" HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) @@ -50,7 +51,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D, riid)) + else if (IsEqualGUID(&IID_IDirect3D, riid) && !g_config.direct3d_passthrough) { IDirect3DImpl* d3d = (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl)); @@ -64,7 +65,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D2, riid)) + else if (IsEqualGUID(&IID_IDirect3D2, riid) && !g_config.direct3d_passthrough) { IDirect3D2Impl* d3d = (IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl)); @@ -78,7 +79,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D3, riid)) + else if (IsEqualGUID(&IID_IDirect3D3, riid) && !g_config.direct3d_passthrough) { IDirect3D3Impl* d3d = (IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl)); @@ -92,7 +93,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D7, riid)) + else if (IsEqualGUID(&IID_IDirect3D7, riid) && !g_config.direct3d_passthrough) { IDirect3D7Impl* d3d = (IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl)); diff --git a/src/config.c b/src/config.c index 9eea32d..55b0e0a 100644 --- a/src/config.c +++ b/src/config.c @@ -85,6 +85,7 @@ void cfg_load() GET_INT(g_config.custom_width, "custom_width", 0); GET_INT(g_config.custom_height, "custom_height", 0); GET_INT(g_config.min_font_size, "min_font_size", 0); + GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); /* Hotkeys */ @@ -290,6 +291,7 @@ static void cfg_create_ini() "custom_width=0\n" "custom_height=0\n" "min_font_size=0\n" + "direct3d_passthrough=false\n" "\n" "\n" "\n" @@ -804,6 +806,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "releasealt=true\n" "\n" + "; Jedi Knight Dark Forces 2\n" + "[JK]\n" + "direct3d_passthrough=true\n" + "\n" "; Kings Quest 8\n" "[Mask]\n" "renderer=opengl\n" From c328ae95501113f679053a5023cb3eb94d73d381 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:35:09 +0200 Subject: [PATCH 0715/1724] forward input to video window during video playback --- inc/dd.h | 1 + src/render_d3d9.c | 1 + src/render_gdi.c | 1 + src/render_ogl.c | 1 + src/utils.c | 2 ++ src/wndproc.c | 21 +++++++++++++++++++++ 6 files changed, 27 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 1d0aa8f..1ab5d64 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,6 +136,7 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; + HWND video_window_hwnd; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 66511ad..cae506b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -541,6 +541,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/render_gdi.c b/src/render_gdi.c index bd88fb6..40d5263 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -84,6 +84,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } diff --git a/src/render_ogl.c b/src/render_ogl.c index cc87e92..79b1477 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -770,6 +770,7 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/utils.c b/src/utils.c index 5aeadd0..999a8e4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -475,6 +475,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); if (!(style & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 5ff00c2..4fccc95 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -729,6 +729,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } case WM_KEYUP: @@ -736,6 +743,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } /* button up messages reactivate cursor lock */ @@ -824,6 +838,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam = MAKELPARAM(x, y); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } case WM_PARENTNOTIFY: From 488d4ea56737078ff780c8049359549a43a484f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:50:34 +0200 Subject: [PATCH 0716/1724] only save hwnd for video windows --- src/utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 999a8e4..bddc06b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -475,7 +475,10 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) + { + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); From d7ed6bd7bc05200ac890a49764fddc9e75e25e6a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Oct 2023 18:13:35 +0200 Subject: [PATCH 0717/1724] improve ini reader performance --- inc/config.h | 3 +- inc/ini.h | 16 ++++- src/config.c | 43 ++++++------- src/ini.c | 170 ++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 182 insertions(+), 50 deletions(-) diff --git a/inc/config.h b/inc/config.h index 381df22..709a800 100644 --- a/inc/config.h +++ b/inc/config.h @@ -1,8 +1,8 @@ #ifndef CONFIG_H #define CONFIG_H -#define WIN32_LEAN_AND_MEAN #include +#include "ini.h" #define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) @@ -15,6 +15,7 @@ typedef struct CNCDDRAWCONFIG char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; + INIFILE ini; /* Optional settings */ diff --git a/inc/ini.h b/inc/ini.h index 9b73604..ee88575 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -1,6 +1,20 @@ #ifndef INI_H #define INI_H -BOOL ini_section_exists(char* section); +typedef struct +{ + char filename[MAX_PATH]; + + struct { + unsigned long hash; + char* data; + }*sections; +} INIFILE; + +void ini_create(INIFILE* ini, char* filename); +DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); +BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); +int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); +void ini_free(INIFILE* ini); #endif diff --git a/src/config.c b/src/config.c index 55b0e0a..a96644c 100644 --- a/src/config.c +++ b/src/config.c @@ -106,6 +106,8 @@ void cfg_load() GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; + + ini_free(&g_config.ini); } void cfg_save() @@ -1098,31 +1100,25 @@ static void cfg_init() { cfg_create_ini(); } + + ini_create(&g_config.ini, g_config.ini_path); } static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) { - if (!g_config.ini_path[0]) - cfg_init(); - char buf[MAX_PATH] = { 0 }; - if (ini_section_exists(g_config.process_file_name)) - { - DWORD s = GetPrivateProfileStringA( - g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); - if (s > 0) + if (s > 0) + { + if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", buf, sizeof(buf)) > 0) { - if (GetPrivateProfileStringA( - g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } - else + if (FILE_EXISTS(buf)) return s; } + else + return s; } for (int i = 2; i < 10; i++) @@ -1130,22 +1126,19 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - if (ini_section_exists(section)) - { - DWORD s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + DWORD s = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - if (s > 0) + if (s > 0) + { + if (ini_get_string(&g_config.ini, section, "checkfile", "", buf, sizeof(buf)) > 0) { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } + if (FILE_EXISTS(buf)) + return s; } } } - return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); + return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); } static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) diff --git a/src/ini.c b/src/ini.c index 38c42bc..69456b5 100644 --- a/src/ini.c +++ b/src/ini.c @@ -1,49 +1,173 @@ #include +#include #include "debug.h" #include "config.h" #include "crc32.h" +#include "ini.h" -static unsigned long g_ini_section_hashes[1024]; +// Microsoft: The maximum profile section size is 32,767 characters. +#define BUF_SIZE (8192) -BOOL ini_section_exists(char* section) +void ini_create(INIFILE* ini, char* filename) { - if (!g_ini_section_hashes[0]) - { - char* buf = calloc(8192, 1); - if (buf) - { - if (GetPrivateProfileSectionNamesA(buf, 8192, g_config.ini_path) > 0) - { - for (int i = 0; *buf && i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]); i++) - { - size_t len = strlen(buf); + if (!ini || !filename || !filename[0]) + return; - for (char* p = buf; *p; ++p) + ini->sections = calloc(sizeof(ini->sections[0]), 1); + if (ini->sections) + { + strncpy(ini->filename, filename, sizeof(ini->filename) - 1); + + char* names = calloc(BUF_SIZE, 1); + if (names) + { + if (GetPrivateProfileSectionNamesA(names, BUF_SIZE, filename) > 0) + { + char* name = names; + + for (int i = 0; *name; i++) + { + ini->sections = realloc(ini->sections, sizeof(ini->sections[0]) * (i + 2)); + + if (!ini->sections) + return; + + memset(&ini->sections[i + 1], 0, sizeof(ini->sections[0])); + + char* buf = malloc(BUF_SIZE); + if (buf) + { + DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, ini->filename); + if (size > 0) + { + ini->sections[i].data = malloc(size + 2); + if (ini->sections[i].data) + { + memcpy(ini->sections[i].data, buf, size + 2); + } + } + + free(buf); + } + + size_t len = strlen(name); + + for (char* p = name; *p; ++p) *p = tolower(*p); - g_ini_section_hashes[i] = Crc32_ComputeBuf(0, buf, len); + ini->sections[i].hash = Crc32_ComputeBuf(0, name, len); - buf += len + 1; + name += len + 1; } } - - free(buf); + + free(names); } } +} + +DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size) +{ + if (!buf || size == 0) + { + return 0; + } + + if (!ini || !ini->sections || !section || !key) + { + goto end; + } + + size_t key_len = strlen(key); + + if (key_len == 0 || strlen(section) == 0) + { + goto end; + } char s[MAX_PATH]; strncpy(s, section, sizeof(s) - 1); + buf[sizeof(s) - 1] = 0; for (char* p = s; *p; ++p) *p = tolower(*p); - + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); - - for (int i = 0; i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]) && g_ini_section_hashes[i]; i++) + + for (int i = 0; ini->sections[i].hash; i++) { - if (g_ini_section_hashes[i] == hash) - return TRUE; + if (ini->sections[i].hash == hash) + { + if (!ini->sections[i].data) + break; + + for (char* p = ini->sections[i].data; *p; p += strlen(p) + 1) + { + if (_strnicmp(key, p, key_len) == 0 && p[key_len] == '=') + { + strncpy(buf, &p[key_len + 1], size - 1); + buf[size - 1] = 0; + return strlen(buf); + } + } + + break; + } } - return FALSE; +end: + if (def) + { + strncpy(buf, def, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } + + buf[0] = 0; + + return 0; +} + +BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def) +{ + char value[8]; + ini_get_string(ini, section, key, def ? "Yes" : "No", value, sizeof(value)); + + return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); +} + +int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) +{ + char def_str[32]; + _snprintf(def_str, sizeof(def_str) - 1, "%d", def); + + char value[32]; + ini_get_string(ini, section, key, def_str, value, sizeof(value)); + + if (strstr(value, "0x")) + { + return strtol(value, NULL, 0); + } + else + { + return atoi(value); + } +} + +void ini_free(INIFILE* ini) +{ + if (ini->sections) + { + for (int i = 0; ini->sections[i].hash; i++) + { + if (ini->sections[i].data) + { + free(ini->sections[i].data); + ini->sections[i].data = NULL; + } + } + + free(ini->sections); + ini->sections = NULL; + } } From d3a1c821c87371865d6ae4c650fefbe4a4123fa7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Oct 2023 18:31:18 +0200 Subject: [PATCH 0718/1724] fix filename --- src/ini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ini.c b/src/ini.c index 69456b5..7956300 100644 --- a/src/ini.c +++ b/src/ini.c @@ -37,7 +37,7 @@ void ini_create(INIFILE* ini, char* filename) char* buf = malloc(BUF_SIZE); if (buf) { - DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, ini->filename); + DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, filename); if (size > 0) { ini->sections[i].data = malloc(size + 2); From a9445fb3004ca395e4105d16d52a991cbbea28e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Oct 2023 05:22:06 +0200 Subject: [PATCH 0719/1724] add new window message to toggle fullscreen/maximize --- inc/wndproc.h | 5 +++++ src/debug.c | 2 ++ src/wndproc.c | 26 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 6d2a199..3cb6a97 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -7,9 +7,14 @@ #define WM_SIZE_DDRAW WM_APP+114 #define WM_MOVE_DDRAW WM_APP+115 #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 +#define WM_TOGGLE_FULLSCREEN WM_APP+117 +#define WM_TOGGLE_MAXIMIZE WM_APP+118 #define IDT_TIMER_LEAVE_BNET 541287654 +#define CNC_DDRAW_SET_FULLSCREEN 1 +#define CNC_DDRAW_SET_WINDOWED 2 + LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif diff --git a/src/debug.c b/src/debug.c index c38c940..aaa8cb7 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1502,6 +1502,8 @@ char* dbg_mes_to_str(int id) case WM_D3D9DEVICELOST: return "WM_D3D9DEVICELOST"; case WM_WINEFULLSCREEN: return "WM_WINEFULLSCREEN"; case WM_AUTORENDERER: return "WM_AUTORENDERER"; + case WM_TOGGLE_FULLSCREEN: return "WM_TOGGLE_FULLSCREEN"; + case WM_TOGGLE_MAXIMIZE: return "WM_TOGGLE_MAXIMIZE"; } return 0; diff --git a/src/wndproc.c b/src/wndproc.c index 4fccc95..db1c00a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -652,6 +652,32 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_lock(); return 0; } + case WM_TOGGLE_FULLSCREEN: + { + if (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) + { + /* Check if we are fullscreen/borderless already */ + if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen)) + return 0; + + /* Check if we are windowed already */ + if (wParam == CNC_DDRAW_SET_WINDOWED && g_config.windowed && !g_config.fullscreen) + return 0; + + util_toggle_fullscreen(); + } + + return 0; + } + case WM_TOGGLE_MAXIMIZE: + { + if (g_config.resizable) + { + util_toggle_maximize(); + } + + return 0; + } case WM_NCLBUTTONDBLCLK: { if (g_config.resizable) From e92e01ec97c326563f969bb83e7c091e5517098b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Oct 2023 05:22:27 +0200 Subject: [PATCH 0720/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 6054b33..af7cd22 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 802f55dff41340bad9dfd03ae1e296e5f381eca6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Oct 2023 00:45:09 +0200 Subject: [PATCH 0721/1724] add some fixes to ini.c --- src/ini.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ini.c b/src/ini.c index 7956300..593dbba 100644 --- a/src/ini.c +++ b/src/ini.c @@ -17,6 +17,7 @@ void ini_create(INIFILE* ini, char* filename) if (ini->sections) { strncpy(ini->filename, filename, sizeof(ini->filename) - 1); + ini->filename[sizeof(ini->filename) - 1] = 0; char* names = calloc(BUF_SIZE, 1); if (names) @@ -156,6 +157,11 @@ int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) void ini_free(INIFILE* ini) { + if (!ini) + return; + + ini->filename[0] = 0; + if (ini->sections) { for (int i = 0; ini->sections[i].hash; i++) From 23f81c94f556f5a286b9c2e02787ba51b80a8932 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Oct 2023 00:54:48 +0200 Subject: [PATCH 0722/1724] add ini_get_float function --- inc/ini.h | 1 + src/ini.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/inc/ini.h b/inc/ini.h index ee88575..dfcee82 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -15,6 +15,7 @@ void ini_create(INIFILE* ini, char* filename); DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); +float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def); void ini_free(INIFILE* ini); #endif diff --git a/src/ini.c b/src/ini.c index 593dbba..b71f275 100644 --- a/src/ini.c +++ b/src/ini.c @@ -155,6 +155,17 @@ int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) } } +float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def) +{ + char def_str[32]; + _snprintf(def_str, sizeof(def_str) - 1, "%f", def); + + char value[32]; + ini_get_string(ini, section, key, def_str, value, sizeof(value)); + + return (float)atof(value); +} + void ini_free(INIFILE* ini) { if (!ini) From 9b17a9cd46a1f5b6bfef450290df6e2f3c9c4f6b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 03:59:35 +0200 Subject: [PATCH 0723/1724] add preset for vermeer --- inc/config.h | 1 + src/config.c | 5 +++++ src/dd.c | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/inc/config.h b/inc/config.h index 709a800..f609bab 100644 --- a/inc/config.h +++ b/inc/config.h @@ -90,6 +90,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL vermeer_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a96644c..2fed051 100644 --- a/src/config.c +++ b/src/config.c @@ -104,6 +104,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); + GET_BOOL(g_config.vermeer_hack, "vermeer_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -1028,6 +1029,10 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" + "; Vermeer\n" + "[vermeer]\n" + "vermeer_hack=true\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" diff --git a/src/dd.c b/src/dd.c index 908fa88..913a901 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1182,6 +1182,14 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } + if (dwFlags & DDSCL_NORMAL) + { + if (g_config.vermeer_hack) + { + dd_SetDisplayMode(640, 480, 16, 0); + } + } + return DD_OK; } From 65fc87b1397d5d636d9dc386bf3c222a6f3f27fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:24:20 +0200 Subject: [PATCH 0724/1724] force regular fullscreen by default for vermeer --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 913a901..ecc04d6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -479,7 +479,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->bpp == 32) + if (g_ddraw->bpp == 32 || g_config.vermeer_hack) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; @@ -1184,7 +1184,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (g_config.vermeer_hack) + if (0) { dd_SetDisplayMode(640, 480, 16, 0); } From 933fffe89d0b6d274fd478964143e5b952a83dcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:30:04 +0200 Subject: [PATCH 0725/1724] fix for last commit --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index ecc04d6..9d38296 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1184,7 +1184,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (0) + if (g_config.vermeer_hack) { dd_SetDisplayMode(640, 480, 16, 0); } From af861ff2ee9007edfa098030058a4e30ed7cfa9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:35:55 +0200 Subject: [PATCH 0726/1724] update vermeer preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2fed051..eaab99a 100644 --- a/src/config.c +++ b/src/config.c @@ -687,7 +687,6 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" - "devmode=true\n" "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" @@ -1031,6 +1030,7 @@ static void cfg_create_ini() "\n" "; Vermeer\n" "[vermeer]\n" + "adjmouse=true\n" "vermeer_hack=true\n" "\n" "; Wizardry 8\n" From ecc56d4cbc2d958005c012f202704f89f58d073f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 10:19:46 +0200 Subject: [PATCH 0727/1724] add some more error checks to IAT hooker --- inc/utils.h | 1 + src/hook.c | 42 ++++++++++++++---------------------------- src/utils.c | 25 +++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index fdb6b7f..4eee8a6 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_is_avx_supported(); void util_limit_game_ticks(); diff --git a/src/hook.c b/src/hook.c index 224e411..ba2ad7e 100644 --- a/src/hook.c +++ b/src/hook.c @@ -188,20 +188,23 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, while (import_desc->FirstThunk) { + if (!import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - HMODULE cur_mod = GetModuleHandle(hooks[i].module_name); + HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); PIMAGE_THUNK_DATA first_thunk = (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); - PIMAGE_THUNK_DATA original_first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); - while (first_thunk->u1.Function) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) @@ -260,7 +263,6 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, } first_thunk++; - original_first_thunk++; } } } @@ -298,6 +300,12 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc while (import_desc->FirstThunk) { + if (!import_desc->OriginalFirstThunk || !import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); @@ -325,30 +333,8 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; - /* avoid exceptions with obfuscated binaries in debug build */ -#if defined(_DEBUG) || defined(__GNUC__) - MEMORY_BASIC_INFORMATION mbi = { 0 }; - if (VirtualQuery((void*)import->Name, &mbi, sizeof(mbi))) - { - DWORD mask = ( - PAGE_READONLY | - PAGE_READWRITE | - PAGE_WRITECOPY | - PAGE_EXECUTE_READ | - PAGE_EXECUTE_READWRITE | - PAGE_EXECUTE_WRITECOPY); - - BOOL b = !(mbi.Protect & mask); - - if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) - b = TRUE; - - if (b) - continue; - } - else + if (util_is_bad_read_ptr((void*)import->Name)) continue; -#endif if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { diff --git a/src/utils.c b/src/utils.c index bddc06b..446d342 100644 --- a/src/utils.c +++ b/src/utils.c @@ -11,6 +11,31 @@ #include "config.h" +BOOL util_is_bad_read_ptr(void* p) +{ + MEMORY_BASIC_INFORMATION mbi = { 0 }; + if (VirtualQuery(p, &mbi, sizeof(mbi))) + { + DWORD mask = ( + PAGE_READONLY | + PAGE_READWRITE | + PAGE_WRITECOPY | + PAGE_EXECUTE_READ | + PAGE_EXECUTE_READWRITE | + PAGE_EXECUTE_WRITECOPY); + + BOOL b = !(mbi.Protect & mask); + + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + b = TRUE; + + if (!b) + return b; + } + + return TRUE; +} + BOOL util_is_minimized(HWND hwnd) { RECT rc = { 0 }; From ed2fa9331a01ed9935a67fe392f171793e320910 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 10:42:15 +0200 Subject: [PATCH 0728/1724] some more IAT hook tweaks --- src/hook.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/hook.c b/src/hook.c index ba2ad7e..110120c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -9,6 +9,7 @@ #include "debug.h" #include "dllmain.h" #include "config.h" +#include "utils.h" #ifdef _MSC_VER #include "detours.h" @@ -196,14 +197,13 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); - PIMAGE_THUNK_DATA first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); while (first_thunk->u1.Function) { @@ -264,6 +264,8 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, first_thunk++; } + + break; } } @@ -308,22 +310,25 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); - PIMAGE_THUNK_DATA original_first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); - - while (first_thunk->u1.Function && original_first_thunk->u1.AddressOfData) + while (first_thunk->u1.Function) { - PIMAGE_IMPORT_BY_NAME import = - (PIMAGE_IMPORT_BY_NAME)((DWORD)dos_header + original_first_thunk->u1.AddressOfData); + if (!o_first_thunk->u1.AddressOfData) + { + first_thunk++; + o_first_thunk++; + continue; + } - if ((original_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + + if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { @@ -336,7 +341,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (util_is_bad_read_ptr((void*)import->Name)) continue; - if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) + if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -373,8 +378,10 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } first_thunk++; - original_first_thunk++; + o_first_thunk++; } + + break; } } @@ -408,7 +415,13 @@ BOOL hook_got_ddraw_import() while (import_desc->FirstThunk) { - char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + if (!import_desc->Name) + { + import_desc++; + continue; + } + + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, "ddraw.dll") == 0) { From 3d8e05996d707b89afde89ecdfb8843f1b398cc9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 11:05:11 +0200 Subject: [PATCH 0729/1724] add GNUC check --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 110120c..ebd1c26 100644 --- a/src/hook.c +++ b/src/hook.c @@ -338,8 +338,10 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; +#if defined(__GNUC__) if (util_is_bad_read_ptr((void*)import->Name)) continue; +#endif if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { From d194865299efe1a7233a525796e49fbbe9e2c804 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 12:26:39 +0200 Subject: [PATCH 0730/1724] update atrox preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index eaab99a..42b6f5a 100644 --- a/src/config.c +++ b/src/config.c @@ -344,8 +344,6 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" - "renderer=gdi\n" - "hook=2\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 30023e00a8d52fcc9d318eddddf02ab605eea70a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 14:00:01 +0200 Subject: [PATCH 0731/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index af7cd22..e8bacc5 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 8 +#define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 4da01c3683d29ee5c85d96d6396c7d4e97f4b63b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 14:51:19 +0200 Subject: [PATCH 0732/1724] fix util_is_bad_read_ptr --- src/utils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 446d342..6c0f91e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -29,8 +29,7 @@ BOOL util_is_bad_read_ptr(void* p) if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; - if (!b) - return b; + return b; } return TRUE; From 44794a84784fb8c0e23cd1c13497872a6d7d7465 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 15:08:10 +0200 Subject: [PATCH 0733/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2505635..0faf14f 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad 1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game -Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) +Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once.   From 5fc3764253af35406053403d8b55712ec1529262 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:27:59 +0200 Subject: [PATCH 0734/1724] add fallback solution for rgb555 texture format issues --- src/dd.c | 2 +- src/render_d3d9.c | 54 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9d38296..ab5fc5b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1441,7 +1441,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); } - + if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) { g_ddraw->d3d9on12 = TRUE; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index cae506b..ead6db2 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -275,17 +275,49 @@ static BOOL d3d9_create_resources() for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) { - err = err || FAILED( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - g_ddraw->bpp == 16 ? (g_config.rgb555 ? D3DFMT_X1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); + if (g_ddraw->bpp == 16 && g_config.rgb555) + { + BOOL error = FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_X1R5G5B5, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_A1R5G5B5, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } + } + else + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } err = err || !g_d3d9.surface_tex[i]; From f7a8f3a083efc6b0157dfb48ebce2f20ca1093ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:29:13 +0200 Subject: [PATCH 0735/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index e8bacc5..df8acc9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6a4159d73eb11a9d5a0001510b669996980b8b8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:50:24 +0200 Subject: [PATCH 0736/1724] add fallback solution for 32bit texture format --- src/render_d3d9.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index ead6db2..daf7393 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -304,6 +304,35 @@ static BOOL d3d9_create_resources() 0)); } } + else if (g_ddraw->bpp == 32) + { + BOOL error = FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_X8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_A8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } + } else { err = err || FAILED( @@ -313,7 +342,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); From 26f3a0a5d2c322280b9c91a0a8c36727a8270801 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 07:02:51 +0200 Subject: [PATCH 0737/1724] add fallback solution for palette texture --- src/render_d3d9.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index daf7393..fa5914f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -288,7 +288,7 @@ static BOOL d3d9_create_resources() D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); - + if (error) { err = err || FAILED( @@ -352,7 +352,7 @@ static BOOL d3d9_create_resources() if (g_ddraw->bpp == 8) { - err = err || FAILED( + BOOL error = FAILED( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -364,6 +364,21 @@ static BOOL d3d9_create_resources() &g_d3d9.palette_tex[i], 0)); + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + 256, + 256, + 1, + 0, + D3DFMT_A8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.palette_tex[i], + 0)); + } + err = err || !g_d3d9.palette_tex[i]; } } From 6513df2111ad5d2819be0a784dc4f4a43a5a5511 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 07:40:01 +0200 Subject: [PATCH 0738/1724] add NULL checks --- src/render_ogl.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 79b1477..ce01a5f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -935,7 +935,9 @@ static void ogl_render() static void ogl_delete_context(HGLRC context) { - HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); + if (g_ogl.surface_tex) + HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); + glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); if (g_ddraw->bpp == 8) @@ -985,6 +987,9 @@ static void ogl_delete_context(HGLRC context) static BOOL ogl_texture_upload_test() { + if (!g_ogl.surface_tex) + return TRUE; + static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; int i; @@ -1043,6 +1048,9 @@ static BOOL ogl_texture_upload_test() static BOOL ogl_shader_test() { + if (!g_ogl.surface_tex) + return TRUE; + BOOL result = TRUE; if (g_ddraw->bpp != 8) From 64f58ef2d24d617dc8504dff25921eac1db7a59b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 08:55:28 +0200 Subject: [PATCH 0739/1724] restore old bmp screenshot code as fallback solution --- src/screenshot.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/src/screenshot.c b/src/screenshot.c index d559101..d03e029 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -9,6 +9,7 @@ #include "blt.h" #include "config.h" +static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src); static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) { @@ -154,16 +155,93 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) if (src->bpp == 8 && src->palette) { - return ss_screenshot_8bit(filename, src); + if (!ss_screenshot_8bit(filename, src)) + return ss_screenshot_bmp(filename, src); + + return TRUE; } else if (src->bpp == 16) { - return ss_screenshot_16bit(filename, src); + if (!ss_screenshot_bmp(filename, src)) + return ss_screenshot_bmp(filename, src); + + return TRUE; } else if (src->bpp == 32) { - return ss_screenshot_32bit(filename, src); - } + if (!ss_screenshot_32bit(filename, src)) + return ss_screenshot_bmp(filename, src); + return TRUE; + } + return FALSE; } + +static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) +{ + BOOL result = TRUE; + + // make sure file extension is correct + char* ext = filename + strlen(filename) - 4; + + if (_strcmpi(ext, ".png") == 0) + { + strncpy(ext, ".bmp", 4); + } + + // Create the .BMP file. + HANDLE hf = CreateFile( + filename, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + (HANDLE)NULL); + + if (hf == INVALID_HANDLE_VALUE) + return FALSE; + + PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)src->bmi; + BITMAPFILEHEADER hdr; + + hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" + // Compute the size of the entire file. + hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); + hdr.bfReserved1 = 0; + hdr.bfReserved2 = 0; + + // Compute the offset to the array of color indices. + hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD); + + // Copy the BITMAPFILEHEADER into the .BMP file. + DWORD tmp; + if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&tmp, NULL)) + { + result = FALSE; + } + + // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. + if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&tmp, (NULL))) + { + result = FALSE; + } + + // Copy the array of color indices into the .BMP file. + DWORD cb = pbih->biSizeImage; + DWORD total = pbih->biSizeImage; + + if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL)) + { + result = FALSE; + } + + // Close the .BMP file. + if (!CloseHandle(hf)) + { + result = FALSE; + } + + return result; +} From 77319903fb9c2b5e640fd6ba8b705bd476208b25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 09:07:38 +0200 Subject: [PATCH 0740/1724] remove unused var --- src/screenshot.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/screenshot.c b/src/screenshot.c index d03e029..4ed72fc 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -230,8 +230,6 @@ static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) // Copy the array of color indices into the .BMP file. DWORD cb = pbih->biSizeImage; - DWORD total = pbih->biSizeImage; - if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL)) { result = FALSE; From 9b259d4ec60521bbac869ef57b9ecabcf5cd7aca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:28:22 +0200 Subject: [PATCH 0741/1724] update build.bat path --- build.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index 85a89a6..b3508d8 100644 --- a/build.bat +++ b/build.bat @@ -2,7 +2,7 @@ REM REM cnc-patch environment config REM -set PATH=C:\win-builds-patch-32\bin -gmake clean -gmake +set PATH=C:\w64devkit\bin +make clean +make pause From 589b422d938e9526e35c5745bee50ae1694a6c24 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:46:13 +0200 Subject: [PATCH 0742/1724] fix some warnings --- src/IDirectDraw/IDirectDraw.c | 10 ++++++++++ src/ddsurface.c | 8 ++++---- src/debug.c | 5 +++-- src/render_d3d9.c | 2 +- src/render_gdi.c | 2 +- src/render_ogl.c | 4 ++-- src/screenshot.c | 4 ++-- src/utils.c | 2 +- 8 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 35cd482..9a96270 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -159,7 +159,13 @@ ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) { TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; + +#ifdef _DEBUG ULONG glob_ref = dd_AddRef(); +#else + dd_AddRef(); +#endif + TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; } @@ -177,7 +183,11 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HeapFree(GetProcessHeap(), 0, This); } +#ifdef _DEBUG ULONG glob_ref = dd_Release(); +#else + dd_Release(); +#endif TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; diff --git a/src/ddsurface.c b/src/ddsurface.c index e50fb21..bf47588 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -753,13 +753,13 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); - HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap); - HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc); + HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer((void*)&This->bitmap, backbuffer->bitmap); + HDC dc = (HDC)InterlockedExchangePointer((void*)&This->hdc, backbuffer->hdc); HANDLE map = (HANDLE)InterlockedExchangePointer(&This->mapping, backbuffer->mapping); InterlockedExchangePointer(&backbuffer->surface, buf); - InterlockedExchangePointer(&backbuffer->bitmap, bitmap); - InterlockedExchangePointer(&backbuffer->hdc, dc); + InterlockedExchangePointer((void*)&backbuffer->bitmap, bitmap); + InterlockedExchangePointer((void*)&backbuffer->hdc, dc); InterlockedExchangePointer(&backbuffer->mapping, map); if (g_config.flipclear) diff --git a/src/debug.c b/src/debug.c index aaa8cb7..eb5a875 100644 --- a/src/debug.c +++ b/src/debug.c @@ -16,11 +16,12 @@ LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; -static int g_dbg_crash_count = 0; static FILE* g_dbg_log_file; static BOOL g_dbg_log_rotate; -#if _DEBUG +#ifdef _DEBUG +static int g_dbg_crash_count = 0; + int dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index fa5914f..d8d3d88 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -617,7 +617,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/render_gdi.c b/src/render_gdi.c index 40d5263..8576450 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -84,7 +84,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } diff --git a/src/render_ogl.c b/src/render_ogl.c index ce01a5f..141073b 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -156,7 +156,7 @@ static void ogl_build_programs() { char shader_path[MAX_PATH] = { 0 }; - strncpy(shader_path, g_config.shader, sizeof(shader_path) - 1); + strncpy(shader_path, g_config.shader, sizeof(shader_path)); if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { @@ -770,7 +770,7 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/screenshot.c b/src/screenshot.c index 4ed72fc..2c4db21 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -162,7 +162,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } else if (src->bpp == 16) { - if (!ss_screenshot_bmp(filename, src)) + if (!ss_screenshot_16bit(filename, src)) return ss_screenshot_bmp(filename, src); return TRUE; @@ -187,7 +187,7 @@ static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) if (_strcmpi(ext, ".png") == 0) { - strncpy(ext, ".bmp", 4); + strncpy(ext, ".bmp", 5); } // Create the .BMP file. diff --git a/src/utils.c b/src/utils.c index 6c0f91e..2f97674 100644 --- a/src/utils.c +++ b/src/utils.c @@ -501,7 +501,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, hwnd); } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); From 0f08cbcc65e04ac0f91a98931d108b10b6a3ae1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:54:21 +0200 Subject: [PATCH 0743/1724] update makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 332982d..8d072df 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O2 -march=i486 +CFLAGS = -std=c99 -O2 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From bae707f865dbd2d39e2b846c6533b4354d0f751e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 08:20:25 +0200 Subject: [PATCH 0744/1724] use different function to enumarte modules for mingw build --- inc/utils.h | 1 + src/hook.c | 28 ++------------------------ src/utils.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 4eee8a6..2e2e779 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_is_avx_supported(); diff --git a/src/hook.c b/src/hook.c index ebd1c26..b6a7a6a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -474,17 +474,8 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; - HANDLE process = NULL; -#ifndef _MSC_VER - HMODULE mods[512]; - memset(mods, 0, sizeof(mods)); - process = GetCurrentProcess(); - EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); - for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) -#else - while (hmod = DetourEnumerateModules(hmod)) -#endif + while ((hmod = util_enumerate_modules(hmod))) { if (hmod == g_ddraw_module) continue; @@ -515,9 +506,6 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) } } } - - if (process) - CloseHandle(process); } } @@ -561,17 +549,8 @@ void hook_revert(HOOKLIST* hooks) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; - HANDLE process = NULL; -#ifndef _MSC_VER - HMODULE mods[512]; - memset(mods, 0, sizeof(mods)); - process = GetCurrentProcess(); - EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); - for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) -#else - while (hmod = DetourEnumerateModules(hmod)) -#endif + while ((hmod = util_enumerate_modules(hmod))) { if (hmod == g_ddraw_module) continue; @@ -591,9 +570,6 @@ void hook_revert(HOOKLIST* hooks) } } } - - if (process) - CloseHandle(process); } } diff --git a/src/utils.c b/src/utils.c index 2f97674..41a4c08 100644 --- a/src/utils.c +++ b/src/utils.c @@ -11,6 +11,63 @@ #include "config.h" +/* + The following code is licensed under the MIT license: + DetourEnumerateModules + Copyright (c) Microsoft Corporation + https://github.com/microsoft/Detours +*/ +#define MM_ALLOCATION_GRANULARITY 0x10000 + +HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) +{ + PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY; + + MEMORY_BASIC_INFORMATION mbi; + ZeroMemory(&mbi, sizeof(mbi)); + + // Find the next memory region that contains a mapped PE image. + // + for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) { + if (VirtualQuery(pbLast, &mbi, sizeof(mbi)) <= 0) { + break; + } + + // Skip uncommitted regions and guard pages. + // + if ((mbi.State != MEM_COMMIT) || + ((mbi.Protect & 0xff) == PAGE_NOACCESS) || + (mbi.Protect & PAGE_GUARD)) { + continue; + } + + __try { + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbLast; + if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE || + (DWORD)pDosHeader->e_lfanew > mbi.RegionSize || + (DWORD)pDosHeader->e_lfanew < sizeof(*pDosHeader)) { + continue; + } + + PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + + pDosHeader->e_lfanew); + if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { + continue; + } + + return (HMODULE)pDosHeader; + } +#if defined(_MSC_VER) +#pragma prefast(suppress:28940, "A bad pointer means this probably isn't a PE header.") +#endif + __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? + EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { + continue; + } + } + return NULL; +} + BOOL util_is_bad_read_ptr(void* p) { MEMORY_BASIC_INFORMATION mbi = { 0 }; From df52dd869a40141ec3b14da52c2928e4a5c95459 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 12:16:44 +0200 Subject: [PATCH 0745/1724] improve IAT hook performance --- inc/hook.h | 10 +++++++++- src/hook.c | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ed453fc..6ebb33b 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -8,7 +8,15 @@ #define HOOK_SKIP_2 0x00000001l #define HOOK_LOCAL_ONLY 0x00000002l -typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; +typedef struct HOOKLISTDATA { + char function_name[32]; + PROC new_function; + PROC* function; + DWORD flags; + PROC org_function; + HMODULE mod; +} HOOKLISTDATA; + typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); diff --git a/src/hook.c b/src/hook.c index b6a7a6a..5b2500b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -209,10 +209,17 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - DWORD org_function = - (DWORD)real_GetProcAddress( - cur_mod, - hooks[i].data[x].function_name); + /* GetProcAddress is slow, save the pointer and reuse it for better performance */ + DWORD org_function = (DWORD)InterlockedExchangeAdd((LONG*)&hooks[i].data[x].org_function, 0); + + if (!org_function || cur_mod != hooks[i].data[x].mod) + { + hooks[i].data[x].mod = cur_mod; + + org_function = (DWORD)real_GetProcAddress(cur_mod, hooks[i].data[x].function_name); + + InterlockedExchange((LONG*)&hooks[i].data[x].org_function, (LONG)org_function); + } if (!hooks[i].data[x].new_function || !org_function) continue; @@ -357,7 +364,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc { DWORD org = (DWORD)real_GetProcAddress( - GetModuleHandle(hooks[i].module_name), + GetModuleHandleA(hooks[i].module_name), hooks[i].data[x].function_name); if (org && first_thunk->u1.Function != org) From 8d64f660ec7b59c86aee97811fd5f3cf954ea071 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 13:38:24 +0200 Subject: [PATCH 0746/1724] hook only when a new module was loaded --- src/winapi_hooks.c | 72 ++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7efbb76..ca4f9a2 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -994,96 +994,112 @@ HFONT WINAPI fake_CreateFontA( HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { + HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryA(lpLibFileName); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) { + HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryW(lpLibFileName); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { + HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { + HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } From 312dd07312db79ca5f438bfa5918836df6b6b2d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Oct 2023 19:47:27 +0100 Subject: [PATCH 0747/1724] update makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8d072df..20da2fb 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ -include config.mk WINDRES ?= windres -LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O2 +LDFLAGS = -Wl,--enable-stdcall-fixup -s +CFLAGS = -Iinc -O2 -march=pentium4 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From 6eec2443780767b6fd9e02ab55c7dae78c768954 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Tue, 31 Oct 2023 18:39:55 +1300 Subject: [PATCH 0748/1724] Use double for maintas --- src/dd.c | 4 ++-- src/utils.c | 4 ++-- src/wndproc.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index ab5fc5b..81d4109 100644 --- a/src/dd.c +++ b/src/dd.c @@ -802,12 +802,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)(((double)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 41a4c08..986d123 100644 --- a/src/utils.c +++ b/src/utils.c @@ -381,11 +381,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((double)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index db1c00a..aaa85a3 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - float scaleH = (float)g_ddraw->height / g_ddraw->width; - float scaleW = (float)g_ddraw->width / g_ddraw->height; + double scaleH = (double)g_ddraw->height / g_ddraw->width; + double scaleW = (double)g_ddraw->width / g_ddraw->height; switch (wParam) { From 1b00f020435d49a8754a33b73df9600392d90f04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Oct 2023 16:18:56 +0100 Subject: [PATCH 0749/1724] update atrox preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 42b6f5a..a7fa470 100644 --- a/src/config.c +++ b/src/config.c @@ -344,6 +344,7 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "hook=3\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 275e68137b9c9a94eb665b82667c34fdbc683c2b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Nov 2023 12:16:22 +0100 Subject: [PATCH 0750/1724] tweak IAT hooker checks --- src/hook.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/hook.c b/src/hook.c index 5b2500b..4173613 100644 --- a/src/hook.c +++ b/src/hook.c @@ -181,12 +181,14 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; + DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { if (!import_desc->Name) @@ -301,12 +303,14 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; + DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { if (!import_desc->OriginalFirstThunk || !import_desc->Name) @@ -416,25 +420,24 @@ BOOL hook_got_ddraw_import() if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return FALSE; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; + DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return FALSE; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { - if (!import_desc->Name) + if (import_desc->Name) { - import_desc++; - continue; - } + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); - - if (_stricmp(imp_module_name, "ddraw.dll") == 0) - { - return TRUE; + if (_stricmp(imp_module_name, "ddraw.dll") == 0) + { + return TRUE; + } } import_desc++; From c029c9c1e5bb027e711615c0583d590371b1505e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 02:56:15 +0100 Subject: [PATCH 0751/1724] #262 add preset for gruntz --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index a7fa470..75afda6 100644 --- a/src/config.c +++ b/src/config.c @@ -730,6 +730,12 @@ static void cfg_create_ini() "[Gta_61]\n" "singlecpu=false\n" "\n" + "; Gruntz\n" + "[GRUNTZ]\n" + "adjmouse=true\n" + "noactivateapp=true\n" + "nonexclusive=true\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From f79b7db8cdf4baf76e4635ebbe341c926537a0b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 03:14:32 +0100 Subject: [PATCH 0752/1724] add new .ini function ini_section_exists --- inc/ini.h | 1 + src/ini.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/inc/ini.h b/inc/ini.h index dfcee82..e3f073c 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -12,6 +12,7 @@ typedef struct } INIFILE; void ini_create(INIFILE* ini, char* filename); +BOOL ini_section_exists(INIFILE* ini, LPCSTR section); DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); diff --git a/src/ini.c b/src/ini.c index b71f275..3304000 100644 --- a/src/ini.c +++ b/src/ini.c @@ -67,6 +67,33 @@ void ini_create(INIFILE* ini, char* filename) } } +BOOL ini_section_exists(INIFILE* ini, LPCSTR section) +{ + if (!ini || !ini->sections || !section || strlen(section) == 0) + { + return FALSE; + } + + char s[MAX_PATH]; + strncpy(s, section, sizeof(s) - 1); + s[sizeof(s) - 1] = 0; + + for (char* p = s; *p; ++p) + *p = tolower(*p); + + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); + + for (int i = 0; ini->sections[i].hash; i++) + { + if (ini->sections[i].hash == hash) + { + return TRUE; + } + } + + return FALSE; +} + DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size) { if (!buf || size == 0) @@ -88,7 +115,7 @@ DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR char s[MAX_PATH]; strncpy(s, section, sizeof(s) - 1); - buf[sizeof(s) - 1] = 0; + s[sizeof(s) - 1] = 0; for (char* p = s; *p; ++p) *p = tolower(*p); From e9b585f440a9c5d5ea891262501a72d18996914e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 03:20:30 +0100 Subject: [PATCH 0753/1724] move is_wine bool to g_config --- inc/config.h | 1 + inc/dd.h | 1 - src/config.c | 2 ++ src/dd.c | 9 ++++----- src/ddsurface.c | 2 +- src/opengl_utils.c | 3 ++- src/wndproc.c | 10 +++++----- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/inc/config.h b/inc/config.h index f609bab..2b2435e 100644 --- a/inc/config.h +++ b/inc/config.h @@ -16,6 +16,7 @@ typedef struct CNCDDRAWCONFIG char process_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; INIFILE ini; + BOOL is_wine; /* Optional settings */ diff --git a/inc/dd.h b/inc/dd.h index 1ab5d64..2e3e09f 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -124,7 +124,6 @@ typedef struct CNCDDRAW BOOL iscnc1; BOOL iskkndx; LONG upscale_hack_active; - BOOL wine; HCURSOR old_cursor; int show_cursor_count; BOOL alt_key_down; diff --git a/src/config.c b/src/config.c index 75afda6..b8209a1 100644 --- a/src/config.c +++ b/src/config.c @@ -1067,6 +1067,8 @@ static void cfg_create_ini() static void cfg_init() { + g_config.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { diff --git a/src/dd.c b/src/dd.c index 81d4109..47a0b36 100644 --- a/src/dd.c +++ b/src/dd.c @@ -855,7 +855,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw->hwnd)) SetMenu(g_ddraw->hwnd, NULL); - if (!g_ddraw->wine) + if (!g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -888,7 +888,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (g_ddraw->wine) + if (g_config.is_wine) { real_SetWindowLongA( g_ddraw->hwnd, @@ -1015,7 +1015,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } - if (g_ddraw->wine) + if (g_config.is_wine) { real_SetWindowLongA( g_ddraw->hwnd, @@ -1391,7 +1391,6 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute InitializeCriticalSection(&g_ddraw->cs); g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); - g_ddraw->wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; g_blt_use_avx = util_is_avx_supported(); if (g_config.minfps > 1000) @@ -1473,7 +1472,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!g_ddraw->wine && d3d9_is_available()) + if (!g_config.is_wine && d3d9_is_available()) { g_ddraw->renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index bf47588..09ade3b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -955,7 +955,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_config.fixnotresponding && !g_ddraw->wine) + if (g_ddraw && g_config.fixnotresponding && !g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e775a90..a1bfbae 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -4,6 +4,7 @@ #include "dd.h" #include "debug.h" #include "hook.h" +#include "config.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -211,7 +212,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (g_ddraw->wine && glversion && glversion[0] == '2') // macOS + if (g_config.is_wine && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/wndproc.c b/src/wndproc.c index aaa85a3..930a5c1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -228,7 +228,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (g_ddraw->wine && + if (g_config.is_wine && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_ddraw->wine && !g_config.fullscreen && g_ddraw->render.thread)) + if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw->render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -477,7 +477,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!g_ddraw->wine) /* hack: disable aero snap */ + if (!g_config.is_wine) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); @@ -490,7 +490,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); @@ -594,7 +594,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) + if (g_config.is_wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From 7ef71421b0db9881d400142a25ad12ac5d31bb9c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:08:51 +0100 Subject: [PATCH 0754/1724] add option to apply wine specific settings --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index b8209a1..397c923 100644 --- a/src/config.c +++ b/src/config.c @@ -1120,6 +1120,22 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; + if (g_config.is_wine) + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); + + if (ini_section_exists(&g_config.ini, section)) + { + DWORD x = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); + + if (x > 0) + return x; + + return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + } + } + DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); if (s > 0) From b8cef05a9c4b27ac1437255868c72b3b10310219 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:16:59 +0100 Subject: [PATCH 0755/1724] make sure at least one function is imported --- src/hook.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index 4173613..f101e72 100644 --- a/src/hook.c +++ b/src/hook.c @@ -436,7 +436,10 @@ BOOL hook_got_ddraw_import() if (_stricmp(imp_module_name, "ddraw.dll") == 0) { - return TRUE; + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + + if (first_thunk->u1.Function) + return TRUE; } } From d95423f5e6d88c2a5b56291cf9ccfed90c5be65c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:26:19 +0100 Subject: [PATCH 0756/1724] also check imported dlls for ddraw.dll import --- src/hook.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index f101e72..a7a4b27 100644 --- a/src/hook.c +++ b/src/hook.c @@ -406,13 +406,14 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } } -BOOL hook_got_ddraw_import() +BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls) { + if (!mod) + return FALSE; + __try { - HMODULE hmod = GetModuleHandleA(NULL); - - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; @@ -441,6 +442,11 @@ BOOL hook_got_ddraw_import() if (first_thunk->u1.Function) return TRUE; } + else if (check_imported_dlls) + { + if (hook_got_ddraw_import(GetModuleHandleA(imp_module_name), FALSE)) + return TRUE; + } } import_desc++; @@ -596,7 +602,7 @@ void hook_init(BOOL initial_hook) { if (initial_hook) { - if (g_config.hook == 4 && hook_got_ddraw_import()) + if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE)) { /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; From c43f38fad3f63660b793a4590a7499b5883a0e15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:45:41 +0100 Subject: [PATCH 0757/1724] improve mingw build - always hook dinput --- src/hook.c | 7 ------- src/winapi_hooks.c | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/hook.c b/src/hook.c index a7a4b27..e53f062 100644 --- a/src/hook.c +++ b/src/hook.c @@ -607,13 +607,6 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; } - -#if defined(__GNUC__) - if (g_config.hook == 4) - { - g_config.hook = 3; - } -#endif } if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ca4f9a2..a24a6fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1114,9 +1114,23 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) } #endif + BOOL hook = g_config.hook == 3; + +#if defined(__GNUC__) + if (g_config.hook == 4 && hModule && HIWORD(lpProcName)) + { + if (strcmp(lpProcName, "DirectInputCreateA") == 0 || + strcmp(lpProcName, "DirectInputCreateEx") == 0 || + strcmp(lpProcName, "DirectInput8Create") == 0) + { + hook = TRUE; + } + } +#endif + FARPROC proc = real_GetProcAddress(hModule, lpProcName); - if (g_config.hook != 3 || !hModule || !HIWORD(lpProcName)) + if (!hook || !hModule || !HIWORD(lpProcName)) return proc; for (int i = 0; g_hook_hooklist[i].module_name[0]; i++) From d04f9d3fa3d66a78f96d72ca0eb23aa1a2c119dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:09:06 +0100 Subject: [PATCH 0758/1724] make sure we always hook dinput --- src/winapi_hooks.c | 62 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a24a6fe..7ea7257 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -16,6 +16,7 @@ #include "ddclipper.h" #include "dllmain.h" #include "hook.h" +#include "directinput.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -1005,15 +1006,15 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1033,15 +1034,15 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1061,15 +1062,15 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1089,15 +1090,15 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1119,11 +1120,12 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) #if defined(__GNUC__) if (g_config.hook == 4 && hModule && HIWORD(lpProcName)) { - if (strcmp(lpProcName, "DirectInputCreateA") == 0 || - strcmp(lpProcName, "DirectInputCreateEx") == 0 || + if (strcmp(lpProcName, "DirectInputCreateA") == 0 || + strcmp(lpProcName, "DirectInputCreateEx") == 0 || strcmp(lpProcName, "DirectInput8Create") == 0) { hook = TRUE; + g_dinput_hook_active = TRUE; } } #endif From c1a0a3a0465482ba28c7c2582a9fb5f7528b154e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:21:40 +0100 Subject: [PATCH 0759/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index df8acc9..56b8c1c 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 5 -#define VERSION_MINOR 9 +#define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 189ce116747fb91686577fa87364198b33a0f9bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:22:34 +0100 Subject: [PATCH 0760/1724] update atrox preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 397c923..1f36d97 100644 --- a/src/config.c +++ b/src/config.c @@ -344,7 +344,6 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" - "hook=3\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 5d6d0915b01e3c94262da8dcdf375b3ea9d4ef56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:25:05 +0100 Subject: [PATCH 0761/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 56b8c1c..1e49441 100644 --- a/inc/version.h +++ b/inc/version.h @@ -4,8 +4,8 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) -#define VERSION_MAJOR 5 -#define VERSION_MINOR 6 +#define VERSION_MAJOR 6 +#define VERSION_MINOR 0 #define VERSION_BUILD 0 #define VERSION_REVISION 0 From 1443b13432d8dab83a4afb6f7a8048c46eb5e242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Nov 2023 02:17:39 +0100 Subject: [PATCH 0762/1724] unlock cursor on dialog boxes in windowed mode --- src/utils.c | 2 +- src/wndproc.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 986d123..8e62c26 100644 --- a/src/utils.c +++ b/src/utils.c @@ -549,7 +549,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //TRACE_EXT(" AVIWINDOW class=%s\n", class_name); + //TRACE(" AVIWINDOW class=%s\n", class_name); if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || diff --git a/src/wndproc.c b/src/wndproc.c index 930a5c1..445d271 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -560,6 +560,43 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } + if (wParam == WA_INACTIVE) + { + if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA((HWND)lParam, class_name, sizeof(class_name) - 1); + + if (strcmp(class_name, "#32770") == 0) // dialog box + { + mouse_unlock(); + + /* + // Center to main window + RECT rc_main = { 0 }; + RECT rc_dialog = { 0 }; + RECT rc = { 0 }; + + real_GetWindowRect(hWnd, &rc_main); + real_GetWindowRect((HWND)lParam, &rc_dialog); + CopyRect(&rc, &rc_main); + + OffsetRect(&rc_dialog, -rc_dialog.left, -rc_dialog.top); + OffsetRect(&rc, -rc.left, -rc.top); + OffsetRect(&rc, -rc_dialog.right, -rc_dialog.bottom); + + real_SetWindowPos( + (HWND)lParam, + HWND_TOP, + rc_main.left + (rc.right / 2), + rc_main.top + (rc.bottom / 2), + 0, 0, + SWP_NOSIZE); + */ + } + } + } + //if (g_ddraw->windowed || g_ddraw->noactivateapp) if (!g_config.allow_wmactivate) From 8cfe73e834096e6821f6bfaa9fce3916d5e10dbf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Nov 2023 02:19:40 +0100 Subject: [PATCH 0763/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 1e49441..c2c3092 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 07d26d7bed687f45d0506462bf1acb7b39e72983 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Nov 2023 23:58:10 +0100 Subject: [PATCH 0764/1724] always use full path to avoid issues with working directories in wine --- config/ConfigFormUnit.cpp | 20 +++++++++++--------- config/cnc-ddraw config.cpp | 6 +++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 5b51d7d..4dac099 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -24,6 +24,8 @@ int Savesettings; int Resolutions; int Minfps; +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + //--------------------------------------------------------------------------- __fastcall TConfigForm::TConfigForm(TComponent* Owner) : TForm(Owner) @@ -41,7 +43,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -58,7 +60,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -87,7 +89,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - DeleteFile(".\\ddraw.ini"); + DeleteFile(GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -670,11 +672,11 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); - HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + HMODULE ddraw = LoadLibraryW((GAME_PATH + "ddraw.dll").w_str()); if (ddraw) { @@ -694,7 +696,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -902,8 +904,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); RestoreDefaultsBtn->Visible = - FileExists(".\\ddraw.dll") && - FileExists(".\\ddraw.ini") && + FileExists(GAME_PATH + "ddraw.dll") && + FileExists(GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -916,7 +918,7 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 7cb64d5..0760b13 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -3,6 +3,7 @@ #include #pragma hdrstop #include +#include #include #include //--------------------------------------------------------------------------- @@ -10,6 +11,9 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- + +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try @@ -31,7 +35,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( From ec36b6d7bcfbbd4f273f02e458b119937d8539a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Nov 2023 00:18:17 +0100 Subject: [PATCH 0765/1724] export DDIsWindowed function so fan patched games can query the windowed state --- ddraw.def | 1 + inc/version.h | 2 +- src/dllmain.c | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ddraw.def b/ddraw.def index c1b0b64..ff672bc 100644 --- a/ddraw.def +++ b/ddraw.def @@ -20,3 +20,4 @@ EXPORTS DirectInput8Create = fake_DirectInput8Create GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA + DDIsWindowed diff --git a/inc/version.h b/inc/version.h index c2c3092..0c15ac6 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/dllmain.c b/src/dllmain.c index bf6c556..ad00d68 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -133,6 +133,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) return TRUE; } +BOOL DDIsWindowed() +{ + return g_config.windowed && !g_config.fullscreen; +} + HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); From 434fb4de9969672499007bb82a76f09c3abd7d54 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:16:23 +0100 Subject: [PATCH 0766/1724] add support for alt+enter in fullscreen upscaled mode --- inc/config.h | 3 ++- inc/version.h | 2 +- src/config.c | 10 +++++++--- src/utils.c | 15 +++++++++++++-- src/wndproc.c | 4 ++-- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/inc/config.h b/inc/config.h index 2b2435e..34c8c66 100644 --- a/inc/config.h +++ b/inc/config.h @@ -10,7 +10,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; - int borderless_state; + int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; @@ -37,6 +37,7 @@ typedef struct CNCDDRAWCONFIG BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; + BOOL toggle_upscaled; /* Compatibility settings */ diff --git a/inc/version.h b/inc/version.h index 0c15ac6..70d7cff 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 1f36d97..5cf7718 100644 --- a/src/config.c +++ b/src/config.c @@ -23,7 +23,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, #define GET_STRING(a,b,c,d) cfg_get_string(a, b, c, d); TRACE("%s=%s\n", a, c) CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 }; void cfg_load() { @@ -52,6 +52,7 @@ void cfg_load() GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); + GET_BOOL(g_config.toggle_upscaled, "toggle_upscaled", FALSE); /* Compatibility settings */ @@ -148,9 +149,9 @@ void cfg_save() WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } - if (g_config.borderless_state != -1) + if (g_config.upscaled_state != -1) { - WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + WritePrivateProfileString(section, "fullscreen", g_config.upscaled_state ? "true" : "false", g_config.ini_path); } } @@ -235,6 +236,9 @@ static void cfg_create_ini() "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" "toggle_borderless=false\n" "\n" + "; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_upscaled=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 8e62c26..763f271 100644 --- a/src/utils.c +++ b/src/utils.c @@ -421,7 +421,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_config.fullscreen = TRUE; + g_config.upscaled_state = g_config.fullscreen = TRUE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); @@ -430,7 +430,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_config.fullscreen = FALSE; + g_config.upscaled_state = g_config.fullscreen = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); @@ -442,6 +442,11 @@ void util_toggle_fullscreen() { mouse_unlock(); + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = TRUE; + } + g_config.window_state = g_config.windowed = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); @@ -451,6 +456,12 @@ void util_toggle_fullscreen() else { mouse_unlock(); + + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = FALSE; + } + g_config.window_state = g_config.windowed = TRUE; if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) diff --git a/src/wndproc.c b/src/wndproc.c index 445d271..70c70d6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -691,7 +691,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_TOGGLE_FULLSCREEN: { - if (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) + if (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) { /* Check if we are fullscreen/borderless already */ if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen)) @@ -731,7 +731,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen && - (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) && + (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) && context_code && !key_state) { From 0e2342860bf755c0b4a8983b5eeed4a3b715bf5d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:24:41 +0100 Subject: [PATCH 0767/1724] set new toggle_fullscreen bool --- config/ConfigFormUnit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4dac099..6ea9a24 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -927,15 +927,19 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "false"); ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 1: ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "true"); + ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "true"); break; case 2: ini->WriteString("ddraw", "windowed", "true"); ini->WriteString("ddraw", "fullscreen", "true"); ini->WriteString("ddraw", "toggle_borderless", "true"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 3: ini->WriteString("ddraw", "windowed", "true"); From 1e9f3a0ab86f50a08165e83de08c46ec7c5bcc1f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Nov 2023 02:26:19 +0100 Subject: [PATCH 0768/1724] fix custom resolution with high refresh rate monitors --- src/dd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 47a0b36..0534e04 100644 --- a/src/dd.c +++ b/src/dd.c @@ -171,6 +171,8 @@ HRESULT dd_EnumDisplayModes( m.dmSize = sizeof(DEVMODE); i = 0; + BOOL custom_res_injected = FALSE; + while (EnumDisplaySettings(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && @@ -183,10 +185,11 @@ HRESULT dd_EnumDisplayModes( while (--m.dmPelsWidth % 8); } - if (i == 0 && g_config.custom_width && g_config.custom_height) + if (!custom_res_injected && g_config.custom_width && g_config.custom_height) { m.dmPelsWidth = g_config.custom_width; m.dmPelsHeight = g_config.custom_height; + custom_res_injected = TRUE; } TRACE( From 91796c71c14b51742c0db57c7ccfe169be210d3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Nov 2023 02:25:16 +0100 Subject: [PATCH 0769/1724] set lpSurface on failure --- inc/version.h | 2 +- src/ddsurface.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 70d7cff..47df2cf 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/ddsurface.c b/src/ddsurface.c index 09ade3b..cbea99f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -972,6 +972,8 @@ HRESULT dds_Lock( lpDestRect->right > This->width || lpDestRect->bottom > This->height) { + lpDDSurfaceDesc->lpSurface = NULL; + return DDERR_INVALIDPARAMS; } From c08ccb61c43f56da438aacd939f5ec37dc3f526e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Dec 2023 18:12:51 +0100 Subject: [PATCH 0770/1724] remove GetBltStatus from logs --- src/IDirectDraw/IDirectDrawSurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index ebe71b7..c7775af 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -284,9 +284,9 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface( HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE_EXT("<- %s\n", __FUNCTION__); + //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } From 3ab1f7ff11628ed6ff38063bdccf6fec615ba6e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Dec 2023 00:51:16 +0100 Subject: [PATCH 0771/1724] #267 allow to override .ini path via env var --- config/ConfigFormUnit.cpp | 36 +++++++++++++++++++++++++++++------- config/cnc-ddraw config.cpp | 7 ++++++- inc/version.h | 2 +- src/config.c | 27 ++++++++++++++------------- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 6ea9a24..3954825 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -43,7 +43,12 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -60,7 +65,12 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -89,7 +99,10 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - DeleteFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + DeleteFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -671,8 +684,12 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && + !FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); @@ -696,7 +713,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -905,7 +923,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RestoreDefaultsBtn->Visible = FileExists(GAME_PATH + "ddraw.dll") && - FileExists(GAME_PATH + "ddraw.ini") && + FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -918,7 +936,11 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 0760b13..4c3dd33 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -35,7 +35,12 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( diff --git a/inc/version.h b/inc/version.h index 47df2cf..7d4039c 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 5cf7718..185b2aa 100644 --- a/src/config.c +++ b/src/config.c @@ -1090,26 +1090,27 @@ static void cfg_init() } } - /* set up settings ini */ - - if (strlen(g_config.game_path) > 0) + if (!GetEnvironmentVariableA("CNC_DDRAW_CONFIG_FILE", g_config.ini_path, sizeof(g_config.ini_path) - 1)) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); - - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + if (strlen(g_config.game_path) > 0) { - cfg_create_ini(); - } + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + cfg_create_ini(); + } + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + } + } + else { strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); } } - else - { - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); - } if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { From dc3be1243ac720827c1ce1c3dc6e7fb26eb33685 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 12 Dec 2023 00:39:25 +0100 Subject: [PATCH 0772/1724] #269 add workaround for Quest for Glory 5 movies --- inc/IDirectDrawSurface.h | 1 + src/ddsurface.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 5c1a26d..e339450 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -42,6 +42,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD last_flip_tick; DWORD last_blt_tick; BOOL queried; + BOOL skip_flip; /* Quest for Glory 5 */ struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/src/ddsurface.c b/src/ddsurface.c index cbea99f..29314bd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -747,7 +747,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa { dbg_dump_dds_flip_flags(dwFlags); - if (This->backbuffer) + if (This->backbuffer && !This->skip_flip) { EnterCriticalSection(&g_ddraw->cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; @@ -775,6 +775,8 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa } } + This->skip_flip = FALSE; + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { This->last_flip_tick = timeGetTime(); @@ -1318,6 +1320,8 @@ HRESULT dd_CreateSurface( g_ddraw->primary->height == g_ddraw->height && g_ddraw->primary->bpp == g_ddraw->bpp) { + g_ddraw->primary->skip_flip = TRUE; + *lpDDSurface = g_ddraw->primary; IDirectDrawSurface_AddRef(g_ddraw->primary); From 564419562fc250b717b9a26454e9f5aa7ee5079e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Dec 2023 00:28:13 +0100 Subject: [PATCH 0773/1724] #270 always clear entire screen --- inc/version.h | 2 +- src/render_ogl.c | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7d4039c..7a74663 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/render_ogl.c b/src/render_ogl.c index 141073b..028e55e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -804,10 +804,7 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) - { - glClear(GL_COLOR_BUFFER_BIT); - } + glClear(GL_COLOR_BUFFER_BIT); if (scale_changed) { From 68fe009736fc9f29d6cde58447cf2d834d0f452e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Dec 2023 23:01:56 +0100 Subject: [PATCH 0774/1724] Revert "#270 always clear entire screen" This reverts commit 564419562fc250b717b9a26454e9f5aa7ee5079e. --- inc/version.h | 2 +- src/render_ogl.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7a74663..7d4039c 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/render_ogl.c b/src/render_ogl.c index 028e55e..141073b 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -804,7 +804,10 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - glClear(GL_COLOR_BUFFER_BIT); + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + { + glClear(GL_COLOR_BUFFER_BIT); + } if (scale_changed) { From 9e8f24f38d1d36ff2e55557861ffc93a76f1471e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 17 Dec 2023 17:03:05 +0100 Subject: [PATCH 0775/1724] add preset for worms 2 --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 185b2aa..3552f7a 100644 --- a/src/config.c +++ b/src/config.c @@ -1047,6 +1047,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "releasealt=true\n" "\n" + "; Worms 2\n" + "[worms2]\n" + "game_handles_close=true\n" + "\n" "; Worms Armageddon\n" "[WA]\n" "adjmouse=true\n" From ff1c8fb0a37f5363efca6086e2d180ef1942b3c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Dec 2023 01:35:44 +0100 Subject: [PATCH 0776/1724] Revert "Use double for maintas" This reverts commit 6eec2443780767b6fd9e02ab55c7dae78c768954. --- src/dd.c | 4 ++-- src/utils.c | 4 ++-- src/wndproc.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 0534e04..db4bdf2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -805,12 +805,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((double)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 763f271..3e2d686 100644 --- a/src/utils.c +++ b/src/utils.c @@ -381,11 +381,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((double)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((double)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index 70c70d6..d6f5543 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - double scaleH = (double)g_ddraw->height / g_ddraw->width; - double scaleW = (double)g_ddraw->width / g_ddraw->height; + float scaleH = (float)g_ddraw->height / g_ddraw->width; + float scaleW = (float)g_ddraw->width / g_ddraw->height; switch (wParam) { From 988cad0200e5d04ac1739e8e3f97cb020ee93163 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Dec 2023 01:40:49 +0100 Subject: [PATCH 0777/1724] use roundf for maintas --- src/dd.c | 3 ++- src/utils.c | 5 +++-- src/wndproc.c | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index db4bdf2..cb1bb3d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1,4 +1,5 @@ #include +#include #include "ddraw.h" #include "IDirectDraw.h" #include "dd.h" @@ -805,7 +806,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)roundf(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { diff --git a/src/utils.c b/src/utils.c index 3e2d686..2fbd72d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,5 +1,6 @@ #include #include +#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -381,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)roundf(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)roundf(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index d6f5543..c0886c2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)roundf(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); break; } } From 2cbf45cc2fc621dd54b16ba30948936a3ec9c73b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 30 Dec 2023 22:16:55 +0100 Subject: [PATCH 0778/1724] add missing roundf --- src/dd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index cb1bb3d..a7ee93e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -811,11 +811,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } + g_ddraw->render.viewport.width = min(g_ddraw->render.viewport.width, g_ddraw->render.width); + g_ddraw->render.viewport.height = min(g_ddraw->render.viewport.height, g_ddraw->render.height); + g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; } From a863d8cb33fd0e23023bd3c181508e512cc37cf4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:16:45 +0100 Subject: [PATCH 0779/1724] fix aspect ratio issues --- src/dd.c | 10 ++++++---- src/utils.c | 4 ++-- src/wndproc.c | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/dd.c b/src/dd.c index a7ee93e..e943488 100644 --- a/src/dd.c +++ b/src/dd.c @@ -804,11 +804,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = - (int)roundf(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + float dst_ar = (float)g_ddraw->height / g_ddraw->width; + float src_ar = (float)g_ddraw->render.height / g_ddraw->render.width; - if (g_ddraw->render.viewport.height > g_ddraw->render.height) + g_ddraw->render.viewport.width = g_ddraw->render.width; + g_ddraw->render.viewport.height = (int)roundf(dst_ar * g_ddraw->render.viewport.width); + + if (src_ar < dst_ar) { g_ddraw->render.viewport.width = (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); diff --git a/src/utils.c b/src/utils.c index 2fbd72d..3f4e026 100644 --- a/src/utils.c +++ b/src/utils.c @@ -382,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)roundf(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)roundf(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index c0886c2..d6f5543 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)roundf(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } } From 3e4833bda7594778ab031b33640cf9d867408cc8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:35:08 +0100 Subject: [PATCH 0780/1724] some more maintas tweaks --- src/dd.c | 8 ++++---- src/utils.c | 4 ++-- src/wndproc.c | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index e943488..5cbf6f7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -804,16 +804,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - float dst_ar = (float)g_ddraw->height / g_ddraw->width; - float src_ar = (float)g_ddraw->render.height / g_ddraw->render.width; + double dst_ar = (double)g_ddraw->height / g_ddraw->width; + double src_ar = (double)g_ddraw->render.height / g_ddraw->render.width; g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = (int)roundf(dst_ar * g_ddraw->render.viewport.width); + g_ddraw->render.viewport.height = (int)round(dst_ar * g_ddraw->render.viewport.width); if (src_ar < dst_ar) { g_ddraw->render.viewport.width = - (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)round(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 3f4e026..c3c94d5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -382,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)round(((double)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index d6f5543..b4451b8 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - float scaleH = (float)g_ddraw->height / g_ddraw->width; - float scaleW = (float)g_ddraw->width / g_ddraw->height; + double scaleH = (double)g_ddraw->height / g_ddraw->width; + double scaleW = (double)g_ddraw->width / g_ddraw->height; switch (wParam) { @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom); break; } } From 8d24dde49c123331190cce7ab6c30ec9a6c5ffa2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:45:14 +0100 Subject: [PATCH 0781/1724] more maintas tweaks --- src/utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index c3c94d5..67665a7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -379,12 +379,15 @@ void util_toggle_maximize() int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; + double dst_ar = (double)g_ddraw->height / g_ddraw->width; + double src_ar = (double)h / w; + dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)round(((double)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)round(dst_ar * w); - if (dst_rc.bottom > h) + if (src_ar < dst_ar) { dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; From 7002639452c275e990ebab4152c5d537f5ce5610 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 20:44:04 +0100 Subject: [PATCH 0782/1724] #273 use 64bit aligned pitch --- src/dd.c | 18 +++++++++--------- src/ddsurface.c | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 5cbf6f7..1edb49d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -211,7 +211,7 @@ HRESULT dd_EnumDisplayModes( s.dwRefreshRate = 60; s.dwHeight = m.dmPelsHeight; s.dwWidth = m.dmPelsWidth; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) @@ -237,7 +237,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -262,7 +262,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -331,7 +331,7 @@ HRESULT dd_EnumDisplayModes( s.dwRefreshRate = 60; s.dwHeight = resolutions[i].cy; s.dwWidth = resolutions[i].cx; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -353,7 +353,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -378,7 +378,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -481,7 +481,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (g_ddraw->bpp == 32 || g_config.vermeer_hack) { @@ -492,7 +492,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } else if (g_ddraw->bpp != 8) { @@ -503,7 +503,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } } diff --git a/src/ddsurface.c b/src/ddsurface.c index 29314bd..b45cc75 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1405,7 +1405,7 @@ HRESULT dd_CreateSurface( else if (dst_surface->width && dst_surface->height) { dst_surface->bytes_pp = dst_surface->bpp / 8; - dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; + dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 63) & ~63) >> 3; dst_surface->size = dst_surface->pitch * dst_surface->height; DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; @@ -1429,7 +1429,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((aligned_width * clr_bits + 31) & ~31) / 8 * dst_surface->height; + ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { From 8fdfafc7e3f5f4219a0458e7d1d1a672934f6e2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 20:48:28 +0100 Subject: [PATCH 0783/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7d4039c..7a74663 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 3212dad148a534e293eb973699efbd972988c1e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 21:09:47 +0100 Subject: [PATCH 0784/1724] fix palette in bmp screenshots --- src/screenshot.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/screenshot.c b/src/screenshot.c index 2c4db21..d4c1b60 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -156,7 +156,11 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) if (src->bpp == 8 && src->palette) { if (!ss_screenshot_8bit(filename, src)) + { + memcpy(&src->bmi->bmiColors[0], src->palette->data_rgb, 256 * sizeof(int)); + return ss_screenshot_bmp(filename, src); + } return TRUE; } From 8a66959df9486aabc39ac9cd118cc6e32443116f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jan 2024 04:34:42 +0100 Subject: [PATCH 0785/1724] #270 make sure framebuffer is initialized with surface_tex --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 141073b..f666eb5 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -583,7 +583,7 @@ static void ogl_init_scale_program() 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0); + g_ogl.surface_tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id, 0); From 1b86d1cc1c6665bd017d2447bc44901c285a31e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Jan 2024 00:34:59 +0100 Subject: [PATCH 0786/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7a74663..8c06a04 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 0 +#define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 4cb4ce60b17a4931c7132aec86cab1381672d55c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jan 2024 22:49:51 +0100 Subject: [PATCH 0787/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 8c06a04..f07c491 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 88e9566ccff9cab2847d8d606b9e77cc69cd2951 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jan 2024 23:00:08 +0100 Subject: [PATCH 0788/1724] adjust ini file name and settings --- config/ConfigFormUnit.cpp | 17 +++++++------- config/ConfigFormUnit.dfm | 48 +++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index e64166b..499c337 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -702,7 +702,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } auto *ini = new TIniFile(".\\dd-hd.ini"); - auto *hd_ini = new TIniFile(".\\Warcraft_II_HD.ini"); + auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -736,9 +736,9 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) PresentationCbx->ItemIndex = 0; } - int cwidth = hd_ini->ReadInteger("Warcraft_II_HD", "Width", 0); - int cheight = hd_ini->ReadInteger("Warcraft_II_HD", "Height", 0); - int reso = hd_ini->ReadInteger("Warcraft_II_HD", "Resolution", 3); + int cwidth = hd_ini->ReadInteger("Game", "Width", 0); + int cheight = hd_ini->ReadInteger("Game", "Height", 0); + int reso = hd_ini->ReadInteger("Game", "Resolution", 3); if (!cwidth || !cheight) { ResolutionCbx->ItemIndex = reso <= 5 ? reso : 3; @@ -921,7 +921,7 @@ void TConfigForm::SaveSettings() return; auto *ini = new TIniFile(".\\dd-hd.ini"); - auto *hd_ini = new TIniFile(".\\Warcraft_II_HD.ini"); + auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); /* Display Settings */ @@ -949,11 +949,10 @@ void TConfigForm::SaveSettings() } if (ResolutionCbx->ItemIndex <= 5) { - hd_ini->WriteInteger( - "Warcraft_II_HD", "Resolution", ResolutionCbx->ItemIndex); + hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex); - hd_ini->WriteInteger("Warcraft_II_HD", "Width", 0); - hd_ini->WriteInteger("Warcraft_II_HD", "Height", 0); + hd_ini->WriteInteger("Game", "Width", 0); + hd_ini->WriteInteger("Game", "Height", 0); if (ResolutionCbx->Items->Count == 7) { ResolutionCbx->Items->Delete(6); diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 29b86ff..1c96d00 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,8 +4,8 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 476 - ClientWidth = 741 + ClientHeight = 475 + ClientWidth = 737 Color = clMenu Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -2681,14 +2681,14 @@ object ConfigForm: TConfigForm OnActivate = FormActivate OnCreate = FormCreate DesignSize = ( - 741 - 476) + 737 + 475) TextHeight = 13 object DisplayPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -2697,8 +2697,8 @@ object ConfigForm: TConfigForm TabOrder = 1 StyleElements = [seFont, seBorder] DesignSize = ( - 499 - 465) + 495 + 464) object PresentationLbl: TLabel Left = 40 Top = 28 @@ -2776,7 +2776,7 @@ object ConfigForm: TConfigForm OnPaint = PboxPaint end object LanguageImg: TImage - Left = 453 + Left = 449 Top = 8 Width = 16 Height = 11 @@ -2803,6 +2803,7 @@ object ConfigForm: TConfigForm Stretch = True Visible = False OnClick = LanguageImgClick + ExplicitLeft = 453 end object ResolutionLbl: TLabel Left = 40 @@ -2884,7 +2885,7 @@ object ConfigForm: TConfigForm OnClick = DevmodeChkClick end object ThemePnl: TPanel - Left = 475 + Left = 471 Top = 8 Width = 16 Height = 11 @@ -2895,7 +2896,6 @@ object ConfigForm: TConfigForm TabOrder = 5 StyleElements = [seFont, seBorder] OnClick = ThemePnlClick - ExplicitLeft = 471 end object ResolutionCbx: TComboBox Left = 41 @@ -2926,8 +2926,8 @@ object ConfigForm: TConfigForm object CompatibilityPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -2936,8 +2936,6 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3108,8 +3106,8 @@ object ConfigForm: TConfigForm object AdvancedPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -3118,8 +3116,6 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3324,8 +3320,8 @@ object ConfigForm: TConfigForm object HotkeyPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -3334,8 +3330,6 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3557,16 +3551,15 @@ object ConfigForm: TConfigForm Left = 0 Top = 8 Width = 233 - Height = 468 + Height = 467 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone Color = clMenu ParentBackground = False TabOrder = 0 - ExplicitHeight = 467 DesignSize = ( 233 - 468) + 467) object DisplayBtn: TSpeedButton Left = 0 Top = 8 @@ -3633,7 +3626,7 @@ object ConfigForm: TConfigForm end object RestoreDefaultsBtn: TSpeedButton Left = 0 - Top = 440 + Top = 439 Width = 227 Height = 22 Anchors = [akLeft, akRight, akBottom] @@ -3646,6 +3639,7 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = RestoreDefaultsBtnClick + ExplicitTop = 440 end end end From 3997c03d70c8991b41b023ff7f938b3c429e7c59 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jan 2024 23:17:21 +0100 Subject: [PATCH 0789/1724] add 16:10 resolutions --- config/ConfigFormUnit.cpp | 8 +- config/ConfigFormUnit.dfm | 490 +++++++++++++++++++------------------- 2 files changed, 255 insertions(+), 243 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 499c337..4cc22a1 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -741,7 +741,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) int reso = hd_ini->ReadInteger("Game", "Resolution", 3); if (!cwidth || !cheight) { - ResolutionCbx->ItemIndex = reso <= 5 ? reso : 3; + ResolutionCbx->ItemIndex = reso <= 7 ? reso : 3; } else { ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL); @@ -948,14 +948,14 @@ void TConfigForm::SaveSettings() break; } - if (ResolutionCbx->ItemIndex <= 5) { + if (ResolutionCbx->ItemIndex <= 7) { hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex); hd_ini->WriteInteger("Game", "Width", 0); hd_ini->WriteInteger("Game", "Height", 0); - if (ResolutionCbx->Items->Count == 7) { - ResolutionCbx->Items->Delete(6); + if (ResolutionCbx->Items->Count == 9) { + ResolutionCbx->Items->Delete(8); } } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 1c96d00..533b68b 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2684,245 +2684,6 @@ object ConfigForm: TConfigForm 737 475) TextHeight = 13 - object DisplayPnl: TPanel - Left = 233 - Top = 8 - Width = 495 - Height = 464 - Anchors = [akLeft, akTop, akRight, akBottom] - BevelOuter = bvNone - Color = clWhite - ParentBackground = False - ShowCaption = False - TabOrder = 1 - StyleElements = [seFont, seBorder] - DesignSize = ( - 495 - 464) - object PresentationLbl: TLabel - Left = 40 - Top = 28 - Width = 87 - Height = 21 - Caption = 'Presentation' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object MaintasLbl: TLabel - Left = 40 - Top = 182 - Width = 145 - Height = 21 - Margins.Top = 18 - Caption = 'Maintain aspect ratio' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object VsyncLbl: TLabel - Left = 40 - Top = 250 - Width = 93 - Height = 21 - Margins.Top = 18 - Caption = 'Enable VSync' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object AdjmouseLbl: TLabel - Left = 40 - Top = 318 - Width = 168 - Height = 21 - Margins.Top = 18 - Caption = 'Adjust mouse sensitivity' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object DevmodeLbl: TLabel - Left = 40 - Top = 386 - Width = 216 - Height = 21 - Margins.Top = 18 - Caption = 'Lock cursor to window / screen' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object PresentationPbox: TPaintBox - Left = 40 - Top = 54 - Width = 282 - Height = 31 - OnPaint = PboxPaint - end - object LanguageImg: TImage - Left = 449 - Top = 8 - Width = 16 - Height = 11 - Anchors = [akTop, akRight] - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 - 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 - 455874536F6674776172650041646F626520496D616765526561647971C9653C - 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 - 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 - B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D - C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 - C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 - 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF - 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE - ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 - 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 - F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 - B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 - 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 - CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 - 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 - 00000049454E44AE426082} - Stretch = True - Visible = False - OnClick = LanguageImgClick - ExplicitLeft = 453 - end - object ResolutionLbl: TLabel - Left = 40 - Top = 105 - Width = 74 - Height = 21 - Caption = 'Resolution' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object ResolutionPbox: TPaintBox - Left = 40 - Top = 131 - Width = 282 - Height = 31 - OnPaint = PboxPaint - end - object PresentationCbx: TComboBox - Left = 41 - Top = 55 - Width = 280 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 1 - OnChange = PresentationCbxChange - Items.Strings = ( - 'Fullscreen' - 'Fullscreen Upscaled' - 'Borderless' - 'Windowed') - end - object MaintasChk: TToggleSwitch - Left = 40 - Top = 209 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 0 - OnClick = MaintasChkClick - end - object VsyncChk: TToggleSwitch - Left = 40 - Top = 277 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 2 - OnClick = VsyncChkClick - end - object AdjmouseChk: TToggleSwitch - Left = 40 - Top = 345 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 3 - OnClick = AdjmouseChkClick - end - object DevmodeChk: TToggleSwitch - Left = 40 - Top = 413 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 4 - OnClick = DevmodeChkClick - end - object ThemePnl: TPanel - Left = 471 - Top = 8 - Width = 16 - Height = 11 - Anchors = [akTop, akRight] - BevelOuter = bvNone - Color = 2039583 - ParentBackground = False - TabOrder = 5 - StyleElements = [seFont, seBorder] - OnClick = ThemePnlClick - end - object ResolutionCbx: TComboBox - Left = 41 - Top = 132 - Width = 280 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 6 - OnChange = PresentationCbxChange - Items.Strings = ( - '640x480 (4:3)' - '800x608 (4:3)' - '832x480 (16:9)' - '960x544 (16:9)' - '1280x704 (16:9)' - '1280x544 (21:9)') - end - end object CompatibilityPnl: TPanel Left = 233 Top = 8 @@ -2936,6 +2697,8 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3116,6 +2879,8 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3330,6 +3095,8 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3547,6 +3314,250 @@ object ConfigForm: TConfigForm OnKeyUp = HotkeyEdtKeyUp end end + object DisplayPnl: TPanel + Left = 233 + Top = 8 + Width = 495 + Height = 464 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 1 + StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 + DesignSize = ( + 495 + 464) + object PresentationLbl: TLabel + Left = 40 + Top = 28 + Width = 87 + Height = 21 + Caption = 'Presentation' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MaintasLbl: TLabel + Left = 40 + Top = 182 + Width = 145 + Height = 21 + Margins.Top = 18 + Caption = 'Maintain aspect ratio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object VsyncLbl: TLabel + Left = 40 + Top = 250 + Width = 93 + Height = 21 + Margins.Top = 18 + Caption = 'Enable VSync' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object AdjmouseLbl: TLabel + Left = 40 + Top = 318 + Width = 168 + Height = 21 + Margins.Top = 18 + Caption = 'Adjust mouse sensitivity' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object DevmodeLbl: TLabel + Left = 40 + Top = 386 + Width = 216 + Height = 21 + Margins.Top = 18 + Caption = 'Lock cursor to window / screen' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object PresentationPbox: TPaintBox + Left = 40 + Top = 54 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end + object LanguageImg: TImage + Left = 449 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 + 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 + 455874536F6674776172650041646F626520496D616765526561647971C9653C + 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 + 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 + B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D + C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 + C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 + 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF + 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE + ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 + 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 + F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 + B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 + 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 + CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 + 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 + 00000049454E44AE426082} + Stretch = True + Visible = False + OnClick = LanguageImgClick + ExplicitLeft = 453 + end + object ResolutionLbl: TLabel + Left = 40 + Top = 105 + Width = 74 + Height = 21 + Caption = 'Resolution' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object ResolutionPbox: TPaintBox + Left = 40 + Top = 131 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end + object PresentationCbx: TComboBox + Left = 41 + Top = 55 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = PresentationCbxChange + Items.Strings = ( + 'Fullscreen' + 'Fullscreen Upscaled' + 'Borderless' + 'Windowed') + end + object MaintasChk: TToggleSwitch + Left = 40 + Top = 209 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 0 + OnClick = MaintasChkClick + end + object VsyncChk: TToggleSwitch + Left = 40 + Top = 277 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 2 + OnClick = VsyncChkClick + end + object AdjmouseChk: TToggleSwitch + Left = 40 + Top = 345 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 3 + OnClick = AdjmouseChkClick + end + object DevmodeChk: TToggleSwitch + Left = 40 + Top = 413 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 4 + OnClick = DevmodeChkClick + end + object ThemePnl: TPanel + Left = 471 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + BevelOuter = bvNone + Color = 2039583 + ParentBackground = False + TabOrder = 5 + StyleElements = [seFont, seBorder] + OnClick = ThemePnlClick + ExplicitLeft = 467 + end + object ResolutionCbx: TComboBox + Left = 41 + Top = 132 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnChange = PresentationCbxChange + Items.Strings = ( + '640x480 (4:3)' + '800x608 (4:3)' + '832x480 (16:9)' + '960x544 (16:9)' + '1280x704 (16:9)' + '1280x544 (21:9)' + '768x480 (16:10)' + '960x608 (16:10)') + end + end object MenuPnl: TPanel Left = 0 Top = 8 @@ -3557,6 +3568,7 @@ object ConfigForm: TConfigForm Color = clMenu ParentBackground = False TabOrder = 0 + ExplicitHeight = 466 DesignSize = ( 233 467) From cfc5441994b674168df5716a66d2d4414dd76bf1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 1 Feb 2024 18:19:46 +0100 Subject: [PATCH 0790/1724] update nova preset to support the new CE release (Fixes open pilot menu) --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 3552f7a..f187fe0 100644 --- a/src/config.c +++ b/src/config.c @@ -689,6 +689,7 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" + "nonexclusive=true\n" "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" From 93c6e120b61359e24424665b26e91f558bfa798c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Feb 2024 21:06:24 +0100 Subject: [PATCH 0791/1724] restore original .ini file name --- config/ConfigFormUnit.cpp | 16 ++++++++-------- config/cnc-ddraw config.cpp | 2 +- src/config.c | 10 +++++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4cc22a1..64d0014 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -40,7 +40,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *ini = new TIniFile(".\\ddraw.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -57,7 +57,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *ini = new TIniFile(".\\ddraw.ini"); auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -86,7 +86,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - DeleteFile(".\\dd-hd.ini"); + DeleteFile(".\\ddraw.ini"); ShellExecute( NULL, @@ -676,8 +676,8 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { - /* Let cnc-ddraw create a new dd-hd.ini if it doesn't exist */ - if (FileExists(".\\ddraw.dll") && !FileExists(".\\dd-hd.ini")) { + /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ + if (FileExists(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); @@ -701,7 +701,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *ini = new TIniFile(".\\ddraw.ini"); auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -906,7 +906,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RestoreDefaultsBtn->Visible = FileExists(".\\ddraw.dll") && - FileExists(".\\dd-hd.ini") && + FileExists(".\\ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -920,7 +920,7 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *ini = new TIniFile(".\\ddraw.ini"); auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index f88df0c..7cb64d5 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -31,7 +31,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(".\\dd-hd.ini"); + auto *ini = new TIniFile(".\\ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( diff --git a/src/config.c b/src/config.c index 1ddacc1..eaca4d7 100644 --- a/src/config.c +++ b/src/config.c @@ -685,6 +685,14 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Diablo\n" + "[Diablo]\n" + "devmode=true\n" + "\n" + "; Diablo: Hellfire\n" + "[hellfire]\n" + "devmode=true\n" + "\n" "; Eggsucker\n" "[eggsucker]\n" "fixpitch=true\n" @@ -1003,7 +1011,7 @@ static void cfg_init() } /* set up settings ini */ - strncpy(g_config.ini_path, ".\\dd-hd.ini", sizeof(g_config.ini_path) - 1); + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) cfg_create_ini(); From 0c5c9acecf82fecee03e5ea2cac5512f2013e680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Feb 2024 21:44:15 +0100 Subject: [PATCH 0792/1724] test --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f187fe0..bf37159 100644 --- a/src/config.c +++ b/src/config.c @@ -29,7 +29,7 @@ void cfg_load() { cfg_init(); - /* Optional settings */ + /* Optional settings */ GET_INT(g_config.window_rect.right, "width", 0); GET_INT(g_config.window_rect.bottom, "height", 0); From d147e916300a1947914b26b45d995cf7df888685 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Feb 2024 22:54:16 +0100 Subject: [PATCH 0793/1724] adjust default shader path --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index bf37159..31f5a5f 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,7 @@ void cfg_load() GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); - GET_STRING("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); + GET_STRING("shader", "Shaders\\interpolation\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); GET_INT(g_config.window_rect.left, "posX", -32000); GET_INT(g_config.window_rect.top, "posY", -32000); GET_STRING("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); @@ -201,7 +201,7 @@ static void cfg_create_ini() "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2\n" - "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" + "shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" "posX=-32000\n" From de2e3bb26631709ad314c923382f6d1db05bc2ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 01:45:41 +0100 Subject: [PATCH 0794/1724] add new resolution settings --- config/ConfigFormUnit.cpp | 10 +++++----- config/ConfigFormUnit.dfm | 16 ++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 64d0014..cae9037 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -738,10 +738,10 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) int cwidth = hd_ini->ReadInteger("Game", "Width", 0); int cheight = hd_ini->ReadInteger("Game", "Height", 0); - int reso = hd_ini->ReadInteger("Game", "Resolution", 3); + int reso = hd_ini->ReadInteger("Game", "Resolution", 4); if (!cwidth || !cheight) { - ResolutionCbx->ItemIndex = reso <= 7 ? reso : 3; + ResolutionCbx->ItemIndex = reso <= 10 ? reso : 4; } else { ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL); @@ -948,14 +948,14 @@ void TConfigForm::SaveSettings() break; } - if (ResolutionCbx->ItemIndex <= 7) { + if (ResolutionCbx->ItemIndex <= 10) { hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex); hd_ini->WriteInteger("Game", "Width", 0); hd_ini->WriteInteger("Game", "Height", 0); - if (ResolutionCbx->Items->Count == 9) { - ResolutionCbx->Items->Delete(8); + if (ResolutionCbx->Items->Count == 12) { + ResolutionCbx->Items->Delete(11); } } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 533b68b..7bcdc25 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3539,6 +3539,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList + DropDownCount = 11 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3548,14 +3549,17 @@ object ConfigForm: TConfigForm TabOrder = 6 OnChange = PresentationCbxChange Items.Strings = ( - '640x480 (4:3)' - '800x608 (4:3)' - '832x480 (16:9)' - '960x544 (16:9)' + '640x480 (4:3)' + '800x608 (4:3)' + '1024x768 (4:3)' + '832x480 (16:9)' + '960x544 (16:9)' '1280x704 (16:9)' + '1120x480 (21:9)' '1280x544 (21:9)' - '768x480 (16:10)' - '960x608 (16:10)') + '768x480 (16:10)' + '960x608 (16:10)' + '1280x800 (16:10)') end end object MenuPnl: TPanel From 6aae09eea9466b07a4d5c19ca8b293c572735601 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 01:46:54 +0100 Subject: [PATCH 0795/1724] increase dropdowncount --- config/ConfigFormUnit.dfm | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 7bcdc25..786a72b 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3539,7 +3539,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 11 + DropDownCount = 12 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3549,17 +3549,17 @@ object ConfigForm: TConfigForm TabOrder = 6 OnChange = PresentationCbxChange Items.Strings = ( - '640x480 (4:3)' - '800x608 (4:3)' - '1024x768 (4:3)' - '832x480 (16:9)' - '960x544 (16:9)' - '1280x704 (16:9)' - '1120x480 (21:9)' - '1280x544 (21:9)' - '768x480 (16:10)' - '960x608 (16:10)' - '1280x800 (16:10)') + '640x480 (4:3)' + '800x608 (4:3)' + '1024x768 (4:3)' + '832x480 (16:9)' + '960x544 (16:9)' + '1280x704 (16:9)' + '1120x480 (21:9)' + '1280x544 (21:9)' + '768x480 (16:10)' + '960x608 (16:10)' + '1280x800 (16:10)') end end object MenuPnl: TPanel From 0a88e48e60a136139e8c7b10a981c7ecf28886f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 04:21:13 +0100 Subject: [PATCH 0796/1724] reset resolution to default --- config/ConfigFormUnit.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index cae9037..11cec77 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -86,6 +86,14 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } + auto *ini = new TIniFile(".\\Warcraft II BNE.ini"); + + ini->WriteString("Game", "Resolution", "4"); + ini->WriteString("Game", "Width", "0"); + ini->WriteString("Game", "Height", "0"); + + delete ini; + DeleteFile(".\\ddraw.ini"); ShellExecute( From b9eead19477bf6890ab9dd36e4dc5aa880a217c3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 04:22:53 +0100 Subject: [PATCH 0797/1724] fix url --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index eaca4d7..5d48d41 100644 --- a/src/config.c +++ b/src/config.c @@ -241,7 +241,7 @@ static void cfg_create_ini() if (fh) { fputs( - "; cnc-ddraw - https://github.com/CnCNet/cnc-ddraw - https://cncnet.org\n" + "; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw\n" "\n" "[ddraw]\n" "; ### Optional settings ###\n" From d70d316c7ee279120e23639331a0951b1617bb46 Mon Sep 17 00:00:00 2001 From: egornovivan Date: Fri, 16 Feb 2024 22:55:17 +0500 Subject: [PATCH 0798/1724] Added support for subdir and sync of dll and ini names https://github.com/FunkyFr3sh/cnc-ddraw/issues/287 --- inc/config.h | 3 +++ src/config.c | 24 +++++++++++++++++++++--- src/render_ogl.c | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index 34c8c66..562535e 100644 --- a/inc/config.h +++ b/inc/config.h @@ -13,8 +13,11 @@ typedef struct CNCDDRAWCONFIG int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; + char dll_path[MAX_PATH]; char process_file_name[MAX_PATH]; + char dll_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; + char dll_file_ext[MAX_PATH]; INIFILE ini; BOOL is_wine; diff --git a/src/config.c b/src/config.c index 31f5a5f..543def4 100644 --- a/src/config.c +++ b/src/config.c @@ -1095,11 +1095,29 @@ static void cfg_init() } } + /* get dll filename and directory */ + if (GetModuleFileNameA(g_ddraw_module, g_config.dll_path, sizeof(g_config.dll_path) - 1) > 0) + { + _splitpath(g_config.dll_path, NULL, NULL, g_config.dll_file_name, g_config.dll_file_ext); + + int len = strlen(g_config.dll_path) - strlen(g_config.dll_file_name) - strlen(g_config.dll_file_ext); + char* end = strstr(g_config.dll_path + len, g_config.dll_file_name); + + if (end) + { + *end = 0; + } + else + { + g_config.dll_path[0] = 0; + } + } + if (!GetEnvironmentVariableA("CNC_DDRAW_CONFIG_FILE", g_config.ini_path, sizeof(g_config.ini_path) - 1)) { - if (strlen(g_config.game_path) > 0) + if (strlen(g_config.dll_path) > 0 && strlen(g_config.dll_file_name) > 0) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { @@ -1108,7 +1126,7 @@ static void cfg_init() if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); } } else diff --git a/src/render_ogl.c b/src/render_ogl.c index f666eb5..6ff9a2c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -160,7 +160,7 @@ static void ogl_build_programs() if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_config.shader); + _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } /* detect common upscaling shaders and disable them if no upscaling is required */ From 9ba2a78588610898a1294b38942e9c495dc2bb08 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 21:12:58 +0100 Subject: [PATCH 0799/1724] keep subdir change but revert to using ddraw.ini filename --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 543def4..d405775 100644 --- a/src/config.c +++ b/src/config.c @@ -1117,7 +1117,10 @@ static void cfg_init() { if (strlen(g_config.dll_path) > 0 && strlen(g_config.dll_file_name) > 0) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.dll_path); + + /* Use this here instead to sync .ini filename with .dll filename - by egornovivan @ github */ + //_snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { @@ -1126,7 +1129,8 @@ static void cfg_init() if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); + /* This might not actually be needed, but we keep it for now */ + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); } } else From 608cb6fa684e045572f13b0063c473436e4e5824 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 03:49:32 +0100 Subject: [PATCH 0800/1724] add 1024x576 to config --- config/ConfigFormUnit.cpp | 8 ++++---- config/ConfigFormUnit.dfm | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 11cec77..6a00eb9 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -749,7 +749,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) int reso = hd_ini->ReadInteger("Game", "Resolution", 4); if (!cwidth || !cheight) { - ResolutionCbx->ItemIndex = reso <= 10 ? reso : 4; + ResolutionCbx->ItemIndex = reso <= 11 ? reso : 4; } else { ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL); @@ -956,14 +956,14 @@ void TConfigForm::SaveSettings() break; } - if (ResolutionCbx->ItemIndex <= 10) { + if (ResolutionCbx->ItemIndex <= 11) { hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex); hd_ini->WriteInteger("Game", "Width", 0); hd_ini->WriteInteger("Game", "Height", 0); - if (ResolutionCbx->Items->Count == 12) { - ResolutionCbx->Items->Delete(11); + if (ResolutionCbx->Items->Count == 13) { + ResolutionCbx->Items->Delete(12); } } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 786a72b..62c57de 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3539,7 +3539,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 12 + DropDownCount = 13 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 @@ -3554,6 +3554,7 @@ object ConfigForm: TConfigForm '1024x768 (4:3)' '832x480 (16:9)' '960x544 (16:9)' + '1024x576 (16:9)' '1280x704 (16:9)' '1120x480 (21:9)' '1280x544 (21:9)' From 0f20a1a25fe69ddbb8936cc95bb836ec810f7341 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 06:27:18 +0100 Subject: [PATCH 0801/1724] fix wayland bug (linux) --- src/dd.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 1edb49d..eec2722 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1015,13 +1015,29 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if ((!d3d9_active || g_config.nonexclusive) && - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!d3d9_active || g_config.nonexclusive) { - g_ddraw->render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } + + /* + Fix wayland bug: + ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed + */ + if (g_config.is_wine && + (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } } if (g_config.is_wine) From 194fb5e371942235fe763f8e8f4dd4b6575c2568 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 06:33:56 +0100 Subject: [PATCH 0802/1724] add ChangeDisplaySettings(NULL, 0); just to be sure --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index eec2722..750e69b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1033,6 +1033,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { + ChangeDisplaySettings(NULL, 0); + g_ddraw->render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; From caa06c77c0f3d7c25fd37a91c6870e6c6722574f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 18:11:58 +0100 Subject: [PATCH 0803/1724] set g_ddraw_module right away --- src/dllmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ad00d68..f26e4dd 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -26,6 +26,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { + g_ddraw_module = hDll; + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) { cfg_load(); @@ -40,8 +42,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); - g_ddraw_module = hDll; - char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) From eca7dde89e385c1d6f9cfdadebb82f7a6342fe4e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:18:42 +0100 Subject: [PATCH 0804/1724] fix videos in wine --- src/hook.c | 2 ++ src/utils.c | 1 + src/winapi_hooks.c | 22 +++++++++++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/hook.c b/src/hook.c index e53f062..5646765 100644 --- a/src/hook.c +++ b/src/hook.c @@ -517,6 +517,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -581,6 +582,7 @@ void hook_revert(HOOKLIST* hooks) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) diff --git a/src/utils.c b/src/utils.c index 67665a7..91fbcaf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -568,6 +568,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7ea7257..6492f59 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -763,6 +763,7 @@ BOOL WINAPI fake_StretchBlt( (hwnd == g_ddraw->hwnd || (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { @@ -864,7 +865,22 @@ int WINAPI fake_StretchDIBits( UINT iUsage, DWORD rop) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + HWND hwnd = WindowFromDC(hdc); + + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw && g_ddraw->hwnd && + (hwnd == g_ddraw->hwnd || + (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { @@ -894,11 +910,11 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw->width > 0) + else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { return real_StretchDIBits( - hdc, + g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, (int)(DestWidth * g_ddraw->render.scale_w), From b87e5b78fb6f444128f94e6a93c6e5bea74fc144 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:21:43 +0100 Subject: [PATCH 0805/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index f07c491..608875f 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ac3486bebbcc64fadb2a1781c82db4a173b16a7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:22:20 +0100 Subject: [PATCH 0806/1724] update copyright year --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 551bfc0..69ba76c 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -12,7 +12,7 @@ PRODUCTVERSION VERSION VALUE "FileDescription", "DirectDraw replacement" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "ddraw" - VALUE "LegalCopyright", "Copyright (c) 2010-2023" + VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" From bc1bf81e15d62f20c8311cfb6d3b5aaffca87321 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Feb 2024 03:51:09 +0100 Subject: [PATCH 0807/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 608875f..58f39f3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 5b3a7b4994188df4ef6cec9e0028ddbe4b6998b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Feb 2024 23:46:32 +0100 Subject: [PATCH 0808/1724] add debug code for possible DwmFlush failure --- inc/fps_limiter.h | 4 +++- src/dd.c | 6 +----- src/fps_limiter.c | 41 +++++++++++++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index 5c8049f..ec0f7bc 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -48,12 +48,14 @@ typedef struct FPSLIMITER D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; BOOL got_adapter; BOOL initialized; + CRITICAL_SECTION cs; + BOOL cs_initialized; } FPSLIMITER; extern FPSLIMITER g_fpsl; void fpsl_init(); -BOOL fpsl_wait_for_vblank(BOOL open_adapter); +BOOL fpsl_wait_for_vblank(); BOOL fpsl_dwm_flush(); BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); diff --git a/src/dd.c b/src/dd.c index 750e69b..06abd7d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1224,11 +1224,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - BOOL open = - !(g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))); - - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return DD_OK; } diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 97c0ec1..90c8076 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -35,6 +35,12 @@ void fpsl_init() g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter); } + if (!g_fpsl.cs_initialized) + { + g_fpsl.cs_initialized = TRUE; + InitializeCriticalSection(&g_fpsl.cs); + } + if (!g_fpsl.gdi32_dll) { g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); @@ -78,19 +84,26 @@ void fpsl_init() g_fpsl.initialized = TRUE; } -BOOL fpsl_wait_for_vblank(BOOL open_adapter) +BOOL fpsl_wait_for_vblank() { if (g_fpsl.initialized) { - if (open_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter) + if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc) { - g_fpsl.adapter.hDc = g_ddraw->render.hdc; + EnterCriticalSection(&g_fpsl.cs); - if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) + if (!g_fpsl.got_adapter) { - g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; - g_fpsl.got_adapter = TRUE; + g_fpsl.adapter.hDc = g_ddraw->render.hdc; + + if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) + { + g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; + g_fpsl.got_adapter = TRUE; + } } + + LeaveCriticalSection(&g_fpsl.cs); } if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent) @@ -104,7 +117,19 @@ BOOL fpsl_wait_for_vblank(BOOL open_adapter) BOOL fpsl_dwm_flush() { - return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()); + if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) + { + HRESULT x = g_fpsl.DwmFlush(); + + if (!SUCCEEDED(x)) + { + //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); + } + + return SUCCEEDED(x); + } + + return FALSE; } BOOL fpsl_dwm_is_enabled() @@ -128,7 +153,7 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return; } From 0d2845b4c7eae4b4e95946fcbccfa3036c3bf6c5 Mon Sep 17 00:00:00 2001 From: egornovivan Date: Sat, 2 Mar 2024 03:39:47 +0500 Subject: [PATCH 0809/1724] Add GHA workflow --- .github/workflows/build.yml | 130 +++++++++++++++++++++++ action.yml | 198 ++++++++++++++++++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 action.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..811df5d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,130 @@ +name: Build + +on: + push: + branches: + - 'master' + - 'develop' + - 'github-action' + paths: + - '.github/workflows/build.yml' + - 'action.yml' + +jobs: + Build: + runs-on: windows-2019 + steps: + +# - name: Install Windows XP Support for Visual Studio 2022 # windows-2022 # v141_xp # Installation takes more than 5 minutes +# run: | +# Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" +# $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" +# $componentsToAdd = @( +# "Microsoft.VisualStudio.Component.WinXP" +# ) +# [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} +# $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') +# $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden +# if ($process.ExitCode -eq 0) +# { +# Write-Host "components have been successfully added" +# Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.* +# } +# else +# { +# Write-Host "components were not installed" +# exit 1 +# } + + - name: Clone cnc-ddraw + uses: actions/checkout@v4 + + - name: Release build + id: build-release + uses: ./ + with: + release: true + + - name: ReleaseWin2000 build + id: build-releasewin2000 + uses: ./ + with: + releasewin2000: true + + - name: Debug build + id: build-debug + uses: ./ + with: + debug: true + + - name: DebugLog build + id: build-debuglog + uses: ./ + with: + debuglog: true + + - name: DebugLogMini build + id: build-debuglogmini + uses: ./ + with: + debuglogmini: true + + - name: Prepare artifact + run: | + : + + mkdir -p cnc-ddraw-release + mkdir -p cnc-ddraw-releasewin2000 + mkdir -p cnc-ddraw-debug + mkdir -p cnc-ddraw-debuglog + mkdir -p cnc-ddraw-debuglogmini + + cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + + cp "${{ steps.build-releasewin2000.outputs.releasewin2000 }}" cnc-ddraw-releasewin2000 + + cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug + cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + + cp "${{ steps.build-debuglog.outputs.debuglog }}" cnc-ddraw-debuglog + cp "${{ steps.build-debuglog.outputs.debuglog-pdb }}" cnc-ddraw-debuglog + + cp "${{ steps.build-debuglogmini.outputs.debuglogmini }}" cnc-ddraw-debuglogmini + cp "${{ steps.build-debuglogmini.outputs.debuglogmini-pdb }}" cnc-ddraw-debuglogmini + + shell: bash + + - name: Upload artifacts cnc-ddraw-release + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-release + path: cnc-ddraw-release + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-releasewin2000 + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-releasewin2000 + path: cnc-ddraw-releasewin2000 + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-debug + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-debug + path: cnc-ddraw-debug + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-debuglog + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-debuglog + path: cnc-ddraw-debuglog + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-debuglogmini + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-debuglogmini + path: cnc-ddraw-debuglogmini + retention-days: 14 diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..0b1e1cc --- /dev/null +++ b/action.yml @@ -0,0 +1,198 @@ +#name: 'sfall' +#description: 'Builds sfall binaries' +#author: '@wipe2238' + +### +# +# Example: +# +# - name: Build sfall +# id: sfall +# uses: phobos2077/sfall@develop +# with: +# release-xp: true +# +# - name: Copy sfall to mod directory +# run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll" +# +### + +# While both inputs are marked as required, users needs to set only one of them (at minimum) to 'true' for action to work +inputs: + + release: + description: 'Set to true to enable building with Release configuration' + required: true + + releasewin2000: + description: 'Set to true to enable building with ReleaseWin2000 configuration' + required: true + + debug: + description: 'Set to true to enable building with Debug configuration' + required: true + + debuglog: + description: 'Set to true to enable building with DebugLog configuration' + required: true + + debuglogmini: + description: 'Set to true to enable building with DebugLogMini configuration' + required: true + +# Outputs are always using Windows directory separator (`\`) +outputs: + + release: + description: 'Full path to ddraw.dll built with Release configuration' + value: ${{ steps.build-release.outputs.ddraw-dll }} + + releasewin2000: + description: 'Full path to ddraw.dll built with ReleaseWin2000 configuration' + value: ${{ steps.build-releasewin2000.outputs.ddraw-dll }} + + debug: + description: 'Full path to ddraw.dll built with Debug configuration' + value: ${{ steps.build-debug.outputs.ddraw-dll }} + debug-pdb: + description: 'Full path to ddraw.pdb built with Debug configuration' + value: ${{ steps.build-debug.outputs.ddraw-pdb }} + + debuglog: + description: 'Full path to ddraw.dll built with DebugLog configuration' + value: ${{ steps.build-debuglog.outputs.ddraw-dll }} + debuglog-pdb: + description: 'Full path to ddraw.pdb built with DebugLog configuration' + value: ${{ steps.build-debuglog.outputs.ddraw-pdb }} + + debuglogmini: + description: 'Full path to ddraw.dll built with DebugLogMini configuration' + value: ${{ steps.build-debuglogmini.outputs.ddraw-dll }} + debuglogmini-pdb: + description: 'Full path to ddraw.pdb built with DebugLogMini configuration' + value: ${{ steps.build-debuglogmini.outputs.ddraw-pdb }} + +runs: + using: 'composite' + steps: + + # Quick check for things which should never happen + - name: Sanity checks + run: | + if [[ "${{ runner.os }}" != "Windows" ]]; then + echo "[ERROR] This action can only be used on Windows" + exit 1 + elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasewin2000 }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglog }}" != "true" ]] && [[ "${{ inputs.debuglogmini }}" != "true" ]]; then + echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasewin2000', 'debug', 'debuglog', 'debuglogmini'" + exit 1 + # + elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then + echo "[ERROR] Solution file not found -- '\\cnc-ddraw.sln'" + exit 1 + fi + # + shell: bash + + # MSBuild is not in PATH on Windows machines + # Using `::set-output` to make sure workflow environment remains unchanged + - name: Prepare MSBuild + id: msbuild + run: | + echo "::group::Prepare MSBuild" + + MSBUILD_EXE="$("/c/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -requires Microsoft.Component.MSBuild -find MSBuild/**/Bin/MSBuild.exe)" + echo "exe=$MSBUILD_EXE" >> $GITHUB_OUTPUT + + echo "::endgroup::" + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build Release + id: build-release + run: | + if [[ "${{ inputs.release }}" == "true" ]]; then + echo ::group::Build Release + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build ReleaseWin2000 + id: build-releasewin2000 + run: | + if [[ "${{ inputs.releasewin2000 }}" == "true" ]]; then + echo ::group::Build ReleaseWin2000 + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseWin2000 -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseWin2000/ddraw.dll")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build Debug + id: build-debug + run: | + : + if [[ "${{ inputs.debug }}" == "true" ]]; then + echo "::group::Build Debug" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build DebugLog + id: build-debuglog + run: | + : + if [[ "${{ inputs.debuglog }}" == "true" ]]; then + echo "::group::Build DebugLog" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLog -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build DebugLogMini + id: build-debuglogmini + run: | + : + if [[ "${{ inputs.debuglogmini }}" == "true" ]]; then + echo "::group::Build DebugLogMini" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMini -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash From 9880c3899ce453d39d31f6465089703374230ace Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Mar 2024 05:02:05 +0100 Subject: [PATCH 0810/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 58f39f3..2e1ad8a 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 5082a40a3d8cf8528c3948d8d4a1240cc2da416a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Mar 2024 02:53:07 +0100 Subject: [PATCH 0811/1724] fix debug build --- inc/debug.h | 2 +- src/debug.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 1d3e6c4..f7c81d1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -4,7 +4,7 @@ #define WIN32_LEAN_AND_MEAN #include -int dbg_exception_handler(EXCEPTION_POINTERS* exception); +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); diff --git a/src/debug.c b/src/debug.c index eb5a875..b63c88e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -22,7 +22,7 @@ static BOOL g_dbg_log_rotate; #ifdef _DEBUG static int g_dbg_crash_count = 0; -int dbg_exception_handler(EXCEPTION_POINTERS* exception) +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; From 9e000720e416a71bd8fc6ce2b18daf4d7a19b257 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:42:15 +0100 Subject: [PATCH 0812/1724] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index d4c1b60..4299b8b 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -150,7 +150,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); - strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); + strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); _snprintf(filename, sizeof(filename) - 1, "%s%s-%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) From 6ead8985be1f35a2e2f0cde8e9c3d57a834cb530 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:42:36 +0100 Subject: [PATCH 0813/1724] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index 02e3d22..0720f03 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -132,7 +132,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } } - strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); + strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); _snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time); if (src->bpp == 8 && src->palette) From bf7a3d021a8ae1318f87e2b2c912145550100c69 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:44:34 +0100 Subject: [PATCH 0814/1724] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index 0720f03..76a7480 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -133,7 +133,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); - _snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time); + _snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time); if (src->bpp == 8 && src->palette) { From 6cc99330bd99527241211f175df81d8bf9073964 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:45:04 +0100 Subject: [PATCH 0815/1724] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index 4299b8b..88d559c 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -151,7 +151,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); - _snprintf(filename, sizeof(filename) - 1, "%s%s-%s.png", g_config.screenshot_dir, title, str_time); + _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { From 488bad66d86e36fbe09d421a63fae572d0d80a84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 9 Mar 2024 21:33:38 +0100 Subject: [PATCH 0816/1724] make sure you can host "no-hd" games with 640x480 --- src/dd.c | 3 ++- src/render_d3d9.c | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 06abd7d..7b8c426 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1512,8 +1512,9 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->ref--; } - + TRACE("Alloc\n"); IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + TRACE("Alloc: dd=%p\n", dd); memcpy(&dd->guid, iid, sizeof(dd->guid)); if (IsEqualGUID(&IID_IDirectDraw, iid)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d8d3d88..0d4aae4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -25,13 +25,21 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; + TRACE("d3d9_is_available\n"); + if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { + TRACE("d3d9_is_available: mod=%p\n", g_d3d9.hmodule); + IDirect3D9* (WINAPI * d3d_create9)(UINT) = (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + TRACE("d3d9_is_available: d3d_create9=%p\n", d3d_create9); + if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - IDirect3D9_Release(d3d9); + { + TRACE("d3d9_is_available: release=%d\n", IDirect3D9_Release(d3d9)); + } } return d3d9 != NULL; From 951871669c0e9516c688aebecec39a3eae7b528b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 9 Mar 2024 21:38:24 +0100 Subject: [PATCH 0817/1724] Revert "make sure you can host "no-hd" games with 640x480" This reverts commit 488bad66d86e36fbe09d421a63fae572d0d80a84. --- src/dd.c | 3 +-- src/render_d3d9.c | 10 +--------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 7b8c426..06abd7d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1512,9 +1512,8 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->ref--; } - TRACE("Alloc\n"); + IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); - TRACE("Alloc: dd=%p\n", dd); memcpy(&dd->guid, iid, sizeof(dd->guid)); if (IsEqualGUID(&IID_IDirectDraw, iid)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 0d4aae4..d8d3d88 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -25,21 +25,13 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; - TRACE("d3d9_is_available\n"); - if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { - TRACE("d3d9_is_available: mod=%p\n", g_d3d9.hmodule); - IDirect3D9* (WINAPI * d3d_create9)(UINT) = (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - TRACE("d3d9_is_available: d3d_create9=%p\n", d3d_create9); - if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - { - TRACE("d3d9_is_available: release=%d\n", IDirect3D9_Release(d3d9)); - } + IDirect3D9_Release(d3d9); } return d3d9 != NULL; From f2d1e9e3e6d8c5b7749b128b633b4d3226f66f01 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 10 Mar 2024 16:56:46 +0100 Subject: [PATCH 0818/1724] log d3d9on12 module ptr --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d8d3d88..e755008 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -76,7 +76,7 @@ BOOL d3d9_create() if (SUCCEEDED(hr)) { TRACE("+--Direct3D9-------------------------------------\n"); - TRACE("| D3D9On12: %s\n", d3d9on12 != NULL ? "True" : "False"); + TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); TRACE("| VendorId: 0x%x\n", ai.VendorId); TRACE("| DeviceId: 0x%x\n", ai.DeviceId); TRACE("| Revision: 0x%x\n", ai.Revision); From 82571fe8dbdd16119c0deb0637dc8e5d35214e64 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 11 Mar 2024 17:48:27 +0100 Subject: [PATCH 0819/1724] #295 add workaround for Win11 steam RA2 crash --- inc/config.h | 2 ++ inc/dd.h | 2 -- src/dd.c | 4 ++-- src/dllmain.c | 6 ++++++ src/opengl_utils.c | 2 +- src/render_d3d9.c | 26 +++++++++++++++++++++----- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/inc/config.h b/inc/config.h index 562535e..fe0f885 100644 --- a/inc/config.h +++ b/inc/config.h @@ -20,6 +20,8 @@ typedef struct CNCDDRAWCONFIG char dll_file_ext[MAX_PATH]; INIFILE ini; BOOL is_wine; + BOOL d3d9on12; + BOOL opengl_core; /* Optional settings */ diff --git a/inc/dd.h b/inc/dd.h index 2e3e09f..afd00d9 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -143,8 +143,6 @@ typedef struct CNCDDRAW DWORD minfps_tick_len; DWORD gui_thread_id; BOOL show_driver_warning; - BOOL d3d9on12; - BOOL opengl_core; } CNCDDRAW; diff --git a/src/dd.c b/src/dd.c index 06abd7d..909310e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1466,11 +1466,11 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) { - g_ddraw->d3d9on12 = TRUE; + g_config.d3d9on12 = TRUE; } else if (_strcmpi(g_config.renderer, "openglcore") == 0) { - g_ddraw->opengl_core = TRUE; + g_config.opengl_core = TRUE; } if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ diff --git a/src/dllmain.c b/src/dllmain.c index f26e4dd..ee3c2cc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -52,6 +52,12 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) while (s) { + /* Workaround for bug in Windows 11 (Steam RA2 crash) */ + if (_strcmpi(s, "Win7RTM") == 0) + { + g_config.d3d9on12 = TRUE; + } + if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) { char mes[128] = { 0 }; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index a1bfbae..2f14a5e 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -218,7 +218,7 @@ void oglu_init() wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } - if (g_ddraw->opengl_core) + if (g_config.opengl_core) { wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } diff --git a/src/render_d3d9.c b/src/render_d3d9.c index e755008..faed00a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -27,11 +27,27 @@ BOOL d3d9_is_available() if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { - IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + if (g_config.d3d9on12) + { + D3D9ON12_ARGS args; + memset(&args, 0, sizeof(args)); + args.Enable9On12 = TRUE; - if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - IDirect3D9_Release(d3d9); + IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = + (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + + if (d3d_create9on12 && (d3d9 = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) + IDirect3D9_Release(d3d9); + } + + if (!d3d9) + { + IDirect3D9* (WINAPI * d3d_create9)(UINT) = + (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + + if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) + IDirect3D9_Release(d3d9); + } } return d3d9 != NULL; @@ -59,7 +75,7 @@ BOOL d3d9_create() IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - if (g_ddraw->d3d9on12) + if (g_config.d3d9on12) { d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); } From c15f02c27b511294a74a335d5ead1d46f1b982fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 11 Mar 2024 18:05:18 +0100 Subject: [PATCH 0820/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 2e1ad8a..a75a5b5 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 2 +#define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 0af9bbb88f210ea9880b14a47e0e7c6b90ea97a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 15 Mar 2024 17:07:40 +0100 Subject: [PATCH 0821/1724] fix build on linux --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 20da2fb..36ab707 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ -include config.mk -WINDRES ?= windres -LDFLAGS = -Wl,--enable-stdcall-fixup -s -CFLAGS = -Iinc -O2 -march=pentium4 -Wall +CC = i686-w64-mingw32-gcc +CXX = i686-w64-mingw32-g++ +WINDRES ?= i686-w64-mingw32-windres +LDFLAGS = -Wl,--enable-stdcall-fixup -s -static +CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ @@ -42,7 +44,6 @@ FILES = src/IDirect3D/IDirect3D.c \ all: $(WINDRES) -J rc ddraw.rc ddraw.rc.o $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -# $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt clean: $(RM) ddraw.dll ddraw.rc.o From c52544ad6f74f15b3b68f7179bc42cc157d3c527 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 18 Mar 2024 00:37:18 +0100 Subject: [PATCH 0822/1724] fix keyboard not working with devmode TRUE --- src/directinput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 2647d6a..38d6eef 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -69,7 +69,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) + if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) { if (pdwInOut) { @@ -91,7 +91,7 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) + if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) { if (cbData > 0 && lpvData) { From 871ccbf19609acc1db69f03f04937ebd1ea9c526 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 05:35:36 +0100 Subject: [PATCH 0823/1724] hook GetKeyState and GetAsyncKeyState for infantry --- inc/hook.h | 6 +++++- inc/version.h | 2 +- inc/winapi_hooks.h | 2 ++ src/hook.c | 4 ++++ src/winapi_hooks.c | 22 ++++++++++++++++++++++ src/wndproc.c | 2 +- 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 6ebb33b..ebb7c01 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -17,7 +17,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[32]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -56,6 +56,8 @@ typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); +typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); +typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); @@ -101,6 +103,8 @@ extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; +extern GETKEYSTATEPROC real_GetKeyState; +extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; diff --git a/inc/version.h b/inc/version.h index a75a5b5..7dd8747 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index a66f475..839eccc 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,8 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); +SHORT WINAPI fake_GetKeyState(int nVirtKey); +SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( diff --git a/src/hook.c b/src/hook.c index 5646765..d8f72a7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,8 @@ SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; +GETKEYSTATEPROC real_GetKeyState = GetKeyState; +GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; @@ -93,6 +95,8 @@ HOOKLIST g_hook_hooklist[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, + { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, + { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, { "", NULL, NULL, 0 } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6492f59..a16d860 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -716,6 +716,28 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w return result; } +SHORT WINAPI fake_GetKeyState(int nVirtKey) +{ + if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + { + if (real_GetForegroundWindow() != g_ddraw->hwnd) + return 0; + } + + return GetKeyState(nVirtKey); +} + +SHORT WINAPI fake_GetAsyncKeyState(int vKey) +{ + if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + { + if (real_GetForegroundWindow() != g_ddraw->hwnd) + return 0; + } + + return GetAsyncKeyState(vKey); +} + int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { if (g_ddraw && diff --git a/src/wndproc.c b/src/wndproc.c index b4451b8..d545046 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -667,7 +667,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { /* let it pass through once (tiberian sun) */ static BOOL one_time; - + if (wParam && !one_time && g_config.tshack) { one_time = TRUE; From c8d4cd997ed08763638cdcbb6ed9a57fe9745ae7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 05:41:42 +0100 Subject: [PATCH 0824/1724] use real_ functions --- src/winapi_hooks.c | 4 ++-- src/wndproc.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a16d860..3d7632b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -724,7 +724,7 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) return 0; } - return GetKeyState(nVirtKey); + return real_GetKeyState(nVirtKey); } SHORT WINAPI fake_GetAsyncKeyState(int vKey) @@ -735,7 +735,7 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) return 0; } - return GetAsyncKeyState(vKey); + return real_GetAsyncKeyState(vKey); } int WINAPI fake_GetDeviceCaps(HDC hdc, int index) diff --git a/src/wndproc.c b/src/wndproc.c index d545046..31cbc02 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -775,7 +775,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.unlock_cursor1 && (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { - if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) + if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) { mouse_unlock(); return 0; @@ -785,7 +785,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.unlock_cursor2 && (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) { - if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) + if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) { mouse_unlock(); return 0; From f57055fd8c797fd49246541a7ffdd93bf0a4eed8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 21:31:05 +0100 Subject: [PATCH 0825/1724] add better forground window detection and always enable new GetKeyState hooks --- inc/utils.h | 1 + src/utils.c | 7 +++++++ src/winapi_hooks.c | 10 ++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 2e2e779..253ec11 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -8,6 +8,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); +BOOL util_in_foreground(); BOOL util_is_avx_supported(); void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); diff --git a/src/utils.c b/src/utils.c index 91fbcaf..d3b26c9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -100,6 +100,13 @@ BOOL util_is_minimized(HWND hwnd) return IsIconic(hwnd) || (real_GetClientRect(hwnd, &rc) && (rc.right - rc.left == 0 || rc.bottom - rc.top == 0)); } +BOOL util_in_foreground() +{ + DWORD process_id = 0; + + return GetWindowThreadProcessId(real_GetForegroundWindow(), &process_id) && process_id == GetCurrentProcessId(); +} + BOOL util_is_avx_supported() { const DWORD XMM_STATE_BIT = 1 << 1; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3d7632b..10c287e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -718,10 +718,9 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w SHORT WINAPI fake_GetKeyState(int nVirtKey) { - if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) { - if (real_GetForegroundWindow() != g_ddraw->hwnd) - return 0; + return 0; } return real_GetKeyState(nVirtKey); @@ -729,10 +728,9 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) SHORT WINAPI fake_GetAsyncKeyState(int vKey) { - if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) { - if (real_GetForegroundWindow() != g_ddraw->hwnd) - return 0; + return 0; } return real_GetAsyncKeyState(vKey); From 978946a5d94f2b89e166db384e664ab1225c6a42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 21:51:23 +0100 Subject: [PATCH 0826/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7dd8747..016e2b7 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From d69a56c0d04976a2d3adc7a3b7b8a4e636411b6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 04:36:30 +0100 Subject: [PATCH 0827/1724] add some more debug logging to dd_EnumDisplayModes --- inc/version.h | 2 +- src/dd.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 016e2b7..ddb62c3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/dd.c b/src/dd.c index 909310e..bf448e5 100644 --- a/src/dd.c +++ b/src/dd.c @@ -65,6 +65,8 @@ HRESULT dd_EnumDisplayModes( { max_w = reg_m.dmPelsWidth; max_h = reg_m.dmPelsHeight; + + TRACE(" max_w=%u, max_h=%u\n", reg_m.dmPelsWidth, reg_m.dmPelsHeight); } if (g_config.stronghold_hack && max_w && (max_w % 8)) @@ -317,7 +319,10 @@ HRESULT dd_EnumDisplayModes( m.dmPelsHeight = resolutions[i].cy; if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + { + TRACE(" SKIPPED: %ux%u\n", m.dmPelsWidth, m.dmPelsHeight); continue; + } } memset(&s, 0, sizeof(s)); From 36a87419e3522b028dce9999f31a28bb9e3c7359 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 22:27:00 +0100 Subject: [PATCH 0828/1724] don't allocate ddraw struct --- inc/dd.h | 4 +- inc/version.h | 2 +- src/IDirectDraw/IDirectDraw.c | 22 +- src/IDirectDraw/IDirectDrawPalette.c | 4 +- src/IDirectDraw/IDirectDrawSurface.c | 16 +- src/dd.c | 621 ++++++++++++++------------- src/ddpalette.c | 6 +- src/ddsurface.c | 112 ++--- src/debug.c | 6 +- src/directinput.c | 4 +- src/fps_limiter.c | 12 +- src/mouse.c | 44 +- src/render_d3d9.c | 144 +++---- src/render_gdi.c | 112 ++--- src/render_ogl.c | 172 ++++---- src/screenshot.c | 2 +- src/utils.c | 120 +++--- src/winapi_hooks.c | 430 +++++++++---------- src/wndproc.c | 214 ++++----- 19 files changed, 1027 insertions(+), 1020 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index afd00d9..5fdc857 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -56,11 +56,11 @@ typedef struct SPEEDLIMITER struct IDirectDrawSurfaceImpl; -extern struct CNCDDRAW* g_ddraw; +extern struct CNCDDRAW g_ddraw; typedef struct CNCDDRAW { - ULONG ref; + LONG ref; DWORD width; DWORD height; diff --git a/inc/version.h b/inc/version.h index ddb62c3..9dc51c9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 9a96270..1e6f6a4 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -131,20 +131,20 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - if (!g_ddraw->real_dll) - g_ddraw->real_dll = real_LoadLibraryA("system32\\ddraw.dll"); + if (!g_ddraw.real_dll) + g_ddraw.real_dll = real_LoadLibraryA("system32\\ddraw.dll"); - if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) - g_ddraw->DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); + if (g_ddraw.real_dll && !g_ddraw.DirectDrawCreate) + g_ddraw.DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw.real_dll, "DirectDrawCreate"); - if (g_ddraw->DirectDrawCreate == DirectDrawCreate) - g_ddraw->DirectDrawCreate = NULL; + if (g_ddraw.DirectDrawCreate == DirectDrawCreate) + g_ddraw.DirectDrawCreate = NULL; - if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate) - g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL); + if (!g_ddraw.real_dd && g_ddraw.DirectDrawCreate) + g_ddraw.DirectDrawCreate(NULL, &g_ddraw.real_dd, NULL); - if (g_ddraw->real_dd) - ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj); + if (g_ddraw.real_dd) + ret = IDirectDraw_QueryInterface(g_ddraw.real_dd, riid, ppvObj); else ret = E_NOINTERFACE; } @@ -355,7 +355,7 @@ HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAW { TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary; + *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 2eb313b..2767478 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -30,8 +30,8 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { TRACE(" Released (%p)\n", This); - if (g_ddraw) - g_ddraw->last_freed_palette = This; + if (g_ddraw.ref) + g_ddraw.last_freed_palette = This; HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index c7775af..7445f99 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -82,11 +82,11 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { TRACE(" Released (%p)\n", This); - if (g_ddraw && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (g_ddraw.ref && (This->caps & DDSCAPS_PRIMARYSURFACE)) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->primary = NULL; - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.primary = NULL; + LeaveCriticalSection(&g_ddraw.cs); } if (This->bitmap) @@ -111,7 +111,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->mapping) CloseHandle(This->mapping); - if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface)) + if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface)) { IDirectDrawSurface_Release(This->backbuffer); } @@ -119,15 +119,15 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->clipper) IDirectDrawClipper_Release(This->clipper); - if (This->palette && (!g_ddraw || (void*)This->palette != g_ddraw->last_freed_palette)) + if (This->palette && (!g_ddraw.ref || (void*)This->palette != g_ddraw.last_freed_palette)) { IDirectDrawPalette_Release(This->palette); } DeleteCriticalSection(&This->cs); - if (g_ddraw) - g_ddraw->last_freed_surface = This; + if (g_ddraw.ref) + g_ddraw.last_freed_surface = This; HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/dd.c b/src/dd.c index bf448e5..c6cddf1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -16,7 +16,7 @@ #include "blt.h" -CNCDDRAW* g_ddraw = NULL; +CNCDDRAW g_ddraw; HRESULT dd_EnumDisplayModes( DWORD dwFlags, @@ -123,9 +123,9 @@ HRESULT dd_EnumDisplayModes( } } - if ((g_ddraw->bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) + if ((g_ddraw.bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) { - TRACE(" g_ddraw->bpp=%u\n", g_ddraw->bpp); + TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); /* set up some filters to keep the list short */ DWORD refresh_rate = 0; @@ -218,7 +218,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 8 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 8 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -243,7 +243,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 16 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 16 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -268,7 +268,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 32 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 32 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -300,7 +300,7 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw->bpp || g_config.resolutions != RESLIST_NORMAL) + if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { @@ -482,13 +482,13 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; + lpDDSurfaceDesc->dwHeight = g_ddraw.height ? g_ddraw.height : 768; + lpDDSurfaceDesc->dwWidth = g_ddraw.width ? g_ddraw.width : 1024; lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - if (g_ddraw->bpp == 32 || g_config.vermeer_hack) + if (g_ddraw.bpp == 32 || g_config.vermeer_hack) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; @@ -499,7 +499,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } - else if (g_ddraw->bpp != 8) + else if (g_ddraw.bpp != 8) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; @@ -525,28 +525,28 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (!g_ddraw->render.run) + if (!g_ddraw.render.run) { return DD_OK; } - if (g_ddraw->renderer != gdi_render_main) + if (g_ddraw.renderer != gdi_render_main) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } } if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -567,187 +567,187 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } - if (!g_ddraw->mode.dmPelsWidth) + if (!g_ddraw.mode.dmPelsWidth) { ChangeDisplaySettings(NULL, 0); - g_ddraw->mode.dmSize = sizeof(DEVMODE); - g_ddraw->mode.dmDriverExtra = 0; + g_ddraw.mode.dmSize = sizeof(DEVMODE); + g_ddraw.mode.dmDriverExtra = 0; - if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw->mode) == FALSE) + if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) { - g_ddraw->mode.dmSize = sizeof(DEVMODE); - g_ddraw->mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - g_ddraw->mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); - g_ddraw->mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); - g_ddraw->mode.dmDisplayFrequency = 60; - g_ddraw->mode.dmBitsPerPel = 32; + g_ddraw.mode.dmSize = sizeof(DEVMODE); + g_ddraw.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; + g_ddraw.mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); + g_ddraw.mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); + g_ddraw.mode.dmDisplayFrequency = 60; + g_ddraw.mode.dmBitsPerPel = 32; - if (!g_ddraw->mode.dmPelsWidth || !g_ddraw->mode.dmPelsHeight) + if (!g_ddraw.mode.dmPelsWidth || !g_ddraw.mode.dmPelsHeight) { g_config.fullscreen = FALSE; } } } - g_ddraw->render.width = g_config.window_rect.right; - g_ddraw->render.height = g_config.window_rect.bottom; + g_ddraw.render.width = g_config.window_rect.right; + g_ddraw.render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if ((g_ddraw->width || g_config.infantryhack) && - (g_ddraw->width != dwWidth || g_ddraw->height != dwHeight) && + if ((g_ddraw.width || g_config.infantryhack) && + (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) { g_config.window_rect.left = -32000; g_config.window_rect.top = -32000; } - g_ddraw->width = dwWidth; - g_ddraw->height = dwHeight; - g_ddraw->bpp = dwBPP; + g_ddraw.width = dwWidth; + g_ddraw.height = dwHeight; + g_ddraw.bpp = dwBPP; - InterlockedExchange((LONG*)&g_ddraw->cursor.x, dwWidth / 2); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, dwHeight / 2); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2); BOOL border = g_config.border; BOOL nonexclusive = FALSE; if (g_config.fullscreen) { - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; if (g_config.windowed) /* windowed-fullscreen aka borderless */ { border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw->renderer == ogl_render_main) + if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; } } - if (g_ddraw->render.width < g_ddraw->width) + if (g_ddraw.render.width < g_ddraw.width) { - g_ddraw->render.width = g_ddraw->width; + g_ddraw.render.width = g_ddraw.width; } - if (g_ddraw->render.height < g_ddraw->height) + if (g_ddraw.render.height < g_ddraw.height) { - g_ddraw->render.height = g_ddraw->height; + g_ddraw.render.height = g_ddraw.height; } - g_ddraw->render.run = TRUE; + g_ddraw.render.run = TRUE; BOOL lock_mouse = g_mouse_locked; mouse_unlock(); - memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); - g_ddraw->render.mode.dmSize = sizeof(DEVMODE); + memset(&g_ddraw.render.mode, 0, sizeof(DEVMODE)); + g_ddraw.render.mode.dmSize = sizeof(DEVMODE); - g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; if (g_config.refresh_rate) { - g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; - g_ddraw->render.mode.dmDisplayFrequency = g_config.refresh_rate; + g_ddraw.render.mode.dmFields |= DM_DISPLAYFREQUENCY; + g_ddraw.render.mode.dmDisplayFrequency = g_config.refresh_rate; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { g_config.refresh_rate = 0; - g_ddraw->render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; - g_ddraw->render.mode.dmDisplayFrequency = 0; + g_ddraw.render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; + g_ddraw.render.mode.dmDisplayFrequency = 0; } } if (!g_config.windowed) { /* Making sure the chosen resolution is valid */ - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try without upscaling */ - g_ddraw->render.width = g_ddraw->width; - g_ddraw->render.height = g_ddraw->height; + g_ddraw.render.width = g_ddraw.width; + g_ddraw.render.height = g_ddraw.height; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try 2x scaling */ - g_ddraw->render.width *= 2; - g_ddraw->render.height *= 2; + g_ddraw.render.width *= 2; + g_ddraw.render.height *= 2; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth || - g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) || - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if ((g_ddraw.render.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.render.height > g_ddraw.mode.dmPelsHeight) || + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { SIZE res = { 0 }; /* try to get a resolution with the same aspect ratio as the requested resolution */ BOOL found_res = util_get_lowest_resolution( - (float)g_ddraw->width / g_ddraw->height, + (float)g_ddraw.width / g_ddraw.height, &res, - g_ddraw->width + 1, /* don't return the original resolution since we tested that one already */ - g_ddraw->height, - g_ddraw->mode.dmPelsWidth, - g_ddraw->mode.dmPelsHeight); + g_ddraw.width + 1, /* don't return the original resolution since we tested that one already */ + g_ddraw.height, + g_ddraw.mode.dmPelsWidth, + g_ddraw.mode.dmPelsHeight); if (!found_res) { /* try to get a resolution with the same aspect ratio as the current display mode */ found_res = util_get_lowest_resolution( - (float)g_ddraw->mode.dmPelsWidth / g_ddraw->mode.dmPelsHeight, + (float)g_ddraw.mode.dmPelsWidth / g_ddraw.mode.dmPelsHeight, &res, - g_ddraw->width, - g_ddraw->height, - g_ddraw->mode.dmPelsWidth, - g_ddraw->mode.dmPelsHeight); + g_ddraw.width, + g_ddraw.height, + g_ddraw.mode.dmPelsWidth, + g_ddraw.mode.dmPelsHeight); } - g_ddraw->render.width = res.cx; - g_ddraw->render.height = res.cy; + g_ddraw.render.width = res.cx; + g_ddraw.render.height = res.cy; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; if (!found_res || - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || - g_ddraw->height > g_ddraw->mode.dmPelsHeight) + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ g_config.adjmouse = TRUE; } /* try current display settings */ - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* everything failed, use borderless mode instead */ ChangeDisplaySettings(NULL, 0); @@ -757,7 +757,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw->renderer == ogl_render_main) + if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; } @@ -770,151 +770,151 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl /* Support downscaling in borderless mode */ if (g_config.windowed && g_config.fullscreen) { - if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || - g_ddraw->height > g_ddraw->mode.dmPelsHeight) + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ g_config.adjmouse = TRUE; - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; } } - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = g_ddraw->render.height; - g_ddraw->render.viewport.x = 0; - g_ddraw->render.viewport.y = 0; + g_ddraw.render.viewport.width = g_ddraw.render.width; + g_ddraw.render.viewport.height = g_ddraw.render.height; + g_ddraw.render.viewport.x = 0; + g_ddraw.render.viewport.y = 0; if (g_config.boxing) { - g_ddraw->render.viewport.width = g_ddraw->width; - g_ddraw->render.viewport.height = g_ddraw->height; + g_ddraw.render.viewport.width = g_ddraw.width; + g_ddraw.render.viewport.height = g_ddraw.height; for (int i = 20; i-- > 1;) { - if (g_ddraw->width * i <= g_ddraw->render.width && g_ddraw->height * i <= g_ddraw->render.height) + if (g_ddraw.width * i <= g_ddraw.render.width && g_ddraw.height * i <= g_ddraw.render.height) { - g_ddraw->render.viewport.width *= i; - g_ddraw->render.viewport.height *= i; + g_ddraw.render.viewport.width *= i; + g_ddraw.render.viewport.height *= i; break; } } - g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; - g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; + g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; + g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; } else if (g_config.maintas) { - double dst_ar = (double)g_ddraw->height / g_ddraw->width; - double src_ar = (double)g_ddraw->render.height / g_ddraw->render.width; + double dst_ar = (double)g_ddraw.height / g_ddraw.width; + double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width; - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = (int)round(dst_ar * g_ddraw->render.viewport.width); + g_ddraw.render.viewport.width = g_ddraw.render.width; + g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); if (src_ar < dst_ar) { - g_ddraw->render.viewport.width = - (int)round(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + g_ddraw.render.viewport.width = + (int)round(((double)g_ddraw.render.viewport.width / g_ddraw.render.viewport.height) * g_ddraw.render.height); - g_ddraw->render.viewport.height = g_ddraw->render.height; + g_ddraw.render.viewport.height = g_ddraw.render.height; } - g_ddraw->render.viewport.width = min(g_ddraw->render.viewport.width, g_ddraw->render.width); - g_ddraw->render.viewport.height = min(g_ddraw->render.viewport.height, g_ddraw->render.height); + g_ddraw.render.viewport.width = min(g_ddraw.render.viewport.width, g_ddraw.render.width); + g_ddraw.render.viewport.height = min(g_ddraw.render.viewport.height, g_ddraw.render.height); - g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; - g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; + g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; + g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; } - g_ddraw->render.scale_w = ((float)g_ddraw->render.viewport.width / g_ddraw->width); - g_ddraw->render.scale_h = ((float)g_ddraw->render.viewport.height / g_ddraw->height); - g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); - g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); + g_ddraw.render.scale_w = ((float)g_ddraw.render.viewport.width / g_ddraw.width); + g_ddraw.render.scale_h = ((float)g_ddraw.render.viewport.height / g_ddraw.height); + g_ddraw.render.unscale_w = ((float)g_ddraw.width / g_ddraw.render.viewport.width); + g_ddraw.render.unscale_h = ((float)g_ddraw.height / g_ddraw.render.viewport.height); - g_ddraw->mouse.scale_x = ((float)(g_ddraw->render.viewport.width - 1) / (g_ddraw->width - 1)); - g_ddraw->mouse.scale_y = ((float)(g_ddraw->render.viewport.height - 1) / (g_ddraw->height - 1)); - g_ddraw->mouse.unscale_x = ((float)(g_ddraw->width - 1) / (g_ddraw->render.viewport.width - 1)); - g_ddraw->mouse.unscale_y = ((float)(g_ddraw->height - 1) / (g_ddraw->render.viewport.height - 1)); + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); - g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; - g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; - g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust; - g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->mouse.y_adjust; + g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.top = g_ddraw.mouse.y_adjust; + g_ddraw.mouse.rc.right = g_ddraw.width + g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.bottom = g_ddraw.height + g_ddraw.mouse.y_adjust; if (g_config.adjmouse) { - g_ddraw->mouse.rc.right = g_ddraw->render.viewport.width + g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.bottom = g_ddraw->render.viewport.height + g_ddraw->mouse.y_adjust; + g_ddraw.mouse.rc.right = g_ddraw.render.viewport.width + g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.bottom = g_ddraw.render.viewport.height + g_ddraw.mouse.y_adjust; } - if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw->renderer == ogl_render_main)) + if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw.renderer == ogl_render_main)) { - g_ddraw->render.height++; - g_ddraw->render.opengl_y_align = 1; + g_ddraw.render.height++; + g_ddraw.render.opengl_y_align = 1; } else { - g_ddraw->render.opengl_y_align = 0; + g_ddraw.render.opengl_y_align = 0; } if (g_config.windowed) { - if (g_config.remove_menu && GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); if (!g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } if (!border) { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, real_GetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - if (GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); } else { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); } - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); if ((exstyle & WS_EX_TOOLWINDOW)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } if (g_config.is_wine) { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); } /* center the window with correct dimensions */ - int cy = g_ddraw->mode.dmPelsWidth ? g_ddraw->mode.dmPelsWidth : g_ddraw->render.width; - int cx = g_ddraw->mode.dmPelsHeight ? g_ddraw->mode.dmPelsHeight : g_ddraw->render.height; - int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); - int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); + int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; + int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; + int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw.render.width / 2); + int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw.render.height / 2); if (g_config.fullscreen) { @@ -926,18 +926,18 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl y = real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); } - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); - RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; + RECT dst = { x, y, g_ddraw.render.width + x, g_ddraw.render.height + y }; - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); + AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_NOTOPMOST, dst.left, dst.top, @@ -948,27 +948,27 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl BOOL d3d9_active = FALSE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw.renderer == d3d9_render_main) { d3d9_active = d3d9_create(); if (!d3d9_active) { d3d9_release(); - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } - if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)) + if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); } else { - if (GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); DWORD swp_flags = SWP_SHOWWINDOW; @@ -977,34 +977,34 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl swp_flags |= SWP_FRAMECHANGED; real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); if ((exstyle & WS_EX_TOOLWINDOW)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } BOOL d3d9_active = FALSE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw.renderer == d3d9_render_main) { if (g_config.nonexclusive) { - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, swp_flags); swp_flags = SWP_SHOWWINDOW; @@ -1015,16 +1015,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!d3d9_active) { d3d9_release(); - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } if (!d3d9_active || g_config.nonexclusive) { - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { - g_ddraw->render.run = FALSE; + g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); @@ -1035,12 +1035,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ if (g_config.is_wine && - (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || - g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { ChangeDisplaySettings(NULL, 0); - g_ddraw->render.run = FALSE; + g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); @@ -1050,53 +1050,53 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.is_wine) { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, swp_flags); if (d3d9_active && g_config.nonexclusive) d3d9_reset(TRUE); - g_ddraw->last_set_window_pos_tick = timeGetTime(); + g_ddraw.last_set_window_pos_tick = timeGetTime(); mouse_lock(); } - RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { - InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); + InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); } - if (g_ddraw->render.thread == NULL) + if (g_ddraw.render.thread == NULL) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL); - SetThreadPriority(g_ddraw->render.thread, THREAD_PRIORITY_ABOVE_NORMAL); + g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, NULL); + SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) { - real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); - real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); - real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + real_SendMessageA(g_ddraw.hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw.width, g_ddraw.height)); + real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } return DD_OK; @@ -1111,21 +1111,21 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) return DD_OK; } - if (g_ddraw->hwnd == NULL) + if (g_ddraw.hwnd == NULL) { - g_ddraw->hwnd = hwnd; + g_ddraw.hwnd = hwnd; } - if (!g_ddraw->wndproc) + if (!g_ddraw.wndproc) { hook_init(FALSE); - g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); - g_ddraw->gui_thread_id = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); + g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); - if (!g_ddraw->render.hdc) + if (!g_ddraw.render.hdc) { - g_ddraw->render.hdc = GetDC(g_ddraw->hwnd); + g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); @@ -1133,13 +1133,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) pfd.nVersion = 1; pfd.dwFlags = - PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw->renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); + PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw.renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw->mode.dmBitsPerPel; + pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; pfd.iLayerType = PFD_MAIN_PLANE; - SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); + SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); } if (!g_config.devmode) @@ -1147,11 +1147,11 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); if (cursor != LoadCursor(NULL, IDC_WAIT)) - InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)cursor); + InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)cursor); } int cursor_count = real_ShowCursor(TRUE) - 1; - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, cursor_count); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, cursor_count); real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ @@ -1166,24 +1166,24 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) real_ClipCursor(NULL); } - GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); + GetWindowText(g_ddraw.hwnd, (LPTSTR)&g_ddraw.title, sizeof(g_ddraw.title)); - g_ddraw->isredalert = strcmp(g_ddraw->title, "Red Alert") == 0; - g_ddraw->iscnc1 = strcmp(g_ddraw->title, "Command & Conquer") == 0; - g_ddraw->iskkndx = strcmp(g_ddraw->title, "KKND Xtreme") == 0; + g_ddraw.isredalert = strcmp(g_ddraw.title, "Red Alert") == 0; + g_ddraw.iscnc1 = strcmp(g_ddraw.title, "Command & Conquer") == 0; + g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; - if (g_ddraw->iskkndx) + if (g_ddraw.iskkndx) { - g_ddraw->upscale_hack_width = 640; - g_ddraw->upscale_hack_height = 480; + g_ddraw.upscale_hack_width = 640; + g_ddraw.upscale_hack_height = 480; } - else if (g_ddraw->isredalert || g_ddraw->iscnc1) + else if (g_ddraw.isredalert || g_ddraw.iscnc1) { - g_ddraw->upscale_hack_width = 640; - g_ddraw->upscale_hack_height = 400; + g_ddraw.upscale_hack_width = 640; + g_ddraw.upscale_hack_height = 400; } - if (g_config.vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) + if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx) { g_config.vhack = 0; } @@ -1204,7 +1204,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) windowed = g_config.windowed; fullscreen = g_config.fullscreen; - if (GetMenu(g_ddraw->hwnd) != NULL) + if (GetMenu(g_ddraw.hwnd) != NULL) { g_config.windowed = TRUE; g_config.fullscreen = FALSE; @@ -1233,25 +1233,25 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) return DD_OK; } - if (!g_ddraw->flip_limiter.tick_length) + if (!g_ddraw.flip_limiter.tick_length) return DD_OK; - if (g_ddraw->flip_limiter.htimer) + if (g_ddraw.flip_limiter.htimer) { FILETIME ft = { 0 }; GetSystemTimeAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw->flip_limiter.due_time, &ft) == -1) + if (CompareFileTime((FILETIME*)&g_ddraw.flip_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw->flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw.flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw->flip_limiter.htimer, g_ddraw->flip_limiter.tick_length * 2); + WaitForSingleObject(g_ddraw.flip_limiter.htimer, g_ddraw.flip_limiter.tick_length * 2); } - g_ddraw->flip_limiter.due_time.QuadPart += g_ddraw->flip_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw->flip_limiter.htimer, &g_ddraw->flip_limiter.due_time, 0, NULL, NULL, FALSE); + g_ddraw.flip_limiter.due_time.QuadPart += g_ddraw.flip_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw.flip_limiter.htimer, &g_ddraw.flip_limiter.due_time, 0, NULL, NULL, FALSE); } else { @@ -1263,12 +1263,12 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) return DD_OK; } - next_game_tick += g_ddraw->flip_limiter.tick_length; + next_game_tick += g_ddraw.flip_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw->flip_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw.flip_limiter.tick_length) { next_game_tick = tick_count; } @@ -1283,37 +1283,37 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) ULONG dd_AddRef() { - return ++g_ddraw->ref; + return InterlockedIncrement(&g_ddraw.ref); } ULONG dd_Release() { - g_ddraw->ref--; + LONG ref = InterlockedDecrement(&g_ddraw.ref); - if (g_ddraw->ref == 0) + if (ref == 0) { - if (g_ddraw->bpp) + if (g_ddraw.bpp) { cfg_save(); } - if (g_ddraw->render.run) + if (g_ddraw.render.run) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } } if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -1324,24 +1324,24 @@ ULONG dd_Release() } } - if (g_ddraw->render.hdc) + if (g_ddraw.render.hdc) { - ReleaseDC(g_ddraw->hwnd, g_ddraw->render.hdc); - g_ddraw->render.hdc = NULL; + ReleaseDC(g_ddraw.hwnd, g_ddraw.render.hdc); + g_ddraw.render.hdc = NULL; } - if (g_ddraw->ticks_limiter.htimer) + if (g_ddraw.ticks_limiter.htimer) { - CancelWaitableTimer(g_ddraw->ticks_limiter.htimer); - CloseHandle(g_ddraw->ticks_limiter.htimer); - g_ddraw->ticks_limiter.htimer = NULL; + CancelWaitableTimer(g_ddraw.ticks_limiter.htimer); + CloseHandle(g_ddraw.ticks_limiter.htimer); + g_ddraw.ticks_limiter.htimer = NULL; } - if (g_ddraw->flip_limiter.htimer) + if (g_ddraw.flip_limiter.htimer) { - CancelWaitableTimer(g_ddraw->flip_limiter.htimer); - CloseHandle(g_ddraw->flip_limiter.htimer); - g_ddraw->flip_limiter.htimer = NULL; + CancelWaitableTimer(g_ddraw.flip_limiter.htimer); + CloseHandle(g_ddraw.flip_limiter.htimer); + g_ddraw.flip_limiter.htimer = NULL; } if (g_fpsl.htimer) @@ -1351,26 +1351,31 @@ ULONG dd_Release() g_fpsl.htimer = NULL; } - if (g_ddraw->real_dd) + if (g_ddraw.real_dd) { - g_ddraw->real_dd->lpVtbl->Release(g_ddraw->real_dd); + g_ddraw.real_dd->lpVtbl->Release(g_ddraw.real_dd); } - DeleteCriticalSection(&g_ddraw->cs); + DeleteCriticalSection(&g_ddraw.cs); /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - if (g_ddraw->hwnd) + if (g_ddraw.hwnd) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } - - HeapFree(GetProcessHeap(), 0, g_ddraw); - g_ddraw = NULL; - + + memset(&g_ddraw, 0, sizeof(g_ddraw)); + return 0; } - return g_ddraw->ref; + if (ref < 0) + { + InterlockedExchange(&g_ddraw.ref, 0); + return 0; + } + + return (ULONG)ref; } HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) @@ -1411,42 +1416,41 @@ HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - if (!g_ddraw) + if (InterlockedExchangeAdd((LONG*)&g_ddraw.ref, 0) == 0) { - g_ddraw = (CNCDDRAW*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CNCDDRAW)); - g_ddraw->ref++; + InterlockedIncrement(&g_ddraw.ref); - InitializeCriticalSection(&g_ddraw->cs); + InitializeCriticalSection(&g_ddraw.cs); - g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); + g_ddraw.render.sem = CreateSemaphore(NULL, 0, 1, NULL); g_blt_use_avx = util_is_avx_supported(); if (g_config.minfps > 1000) g_config.minfps = 1000; if (g_config.minfps > 0) - g_ddraw->minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); + g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); - /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ + /* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */ g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) { - g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float len = 1000.0f / g_config.maxgameticks; - g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); - g_ddraw->ticks_limiter.tick_length = (DWORD)(len + 0.5f); + g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); + g_ddraw.ticks_limiter.tick_length = (DWORD)(len + 0.5f); } if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) { /* always using 60 fps for flip... */ - g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float flip_len = 1000.0f / 60; - g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); - g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); + g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); + g_ddraw.flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } @@ -1480,42 +1484,45 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ { - g_ddraw->renderer = d3d9_render_main; + g_ddraw.renderer = d3d9_render_main; } else if (tolower(g_config.renderer[0]) == 's' || tolower(g_config.renderer[0]) == 'g') /* gdi */ { - g_ddraw->renderer = gdi_render_main; + g_ddraw.renderer = gdi_render_main; } else if (tolower(g_config.renderer[0]) == 'o') /* opengl or openglcore */ { if (oglu_load_dll()) { - g_ddraw->renderer = ogl_render_main; + g_ddraw.renderer = ogl_render_main; } else { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } else /* auto */ { if (!g_config.is_wine && d3d9_is_available()) { - g_ddraw->renderer = d3d9_render_main; + g_ddraw.renderer = d3d9_render_main; } else if (oglu_load_dll()) { - g_ddraw->renderer = ogl_render_main; + g_ddraw.renderer = ogl_render_main; } else { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } - g_ddraw->ref--; + LONG ref = InterlockedDecrement(&g_ddraw.ref); + + if (ref < 0) + InterlockedExchange(&g_ddraw.ref, 0); } IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); diff --git a/src/ddpalette.c b/src/ddpalette.c index 3a7b52c..ed2b858 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -57,10 +57,10 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if (g_ddraw && g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) + if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return DD_OK; diff --git a/src/ddsurface.c b/src/ddsurface.c index b45cc75..d7176c2 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -48,8 +48,8 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_ddraw && - g_ddraw->iskkndx && + if (g_ddraw.ref && + g_ddraw.iskkndx && (dwFlags & DDBLT_COLORFILL) && lpDestRect && lpDestRect->right == 640 && @@ -261,7 +261,7 @@ HRESULT dds_Blt( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; if (quad) @@ -404,20 +404,20 @@ HRESULT dds_Blt( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw->ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -557,7 +557,7 @@ HRESULT dds_BltFast( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; if (quad) @@ -637,20 +637,20 @@ HRESULT dds_BltFast( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_config.limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0) + if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -749,7 +749,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (This->backbuffer && !This->skip_flip) { - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); @@ -767,7 +767,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa blt_clear(buf, 0, backbuffer->size); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer) { @@ -777,12 +777,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa This->skip_flip = FALSE; - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { This->last_flip_tick = timeGetTime(); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2) @@ -790,9 +790,9 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } - if (g_ddraw->ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -877,7 +877,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) RGBQUAD* data = This->palette ? This->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; HDC dc = This->hdc; @@ -957,10 +957,10 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_config.fixnotresponding && !g_config.is_wine) + if (g_ddraw.ref && g_config.fixnotresponding && !g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); @@ -988,16 +988,16 @@ HRESULT dds_Lock( HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } } @@ -1061,16 +1061,16 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (This->palette) IDirectDrawPalette_Release(This->palette); - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) { - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); This->palette = lpDDPalette; - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.run) + if (g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } } else @@ -1084,7 +1084,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { /* Hack for Warcraft II BNE and Diablo */ - HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; + HWND hwnd = g_ddraw.ref && g_ddraw.bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1129,17 +1129,17 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (erase) { - BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; DDBLTFX fx = { .dwFillColor = 0xFE }; IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - g_ddraw->ticks_limiter.use_blt_or_flip = x; + g_ddraw.ticks_limiter.use_blt_or_flip = x; } } /* Hack for Star Trek Armada */ - hwnd = g_ddraw && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + hwnd = g_ddraw.ref && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1168,27 +1168,27 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseDC(hwnd, hdc); } - BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; DDBLTFX fx = { .dwFillColor = 0 }; IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - g_ddraw->ticks_limiter.use_blt_or_flip = x; + g_ddraw.ticks_limiter.use_blt_or_flip = x; } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw->ticks_limiter.tick_length > 0 && !g_ddraw->ticks_limiter.use_blt_or_flip) + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) util_limit_game_ticks(); } } @@ -1315,15 +1315,15 @@ HRESULT dd_CreateSurface( } if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - g_ddraw->primary && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - g_ddraw->primary->bpp == g_ddraw->bpp) + g_ddraw.primary && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + g_ddraw.primary->bpp == g_ddraw.bpp) { - g_ddraw->primary->skip_flip = TRUE; + g_ddraw.primary->skip_flip = TRUE; - *lpDDSurface = g_ddraw->primary; - IDirectDrawSurface_AddRef(g_ddraw->primary); + *lpDDSurface = g_ddraw.primary; + IDirectDrawSurface_AddRef(g_ddraw.primary); return DD_OK; } @@ -1337,7 +1337,7 @@ HRESULT dd_CreateSurface( InitializeCriticalSection(&dst_surface->cs); - dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp; + dst_surface->bpp = g_ddraw.bpp == 0 ? 16 : g_ddraw.bpp; dst_surface->flags = lpDDSurfaceDesc->dwFlags; dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; dst_surface->ddraw = This; @@ -1378,8 +1378,8 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_FRONTBUFFER; } - dst_surface->width = g_ddraw->width; - dst_surface->height = g_ddraw->height; + dst_surface->width = g_ddraw.width; + dst_surface->height = g_ddraw.height; dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } @@ -1462,10 +1462,10 @@ HRESULT dd_CreateSurface( /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) || + (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || (dst_surface->width == 128 && dst_surface->height == 128)) { - dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + dst_surface->hdc = CreateCompatibleDC(g_ddraw.render.hdc); if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); @@ -1524,7 +1524,7 @@ HRESULT dd_CreateSurface( if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { - g_ddraw->primary = dst_surface; + g_ddraw.primary = dst_surface; FakePrimarySurface = dst_surface->surface; } } diff --git a/src/debug.c b/src/debug.c index b63c88e..4e81ab5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -252,12 +252,12 @@ void dbg_draw_frame_info_start() static DWORD tick_fps = 0; static char debug_text[512] = { 0 }; - RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT debugrc = { 0, 0, g_ddraw.width, g_ddraw.height }; - if (g_ddraw->primary) + if (g_ddraw.primary) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP); } diff --git a/src/directinput.c b/src/directinput.c index 38d6eef..6dd5e5e 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -45,14 +45,14 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); - if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { if (g_mouse_locked || g_config.devmode) { while (real_ShowCursor(FALSE) >= 0); } - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, -1); } return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 90c8076..a6014bf 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,8 +14,8 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) - max_fps = g_ddraw->mode.dmDisplayFrequency; + if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) + max_fps = g_ddraw.mode.dmDisplayFrequency; if (max_fps > 1000) max_fps = 0; @@ -88,13 +88,13 @@ BOOL fpsl_wait_for_vblank() { if (g_fpsl.initialized) { - if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc) + if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw.render.hdc) { EnterCriticalSection(&g_fpsl.cs); if (!g_fpsl.got_adapter) { - g_fpsl.adapter.hDc = g_ddraw->render.hdc; + g_fpsl.adapter.hDc = g_ddraw.render.hdc; if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) { @@ -151,7 +151,7 @@ void fpsl_frame_start() void fpsl_frame_end() { if (g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return; @@ -161,7 +161,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; diff --git a/src/mouse.c b/src/mouse.c index 504ee92..c5b25eb 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -13,12 +13,12 @@ HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_config.devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) + if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd) return; - if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) + if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) { - int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); + int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw.show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; real_ShowCursor(FALSE); @@ -31,22 +31,22 @@ void mouse_lock() while (real_ShowCursor(TRUE) < game_count); } - real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0)); + real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw.old_cursor, 0)); RECT rc = { 0 }; - real_GetClientRect(g_ddraw->hwnd, &rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); + real_GetClientRect(g_ddraw.hwnd, &rc); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); real_SetCursorPos( - g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)) : rc.left + cur_x, - g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)) : rc.top + cur_y); + g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x, + g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y); - CopyRect(&rc, &g_ddraw->mouse.rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + CopyRect(&rc, &g_ddraw.mouse.rc); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_ClipCursor(&rc); g_mouse_locked = TRUE; @@ -55,7 +55,7 @@ void mouse_lock() void mouse_unlock() { - if (g_config.devmode || !g_hook_active || !g_ddraw->hwnd) + if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd) return; if (g_mouse_locked) @@ -66,16 +66,16 @@ void mouse_unlock() //ReleaseCapture(); RECT rc = { 0 }; - real_GetClientRect(g_ddraw->hwnd, &rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); + real_GetClientRect(g_ddraw.hwnd, &rc); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); real_SetCursorPos( - (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)), - (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y))); + (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)), + (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y))); real_SetCursor(LoadCursor(NULL, IDC_ARROW)); @@ -85,7 +85,7 @@ void mouse_unlock() LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw) + if (!g_ddraw.ref) return g_mouse_proc(Code, wParam, lParam); if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index faed00a..276a81f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -55,7 +55,7 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) + if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) { return TRUE; } @@ -122,18 +122,18 @@ BOOL d3d9_create() TRACE("+------------------------------------------------\n"); } #endif - g_d3d9.hwnd = g_ddraw->hwnd; + g_d3d9.hwnd = g_ddraw.hwnd; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; - g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; + g_d3d9.params.hDeviceWindow = g_ddraw.hwnd; g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; - g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { @@ -151,7 +151,7 @@ BOOL d3d9_create() g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, - g_ddraw->hwnd, + g_ddraw.hwnd, behavior_flags[i], &g_d3d9.params, &g_d3d9.device))) @@ -176,10 +176,10 @@ BOOL d3d9_on_device_lost() BOOL d3d9_reset(BOOL windowed) { g_d3d9.params.Windowed = windowed || g_config.nonexclusive; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; - g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { @@ -187,9 +187,9 @@ BOOL d3d9_reset(BOOL windowed) if (result) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return result; @@ -264,8 +264,8 @@ static BOOL d3d9_create_resources() BOOL err = FALSE; - int width = g_ddraw->width; - int height = g_ddraw->height; + int width = g_ddraw.width; + int height = g_ddraw.height; g_d3d9.tex_width = width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; @@ -287,11 +287,11 @@ static BOOL d3d9_create_resources() &g_d3d9.vertex_buf, NULL)); - err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0), TRUE); + err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0), TRUE); for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) { - if (g_ddraw->bpp == 16 && g_config.rgb555) + if (g_ddraw.bpp == 16 && g_config.rgb555) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -320,7 +320,7 @@ static BOOL d3d9_create_resources() 0)); } } - else if (g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 32) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -358,7 +358,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, + g_ddraw.bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); @@ -366,7 +366,7 @@ static BOOL d3d9_create_resources() err = err || !g_d3d9.surface_tex[i]; - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -399,7 +399,7 @@ static BOOL d3d9_create_resources() } } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { err = err || FAILED( IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); @@ -434,7 +434,7 @@ static BOOL d3d9_create_resources() } } - return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err; + return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !err; } static BOOL d3d9_set_states() @@ -445,14 +445,14 @@ static BOOL d3d9_set_states() err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = g_config.d3d9_filter && g_d3d9.pixel_shader_upscale && - (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); + (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height); err = err || FAILED( IDirect3DDevice9_SetPixelShader( @@ -471,8 +471,8 @@ static BOOL d3d9_set_states() { if (g_config.d3d9_filter == FILTER_LANCZOS && g_d3d9.pixel_shader_upscale && - (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height) && + (g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height) && SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; @@ -483,8 +483,8 @@ static BOOL d3d9_set_states() SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && g_config.d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && - (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height) && + (g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height) && SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; @@ -495,10 +495,10 @@ static BOOL d3d9_set_states() /* D3DVIEWPORT9 view_data = { - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0.0f, 1.0f }; @@ -509,14 +509,14 @@ static BOOL d3d9_set_states() static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) { - float vp_x = stretch ? (float)g_ddraw->render.viewport.x : 0.0f; - float vp_y = stretch ? (float)g_ddraw->render.viewport.y : 0.0f; + float vp_x = stretch ? (float)g_ddraw.render.viewport.x : 0.0f; + float vp_y = stretch ? (float)g_ddraw.render.viewport.y : 0.0f; - float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width; - float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height; + float vp_w = stretch ? (float)(g_ddraw.render.viewport.width + g_ddraw.render.viewport.x) : (float)g_ddraw.width; + float vp_h = stretch ? (float)(g_ddraw.render.viewport.height + g_ddraw.render.viewport.y) : (float)g_ddraw.height; - float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h; - float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w; + float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw.upscale_hack_height / g_ddraw.height) : g_d3d9.scale_h; + float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw.upscale_hack_width / g_ddraw.width) : g_d3d9.scale_w; CUSTOMVERTEX vertices[] = { @@ -546,10 +546,10 @@ DWORD WINAPI d3d9_render_main(void) BOOL needs_update = FALSE; - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -559,39 +559,39 @@ DWORD WINAPI d3d9_render_main(void) fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (g_config.vhack) { if (util_detect_low_res_screen()) { - if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) d3d9_update_vertices(TRUE, TRUE); } else { - if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) d3d9_update_vertices(FALSE, TRUE); } } D3DLOCKED_RECT lock_rc; - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= D3D9_TEXTURE_COUNT) tex_index = 0; - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) @@ -600,21 +600,21 @@ DWORD WINAPI d3d9_render_main(void) lock_rc.pBits, 0, 0, - g_ddraw->primary->width, - g_ddraw->primary->height, + g_ddraw.primary->width, + g_ddraw.primary->height, lock_rc.Pitch, - g_ddraw->primary->surface, + g_ddraw.primary->surface, 0, 0, - g_ddraw->primary->pitch, - g_ddraw->primary->bpp); + g_ddraw.primary->pitch, + g_ddraw.primary->bpp); IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); } } - if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw.bpp == 8 && + (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= D3D9_TEXTURE_COUNT) pal_index = 0; @@ -624,7 +624,7 @@ DWORD WINAPI d3d9_render_main(void) if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) { - memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0); } @@ -632,13 +632,13 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); - EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); + g_ddraw.child_window_exists = FALSE; + InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); + EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); - if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) + if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) { - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); @@ -654,12 +654,12 @@ DWORD WINAPI d3d9_render_main(void) } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } @@ -668,7 +668,7 @@ DWORD WINAPI d3d9_render_main(void) IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); IDirect3DDevice9_EndScene(g_d3d9.device); - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } @@ -676,9 +676,9 @@ DWORD WINAPI d3d9_render_main(void) if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL))) { DWORD_PTR result; - SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); + SendMessageTimeout(g_ddraw.hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); Sleep(50); } @@ -690,7 +690,7 @@ DWORD WINAPI d3d9_render_main(void) } if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); return 0; } diff --git a/src/render_gdi.c b/src/render_gdi.c index 8576450..78f7d5d 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -16,16 +16,16 @@ DWORD WINAPI gdi_render_main(void) static DWORD warning_end_tick = 0; static char warning_text[512] = { 0 }; - if (g_ddraw->show_driver_warning) + if (g_ddraw.show_driver_warning) { - g_ddraw->show_driver_warning = FALSE; + g_ddraw.show_driver_warning = FALSE; TRACE(" Switched to GDI renderer\n"); warning_end_tick = timeGetTime() + (15 * 1000); if (!g_config.windowed) - PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0); + PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0); _snprintf( warning_text, @@ -38,10 +38,10 @@ DWORD WINAPI gdi_render_main(void) fpsl_init(); - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -49,25 +49,25 @@ DWORD WINAPI gdi_render_main(void) fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (warning_end_tick) { if (timeGetTime() < warning_end_tick) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER); } else @@ -79,88 +79,88 @@ DWORD WINAPI gdi_render_main(void) BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen(); if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack); + InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack); if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); - EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); + g_ddraw.child_window_exists = FALSE; + InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); + EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); } - if (g_ddraw->bpp == 8 && g_ddraw->primary->palette) + if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) { - memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); } - if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE)) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; - FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; + FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; - FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; + FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } else if (upscale_hack) { real_StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.hdc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0, - g_ddraw->height - g_ddraw->upscale_hack_height, - g_ddraw->upscale_hack_width, - g_ddraw->upscale_hack_height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.height - g_ddraw.upscale_hack_height, + g_ddraw.upscale_hack_width, + g_ddraw.upscale_hack_height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS, SRCCOPY); } - else if (!g_ddraw->child_window_exists && - (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) + else if (!g_ddraw.child_window_exists && + (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) { real_StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.hdc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0, 0, - g_ddraw->width, - g_ddraw->height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.width, + g_ddraw.height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS, SRCCOPY); } else { real_SetDIBitsToDevice( - g_ddraw->render.hdc, + g_ddraw.render.hdc, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, 0, 0, 0, - g_ddraw->height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS); } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); #if _DEBUG dbg_draw_frame_info_end(); diff --git a/src/render_ogl.c b/src/render_ogl.c index 6ff9a2c..428453e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -30,7 +30,7 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - g_ogl.context = ogl_create_context(g_ddraw->render.hdc); + g_ogl.context = ogl_create_context(g_ddraw.render.hdc); if (g_ogl.context) { oglu_init(); @@ -42,21 +42,21 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); + g_ogl.context = ogl_create_core_context(g_ddraw.render.hdc); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT) + if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw.render.hdc) && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); ogl_build_programs(); - ogl_create_textures(g_ddraw->width, g_ddraw->height); + ogl_create_textures(g_ddraw.width, g_ddraw.height); ogl_init_main_program(); ogl_init_scale_program(); g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; - g_ogl.use_opengl = (g_ogl.main_program || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !g_ogl.got_error; + g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; ogl_render(); @@ -65,8 +65,8 @@ DWORD WINAPI ogl_render_main(void) if (!g_ogl.use_opengl) { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; gdi_render_main(); } @@ -137,15 +137,15 @@ static void ogl_build_programs() if (g_oglu_got_version3) { - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); } - else if (g_ddraw->bpp == 16 && g_config.rgb555) + else if (g_ddraw.bpp == 16 && g_config.rgb555) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile); } @@ -172,14 +172,14 @@ static void ogl_build_programs() strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || - g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height) + g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height) { g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); if (!g_ogl.scale_program && - (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height)) + (g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height)) { g_ogl.scale_program = oglu_build_program( @@ -209,11 +209,11 @@ static void ogl_build_programs() if (g_oglu_got_version2 && !g_ogl.main_program) { - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE); } @@ -246,7 +246,7 @@ static void ogl_create_textures(int width, int height) while (glGetError() != GL_NO_ERROR); - if (g_ddraw->bpp == 32) + if (g_ddraw.bpp == 32) { glTexImage2D( GL_TEXTURE_2D, @@ -259,7 +259,7 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } - else if (g_ddraw->bpp == 16 && g_config.rgb555) + else if (g_ddraw.bpp == 16 && g_config.rgb555) { if (g_oglu_got_version3) { @@ -288,7 +288,7 @@ static void ogl_create_textures(int width, int height) 0); } } - else if (g_ddraw->bpp == 16) + else if (g_ddraw.bpp == 16) { glTexImage2D( GL_TEXTURE_2D, @@ -316,7 +316,7 @@ static void ogl_create_textures(int width, int height) 0); } } - else if (g_ddraw->bpp == 8) + else if (g_ddraw.bpp == 8) { glTexImage2D( GL_TEXTURE_2D, @@ -360,7 +360,7 @@ static void ogl_create_textures(int width, int height) } } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { glGenTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); @@ -385,7 +385,7 @@ static void ogl_init_main_program() glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1); if (g_oglu_got_version3) @@ -532,12 +532,12 @@ static void ogl_init_scale_program() float input_size[2], output_size[2], texture_size[2]; - input_size[0] = (float)g_ddraw->width; - input_size[1] = (float)g_ddraw->height; + input_size[0] = (float)g_ddraw.width; + input_size[1] = (float)g_ddraw.height; texture_size[0] = (float)g_ogl.surface_tex_width; texture_size[1] = (float)g_ogl.surface_tex_height; - output_size[0] = (float)g_ddraw->render.viewport.width; - output_size[1] = (float)g_ddraw->render.viewport.height; + output_size[0] = (float)g_ddraw.render.viewport.width; + output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize"); if (loc != -1) @@ -648,31 +648,31 @@ static void ogl_render() BOOL needs_update = FALSE; glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); if (g_ogl.main_program) { glUseProgram(g_ogl.main_program); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { glEnable(GL_TEXTURE_2D); } - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ogl.use_opengl && g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ogl.use_opengl && g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); #endif - g_ogl.scale_w = (float)g_ddraw->width / g_ogl.surface_tex_width; - g_ogl.scale_h = (float)g_ddraw->height / g_ogl.surface_tex_height; + g_ogl.scale_w = (float)g_ddraw.width / g_ogl.surface_tex_width; + g_ogl.scale_h = (float)g_ddraw.height / g_ogl.surface_tex_height; static int tex_index = 0, pal_index = 0; @@ -680,36 +680,36 @@ static void ogl_render() fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (g_config.vhack) { if (util_detect_low_res_screen()) { - g_ogl.scale_w *= (float)g_ddraw->upscale_hack_width / g_ddraw->width; - g_ogl.scale_h *= (float)g_ddraw->upscale_hack_height / g_ddraw->height; + g_ogl.scale_w *= (float)g_ddraw.upscale_hack_width / g_ddraw.width; + g_ogl.scale_h *= (float)g_ddraw.upscale_hack_height / g_ddraw.height; - if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) scale_changed = TRUE; } else { - if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) scale_changed = TRUE; } } - if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw.bpp == 8 && + (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= TEXTURE_COUNT) pal_index = 0; @@ -725,19 +725,19 @@ static void ogl_render() 1, GL_RGBA, GL_UNSIGNED_BYTE, - g_ddraw->primary->palette->data_bgr); + g_ddraw.primary->palette->data_bgr); } - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= TEXTURE_COUNT) tex_index = 0; glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - DWORD row_len = g_ddraw->primary->pitch ? g_ddraw->primary->pitch / g_ddraw->primary->bytes_pp : 0; + DWORD row_len = g_ddraw.primary->pitch ? g_ddraw.primary->pitch / g_ddraw.primary->bytes_pp : 0; - if (row_len != g_ddraw->primary->width) + if (row_len != g_ddraw.primary->width) glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len); glTexSubImage2D( @@ -745,13 +745,13 @@ static void ogl_render() 0, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, - g_ddraw->primary->surface); + g_ddraw.primary->surface); - if (row_len != g_ddraw->primary->width) + if (row_len != g_ddraw.primary->width) glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } @@ -769,29 +769,29 @@ static void ogl_render() if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL); - EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); + g_ddraw.child_window_exists = FALSE; + InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); + EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); - if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) + if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) { - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { glClear(GL_COLOR_BUFFER_BIT); if (!needs_update) { - glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); needs_update = TRUE; } } else if (needs_update) { glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); needs_update = FALSE; } @@ -799,12 +799,12 @@ static void ogl_render() } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { glClear(GL_COLOR_BUFFER_BIT); } @@ -848,7 +848,7 @@ static void ogl_render() glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, g_ogl.palette_tex_ids[pal_index]); @@ -861,7 +861,7 @@ static void ogl_render() /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); - glViewport(0, 0, g_ddraw->width, g_ddraw->height); + glViewport(0, 0, g_ddraw.width, g_ddraw.height); glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); @@ -874,17 +874,17 @@ static void ogl_render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0); - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { - glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); } else { glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); } /* apply filter */ @@ -917,10 +917,10 @@ static void ogl_render() glEnd(); } - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) glClear(GL_COLOR_BUFFER_BIT); - SwapBuffers(g_ddraw->render.hdc); + SwapBuffers(g_ddraw.render.hdc); #if _DEBUG dbg_draw_frame_info_end(); @@ -930,7 +930,7 @@ static void ogl_render() } if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } static void ogl_delete_context(HGLRC context) @@ -940,7 +940,7 @@ static void ogl_delete_context(HGLRC context) glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) glDeleteTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); if (glUseProgram) @@ -1004,8 +1004,8 @@ static BOOL ogl_texture_upload_test() 0, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); @@ -1018,7 +1018,7 @@ static BOOL ogl_texture_upload_test() return FALSE; } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { for (i = 0; i < TEXTURE_COUNT; i++) { @@ -1053,7 +1053,7 @@ static BOOL ogl_shader_test() BOOL result = TRUE; - if (g_ddraw->bpp != 8) + if (g_ddraw.bpp != 8) return result; if (g_oglu_got_version3 && g_ogl.main_program) diff --git a/src/screenshot.c b/src/screenshot.c index 88d559c..d76105e 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -134,7 +134,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) char str_time[64]; time_t t = time(NULL); - strncpy(title, g_ddraw->title, sizeof(g_ddraw->title)); + strncpy(title, g_ddraw.title, sizeof(g_ddraw.title)); for (int i = 0; i < strlen(title); i++) { diff --git a/src/utils.c b/src/utils.c index d3b26c9..34ff9a2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -152,25 +152,25 @@ BOOL util_is_avx_supported() void util_limit_game_ticks() { - if (GetCurrentThreadId() != g_ddraw->gui_thread_id) + if (GetCurrentThreadId() != g_ddraw.gui_thread_id) return; - if (g_ddraw->ticks_limiter.htimer) + if (g_ddraw.ticks_limiter.htimer) { FILETIME ft = { 0 }; GetSystemTimeAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw->ticks_limiter.due_time, &ft) == -1) + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw->ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw->ticks_limiter.htimer, g_ddraw->ticks_limiter.tick_length * 2); + WaitForSingleObject(g_ddraw.ticks_limiter.htimer, g_ddraw.ticks_limiter.tick_length * 2); } - g_ddraw->ticks_limiter.due_time.QuadPart += g_ddraw->ticks_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw->ticks_limiter.htimer, &g_ddraw->ticks_limiter.due_time, 0, NULL, NULL, FALSE); + g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw.ticks_limiter.htimer, &g_ddraw.ticks_limiter.due_time, 0, NULL, NULL, FALSE); } else { @@ -182,12 +182,12 @@ void util_limit_game_ticks() return; } - next_game_tick += g_ddraw->ticks_limiter.tick_length; + next_game_tick += g_ddraw.ticks_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw->ticks_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw.ticks_limiter.tick_length) { next_game_tick = tick_count; } @@ -203,7 +203,7 @@ void util_update_bnet_pos(int new_x, int new_y) static int old_x = -32000; static int old_y = -32000; - if (old_x == -32000 || old_y == -32000 || !g_ddraw->bnet_active) + if (old_x == -32000 || old_y == -32000 || !g_ddraw.bnet_active) { old_x = new_x; old_y = new_y; @@ -211,10 +211,10 @@ void util_update_bnet_pos(int new_x, int new_y) } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + real_ClientToScreen(g_ddraw.hwnd, &pt); RECT mainrc; - SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw->width, pt.y + g_ddraw->height); + SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw.width, pt.y + g_ddraw.height); int adj_y = 0; int adj_x = 0; @@ -237,7 +237,7 @@ void util_update_bnet_pos(int new_x, int new_y) 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - if (rc.bottom - rc.top <= g_ddraw->height) + if (rc.bottom - rc.top <= g_ddraw.height) { if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y)) { @@ -249,7 +249,7 @@ void util_update_bnet_pos(int new_x, int new_y) } } - if (rc.right - rc.left <= g_ddraw->width) + if (rc.right - rc.left <= g_ddraw.width) { if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x)) { @@ -340,23 +340,23 @@ void util_toggle_maximize() RECT client_rc; RECT dst_rc; - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); - BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL; + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + BOOL got_menu = GetMenu(g_ddraw.hwnd) != NULL; - if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) + if (real_GetClientRect(g_ddraw.hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) { int width = (dst_rc.right - dst_rc.left); int height = (dst_rc.bottom - dst_rc.top); int x = dst_rc.left; int y = dst_rc.top; - if (client_rc.right != g_ddraw->width || client_rc.bottom != g_ddraw->height) + if (client_rc.right != g_ddraw.width || client_rc.bottom != g_ddraw.height) { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw->width; - dst_rc.bottom = g_ddraw->height; + dst_rc.right = g_ddraw.width; + dst_rc.bottom = g_ddraw.height; AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } @@ -364,15 +364,15 @@ void util_toggle_maximize() { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw->width; - dst_rc.bottom = g_ddraw->height; + dst_rc.right = g_ddraw.width; + dst_rc.bottom = g_ddraw.height; for (int i = 20; i-- > 1;) { - if (width >= g_ddraw->width * i && height - 20 >= g_ddraw->height * i) + if (width >= g_ddraw.width * i && height - 20 >= g_ddraw.height * i) { - dst_rc.right = g_ddraw->width * i; - dst_rc.bottom = g_ddraw->height * i; + dst_rc.right = g_ddraw.width * i; + dst_rc.bottom = g_ddraw.height * i; break; } } @@ -386,7 +386,7 @@ void util_toggle_maximize() int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; - double dst_ar = (double)g_ddraw->height / g_ddraw->width; + double dst_ar = (double)g_ddraw.height / g_ddraw.width; double src_ar = (double)h / w; dst_rc.top = 0; @@ -423,7 +423,7 @@ void util_toggle_maximize() void util_toggle_fullscreen() { - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) return; if (g_config.toggle_borderless && g_config.windowed) @@ -433,7 +433,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = TRUE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); mouse_lock(); } @@ -442,7 +442,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); //mouse_lock(); } @@ -459,7 +459,7 @@ void util_toggle_fullscreen() } g_config.window_state = g_config.windowed = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); mouse_lock(); @@ -475,27 +475,27 @@ void util_toggle_fullscreen() g_config.window_state = g_config.windowed = TRUE; - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { d3d9_reset(g_config.windowed); } else { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_FULLSCREEN); //mouse_lock(); } } @@ -523,15 +523,15 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) { if (g_config.windowed) { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if ((flags & SWP_NOMOVE) == 0) @@ -546,7 +546,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } } @@ -581,7 +581,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { - InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, hwnd); + InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); @@ -603,7 +603,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } else { - g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; + g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT) { @@ -612,7 +612,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) dds_GetDC(this, &src_dc); - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2); BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); @@ -627,7 +627,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) static unsigned char util_get_pixel(int x, int y) { return ((unsigned char*)dds_GetBuffer( - g_ddraw->primary))[y * g_ddraw->primary->pitch + x * g_ddraw->primary->bytes_pp]; + g_ddraw.primary))[y * g_ddraw.primary->pitch + x * g_ddraw.primary->bytes_pp]; } BOOL util_detect_low_res_screen() @@ -636,12 +636,12 @@ BOOL util_detect_low_res_screen() static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; - if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height) + if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { return FALSE; } - if (g_ddraw->isredalert) + if (g_ddraw.isredalert) { if ((*in_movie && !*is_vqa_640) || *should_stretch) { @@ -650,15 +650,15 @@ BOOL util_detect_low_res_screen() return FALSE; } - else if (g_ddraw->iscnc1) + else if (g_ddraw.iscnc1) { return - util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 || - util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0; + util_get_pixel(g_ddraw.upscale_hack_width + 1, 0) == 0 || + util_get_pixel(g_ddraw.upscale_hack_width + 5, 1) == 0; } - else if (g_ddraw->iskkndx) + else if (g_ddraw.iskkndx) { - return util_get_pixel(g_ddraw->width - 3, 3) == 0; + return util_get_pixel(g_ddraw.width - 3, 3) == 0; } return FALSE; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 10c287e..8b6562a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -21,7 +21,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) return real_GetCursorPos(lpPoint); POINT pt, realpt; @@ -32,16 +32,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) realpt.x = pt.x; realpt.y = pt.y; - if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) + if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) { /* fallback solution for possible ClipCursor failure */ int diffx = 0, diffy = 0; - int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; + int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; - pt.x -= g_ddraw->mouse.x_adjust; - pt.y -= g_ddraw->mouse.y_adjust; + pt.x -= g_ddraw.mouse.x_adjust; + pt.y -= g_ddraw.mouse.y_adjust; if (pt.x < 0) { @@ -75,38 +75,38 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (g_config.adjmouse) { - x = min((DWORD)(roundf(pt.x * g_ddraw->mouse.unscale_x)), g_ddraw->width - 1); - y = min((DWORD)(roundf(pt.y * g_ddraw->mouse.unscale_y)), g_ddraw->height - 1); + x = min((DWORD)(roundf(pt.x * g_ddraw.mouse.unscale_x)), g_ddraw.width - 1); + y = min((DWORD)(roundf(pt.y * g_ddraw.mouse.unscale_y)), g_ddraw.height - 1); } else { - x = min(pt.x, g_ddraw->width - 1); - y = min(pt.y, g_ddraw->height - 1); + x = min(pt.x, g_ddraw.width - 1); + y = min(pt.y, g_ddraw.height - 1); } - if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) + if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { diffx = 0; diffy = 0; - if (x > g_ddraw->upscale_hack_width) + if (x > g_ddraw.upscale_hack_width) { - diffx = x - g_ddraw->upscale_hack_width; - x = g_ddraw->upscale_hack_width; + diffx = x - g_ddraw.upscale_hack_width; + x = g_ddraw.upscale_hack_width; } - if (y > g_ddraw->upscale_hack_height) + if (y > g_ddraw.upscale_hack_height) { - diffy = y - g_ddraw->upscale_hack_height; - y = g_ddraw->upscale_hack_height; + diffy = y - g_ddraw.upscale_hack_height; + y = g_ddraw.upscale_hack_height; } if (diffx || diffy) real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); } - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); if (lpPoint) { @@ -116,9 +116,9 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } - else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt)) + else if (lpPoint && g_ddraw.bnet_active && real_ScreenToClient(g_ddraw.hwnd, &pt)) { - if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height) + if (pt.x > 0 && pt.x < g_ddraw.width && pt.y > 0 && pt.y < g_ddraw.height) { lpPoint->x = pt.x; lpPoint->y = pt.y; @@ -129,8 +129,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (lpPoint) { - lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); - lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); } return TRUE; @@ -138,13 +138,13 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (g_ddraw && g_ddraw->hwnd && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { RECT dst_rc = { 0, 0, - g_ddraw->width, - g_ddraw->height + g_ddraw.width, + g_ddraw.height }; if (lpRect) @@ -152,28 +152,28 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) if (g_config.adjmouse) { - dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w)); - dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h)); - dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw->render.scale_h)); - dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w)); + dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw.render.scale_w)); } - int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; + int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; dst_rc.bottom = min(dst_rc.bottom, max_height); dst_rc.right = min(dst_rc.right, max_width); OffsetRect( &dst_rc, - g_ddraw->mouse.x_adjust, - g_ddraw->mouse.y_adjust); + g_ddraw.mouse.x_adjust, + g_ddraw.mouse.y_adjust); - CopyRect(&g_ddraw->mouse.rc, &dst_rc); + CopyRect(&g_ddraw.mouse.rc, &dst_rc); - if (g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) + if (g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) { - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); return real_ClipCursor(&dst_rc); } @@ -184,19 +184,19 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) int WINAPI fake_ShowCursor(BOOL bShow) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { if (g_mouse_locked || g_config.devmode) { int count = real_ShowCursor(bShow); - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, count); return count; } else { return bShow ? - InterlockedIncrement((LONG*)&g_ddraw->show_cursor_count) : - InterlockedDecrement((LONG*)&g_ddraw->show_cursor_count); + InterlockedIncrement((LONG*)&g_ddraw.show_cursor_count) : + InterlockedDecrement((LONG*)&g_ddraw.show_cursor_count); } } @@ -205,9 +205,9 @@ int WINAPI fake_ShowCursor(BOOL bShow) HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); + HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)hCursor); if (!g_mouse_locked && !g_config.devmode) return cursor; @@ -219,15 +219,15 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw && - g_ddraw->hwnd && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + g_ddraw.ref && + g_ddraw.hwnd && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -236,7 +236,7 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (real_GetWindowRect(hWnd, lpRect)) { - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)lpRect, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)lpRect, 2); return TRUE; } @@ -251,13 +251,13 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw && - g_ddraw->hwnd == hWnd && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + g_ddraw.ref && + g_ddraw.hwnd == hWnd && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -268,29 +268,29 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_ClientToScreen(hWnd, lpPoint); - if (g_ddraw->hwnd != hWnd) - return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint); + if (g_ddraw.hwnd != hWnd) + return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw.hwnd, lpPoint); return TRUE; } BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_ScreenToClient(hWnd, lpPoint); - if (g_ddraw->hwnd != hWnd) - return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); + if (g_ddraw.hwnd != hWnd) + return real_ClientToScreen(g_ddraw.hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); return TRUE; } BOOL WINAPI fake_SetCursorPos(int X, int Y) { - if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) return real_SetCursorPos(X, Y); if (!g_mouse_locked && !g_config.devmode) @@ -300,35 +300,35 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y) if (g_config.adjmouse) { - pt.x = (LONG)(roundf(pt.x * g_ddraw->mouse.scale_x)); - pt.y = (LONG)(roundf(pt.y * g_ddraw->mouse.scale_y)); + pt.x = (LONG)(roundf(pt.x * g_ddraw.mouse.scale_x)); + pt.y = (LONG)(roundf(pt.y * g_ddraw.mouse.scale_y)); } - pt.x += g_ddraw->mouse.x_adjust; - pt.y += g_ddraw->mouse.y_adjust; + pt.x += g_ddraw.mouse.x_adjust; + pt.y += g_ddraw.mouse.y_adjust; - return real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); + return real_ClientToScreen(g_ddraw.hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); } HWND WINAPI fake_WindowFromPoint(POINT Point) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_WindowFromPoint(Point); POINT pt = { Point.x, Point.y }; - return real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; + return real_ClientToScreen(g_ddraw.hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; } BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) { - if (!g_ddraw || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.width) return real_GetClipCursor(lpRect); if (lpRect) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -339,21 +339,21 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_GetCursorInfo(pci); - return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos); + return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw.hwnd, &pci->ptScreenPos); } int WINAPI fake_GetSystemMetrics(int nIndex) { - if (g_ddraw && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.width) { if (nIndex == SM_CXSCREEN) - return g_ddraw->width; + return g_ddraw.width; if (nIndex == SM_CYSCREEN) - return g_ddraw->height; + return g_ddraw.height; } return real_GetSystemMetrics(nIndex); @@ -361,19 +361,19 @@ int WINAPI fake_GetSystemMetrics(int nIndex) BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER; if ((uFlags & req_flags) != req_flags) return TRUE; } - else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw->hwnd, &pt)) + if (real_ClientToScreen(g_ddraw.hwnd, &pt)) { X += pt.x; Y += pt.y; @@ -386,27 +386,27 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { - if (g_ddraw->width && g_ddraw->height && (nWidth != g_ddraw->width || nHeight != g_ddraw->height)) + if (g_ddraw.width && g_ddraw.height && (nWidth != g_ddraw.width || nHeight != g_ddraw.height)) { - //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); + //real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); real_SendMessageA( - g_ddraw->hwnd, + g_ddraw.hwnd, WM_SIZE_DDRAW, 0, - MAKELPARAM(min(nWidth, g_ddraw->width), min(nHeight, g_ddraw->height))); + MAKELPARAM(min(nWidth, g_ddraw.width), min(nHeight, g_ddraw.height))); } return TRUE; } - else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw->hwnd, &pt)) + if (real_ClientToScreen(g_ddraw.hwnd, &pt)) { X += pt.x; Y += pt.y; @@ -419,35 +419,35 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); - if (g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE) + if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); if (g_config.adjmouse) { - x = (int)(roundf(x * g_ddraw->mouse.scale_x)); - y = (int)(roundf(y * g_ddraw->mouse.scale_y)); + x = (int)(roundf(x * g_ddraw.mouse.scale_x)); + y = (int)(roundf(y * g_ddraw.mouse.scale_y)); } - lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); + lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); } - if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) + if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; } LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam); - if (result && g_ddraw && Msg == CB_GETDROPPEDCONTROLRECT) + if (result && g_ddraw.ref && Msg == CB_GETDROPPEDCONTROLRECT) { RECT* rc = (RECT*)lParam; if (rc) - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)rc, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)rc, 2); } return result; @@ -455,15 +455,15 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_STYLE) return 0; if (nIndex == GWL_WNDPROC) { - WNDPROC old = g_ddraw->wndproc; - g_ddraw->wndproc = (WNDPROC)dwNewLong; + WNDPROC old = g_ddraw.wndproc; + g_ddraw.wndproc = (WNDPROC)dwNewLong; return (LONG)old; } @@ -474,11 +474,11 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_WNDPROC) { - return (LONG)g_ddraw->wndproc; + return (LONG)g_ddraw.wndproc; } } @@ -487,7 +487,7 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { return FALSE; } @@ -497,30 +497,30 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { if (hWndTo == HWND_DESKTOP) { - if (hWndFrom == g_ddraw->hwnd) + if (hWndFrom == g_ddraw.hwnd) { return 0; } else { //real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); - //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, lpPoints, cPoints); + //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); } } if (hWndFrom == HWND_DESKTOP) { - if (hWndTo == g_ddraw->hwnd) + if (hWndTo == g_ddraw.hwnd) { return 0; } else { - //real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, lpPoints, cPoints); + //real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); //return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } } @@ -531,7 +531,7 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; @@ -548,9 +548,9 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) HWND WINAPI fake_GetTopWindow(HWND hWnd) { - if (g_ddraw && g_config.windowed && g_ddraw->hwnd && !hWnd) + if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd && !hWnd) { - return g_ddraw->hwnd; + return g_ddraw.hwnd; } return real_GetTopWindow(hWnd); @@ -558,9 +558,9 @@ HWND WINAPI fake_GetTopWindow(HWND hWnd) HWND WINAPI fake_GetForegroundWindow() { - if (g_ddraw && g_config.windowed && g_ddraw->hwnd) + if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd) { - return g_ddraw->hwnd; + return g_ddraw.hwnd; } return real_GetForegroundWindow(); @@ -568,7 +568,7 @@ HWND WINAPI fake_GetForegroundWindow() BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) { - if (g_ddraw && g_ddraw->bnet_active) + if (g_ddraw.ref && g_ddraw.bnet_active) { return TRUE; } @@ -596,7 +596,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - if (g_ddraw && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.width) { switch (lpMsg->message) { @@ -609,22 +609,22 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa int x = GET_X_LPARAM(lpMsg->lParam); int y = GET_Y_LPARAM(lpMsg->lParam); - if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width || - x < g_ddraw->render.viewport.x || - y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height || - y < g_ddraw->render.viewport.y) + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) { - x = g_ddraw->width / 2; - y = g_ddraw->height / 2; + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; } else { - x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); - y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); } - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); //return FALSE; @@ -654,12 +654,12 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (lpMsg->message == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; - real_ScreenToClient(g_ddraw->hwnd, &pt); + real_ScreenToClient(g_ddraw.hwnd, &pt); lpMsg->lParam = MAKELPARAM(pt.x, pt.y); } - int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw->mouse.y_adjust, 0); + int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); if (g_config.adjmouse) { @@ -673,16 +673,16 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa } else { - x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); } } - x = min(x, g_ddraw->width - 1); - y = min(y, g_ddraw->height - 1); + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lpMsg->lParam = MAKELPARAM(x, y); fake_GetCursorPos(&lpMsg->pt); @@ -718,7 +718,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w SHORT WINAPI fake_GetKeyState(int nVirtKey) { - if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) + if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) { return 0; } @@ -728,7 +728,7 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) SHORT WINAPI fake_GetAsyncKeyState(int vKey) { - if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) + if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) { return 0; } @@ -738,18 +738,18 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { - if (g_ddraw && - g_ddraw->bpp && + if (g_ddraw.ref && + g_ddraw.bpp && index == BITSPIXEL && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - return g_ddraw->bpp; + return g_ddraw.bpp; } - if (g_ddraw && - g_ddraw->bpp == 8 && + if (g_ddraw.ref && + g_ddraw.bpp == 8 && index == RASTERCAPS && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { return RC_PALETTE | real_GetDeviceCaps(hdc, index); } @@ -774,42 +774,42 @@ BOOL WINAPI fake_StretchBlt( char class_name[MAX_PATH] = { 0 }; - if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) { GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); } - if (g_ddraw && g_ddraw->hwnd && - (hwnd == g_ddraw->hwnd || - (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { BOOL result = real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } } - else if (g_ddraw->width > 0 && g_ddraw->render.hdc) + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(wDest * g_ddraw->render.scale_w), - (int)(hDest * g_ddraw->render.scale_h), + g_ddraw.render.hdc, + xDest + g_ddraw.render.viewport.x, + yDest + g_ddraw.render.viewport.y, + (int)(wDest * g_ddraw.render.scale_w), + (int)(hDest * g_ddraw.render.scale_h), hdcSrc, xSrc, ySrc, @@ -836,12 +836,12 @@ int WINAPI fake_SetDIBitsToDevice( const BITMAPINFO* lpbmi, UINT ColorUse) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { @@ -860,7 +860,7 @@ int WINAPI fake_SetDIBitsToDevice( lpbmi, ColorUse); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } @@ -889,23 +889,23 @@ int WINAPI fake_StretchDIBits( char class_name[MAX_PATH] = { 0 }; - if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) { GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); } - if (g_ddraw && g_ddraw->hwnd && - (hwnd == g_ddraw->hwnd || - (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { @@ -925,20 +925,20 @@ int WINAPI fake_StretchDIBits( iUsage, rop); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } } - else if (g_ddraw->width > 0 && g_ddraw->render.hdc) + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchDIBits( - g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(DestWidth * g_ddraw->render.scale_w), - (int)(DestHeight * g_ddraw->render.scale_h), + g_ddraw.render.hdc, + xDest + g_ddraw.render.viewport.x, + yDest + g_ddraw.render.viewport.y, + (int)(DestWidth * g_ddraw.render.scale_w), + (int)(DestHeight * g_ddraw.render.scale_h), xSrc, ySrc, SrcWidth, @@ -1227,49 +1227,49 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw && hWnd == g_ddraw->hwnd) + if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) { - g_ddraw->hwnd = NULL; - g_ddraw->wndproc = NULL; - g_ddraw->render.hdc = NULL; + g_ddraw.hwnd = NULL; + g_ddraw.wndproc = NULL; + g_ddraw.render.hdc = NULL; } - if (g_ddraw && g_ddraw->hwnd != hWnd && g_ddraw->bnet_active) + if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active) { RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL)) { - g_ddraw->bnet_active = FALSE; - SetFocus(g_ddraw->hwnd); + g_ddraw.bnet_active = FALSE; + SetFocus(g_ddraw.hwnd); mouse_lock(); if (g_config.windowed) { - g_ddraw->bnet_pos.x = g_ddraw->bnet_pos.y = 0; - real_ClientToScreen(g_ddraw->hwnd, &g_ddraw->bnet_pos); + g_ddraw.bnet_pos.x = g_ddraw.bnet_pos.y = 0; + real_ClientToScreen(g_ddraw.hwnd, &g_ddraw.bnet_pos); - if (!g_ddraw->bnet_was_upscaled) + if (!g_ddraw.bnet_was_upscaled) { - int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; - int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; + int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; + int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; - UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; - int dst_width = width == g_ddraw->width ? 0 : width; - int dst_height = height == g_ddraw->height ? 0 : height; + int dst_width = width == g_ddraw.width ? 0 : width; + int dst_height = height == g_ddraw.height ? 0 : height; util_set_window_rect( - g_ddraw->bnet_win_rect.left, - g_ddraw->bnet_win_rect.top, + g_ddraw.bnet_win_rect.left, + g_ddraw.bnet_win_rect.top, dst_width, dst_height, flags); } - g_config.fullscreen = g_ddraw->bnet_was_upscaled; + g_config.fullscreen = g_ddraw.bnet_was_upscaled; - SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); + SetTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); g_config.resizable = TRUE; } @@ -1286,14 +1286,14 @@ HWND WINAPI fake_CreateWindowExA( /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw && g_ddraw->hwnd && g_ddraw->width && + g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + real_ClientToScreen(g_ddraw.hwnd, &pt); - int added_height = g_ddraw->render.height - g_ddraw->height; - int added_width = g_ddraw->render.width - g_ddraw->width; + int added_height = g_ddraw.render.height - g_ddraw.height; + int added_width = g_ddraw.render.width - g_ddraw.width; int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; @@ -1302,52 +1302,52 @@ HWND WINAPI fake_CreateWindowExA( } /* Fix for SMACKW32.DLL creating another window that steals the focus */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) { dwStyle &= ~WS_VISIBLE; } - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw && g_ddraw->hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd) { - if (!g_ddraw->bnet_active) + if (!g_ddraw.bnet_active) { - g_ddraw->bnet_was_upscaled = g_config.fullscreen; + g_ddraw.bnet_was_upscaled = g_config.fullscreen; g_config.fullscreen = FALSE; - if (!g_config.windowed && !g_ddraw->bnet_was_fullscreen) + if (!g_config.windowed && !g_ddraw.bnet_was_fullscreen) { int ws = g_config.window_state; util_toggle_fullscreen(); g_config.window_state = ws; - g_ddraw->bnet_was_fullscreen = TRUE; + g_ddraw.bnet_was_fullscreen = TRUE; } - real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2); + real_GetClientRect(g_ddraw.hwnd, &g_ddraw.bnet_win_rect); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw.bnet_win_rect, 2); - int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; - int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; + int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; + int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; - int x = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.x : -32000; - int y = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.y : -32000; + int x = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.x : -32000; + int y = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.y : -32000; - UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; - int dst_width = g_config.window_rect.right ? g_ddraw->width : 0; - int dst_height = g_config.window_rect.bottom ? g_ddraw->height : 0; + int dst_width = g_config.window_rect.right ? g_ddraw.width : 0; + int dst_height = g_config.window_rect.bottom ? g_ddraw.height : 0; util_set_window_rect(x, y, dst_width, dst_height, flags); g_config.resizable = FALSE; - g_ddraw->bnet_active = TRUE; + g_ddraw.bnet_active = TRUE; mouse_unlock(); } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + real_ClientToScreen(g_ddraw.hwnd, &pt); - int added_height = g_ddraw->height - 480; - int added_width = g_ddraw->width - 640; + int added_height = g_ddraw.height - 480; + int added_width = g_ddraw.width - 640; int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; diff --git a/src/wndproc.c b/src/wndproc.c index 31cbc02..35b8cf2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -54,15 +54,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { MINMAXINFO* mmi = (MINMAXINFO*)lParam; - if (g_config.windowed && g_ddraw->width) + if (g_config.windowed && g_ddraw.width) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; AdjustWindowRectEx( &rc, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), - GetMenu(g_ddraw->hwnd) != NULL, - real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), + GetMenu(g_ddraw.hwnd) != NULL, + real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (mmi->ptMaxTrackSize.x < rc.right - rc.left) mmi->ptMaxTrackSize.x = rc.right - rc.left; @@ -71,13 +71,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mmi->ptMaxTrackSize.y = rc.bottom - rc.top; /* - RECT rcmin = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height }; AdjustWindowRectEx( &rcmin, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), - GetMenu(g_ddraw->hwnd) != NULL, - real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), + GetMenu(g_ddraw.hwnd) != NULL, + real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); mmi->ptMinTrackSize.x = rcmin.right - rcmin.left; mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top; @@ -122,7 +122,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_SETCURSOR: { /* show resize cursor on window borders */ - if ((HWND)wParam == g_ddraw->hwnd) + if ((HWND)wParam == g_ddraw.hwnd) { WORD message = HIWORD(lParam); @@ -176,8 +176,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) && - g_ddraw->renderer == d3d9_render_main && + if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && + g_ddraw.renderer == d3d9_render_main && d3d9_on_device_lost()) { if (!g_config.windowed) @@ -191,24 +191,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { case IDT_TIMER_LEAVE_BNET: { - KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET); + KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET); if (!g_config.windowed) - g_ddraw->bnet_was_fullscreen = FALSE; + g_ddraw.bnet_was_fullscreen = FALSE; - if (!g_ddraw->bnet_active) + if (!g_ddraw.bnet_active) { - if (g_ddraw->bnet_was_fullscreen) + if (g_ddraw.bnet_was_fullscreen) { int ws = g_config.window_state; util_toggle_fullscreen(); g_config.window_state = ws; - g_ddraw->bnet_was_fullscreen = FALSE; + g_ddraw.bnet_was_fullscreen = FALSE; } - else if (g_ddraw->bnet_was_upscaled) + else if (g_ddraw.bnet_was_upscaled) { util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - g_ddraw->bnet_was_upscaled = FALSE; + g_ddraw.bnet_was_upscaled = FALSE; } } @@ -231,9 +231,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.is_wine && !g_config.windowed && (pos->x > 0 || pos->y > 0) && - g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) + g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) { - PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0); + PostMessage(g_ddraw.hwnd, WM_WINEFULLSCREEN, 0, 0); } break; @@ -242,24 +242,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.windowed) { - g_ddraw->last_set_window_pos_tick = timeGetTime(); + g_ddraw.last_set_window_pos_tick = timeGetTime(); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 1, 1, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, SWP_SHOWWINDOW); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, SWP_SHOWWINDOW); } return 0; @@ -278,8 +278,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { in_size_move = FALSE; - if (!g_ddraw->render.thread) - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + if (!g_ddraw.render.thread) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } break; } @@ -291,15 +291,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (in_size_move) { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } RECT clientrc = { 0 }; @@ -314,8 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - double scaleH = (double)g_ddraw->height / g_ddraw->width; - double scaleW = (double)g_ddraw->width / g_ddraw->height; + double scaleH = (double)g_ddraw.height / g_ddraw.width; + double scaleW = (double)g_ddraw.width / g_ddraw.height; switch (wParam) { @@ -351,7 +351,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - if (clientrc.right < g_ddraw->width) + if (clientrc.right < g_ddraw.width) { switch (wParam) { @@ -361,20 +361,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_BOTTOM: case WMSZ_TOP: { - windowrc->right += g_ddraw->width - clientrc.right; + windowrc->right += g_ddraw.width - clientrc.right; break; } case WMSZ_TOPLEFT: case WMSZ_BOTTOMLEFT: case WMSZ_LEFT: { - windowrc->left -= g_ddraw->width - clientrc.right; + windowrc->left -= g_ddraw.width - clientrc.right; break; } } } - if (clientrc.bottom < g_ddraw->height) + if (clientrc.bottom < g_ddraw.height) { switch (wParam) { @@ -384,14 +384,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_RIGHT: case WMSZ_LEFT: { - windowrc->bottom += g_ddraw->height - clientrc.bottom; + windowrc->bottom += g_ddraw.height - clientrc.bottom; break; } case WMSZ_TOPLEFT: case WMSZ_TOPRIGHT: case WMSZ_TOP: { - windowrc->top -= g_ddraw->height - clientrc.bottom; + windowrc->top -= g_ddraw.height - clientrc.bottom; break; } } @@ -423,24 +423,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { - if (in_size_move && !g_ddraw->render.thread) + if (in_size_move && !g_ddraw.render.thread) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } /* - else if (g_ddraw->wine) + else if (g_ddraw.wine) { WindowRect.right = LOWORD(lParam); WindowRect.bottom = HIWORD(lParam); - if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height) - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + if (WindowRect.right != g_ddraw.render.width || WindowRect.bottom != g_ddraw.render.height) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp); } */ } } - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) { redraw_count = 2; RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw->render.thread)) + if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -470,7 +470,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ @@ -479,11 +479,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.is_wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); if (!(style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); + real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); } } break; @@ -492,11 +492,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); if ((style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); + real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); } } @@ -515,7 +515,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam _exit(0); } - if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL) + if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) return 0; if (!GameHandlesClose) @@ -541,7 +541,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { mouse_unlock(); - if (real_GetForegroundWindow() == g_ddraw->hwnd) + if (real_GetForegroundWindow() == g_ddraw.hwnd) mouse_lock(); } } @@ -556,7 +556,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE) { - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } @@ -597,7 +597,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - //if (g_ddraw->windowed || g_ddraw->noactivateapp) + //if (g_ddraw.windowed || g_ddraw.noactivateapp) if (!g_config.allow_wmactivate) return 0; @@ -610,19 +610,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); mouse_lock(); } } - else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd) + else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd) { mouse_lock(); } - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } else { @@ -631,15 +631,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_config.is_wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) + if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } } } @@ -674,8 +674,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; } - if (wParam && g_ddraw->alt_key_down && !g_config.releasealt) - PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0); + if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); return 0; } @@ -684,8 +684,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_AUTORENDERER: { mouse_unlock(); - real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); mouse_lock(); return 0; } @@ -751,7 +751,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == VK_MENU) { - g_ddraw->alt_key_down = TRUE; + g_ddraw.alt_key_down = TRUE; } break; @@ -760,7 +760,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == VK_MENU) { - g_ddraw->alt_key_down = FALSE; + g_ddraw.alt_key_down = FALSE; } if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen)) @@ -792,7 +792,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -804,9 +804,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_KEYUP: { if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) - ss_take_screenshot(g_ddraw->primary); + ss_take_screenshot(g_ddraw.primary); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -825,22 +825,22 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); - if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width || - x < g_ddraw->render.viewport.x || - y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height || - y < g_ddraw->render.viewport.y) + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) { - x = g_ddraw->width / 2; - y = g_ddraw->height / 2; + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; } else { - x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); - y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); } - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); return 0; @@ -869,12 +869,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - real_ScreenToClient(g_ddraw->hwnd, &pt); + real_ScreenToClient(g_ddraw.hwnd, &pt); lParam = MAKELPARAM(pt.x, pt.y); } - int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0); + int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); if (g_config.adjmouse) { @@ -888,20 +888,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); } } - x = min(x, g_ddraw->width - 1); - y = min(y, g_ddraw->height - 1); + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lParam = MAKELPARAM(x, y); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -924,11 +924,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.devmode && !g_mouse_locked) { - int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); - int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); + int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); } @@ -945,19 +945,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); break; } case WM_ERASEBKGND: { - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { - InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } break; } } - return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam); + return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam); } From 18c3b3927c8768dd8730fa0ce80caeb07a3d3e04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 22:57:28 +0100 Subject: [PATCH 0829/1724] rename build.bat --- build.bat => build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename build.bat => build.cmd (66%) diff --git a/build.bat b/build.cmd similarity index 66% rename from build.bat rename to build.cmd index b3508d8..539995e 100644 --- a/build.bat +++ b/build.cmd @@ -1,6 +1,6 @@ @echo off REM -REM cnc-patch environment config +REM patch environment config REM set PATH=C:\w64devkit\bin make clean From ed7296220b9bd75a13b4b90c45445d16fc0d2979 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Mar 2024 01:41:02 +0100 Subject: [PATCH 0830/1724] Disable ALT+ENTER on Infantry Online Zone List Window for now --- src/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 34ff9a2..f62a037 100644 --- a/src/utils.c +++ b/src/utils.c @@ -423,7 +423,8 @@ void util_toggle_maximize() void util_toggle_fullscreen() { - if (g_ddraw.bnet_active) + /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ + if (g_ddraw->bnet_active || (g_config.infantryhack && GetMenu(g_ddraw->hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From 75f5c24305fec233b49f0da87fc1a8db29d48563 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Mar 2024 02:50:55 +0100 Subject: [PATCH 0831/1724] fix for last commit --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f62a037..8793092 100644 --- a/src/utils.c +++ b/src/utils.c @@ -424,7 +424,7 @@ void util_toggle_maximize() void util_toggle_fullscreen() { /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ - if (g_ddraw->bnet_active || (g_config.infantryhack && GetMenu(g_ddraw->hwnd))) + if (g_ddraw.bnet_active || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From b89b184ce08605c8a031cdf67634b27303df5b35 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 17:48:31 +0100 Subject: [PATCH 0832/1724] don't force devmode on for infantry (keep it for zone list only) --- src/config.c | 1 - src/dd.c | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index d405775..cd0ddd1 100644 --- a/src/config.c +++ b/src/config.c @@ -777,7 +777,6 @@ static void cfg_create_ini() "\n" "; Infantry Online\n" "[infantry]\n" - "devmode=true\n" "resolutions=2\n" "infantryhack=true\n" "max_resolutions=90\n" diff --git a/src/dd.c b/src/dd.c index c6cddf1..427e082 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1192,22 +1192,25 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) /* Infantry Online Zone List Window */ if (g_config.infantryhack) { - static BOOL windowed, fullscreen; + static BOOL windowed, fullscreen, devmode; if (dwFlags & DDSCL_FULLSCREEN) { g_config.windowed = windowed; g_config.fullscreen = fullscreen; + g_config.devmode = devmode; } else if (dwFlags & DDSCL_NOWINDOWCHANGES) { windowed = g_config.windowed; fullscreen = g_config.fullscreen; + devmode = g_config.devmode; if (GetMenu(g_ddraw.hwnd) != NULL) { g_config.windowed = TRUE; g_config.fullscreen = FALSE; + g_config.devmode = TRUE; } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); From 078099e3c60ad156522b171c122d3a7a2d8051ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 17:52:08 +0100 Subject: [PATCH 0833/1724] fix current GHA for testing --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 811df5d..cf4fd0e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,9 +6,6 @@ on: - 'master' - 'develop' - 'github-action' - paths: - - '.github/workflows/build.yml' - - 'action.yml' jobs: Build: From e89353256231a401a230906ba562b3c5d94c6248 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 23:11:18 +0100 Subject: [PATCH 0834/1724] fix build on linux --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 276a81f..c1875b4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -10,7 +10,7 @@ #include "wndproc.h" #include "blt.h" #include "debug.h" -#include "D3d9types.h" +#include "d3d9types.h" #include "hook.h" #include "config.h" From 86c86999d0d201a3e115e400c80895c31c48623c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 21:36:25 +0100 Subject: [PATCH 0835/1724] remove Win2000 build since it doesn't actualyl work on windows 2000 --- cnc-ddraw.sln | 3 --- cnc-ddraw.vcxproj | 63 +++-------------------------------------------- src/win2000.asm | 15 ----------- 3 files changed, 3 insertions(+), 78 deletions(-) delete mode 100644 src/win2000.asm diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index ab7f479..1b867f0 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -11,7 +11,6 @@ Global DebugLog|x86 = DebugLog|x86 DebugLogMini|x86 = DebugLogMini|x86 Release|x86 = Release|x86 - ReleaseWin2000|x86 = ReleaseWin2000|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 @@ -22,8 +21,6 @@ Global {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.ActiveCfg = ReleaseWin2000|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.Build.0 = ReleaseWin2000|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 924f32f..8a22c6a 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -13,10 +13,6 @@ Debug Win32 - - ReleaseWin2000 - Win32 - Release Win32 @@ -113,9 +109,7 @@ - - - + cnc_ddraw 7.0 @@ -135,13 +129,6 @@ true MultiByte - - DynamicLibrary - false - v141_xp - true - MultiByte - DynamicLibrary false @@ -157,9 +144,7 @@ MultiByte - - - + @@ -168,9 +153,6 @@ - - - @@ -190,12 +172,6 @@ false ddraw - - $(SolutionDir)bin\ReleaseWin2000\ - $(SolutionDir)bin\ReleaseWin2000\ - false - ddraw - $(SolutionDir)bin\DebugLog\ $(SolutionDir)bin\DebugLog\ @@ -258,37 +234,6 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" - - - Level2 - - - MaxSpeed - true - true - _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - inc;src\detours - NoExtensions - - - Windows - true - true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def - - - -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - /safeseh %(AdditionalOptions) - - Level2 @@ -344,7 +289,5 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - - - + \ No newline at end of file diff --git a/src/win2000.asm b/src/win2000.asm deleted file mode 100644 index 5995502..0000000 --- a/src/win2000.asm +++ /dev/null @@ -1,15 +0,0 @@ -.model flat - -.data -__imp__EncodePointer@4 dd dummy -__imp__DecodePointer@4 dd dummy -EXTERNDEF __imp__EncodePointer@4 : DWORD -EXTERNDEF __imp__DecodePointer@4 : DWORD - -.code -dummy proc -mov eax, [esp+4] -ret 4 -dummy endp - -end From a5ddb67940c468c03a179f9a7d18f8bb64eba544 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:06:51 +0100 Subject: [PATCH 0836/1724] update project configs --- .github/workflows/build.yml | 52 ++++++++++----------- action.yml | 90 ++++++++++++++++++------------------- cnc-ddraw.sln | 15 ++++--- cnc-ddraw.vcxproj | 55 +++++++++++++++++++++-- 4 files changed, 131 insertions(+), 81 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf4fd0e..aef68fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,11 +42,11 @@ jobs: with: release: true - - name: ReleaseWin2000 build - id: build-releasewin2000 + - name: ReleaseXP build + id: build-releasexp uses: ./ with: - releasewin2000: true + releasexp: true - name: Debug build id: build-debug @@ -54,40 +54,40 @@ jobs: with: debug: true - - name: DebugLog build - id: build-debuglog + - name: DebugLogXP build + id: build-debuglogxp uses: ./ with: - debuglog: true + debuglogxp: true - - name: DebugLogMini build - id: build-debuglogmini + - name: DebugLogMiniXP build + id: build-debuglogminixp uses: ./ with: - debuglogmini: true + debuglogminixp: true - name: Prepare artifact run: | : mkdir -p cnc-ddraw-release - mkdir -p cnc-ddraw-releasewin2000 + mkdir -p cnc-ddraw-releasexp mkdir -p cnc-ddraw-debug - mkdir -p cnc-ddraw-debuglog - mkdir -p cnc-ddraw-debuglogmini + mkdir -p cnc-ddraw-debuglogxp + mkdir -p cnc-ddraw-debuglogminixp cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release - cp "${{ steps.build-releasewin2000.outputs.releasewin2000 }}" cnc-ddraw-releasewin2000 + cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug - cp "${{ steps.build-debuglog.outputs.debuglog }}" cnc-ddraw-debuglog - cp "${{ steps.build-debuglog.outputs.debuglog-pdb }}" cnc-ddraw-debuglog + cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogmini.outputs.debuglogmini }}" cnc-ddraw-debuglogmini - cp "${{ steps.build-debuglogmini.outputs.debuglogmini-pdb }}" cnc-ddraw-debuglogmini + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp shell: bash @@ -98,11 +98,11 @@ jobs: path: cnc-ddraw-release retention-days: 14 - - name: Upload artifacts cnc-ddraw-releasewin2000 + - name: Upload artifacts cnc-ddraw-releasexp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-releasewin2000 - path: cnc-ddraw-releasewin2000 + name: cnc-ddraw-releasexp + path: cnc-ddraw-releasexp retention-days: 14 - name: Upload artifacts cnc-ddraw-debug @@ -112,16 +112,16 @@ jobs: path: cnc-ddraw-debug retention-days: 14 - - name: Upload artifacts cnc-ddraw-debuglog + - name: Upload artifacts cnc-ddraw-debuglogxp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-debuglog - path: cnc-ddraw-debuglog + name: cnc-ddraw-debuglogxp + path: cnc-ddraw-debuglogxp retention-days: 14 - - name: Upload artifacts cnc-ddraw-debuglogmini + - name: Upload artifacts cnc-ddraw-debuglogminixp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-debuglogmini - path: cnc-ddraw-debuglogmini + name: cnc-ddraw-debuglogminixp + path: cnc-ddraw-debuglogminixp retention-days: 14 diff --git a/action.yml b/action.yml index 0b1e1cc..8917b6d 100644 --- a/action.yml +++ b/action.yml @@ -24,20 +24,20 @@ inputs: description: 'Set to true to enable building with Release configuration' required: true - releasewin2000: - description: 'Set to true to enable building with ReleaseWin2000 configuration' + releasexp: + description: 'Set to true to enable building with ReleaseXP configuration' required: true debug: description: 'Set to true to enable building with Debug configuration' required: true - debuglog: - description: 'Set to true to enable building with DebugLog configuration' + debuglogxp: + description: 'Set to true to enable building with DebugLogXP configuration' required: true - debuglogmini: - description: 'Set to true to enable building with DebugLogMini configuration' + debuglogminixp: + description: 'Set to true to enable building with DebugLogMiniXP configuration' required: true # Outputs are always using Windows directory separator (`\`) @@ -47,9 +47,9 @@ outputs: description: 'Full path to ddraw.dll built with Release configuration' value: ${{ steps.build-release.outputs.ddraw-dll }} - releasewin2000: - description: 'Full path to ddraw.dll built with ReleaseWin2000 configuration' - value: ${{ steps.build-releasewin2000.outputs.ddraw-dll }} + releasexp: + description: 'Full path to ddraw.dll built with ReleaseXP configuration' + value: ${{ steps.build-releasexp.outputs.ddraw-dll }} debug: description: 'Full path to ddraw.dll built with Debug configuration' @@ -58,19 +58,19 @@ outputs: description: 'Full path to ddraw.pdb built with Debug configuration' value: ${{ steps.build-debug.outputs.ddraw-pdb }} - debuglog: - description: 'Full path to ddraw.dll built with DebugLog configuration' - value: ${{ steps.build-debuglog.outputs.ddraw-dll }} - debuglog-pdb: - description: 'Full path to ddraw.pdb built with DebugLog configuration' - value: ${{ steps.build-debuglog.outputs.ddraw-pdb }} + debuglogxp: + description: 'Full path to ddraw.dll built with DebugLogXP configuration' + value: ${{ steps.build-debuglogxp.outputs.ddraw-dll }} + debuglogxp-pdb: + description: 'Full path to ddraw.pdb built with DebugLogXP configuration' + value: ${{ steps.build-debuglogxp.outputs.ddraw-pdb }} - debuglogmini: - description: 'Full path to ddraw.dll built with DebugLogMini configuration' - value: ${{ steps.build-debuglogmini.outputs.ddraw-dll }} - debuglogmini-pdb: - description: 'Full path to ddraw.pdb built with DebugLogMini configuration' - value: ${{ steps.build-debuglogmini.outputs.ddraw-pdb }} + debuglogminixp: + description: 'Full path to ddraw.dll built with DebugLogMiniXP configuration' + value: ${{ steps.build-debuglogminixp.outputs.ddraw-dll }} + debuglogminixp-pdb: + description: 'Full path to ddraw.pdb built with DebugLogMiniXP configuration' + value: ${{ steps.build-debuglogminixp.outputs.ddraw-pdb }} runs: using: 'composite' @@ -82,8 +82,8 @@ runs: if [[ "${{ runner.os }}" != "Windows" ]]; then echo "[ERROR] This action can only be used on Windows" exit 1 - elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasewin2000 }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglog }}" != "true" ]] && [[ "${{ inputs.debuglogmini }}" != "true" ]]; then - echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasewin2000', 'debug', 'debuglog', 'debuglogmini'" + elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasexp }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglogxp }}" != "true" ]] && [[ "${{ inputs.debuglogminixp }}" != "true" ]]; then + echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasexp', 'debug', 'debuglogxp', 'debuglogminixp'" exit 1 # elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then @@ -115,7 +115,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v143 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT @@ -124,17 +124,17 @@ runs: shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build ReleaseWin2000 - id: build-releasewin2000 + - name: Build ReleaseXP + id: build-releasexp run: | - if [[ "${{ inputs.releasewin2000 }}" == "true" ]]; then - echo ::group::Build ReleaseWin2000 + if [[ "${{ inputs.releasexp }}" == "true" ]]; then + echo ::group::Build ReleaseXP # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseWin2000 -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseWin2000/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT echo "::endgroup::" fi @@ -150,7 +150,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v143 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT @@ -160,38 +160,38 @@ runs: shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLog - id: build-debuglog + - name: Build DebugLogXP + id: build-debuglogxp run: | : - if [[ "${{ inputs.debuglog }}" == "true" ]]; then - echo "::group::Build DebugLog" + if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then + echo "::group::Build DebugLogXP" # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLog -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogXP -p:Platform=x86 -p:PlatformToolset=v141_xp # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.pdb")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLogMini - id: build-debuglogmini + - name: Build DebugLogMiniXP + id: build-debuglogminixp run: | : - if [[ "${{ inputs.debuglogmini }}" == "true" ]]; then - echo "::group::Build DebugLogMini" + if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then + echo "::group::Build DebugLogMiniXP" # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMini -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMiniXP -p:Platform=x86 -p:PlatformToolset=v141_xp # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.pdb")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index 1b867f0..c579c3b 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -8,19 +8,22 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 - DebugLog|x86 = DebugLog|x86 - DebugLogMini|x86 = DebugLogMini|x86 + DebugLogMiniXP|x86 = DebugLogMiniXP|x86 + DebugLogXP|x86 = DebugLogXP|x86 Release|x86 = Release|x86 + ReleaseXP|x86 = ReleaseXP|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.ActiveCfg = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.ActiveCfg = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLog|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.Build.0 = ReleaseXP|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 8a22c6a..62cd509 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -13,6 +13,10 @@ Debug Win32 + + ReleaseXP + Win32 + Release Win32 @@ -112,17 +116,24 @@ cnc_ddraw - 7.0 + 10.0 {96094551-5D52-4EBD-BE4C-5291A03507FC} DynamicLibrary true - v141_xp + v143 MultiByte + DynamicLibrary + false + v143 + true + MultiByte + + DynamicLibrary false v141_xp @@ -153,6 +164,9 @@ + + + @@ -172,6 +186,12 @@ false ddraw + + $(SolutionDir)bin\ReleaseXP\ + $(SolutionDir)bin\ReleaseXP\ + false + ddraw + $(SolutionDir)bin\DebugLog\ $(SolutionDir)bin\DebugLog\ @@ -201,7 +221,7 @@ -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) @@ -228,7 +248,34 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) + + + + + + Level2 + + + MaxSpeed + true + true + _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + inc;src\detours + + + Windows + true + true + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + ddraw.def + + + +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) From 979b35bcb7fae2af14f0d184d0902b7427aea93a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:16:23 +0100 Subject: [PATCH 0837/1724] use older toolset for GHA --- action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/action.yml b/action.yml index 8917b6d..6ba68af 100644 --- a/action.yml +++ b/action.yml @@ -115,7 +115,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v143 + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT @@ -150,7 +150,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v143 + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v142 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT From 94d5072988f94210066ced3efeae4853301de193 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:20:25 +0100 Subject: [PATCH 0838/1724] fix dirs --- cnc-ddraw.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 62cd509..d942c22 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -193,14 +193,14 @@ ddraw - $(SolutionDir)bin\DebugLog\ - $(SolutionDir)bin\DebugLog\ + $(SolutionDir)bin\DebugLogXP\ + $(SolutionDir)bin\DebugLogXP\ false ddraw - $(SolutionDir)bin\DebugLogMini\ - $(SolutionDir)bin\DebugLogMini\ + $(SolutionDir)bin\DebugLogMiniXP\ + $(SolutionDir)bin\DebugLogMiniXP\ false ddraw From 12838e5426932f4d183d661adbc47a3e8cd0b537 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:22:56 +0100 Subject: [PATCH 0839/1724] update debug build config --- cnc-ddraw.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index d942c22..f74a7b3 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -210,7 +210,7 @@ Level2 Disabled - _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_DEBUG_X;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) MultiThreadedDebug inc;src\detours From 1ef99b12955a93a86820187bc99dd5f747671ac0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:31:35 +0100 Subject: [PATCH 0840/1724] only build DebugLogXP and ReleaseXP --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 6ba68af..2a9cde0 100644 --- a/action.yml +++ b/action.yml @@ -22,7 +22,7 @@ inputs: release: description: 'Set to true to enable building with Release configuration' - required: true + required: false releasexp: description: 'Set to true to enable building with ReleaseXP configuration' @@ -30,7 +30,7 @@ inputs: debug: description: 'Set to true to enable building with Debug configuration' - required: true + required: false debuglogxp: description: 'Set to true to enable building with DebugLogXP configuration' @@ -38,7 +38,7 @@ inputs: debuglogminixp: description: 'Set to true to enable building with DebugLogMiniXP configuration' - required: true + required: false # Outputs are always using Windows directory separator (`\`) outputs: From 6c5bac90580a3a76da89dfa364eea525c8fa77d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:36:44 +0100 Subject: [PATCH 0841/1724] Revert "only build DebugLogXP and ReleaseXP" This reverts commit 1ef99b12955a93a86820187bc99dd5f747671ac0. --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 2a9cde0..6ba68af 100644 --- a/action.yml +++ b/action.yml @@ -22,7 +22,7 @@ inputs: release: description: 'Set to true to enable building with Release configuration' - required: false + required: true releasexp: description: 'Set to true to enable building with ReleaseXP configuration' @@ -30,7 +30,7 @@ inputs: debug: description: 'Set to true to enable building with Debug configuration' - required: false + required: true debuglogxp: description: 'Set to true to enable building with DebugLogXP configuration' @@ -38,7 +38,7 @@ inputs: debuglogminixp: description: 'Set to true to enable building with DebugLogMiniXP configuration' - required: false + required: true # Outputs are always using Windows directory separator (`\`) outputs: From 4dc8eb5f56131926f79ad3bc55ba87cb3f093e76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Mar 2024 00:25:31 +0100 Subject: [PATCH 0842/1724] fix build on macos --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 36ab707..073ff53 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ CC = i686-w64-mingw32-gcc CXX = i686-w64-mingw32-g++ +STRIP ?= i686-w64-mingw32-strip WINDRES ?= i686-w64-mingw32-windres LDFLAGS = -Wl,--enable-stdcall-fixup -s -static CFLAGS = -Iinc -O2 -march=i486 -Wall From 51d9ef58d9582581ce466090b426990f67efc9d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Apr 2024 00:37:24 +0200 Subject: [PATCH 0843/1724] always use full path to avoid issues with working directories in wine --- config/ConfigFormUnit.cpp | 26 ++++++++++++++------------ config/cnc-ddraw config.cpp | 6 +++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 6a00eb9..790336a 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -23,6 +23,8 @@ int Savesettings; int Resolutions; int Minfps; +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + //--------------------------------------------------------------------------- __fastcall TConfigForm::TConfigForm(TComponent* Owner) : TForm(Owner) @@ -40,7 +42,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -57,7 +59,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -86,7 +88,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - auto *ini = new TIniFile(".\\Warcraft II BNE.ini"); + auto *ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); ini->WriteString("Game", "Resolution", "4"); ini->WriteString("Game", "Width", "0"); @@ -94,7 +96,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) delete ini; - DeleteFile(".\\ddraw.ini"); + DeleteFile(GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -685,11 +687,11 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); - HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + HMODULE ddraw = LoadLibraryW((GAME_PATH + "ddraw.dll").w_str()); if (ddraw) { @@ -709,8 +711,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(".\\ddraw.ini"); - auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -913,8 +915,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); RestoreDefaultsBtn->Visible = - FileExists(".\\ddraw.dll") && - FileExists(".\\ddraw.ini") && + FileExists(GAME_PATH + "ddraw.dll") && + FileExists(GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -928,8 +930,8 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(".\\ddraw.ini"); - auto *hd_ini = new TIniFile(".\\Warcraft II BNE.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 7cb64d5..0760b13 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -3,6 +3,7 @@ #include #pragma hdrstop #include +#include #include #include //--------------------------------------------------------------------------- @@ -10,6 +11,9 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- + +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try @@ -31,7 +35,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( From 3089c8872dfbdd501c5b71e6ebb3e34b469721e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Apr 2024 04:10:33 +0200 Subject: [PATCH 0844/1724] fix some warnings --- src/opengl_utils.c | 4 ++-- src/render_ogl.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 2f14a5e..e9497f3 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -196,8 +196,8 @@ void oglu_init() if (glversion) { strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); - const char deli[2] = " "; - strtok(g_oglu_version, deli); + g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */ + strtok(g_oglu_version, " "); } else { diff --git a/src/render_ogl.c b/src/render_ogl.c index 428453e..f208ab6 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -157,6 +157,7 @@ static void ogl_build_programs() char shader_path[MAX_PATH] = { 0 }; strncpy(shader_path, g_config.shader, sizeof(shader_path)); + shader_path[sizeof(shader_path) - 1] = '\0'; /* strncpy fix */ if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { @@ -530,7 +531,7 @@ static void ogl_init_scale_program() glBindVertexArray(0); - float input_size[2], output_size[2], texture_size[2]; + float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; input_size[0] = (float)g_ddraw.width; input_size[1] = (float)g_ddraw.height; From 3a52a07ba6e105620eda4fbc8ce809dcfd2ccb82 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Apr 2024 01:25:00 +0200 Subject: [PATCH 0845/1724] add (commented out) code to adjust the zone list size on first start --- src/dd.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/dd.c b/src/dd.c index 427e082..e72bbfd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1211,6 +1211,27 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_config.windowed = TRUE; g_config.fullscreen = FALSE; g_config.devmode = TRUE; + + /* + if (!g_config.window_rect.right) + { + if (real_GetSystemMetrics(SM_CYSCREEN) >= 2160) + { + g_config.window_rect.right = 640 * 3; + g_config.window_rect.bottom = 480 * 3; + } + else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1440) + { + g_config.window_rect.right = 640 * 2; + g_config.window_rect.bottom = 480 * 2; + } + else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1080) + { + g_config.window_rect.right = (LONG)(640 * 1.5f); + g_config.window_rect.bottom = (LONG)(480 * 1.5f); + } + } + */ } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); From 9d4f3b148ba9edf276e8d14eec089d157c3a686f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Apr 2024 01:37:44 +0200 Subject: [PATCH 0846/1724] add position check to make sure we'll only resize on first start --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index e72bbfd..b75edff 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1213,7 +1213,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_config.devmode = TRUE; /* - if (!g_config.window_rect.right) + if (!g_config.window_rect.right && g_config.window_rect.left == -32000) { if (real_GetSystemMetrics(SM_CYSCREEN) >= 2160) { From 6dc8390fede9af0c4df5cb409e3c7029b0b91cfb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 02:48:15 +0200 Subject: [PATCH 0847/1724] #304 - Limit window size to max surface size (Dune2000 1.02) --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8b6562a..e21815b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1357,6 +1357,13 @@ HWND WINAPI fake_CreateWindowExA( dwStyle |= WS_CLIPCHILDREN; } + /* Limit window size to max surface size (Dune2000 1.02) */ + if (dwStyle & WS_POPUP) + { + nWidth = min((DWORD)nWidth, (DWORD)16384); + nHeight = min((DWORD)nHeight, (DWORD)16384); + } + return real_CreateWindowExA( dwExStyle, lpClassName, From 36bf42af6f12f559cf97767f30364c970423f5b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 02:54:40 +0200 Subject: [PATCH 0848/1724] allow negative values for window width/height --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e21815b..3388b47 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,8 +1360,8 @@ HWND WINAPI fake_CreateWindowExA( /* Limit window size to max surface size (Dune2000 1.02) */ if (dwStyle & WS_POPUP) { - nWidth = min((DWORD)nWidth, (DWORD)16384); - nHeight = min((DWORD)nHeight, (DWORD)16384); + nWidth = min(nWidth, 16384); + nHeight = min(nHeight, 16384); } return real_CreateWindowExA( From 18c15280ba04beb120cb2c18f0c57386e8a1fb55 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 03:11:33 +0200 Subject: [PATCH 0849/1724] #304 add a check for CW_USEDEFAULT just to be sure --- src/winapi_hooks.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3388b47..9431121 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,8 +1360,15 @@ HWND WINAPI fake_CreateWindowExA( /* Limit window size to max surface size (Dune2000 1.02) */ if (dwStyle & WS_POPUP) { - nWidth = min(nWidth, 16384); - nHeight = min(nHeight, 16384); + if (nWidth != CW_USEDEFAULT) + { + nWidth = min(nWidth, 16384); + } + + if (nHeight != CW_USEDEFAULT) + { + nHeight = min(nHeight, 16384); + } } return real_CreateWindowExA( From 547fda273a69f759d90335de62cbc4492130441e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Apr 2024 01:35:22 +0200 Subject: [PATCH 0850/1724] use default toolset so you don't require a specific VS version --- cnc-ddraw.vcxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index f74a7b3..b1c9390 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -116,20 +116,20 @@ cnc_ddraw - 10.0 + $(WindowsTargetPlatformVersion_10) {96094551-5D52-4EBD-BE4C-5291A03507FC} DynamicLibrary true - v143 + $(DefaultPlatformToolset) MultiByte DynamicLibrary false - v143 + $(DefaultPlatformToolset) true MultiByte From f735ef839c4cecdb89e43ec3c6c73bb58ddb442e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 00:34:46 +0200 Subject: [PATCH 0851/1724] #305 add support for window menu in borderless mode --- src/dd.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index b75edff..225a781 100644 --- a/src/dd.c +++ b/src/dd.c @@ -632,6 +632,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { border = FALSE; + if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + { + g_ddraw.render.height -= real_GetSystemMetrics(SM_CYMENU); + } + /* prevent OpenGL from going automatically into fullscreen exclusive mode */ if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; @@ -882,10 +887,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl GWL_STYLE, real_GetWindowLongA( g_ddraw.hwnd, - GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - - if (GetMenu(g_ddraw.hwnd)) - SetMenu(g_ddraw.hwnd, NULL); + GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } else { @@ -919,6 +921,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.fullscreen) { x = y = 0; + + if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + { + y = real_GetSystemMetrics(SM_CYMENU); + } } else if (border && g_config.window_rect.top == -32000 && y < 0) { From ec648669ef2de6324c50ea3e27a6a3fd13694e06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 04:41:04 +0200 Subject: [PATCH 0852/1724] add partial support for menus in fullscreen via nonexclusive=true --- src/dd.c | 19 +++++++++++++++---- src/wndproc.c | 6 ++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 225a781..6398cc7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -922,7 +922,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { x = y = 0; - if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + if (GetMenu(g_ddraw.hwnd)) { y = real_GetSystemMetrics(SM_CYMENU); } @@ -972,8 +972,19 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + int menu_height = 0; + if (GetMenu(g_ddraw.hwnd)) - SetMenu(g_ddraw.hwnd, NULL); + { + if (g_config.remove_menu || !g_config.nonexclusive) + { + SetMenu(g_ddraw.hwnd, NULL); + } + else + { + menu_height = real_GetSystemMetrics(SM_CYMENU); + } + } LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -1011,7 +1022,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, swp_flags); swp_flags = SWP_SHOWWINDOW; @@ -1071,7 +1082,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, swp_flags); if (d3d9_active && g_config.nonexclusive) diff --git a/src/wndproc.c b/src/wndproc.c index 35b8cf2..8ea8ba5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -244,13 +244,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { g_ddraw.last_set_window_pos_tick = timeGetTime(); + int menu_height = GetMenu(g_ddraw.hwnd) ? real_GetSystemMetrics(SM_CYMENU) : 0; + real_SetWindowPos( g_ddraw.hwnd, HWND_TOPMOST, 1, 1, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, SWP_SHOWWINDOW); real_SetWindowPos( @@ -259,7 +261,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, SWP_SHOWWINDOW); } return 0; From b638b90e69d8674b26bf3b56ceb4e4bd7e2b40d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 06:59:05 +0200 Subject: [PATCH 0853/1724] only build ReleaseXP and DeubgLogXP for now to speed things up a bit --- .github/workflows/build.yml | 40 +++++++++++++++++++++++++------------ action.yml | 11 +++++++--- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aef68fe..f553ba7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,24 +70,38 @@ jobs: run: | : - mkdir -p cnc-ddraw-release - mkdir -p cnc-ddraw-releasexp - mkdir -p cnc-ddraw-debug - mkdir -p cnc-ddraw-debuglogxp - mkdir -p cnc-ddraw-debuglogminixp + if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then + mkdir -p cnc-ddraw-release + + cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + fi - cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + if [[ -f "${{ steps.build-releasexp.outputs.releasexp }}" ]]; then + mkdir -p cnc-ddraw-releasexp + + cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + fi - cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then + mkdir -p cnc-ddraw-debug + + cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug + cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + fi - cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug - cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + if [[ -f "${{ steps.build-debuglogxp.outputs.debuglogxp }}" ]]; then + mkdir -p cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + fi - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp + if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then + mkdir -p cnc-ddraw-debuglogminixp + + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp + fi shell: bash diff --git a/action.yml b/action.yml index 6ba68af..86b657c 100644 --- a/action.yml +++ b/action.yml @@ -110,7 +110,8 @@ runs: - name: Build Release id: build-release run: | - if [[ "${{ inputs.release }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.release }}" == "true" ]]; then echo ::group::Build Release # @@ -127,6 +128,7 @@ runs: - name: Build ReleaseXP id: build-releasexp run: | + #if false; then if [[ "${{ inputs.releasexp }}" == "true" ]]; then echo ::group::Build ReleaseXP @@ -145,7 +147,8 @@ runs: id: build-debug run: | : - if [[ "${{ inputs.debug }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.debug }}" == "true" ]]; then echo "::group::Build Debug" # @@ -164,6 +167,7 @@ runs: id: build-debuglogxp run: | : + #if false; then if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then echo "::group::Build DebugLogXP" @@ -183,7 +187,8 @@ runs: id: build-debuglogminixp run: | : - if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then echo "::group::Build DebugLogMiniXP" # From aba07e00b4cc611615485f24899ea4b5c2841be2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 09:09:29 +0200 Subject: [PATCH 0854/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 9dc51c9..211d331 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ed5176942ffcc74a25b7219340cbd35320795f73 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 25 Apr 2024 00:57:54 +0200 Subject: [PATCH 0855/1724] simplify makefile --- Makefile | 53 +++++++++------------------------------- cnc-ddraw.vcxproj | 12 ++++----- ddraw.def => exports.def | 0 ddraw.rc => res.rc | 0 4 files changed, 17 insertions(+), 48 deletions(-) rename ddraw.def => exports.def (100%) rename ddraw.rc => res.rc (100%) diff --git a/Makefile b/Makefile index 073ff53..98d7592 100644 --- a/Makefile +++ b/Makefile @@ -1,50 +1,19 @@ -include config.mk -CC = i686-w64-mingw32-gcc -CXX = i686-w64-mingw32-g++ -STRIP ?= i686-w64-mingw32-strip -WINDRES ?= i686-w64-mingw32-windres -LDFLAGS = -Wl,--enable-stdcall-fixup -s -static +TARGET = ddraw.dll +LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 -FILES = src/IDirect3D/IDirect3D.c \ - src/IDirect3D/IDirect3D2.c \ - src/IDirect3D/IDirect3D3.c \ - src/IDirect3D/IDirect3D7.c \ - src/IDirectDraw/IDirectDraw.c \ - src/IDirectDraw/IDirectDrawPalette.c \ - src/IDirectDraw/IDirectDrawClipper.c \ - src/IDirectDraw/IDirectDrawSurface.c \ - src/IDirectDraw/IDirectDrawGammaControl.c \ - src/IAMMediaStream/IAMMediaStream.c \ - src/crc32.c \ - src/ini.c \ - src/blt.c \ - src/dd.c \ - src/ddpalette.c \ - src/ddsurface.c \ - src/ddclipper.c \ - src/render_ogl.c \ - src/render_gdi.c \ - src/render_d3d9.c \ - src/debug.c \ - src/mouse.c \ - src/winapi_hooks.c \ - src/screenshot.c \ - src/config.c \ - src/lodepng.c \ - src/directinput.c \ - src/hook.c \ - src/dllmain.c \ - src/wndproc.c \ - src/utils.c \ - src/fps_limiter.c \ - src/opengl_utils.c +CC = i686-w64-mingw32-gcc +WINDRES ?= i686-w64-mingw32-windres -all: - $(WINDRES) -J rc ddraw.rc ddraw.rc.o - $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) +.PHONY: clean all +all: $(TARGET) + +$(TARGET): $(wildcard src/*.c) $(wildcard src/*/*.c) + $(WINDRES) -J rc res.rc res.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ exports.def res.o $(LIBS) clean: - $(RM) ddraw.dll ddraw.rc.o + $(RM) $(TARGET) res.o diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index b1c9390..1a81dbb 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -111,7 +111,7 @@ - + @@ -217,7 +217,7 @@ Windows dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def + exports.def @@ -244,7 +244,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe true true winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def + exports.def @@ -271,7 +271,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe true true winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def + exports.def @@ -298,7 +298,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe true true dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def + exports.def @@ -325,7 +325,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe true true dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ddraw.def + exports.def diff --git a/ddraw.def b/exports.def similarity index 100% rename from ddraw.def rename to exports.def diff --git a/ddraw.rc b/res.rc similarity index 100% rename from ddraw.rc rename to res.rc From a2ef373871c5cac3110fd5ab45ccb962d4197571 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 00:26:36 +0200 Subject: [PATCH 0856/1724] #306 partial support for road rash upscaling --- src/config.c | 1 - src/utils.c | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/config.c b/src/config.c index cd0ddd1..f24ba3c 100644 --- a/src/config.c +++ b/src/config.c @@ -908,7 +908,6 @@ static void cfg_create_ini() "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" - "fixchilds=1\n" "\n" "; Sim Copter\n" "[SimCopter]\n" diff --git a/src/utils.c b/src/utils.c index 8793092..8fbe733 100644 --- a/src/utils.c +++ b/src/utils.c @@ -562,34 +562,35 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { /* TRACE( - " util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n", - size.right, + " util_enum_child_proc width=%u, Height=%u, left=%d, top=%d\n", + size.right, size.bottom, pos.left, pos.top); - */ + */ char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //TRACE(" AVIWINDOW class=%s\n", class_name); + //LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + //TRACE(" AVIWINDOW class=%s, style=%p, exstyle=%p\n", class_name, style, exstyle); + + if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); - } + } - LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - - if (!(style & WS_EX_TRANSPARENT)) + if (!(exstyle & WS_EX_TRANSPARENT)) { - real_SetWindowLongA(hwnd, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); real_SetWindowPos( hwnd, @@ -602,7 +603,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ); } } - else + else if (!(exstyle & WS_EX_TRANSPARENT)) { g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; From 6ddc2ad00b6a5db52c46a184fde76acaa93433ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:13:50 +0200 Subject: [PATCH 0857/1724] #306 support cutscene upscaling for road rash --- src/utils.c | 3 ++- src/winapi_hooks.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 8fbe733..347a143 100644 --- a/src/utils.c +++ b/src/utils.c @@ -581,7 +581,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0) + strcmp(class_name, "MCIWndClass") == 0 || + strcmp(class_name, "AVI Window") == 0) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9431121..12ce224 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -783,6 +783,7 @@ BOOL WINAPI fake_StretchBlt( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) @@ -1301,6 +1302,16 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Road Rash movies */ + if (HIWORD(lpClassName) && + _strcmpi(lpClassName, "AVI Window") == 0 && + g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && + (dwStyle & WS_POPUP)) + { + dwStyle = WS_CHILD; + hWndParent = g_ddraw.hwnd; + } + /* Fix for SMACKW32.DLL creating another window that steals the focus */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) { From 36ae25ea89b235adcf979b1cf89d585dd5fa516e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:23:28 +0200 Subject: [PATCH 0858/1724] #306 adjust road rash preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index f24ba3c..0844b24 100644 --- a/src/config.c +++ b/src/config.c @@ -908,6 +908,7 @@ static void cfg_create_ini() "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" + "nonexclusive=true\n" "\n" "; Sim Copter\n" "[SimCopter]\n" From b34ec49a13f83c8526831bb02757e209ddd11fe2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:27:34 +0200 Subject: [PATCH 0859/1724] handle "AVI Window" in StretchDIBits as well --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 12ce224..28e29c3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -899,6 +899,7 @@ int WINAPI fake_StretchDIBits( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) From 4b7fe8531e17a7f7774befa57fb6f2bab2913aaf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:41:38 +0200 Subject: [PATCH 0860/1724] fix mingw debug build --- Makefile | 4 ++++ build.cmd | 1 + src/hook.c | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 98d7592..00da29b 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,10 @@ LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres +ifdef DEBUG + CFLAGS += -D _DEBUG -D _DEBUG_X +endif + .PHONY: clean all all: $(TARGET) diff --git a/build.cmd b/build.cmd index 539995e..c9d3564 100644 --- a/build.cmd +++ b/build.cmd @@ -5,4 +5,5 @@ REM set PATH=C:\w64devkit\bin make clean make +REM make DEBUG=1 pause diff --git a/src/hook.c b/src/hook.c index d8f72a7..3a1b7cd 100644 --- a/src/hook.c +++ b/src/hook.c @@ -646,12 +646,13 @@ void hook_exit() hook_revert((HOOKLIST*)&g_hook_hooklist); -#if defined(_DEBUG) && defined(_MSC_VER) +#if defined(_DEBUG) +#if defined(_MSC_VER) DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); - +#endif real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #endif From b0fb8d0be75680f57acfef3990c75243692f1eaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 02:02:06 +0200 Subject: [PATCH 0861/1724] hook SetUnhandledExceptionFilter for mingw debug build --- src/hook.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hook.c b/src/hook.c index 3a1b7cd..653e891 100644 --- a/src/hook.c +++ b/src/hook.c @@ -146,6 +146,9 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, +#if defined(_DEBUG) && defined(__GNUC__) + { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, +#endif { "", NULL, NULL, 0 } } }, From 13d7a3747b2bdb0def49e4e4ba87332790e60abf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:52:51 +0200 Subject: [PATCH 0862/1724] fix default WindowsTargetPlatformVersion --- cnc-ddraw.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 1a81dbb..40036f3 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -116,7 +116,7 @@ cnc_ddraw - $(WindowsTargetPlatformVersion_10) + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) {96094551-5D52-4EBD-BE4C-5291A03507FC} From c61389d105bc5e5083df241928cfc4f79cc72064 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:53:29 +0200 Subject: [PATCH 0863/1724] remove unnecessary clears on flip --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d7176c2..ba7a5f1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -762,7 +762,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa InterlockedExchangePointer((void*)&backbuffer->hdc, dc); InterlockedExchangePointer(&backbuffer->mapping, map); - if (g_config.flipclear) + if (g_config.flipclear && (This->caps & DDSCAPS_PRIMARYSURFACE)) { blt_clear(buf, 0, backbuffer->size); } From 18eddc7f7f0af5f0f3fbbb52d3534716e38acfad Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:54:00 +0200 Subject: [PATCH 0864/1724] adjust preset to fix graphical glitches with worms 2 high resolution patch --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 0844b24..da84184 100644 --- a/src/config.c +++ b/src/config.c @@ -1049,6 +1049,7 @@ static void cfg_create_ini() "\n" "; Worms 2\n" "[worms2]\n" + "flipclear=true\n" "game_handles_close=true\n" "\n" "; Worms Armageddon\n" From 57be0f022ec73855befd8d4688a002ed29e9defc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 3 May 2024 07:40:04 +0200 Subject: [PATCH 0865/1724] tweak makefile for faster debugging --- Makefile | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 00da29b..3daa0b7 100644 --- a/Makefile +++ b/Makefile @@ -12,12 +12,17 @@ ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif +SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) +OBJS := $(SRCS:c=o) res.o + .PHONY: clean all all: $(TARGET) -$(TARGET): $(wildcard src/*.c) $(wildcard src/*/*.c) - $(WINDRES) -J rc res.rc res.o - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ exports.def res.o $(LIBS) +%.o: %.rc + $(WINDRES) -J rc $< $@ + +$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) clean: - $(RM) $(TARGET) res.o + $(RM) $(TARGET) $(OBJS) From a6e7b5f235fee1d3cf6c5fc023e11ef2ab5a5be4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 01:45:41 +0200 Subject: [PATCH 0866/1724] Fix alt+tab issues on windows 7 (opengl + aero) --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 8ea8ba5..a551991 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -614,8 +614,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); mouse_lock(); } } From 8d97550c2b97a98a883f66c9c37646058546dc9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 06:34:37 +0200 Subject: [PATCH 0867/1724] Revert "Fix alt+tab issues on windows 7 (opengl + aero)" This reverts commit a6e7b5f235fee1d3cf6c5fc023e11ef2ab5a5be4. --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index a551991..8ea8ba5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -614,8 +614,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); mouse_lock(); } } From 64c4b73853a2328a25c52a6b5b98fa2d7abfacec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 07:19:02 +0200 Subject: [PATCH 0868/1724] Add workaround for alt+tab issues on windows 7 SP1 (opengl) --- inc/versionhelpers.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ src/dd.c | 14 ++++++- src/fps_limiter.c | 16 +++++++- 3 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 inc/versionhelpers.h diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h new file mode 100644 index 0000000..5cb0d97 --- /dev/null +++ b/inc/versionhelpers.h @@ -0,0 +1,98 @@ +/** + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#ifndef _INC_VERSIONHELPERS +#define _INC_VERSIONHELPERS + +#if 1 + +#ifdef __cplusplus +#define VERSIONHELPERAPI inline bool +#else +#define VERSIONHELPERAPI FORCEINLINE BOOL +#endif + +#ifndef _WIN32_WINNT_WIN8 +#define _WIN32_WINNT_WIN8 0x0602 +#endif +#ifndef _WIN32_WINNT_WINBLUE +#define _WIN32_WINNT_WINBLUE 0x0603 +#endif +#ifndef _WIN32_WINNT_WINTHRESHOLD +#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 /* ABRACADABRA_THRESHOLD*/ +#endif +#ifndef _WIN32_WINNT_WIN10 +#define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/ +#endif + +VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,0,0,{0},servpack}; + return VerifyVersionInfoW(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION,VER_GREATER_EQUAL), + VER_MINORVERSION,VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + +VERSIONHELPERAPI IsWindowsXPOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); +} + +VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1); +} + +VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2); +} + +VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3); +} + +VERSIONHELPERAPI IsWindowsVistaOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); +} + +VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1); +} + +VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2); +} + +VERSIONHELPERAPI IsWindows7OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); +} + +VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1); +} + +VERSIONHELPERAPI IsWindows8OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); +} + +VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); +} + +VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0); +} + +VERSIONHELPERAPI IsWindows10OrGreater(void) { + return IsWindowsThresholdOrGreater(); +} + +VERSIONHELPERAPI IsWindowsServer(void) { + OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; + return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); +} + +#endif +#endif diff --git a/src/dd.c b/src/dd.c index 6398cc7..68f0810 100644 --- a/src/dd.c +++ b/src/dd.c @@ -14,6 +14,7 @@ #include "debug.h" #include "utils.h" #include "blt.h" +#include "versionhelpers.h" CNCDDRAW g_ddraw; @@ -1271,8 +1272,17 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return DD_OK; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !g_config.is_wine && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return DD_OK; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return DD_OK; + } } if (!g_ddraw.flip_limiter.tick_length) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index a6014bf..9d74fc5 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -4,6 +4,9 @@ #include "debug.h" #include "hook.h" #include "config.h" +#include "render_ogl.h" +#include "versionhelpers.h" + FPSLIMITER g_fpsl; @@ -153,8 +156,17 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !g_config.is_wine && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return; + } } if (g_fpsl.tick_length > 0) From 2cbd9bba094007c4f4a21e2ec9c772a12db8a74a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 07:47:19 +0200 Subject: [PATCH 0869/1724] comment out non-working functions --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 5 ++++- inc/versionhelpers.h | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 40036f3..4980515 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -106,6 +106,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 5a253f1..e9fb994 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -275,9 +275,12 @@ Header Files + + Header Files + - + Resource Files diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 5cb0d97..ea574e1 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -76,7 +76,7 @@ VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { VERSIONHELPERAPI IsWindows8OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); } - +/* Those can't be used without manifest so we comment them out to ensure they're not being used by accident VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); } @@ -88,7 +88,7 @@ VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } - +*/ VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); From cc97cc0761a46de563f3f6303fd07bb9663643e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 08:09:36 +0200 Subject: [PATCH 0870/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 211d331..5d0330d 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6626480358f06be136aef979c2c7201601e1a9bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 01:23:59 +0200 Subject: [PATCH 0871/1724] extend versionhelpers --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 ++ inc/config.h | 1 - inc/versionhelpers.h | 60 ++++++++++++++++++++------------ src/config.c | 5 ++- src/dd.c | 12 +++---- src/ddsurface.c | 3 +- src/debug.c | 17 +++------ src/dllmain.c | 3 ++ src/fps_limiter.c | 2 +- src/opengl_utils.c | 3 +- src/versionhelpers.c | 72 +++++++++++++++++++++++++++++++++++++++ src/wndproc.c | 11 +++--- 13 files changed, 140 insertions(+), 53 deletions(-) create mode 100644 src/versionhelpers.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 4980515..edfd7ab 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -67,6 +67,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index e9fb994..34b47a6 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -159,6 +159,9 @@ Source Files + + Source Files + diff --git a/inc/config.h b/inc/config.h index fe0f885..badf4fe 100644 --- a/inc/config.h +++ b/inc/config.h @@ -19,7 +19,6 @@ typedef struct CNCDDRAWCONFIG char process_file_ext[MAX_PATH]; char dll_file_ext[MAX_PATH]; INIFILE ini; - BOOL is_wine; BOOL d3d9on12; BOOL opengl_core; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index ea574e1..21e3ced 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -6,8 +6,6 @@ #ifndef _INC_VERSIONHELPERS #define _INC_VERSIONHELPERS -#if 1 - #ifdef __cplusplus #define VERSIONHELPERAPI inline bool #else @@ -26,73 +24,91 @@ #ifndef _WIN32_WINNT_WIN10 #define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/ #endif +#ifndef _WIN32_WINNT_WIN11 +#define _WIN32_WINNT_WIN11 0x0A00 +#endif -VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) + +void verhelp_init(); +BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); +const char* verhelp_wine_get_version(); +void verhelp_wine_get_host_version(const char** sysname, const char** release); +BOOL verhelp_is_wine(); +BOOL verhelp_is_macos(); +BOOL verhelp_is_linux(); + +/* Original MS Functions */ + +VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) { - OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,0,0,{0},servpack}; - return VerifyVersionInfoW(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + RTL_OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,build,0,{0},servpack}; + return verhelp_verify_version(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER|VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION,VER_GREATER_EQUAL), VER_MINORVERSION,VER_GREATER_EQUAL), + VER_BUILDNUMBER,VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } VERSIONHELPERAPI IsWindowsXPOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); } VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); } VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); } VERSIONHELPERAPI IsWindowsVistaOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); } VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); } VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); } VERSIONHELPERAPI IsWindows7OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); } VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); } VERSIONHELPERAPI IsWindows8OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); } -/* Those can't be used without manifest so we comment them out to ensure they're not being used by accident + VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); } VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0, 0); } VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } -*/ + +VERSIONHELPERAPI IsWindows11OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); +} + VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } #endif -#endif diff --git a/src/config.c b/src/config.c index da84184..31cbad5 100644 --- a/src/config.c +++ b/src/config.c @@ -11,6 +11,7 @@ #include "debug.h" #include "dllmain.h" #include "ini.h" +#include "versionhelpers.h" static void cfg_init(); static void cfg_create_ini(); @@ -1075,8 +1076,6 @@ static void cfg_create_ini() static void cfg_init() { - g_config.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; - /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { @@ -1151,7 +1150,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; - if (g_config.is_wine) + if (verhelp_is_wine()) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); diff --git a/src/dd.c b/src/dd.c index 68f0810..c2948c6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -875,7 +875,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (!g_config.is_wine) + if (!verhelp_is_wine()) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -905,7 +905,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (g_config.is_wine) + if (verhelp_is_wine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1053,7 +1053,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (g_config.is_wine && + if (verhelp_is_wine() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { @@ -1066,7 +1066,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (g_config.is_wine) + if (verhelp_is_wine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1273,7 +1273,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !g_config.is_wine && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return DD_OK; @@ -1556,7 +1556,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!g_config.is_wine && d3d9_is_available()) + if (!verhelp_is_wine() && d3d9_is_available()) { g_ddraw.renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index ba7a5f1..e188cba 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -11,6 +11,7 @@ #include "utils.h" #include "blt.h" #include "config.h" +#include "versionhelpers.h" LONG g_dds_gdi_handles; @@ -957,7 +958,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !g_config.is_wine) + if (g_ddraw.ref && g_config.fixnotresponding && !verhelp_is_wine()) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); diff --git a/src/debug.c b/src/debug.c index 4e81ab5..bc840b8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,6 +8,7 @@ #include "debug.h" #include "hook.h" #include "version.h" +#include "versionhelpers.h" double g_dbg_frame_time = 0; @@ -130,23 +131,13 @@ void dbg_init() RegCloseKey(hkey); } - const char* (CDECL * wine_get_version)() = - (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); - - if (wine_get_version) + if (verhelp_is_wine()) { - TRACE("Wine version = %s\n", wine_get_version()); - } + TRACE("Wine version = %s\n", verhelp_wine_get_version()); - void (CDECL* wine_get_host_version)(const char** sysname, const char** release) = - (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version"); - - if (wine_get_host_version) - { const char* sysname = NULL; const char* release = NULL; - - wine_get_host_version(&sysname, &release); + verhelp_wine_get_host_version(&sysname, &release); TRACE("Wine sysname = %s, release = %s\n", sysname, release); } diff --git a/src/dllmain.c b/src/dllmain.c index ee3c2cc..108c9e0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -9,6 +9,7 @@ #include "debug.h" #include "config.h" #include "hook.h" +#include "versionhelpers.h" /* export for cncnet cnc games */ @@ -28,6 +29,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; + verhelp_init(); + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) { cfg_load(); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 9d74fc5..8ea5992 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -157,7 +157,7 @@ void fpsl_frame_end() (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !g_config.is_wine && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e9497f3..da6e7c7 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -5,6 +5,7 @@ #include "debug.h" #include "hook.h" #include "config.h" +#include "versionhelpers.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -212,7 +213,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (g_config.is_wine && glversion && glversion[0] == '2') // macOS + if (verhelp_is_wine() && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/versionhelpers.c b/src/versionhelpers.c new file mode 100644 index 0000000..5752591 --- /dev/null +++ b/src/versionhelpers.c @@ -0,0 +1,72 @@ +#include +#include "versionhelpers.h" + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); + +static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +static WINE_GET_VERSIONPROC wine_get_version; +static WINE_GET_HOST_VERSIONPROC wine_get_host_version; + +/* GetProcAddress is rather slow so we use a function to inizialize it once on startup */ +void verhelp_init() +{ + HMODULE mod = GetModuleHandleA("ntdll.dll"); + if (mod) + { + RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); + wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); + wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); + } +} + +BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) +{ + return RtlVerifyVersionInfo ? + RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : + VerifyVersionInfoW(versionInfo, typeMask, conditionMask); +} + +const char* verhelp_wine_get_version() +{ + return wine_get_version ? wine_get_version() : NULL; +} + +void verhelp_wine_get_host_version(const char** sysname, const char** release) +{ + if (wine_get_host_version) + { + wine_get_host_version(sysname, release); + return; + } + + if (sysname) + *sysname = NULL; + + if (release) + *release = NULL; +} + +BOOL verhelp_is_wine() +{ + return wine_get_version != NULL; +} + +BOOL verhelp_is_macos() +{ + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Darwin") == 0; +} + +BOOL verhelp_is_linux() +{ + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Linux") == 0; +} diff --git a/src/wndproc.c b/src/wndproc.c index 8ea8ba5..f983186 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -13,6 +13,7 @@ #include "wndproc.h" #include "utils.h" #include "debug.h" +#include "versionhelpers.h" LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -228,7 +229,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (g_config.is_wine && + if (verhelp_is_wine() && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) @@ -462,7 +463,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (verhelp_is_wine() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -479,7 +480,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!g_config.is_wine) /* hack: disable aero snap */ + if (!verhelp_is_wine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -492,7 +493,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !verhelp_is_wine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -633,7 +634,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) + if (verhelp_is_wine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From e18eb931ebac417d8ccce7d8e06c4e986246d69d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 02:00:58 +0200 Subject: [PATCH 0872/1724] use inline functions for WINE checks --- inc/versionhelpers.h | 25 ++++++++++++++++++++----- src/config.c | 2 +- src/dd.c | 12 ++++++------ src/ddsurface.c | 2 +- src/debug.c | 2 +- src/fps_limiter.c | 2 +- src/opengl_utils.c | 2 +- src/versionhelpers.c | 23 ----------------------- src/wndproc.c | 10 +++++----- 9 files changed, 36 insertions(+), 44 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 21e3ced..116f0f4 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -33,11 +33,6 @@ void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); const char* verhelp_wine_get_version(); void verhelp_wine_get_host_version(const char** sysname, const char** release); -BOOL verhelp_is_wine(); -BOOL verhelp_is_macos(); -BOOL verhelp_is_linux(); - -/* Original MS Functions */ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) { @@ -111,4 +106,24 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWine(void) { + return verhelp_wine_get_version() != NULL; +} + +VERSIONHELPERAPI IsMacOS(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Darwin") == 0; +} + +VERSIONHELPERAPI IsLinux(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Linux") == 0; +} + #endif diff --git a/src/config.c b/src/config.c index 31cbad5..49118e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1150,7 +1150,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; - if (verhelp_is_wine()) + if (IsWine()) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); diff --git a/src/dd.c b/src/dd.c index c2948c6..576a521 100644 --- a/src/dd.c +++ b/src/dd.c @@ -875,7 +875,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (!verhelp_is_wine()) + if (!IsWine()) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -905,7 +905,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (verhelp_is_wine()) + if (IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1053,7 +1053,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (verhelp_is_wine() && + if (IsWine() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { @@ -1066,7 +1066,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (verhelp_is_wine()) + if (IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1273,7 +1273,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return DD_OK; @@ -1556,7 +1556,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!verhelp_is_wine() && d3d9_is_available()) + if (!IsWine() && d3d9_is_available()) { g_ddraw.renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index e188cba..6b9ab6b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -958,7 +958,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !verhelp_is_wine()) + if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); diff --git a/src/debug.c b/src/debug.c index bc840b8..a25916a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -131,7 +131,7 @@ void dbg_init() RegCloseKey(hkey); } - if (verhelp_is_wine()) + if (IsWine()) { TRACE("Wine version = %s\n", verhelp_wine_get_version()); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 8ea5992..14c4394 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -157,7 +157,7 @@ void fpsl_frame_end() (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index da6e7c7..9e63d8a 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -213,7 +213,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (verhelp_is_wine() && glversion && glversion[0] == '2') // macOS + if (IsWine() && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 5752591..dc4b450 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -47,26 +47,3 @@ void verhelp_wine_get_host_version(const char** sysname, const char** release) if (release) *release = NULL; } - -BOOL verhelp_is_wine() -{ - return wine_get_version != NULL; -} - -BOOL verhelp_is_macos() -{ - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Darwin") == 0; -} - -BOOL verhelp_is_linux() -{ - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Linux") == 0; -} diff --git a/src/wndproc.c b/src/wndproc.c index f983186..69e9d4b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -229,7 +229,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (verhelp_is_wine() && + if (IsWine() && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) @@ -463,7 +463,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (verhelp_is_wine() && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (IsWine() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -480,7 +480,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!verhelp_is_wine()) /* hack: disable aero snap */ + if (!IsWine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -493,7 +493,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !verhelp_is_wine()) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !IsWine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -634,7 +634,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (verhelp_is_wine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) + if (IsWine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From 57a98d667da4d5609b755e1dd1e4458f5867659b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 02:56:40 +0200 Subject: [PATCH 0873/1724] add additonoal windows version check fucntions --- inc/versionhelpers.h | 67 ++++++++++++++++++++++++++++++++++++++++++++ src/versionhelpers.c | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 116f0f4..3e539c7 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -45,6 +45,17 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } +VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD servpack) +{ + RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; + return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), + VER_BUILDNUMBER, VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -106,6 +117,62 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWindowsXP(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); +} + +VERSIONHELPERAPI IsWindowsXPSP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); +} + +VERSIONHELPERAPI IsWindowsXPSP2(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); +} + +VERSIONHELPERAPI IsWindowsXPSP3(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); +} + +VERSIONHELPERAPI IsWindowsVista(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); +} + +VERSIONHELPERAPI IsWindowsVistaSP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); +} + +VERSIONHELPERAPI IsWindowsVistaSP2(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); +} + +VERSIONHELPERAPI IsWindows7(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); +} + +VERSIONHELPERAPI IsWindows7SP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); +} + +VERSIONHELPERAPI IsWindows8(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); +} + +VERSIONHELPERAPI IsWindows8Point1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); +} + +VERSIONHELPERAPI IsWindowsThreshold(void) { + return IsWindows10OrGreater() && !IsWindows11OrGreater(); +} + +VERSIONHELPERAPI IsWindows10(void) { + return IsWindowsThreshold(); +} + +VERSIONHELPERAPI IsWindows11(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); +} + VERSIONHELPERAPI IsWine(void) { return verhelp_wine_get_version() != NULL; } diff --git a/src/versionhelpers.c b/src/versionhelpers.c index dc4b450..e422e90 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -9,7 +9,7 @@ static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; static WINE_GET_VERSIONPROC wine_get_version; static WINE_GET_HOST_VERSIONPROC wine_get_host_version; -/* GetProcAddress is rather slow so we use a function to inizialize it once on startup */ +/* GetProcAddress is rather slow so we use a function to initialize it once on startup */ void verhelp_init() { HMODULE mod = GetModuleHandleA("ntdll.dll"); From 1c9b39a1fd8a0fd0985d36696009fa3e7f91dd50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 01:47:56 +0200 Subject: [PATCH 0874/1724] set color key on GetSurfaceDesc --- src/ddsurface.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 6b9ab6b..feeb90a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -705,6 +705,13 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; } + if (This->flags & DDSD_CKSRCBLT) + { + lpDDSurfaceDesc->dwFlags |= DDSD_CKSRCBLT; + lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue; + lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue = This->color_key.dwColorSpaceLowValue; + } + if (This->bpp == 8) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; From 8326407a64b88b39dbbcd19e7edfbd3feac1c0b9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 03:30:18 +0200 Subject: [PATCH 0875/1724] set DDSD_CKSRCBLT on SetColorKey --- src/ddsurface.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index feeb90a..d1a1b24 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1046,6 +1046,8 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE if (lpColorKey) { + This->flags |= DDSD_CKSRCBLT; + This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; if (dwFlags & DDCKEY_COLORSPACE) From 54d6ff5112fb6236c5dc1c7383a073b10f64ed77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 05:54:56 +0200 Subject: [PATCH 0876/1724] add support for woms 2 high resolution patch zoom --- inc/dd.h | 1 + src/dd.c | 5 +++-- src/render_ogl.c | 6 ++++-- src/utils.c | 34 ++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 2 +- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 5fdc857..01e535e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -123,6 +123,7 @@ typedef struct CNCDDRAW BOOL isredalert; BOOL iscnc1; BOOL iskkndx; + BOOL isworms2; LONG upscale_hack_active; HCURSOR old_cursor; int show_cursor_count; diff --git a/src/dd.c b/src/dd.c index 576a521..94147ab 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1190,8 +1190,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.isredalert = strcmp(g_ddraw.title, "Red Alert") == 0; g_ddraw.iscnc1 = strcmp(g_ddraw.title, "Command & Conquer") == 0; g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; + g_ddraw.isworms2 = strcmp(g_ddraw.title, "worms2") == 0; - if (g_ddraw.iskkndx) + if (g_ddraw.iskkndx || g_ddraw.isworms2) { g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 480; @@ -1202,7 +1203,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.upscale_hack_height = 400; } - if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx) + if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) { g_config.vhack = 0; } diff --git a/src/render_ogl.c b/src/render_ogl.c index f208ab6..8e50e38 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -174,13 +174,15 @@ static void ogl_build_programs() if (!is_upscaler || g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height) + g_ddraw.render.viewport.height != g_ddraw.height || + g_config.vhack) { g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); if (!g_ogl.scale_program && (g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height)) + g_ddraw.render.viewport.height != g_ddraw.height || + g_config.vhack)) { g_ogl.scale_program = oglu_build_program( diff --git a/src/utils.c b/src/utils.c index 347a143..f15316d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -635,9 +635,29 @@ static unsigned char util_get_pixel(int x, int y) BOOL util_detect_low_res_screen() { + /* struct Copied from wkReSolution */ + typedef struct + { + PVOID UnkTable1; + DWORD Unk1, Unk2, Unk3, Unk4; + PVOID UnkDD, UnkTable2; + DWORD Unk5; + DWORD RenderWidth, RenderHeight; + DWORD Unk6, Unk7; + DWORD WidthRT, HeightRT; + DWORD HalfWidth, HalfHeight; + DWORD Unk8; + PCHAR UnkC; + LPDIRECTDRAW lpDD; + } W2DDSTRUCT, * LPW2DDSTRUCT; + static int* in_movie = (int*)0x00665F58; static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; + static LPW2DDSTRUCT* pW2DS; + + if (!pW2DS) + pW2DS = (char*)GetModuleHandleA(NULL) + 0x799C4; if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { @@ -663,6 +683,20 @@ BOOL util_detect_low_res_screen() { return util_get_pixel(g_ddraw.width - 3, 3) == 0; } + else if (g_ddraw.isworms2) + { + if ((*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + { + if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) + { + g_ddraw.upscale_hack_width = (*pW2DS)->RenderWidth; + g_ddraw.upscale_hack_height = (*pW2DS)->RenderHeight; + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); + } + + return TRUE; + } + } return FALSE; } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 28e29c3..6b229ed 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -84,7 +84,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) y = min(pt.y, g_ddraw.height - 1); } - if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) + if (g_config.vhack && !g_ddraw.isworms2 && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { diffx = 0; diffy = 0; From d97dd8e106aca61c2518ffddc29f2ae2aa3ab519 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:10:35 +0200 Subject: [PATCH 0877/1724] fix warning --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f15316d..7054a2e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -657,7 +657,7 @@ BOOL util_detect_low_res_screen() static LPW2DDSTRUCT* pW2DS; if (!pW2DS) - pW2DS = (char*)GetModuleHandleA(NULL) + 0x799C4; + pW2DS = (LPW2DDSTRUCT*)((DWORD)GetModuleHandleA(NULL) + 0x799C4); if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { From 38b553191f7632a652f4980aa8b1ea2b06062fb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:17:54 +0200 Subject: [PATCH 0878/1724] allow zooming on low resolutions as well (worms2) --- src/dd.c | 7 ++++++- src/utils.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 94147ab..c71a4d0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1192,7 +1192,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; g_ddraw.isworms2 = strcmp(g_ddraw.title, "worms2") == 0; - if (g_ddraw.iskkndx || g_ddraw.isworms2) + if (g_ddraw.iskkndx) { g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 480; @@ -1202,6 +1202,11 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 400; } + else if (g_ddraw.isworms2) + { + g_ddraw.upscale_hack_width = 80; + g_ddraw.upscale_hack_height = 60; + } if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) { diff --git a/src/utils.c b/src/utils.c index 7054a2e..41876b1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,7 +685,7 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if ((*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + if ((*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) { if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) { From 91cad99b6febee3b94d61dbe824365a9cf5d7b09 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:35:47 +0200 Subject: [PATCH 0879/1724] add addiotional null check --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 41876b1..52a1ff7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,7 +685,7 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if ((*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + if (*pW2DS && (*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) { if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) { From b8632698a48bac1b9cefa20b54dd425a38524879 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 09:04:19 +0200 Subject: [PATCH 0880/1724] tweak low res function checks --- src/utils.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/utils.c b/src/utils.c index 52a1ff7..9afa971 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,12 +685,15 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if (*pW2DS && (*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + DWORD w2_width = *pW2DS ? (*pW2DS)->RenderWidth : 0; + DWORD w2_height = *pW2DS ? (*pW2DS)->RenderHeight : 0; + + if (w2_width && w2_width < g_ddraw.width && w2_height && w2_height < g_ddraw.height) { - if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) + if (g_ddraw.upscale_hack_width != w2_width || g_ddraw.upscale_hack_height != w2_height) { - g_ddraw.upscale_hack_width = (*pW2DS)->RenderWidth; - g_ddraw.upscale_hack_height = (*pW2DS)->RenderHeight; + g_ddraw.upscale_hack_width = w2_width; + g_ddraw.upscale_hack_height = w2_height; InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } From 5bd886435015b99b1ac534006681de551ba63536 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 01:12:11 +0200 Subject: [PATCH 0881/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0faf14f..8b2deb1 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Features - - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS) and Virtual Machines + - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode From e14515035b48e74af85c64f3b774e42a89a14fe0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 01:12:43 +0200 Subject: [PATCH 0882/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b2deb1..30cb84f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # cnc-ddraw -cnc-ddraw can fix compatibility issues in older games, such as black screen, bad performance, crashes or defective Alt+Tab. +cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab.   From 5a3e1ad49b55af6fda989838d9d845e61aa6abb3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 22:16:29 +0200 Subject: [PATCH 0883/1724] update vhack comments with worms2 support --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 49118e5..70079d0 100644 --- a/src/config.c +++ b/src/config.c @@ -228,7 +228,7 @@ static void cfg_create_ini() "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)\n" "d3d9_filter=2\n" "\n" - "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" + "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" "; Where should screenshots be saved\n" From da3de43f446fda5e999084043ed58492cdba0822 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 22:17:27 +0200 Subject: [PATCH 0884/1724] enable d3d9 filter for vhack --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c1875b4..05f29b9 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -452,7 +452,7 @@ static BOOL d3d9_set_states() BOOL bilinear = g_config.d3d9_filter && g_d3d9.pixel_shader_upscale && - (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height); + (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack); err = err || FAILED( IDirect3DDevice9_SetPixelShader( From 47e1af94d0a34803dd8ff2a3aa075e2ecd5d0786 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 00:03:14 +0200 Subject: [PATCH 0885/1724] fix warning with gcc --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 9afa971..0a87f08 100644 --- a/src/utils.c +++ b/src/utils.c @@ -649,7 +649,7 @@ BOOL util_detect_low_res_screen() DWORD Unk8; PCHAR UnkC; LPDIRECTDRAW lpDD; - } W2DDSTRUCT, * LPW2DDSTRUCT; + } * LPW2DDSTRUCT; static int* in_movie = (int*)0x00665F58; static int* is_vqa_640 = (int*)0x0065D7BC; From c90af52dac4be7fe14da2f915bb458ac39a07632 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 02:43:40 +0200 Subject: [PATCH 0886/1724] remove unused psapi header --- Makefile | 2 +- src/hook.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3daa0b7..3371861 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TARGET = ddraw.dll LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall -LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 +LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/src/hook.c b/src/hook.c index 653e891..4ea34b7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,7 +1,6 @@ #define WIN32_LEAN_AND_MEAN #include #include -#include #include "directinput.h" #include "dd.h" #include "winapi_hooks.h" From 175d2f5458944ebdf29761d69b924b918dfb828c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 07:05:51 +0200 Subject: [PATCH 0887/1724] add inline functions for RTM versions --- inc/versionhelpers.h | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 3e539c7..8acf6f5 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -36,12 +36,12 @@ void verhelp_wine_get_host_version(const char** sysname, const char** release); VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) { - RTL_OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,build,0,{0},servpack}; - return verhelp_verify_version(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER|VER_SERVICEPACKMAJOR, + RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; + return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, - VER_MAJORVERSION,VER_GREATER_EQUAL), - VER_MINORVERSION,VER_GREATER_EQUAL), - VER_BUILDNUMBER,VER_GREATER_EQUAL), + VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION, VER_GREATER_EQUAL), + VER_BUILDNUMBER, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } @@ -56,6 +56,17 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se VER_SERVICEPACKMAJOR, VER_EQUAL)); } +VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) +{ + RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; + return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), + VER_BUILDNUMBER, VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -118,6 +129,10 @@ VERSIONHELPERAPI IsWindowsServer(void) { } VERSIONHELPERAPI IsWindowsXP(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); +} + +VERSIONHELPERAPI IsWindowsXPRTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -134,6 +149,10 @@ VERSIONHELPERAPI IsWindowsXPSP3(void) { } VERSIONHELPERAPI IsWindowsVista(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); +} + +VERSIONHELPERAPI IsWindowsVistaRTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); } @@ -146,6 +165,10 @@ VERSIONHELPERAPI IsWindowsVistaSP2(void) { } VERSIONHELPERAPI IsWindows7(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); +} + +VERSIONHELPERAPI IsWindows7RTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); } From 518b940365137a99b9f787002d6ac31a52348efb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 May 2024 21:35:28 +0200 Subject: [PATCH 0888/1724] add hack for games that require the cursor to be in the exact center of the screen (Worms 2 / Atlantis) --- inc/config.h | 1 + src/config.c | 4 ++++ src/dd.c | 19 +++++++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index badf4fe..ec737eb 100644 --- a/inc/config.h +++ b/inc/config.h @@ -75,6 +75,7 @@ typedef struct CNCDDRAWCONFIG int custom_height; int min_font_size; BOOL direct3d_passthrough; + BOOL center_cursor_fix; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 70079d0..624f12b 100644 --- a/src/config.c +++ b/src/config.c @@ -88,6 +88,7 @@ void cfg_load() GET_INT(g_config.custom_height, "custom_height", 0); GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); + GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); /* Hotkeys */ @@ -300,6 +301,7 @@ static void cfg_create_ini() "custom_height=0\n" "min_font_size=0\n" "direct3d_passthrough=false\n" + "center_cursor_fix=false\n" "\n" "\n" "\n" @@ -433,6 +435,7 @@ static void cfg_create_ini() "[ATLANTIS]\n" "renderer=opengl\n" "maxgameticks=60\n" + "center_cursor_fix=true\n" "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" @@ -1052,6 +1055,7 @@ static void cfg_create_ini() "[worms2]\n" "flipclear=true\n" "game_handles_close=true\n" + "center_cursor_fix=true\n" "\n" "; Worms Armageddon\n" "[WA]\n" diff --git a/src/dd.c b/src/dd.c index c71a4d0..3bb332f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -841,10 +841,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.unscale_w = ((float)g_ddraw.width / g_ddraw.render.viewport.width); g_ddraw.render.unscale_h = ((float)g_ddraw.height / g_ddraw.render.viewport.height); - g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); - g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); - g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); - g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); + /* Hack for games that require the cursor to be in the exact center of the screen (Worms 2 / Atlantis) */ + if (g_config.center_cursor_fix) + { + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width) / (g_ddraw.width)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height) / (g_ddraw.height)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width) / (g_ddraw.render.viewport.width)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height) / (g_ddraw.render.viewport.height)); + } + else + { + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); + } g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; From 9897ffbd57a69d490c51e0ad0db81df1c2d35e80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 03:03:44 +0200 Subject: [PATCH 0889/1724] remove old WM_MOVE hack --- src/dd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3bb332f..8e9699e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1125,7 +1125,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) { real_SendMessageA(g_ddraw.hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw.width, g_ddraw.height)); - real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } From 70f0264b1918947bd0a321fee746d6979ca866e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 03:05:31 +0200 Subject: [PATCH 0890/1724] add preset for new FreeInfantry.exe --- src/config.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 624f12b..fb13051 100644 --- a/src/config.c +++ b/src/config.c @@ -779,12 +779,18 @@ static void cfg_create_ini() "[i76]\n" "adjmouse=true\n" "\n" - "; Infantry Online\n" + "; Infantry\n" "[infantry]\n" "resolutions=2\n" "infantryhack=true\n" "max_resolutions=90\n" "\n" + "; Infantry Steam\n" + "[FreeInfantry]\n" + "resolutions=2\n" + "infantryhack=true\n" + "max_resolutions=90\n" + "\n" "; Jagged Alliance 2\n" "[ja2]\n" "singlecpu=false\n" From 8de39f6590e4e02cc212fb2331f6b7754a7014b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 04:21:54 +0200 Subject: [PATCH 0891/1724] enable vhack by default for worms 2 --- src/config.c | 1 + src/dd.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index fb13051..fdabd7c 100644 --- a/src/config.c +++ b/src/config.c @@ -1059,6 +1059,7 @@ static void cfg_create_ini() "\n" "; Worms 2\n" "[worms2]\n" + "vhack=true\n" "flipclear=true\n" "game_handles_close=true\n" "center_cursor_fix=true\n" diff --git a/src/dd.c b/src/dd.c index 8e9699e..bd54438 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1214,8 +1214,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (g_ddraw.isworms2) { - g_ddraw.upscale_hack_width = 80; - g_ddraw.upscale_hack_height = 60; + if (memcmp((char*)GetModuleHandleA(NULL) + 0x00010000, "\x17\x81\xC2\x00\x80\x00\x00\x89", 8) != 0) + { + g_ddraw.isworms2 = FALSE; + } + else + { + g_ddraw.upscale_hack_width = 80; + g_ddraw.upscale_hack_height = 60; + } } if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) From 82627161944da2726de9f3536a3c9905d1358673 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 04:32:40 +0200 Subject: [PATCH 0892/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 5d0330d..ba7b0eb 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 3 +#define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 5eb1f00b9f244b8b41e176cf490e86f2af8f8ce1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:14:07 +0200 Subject: [PATCH 0893/1724] #309 Add possible fix for Nancy Draw: Last Train to Blue Moon Canyon SetSurfaceDesc() error --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d1a1b24..e6770a4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1227,7 +1227,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - if ((lpDDSD->dwFlags & req_flags) != req_flags) + if (((lpDDSD->dwFlags & req_flags) != req_flags) && (lpDDSD->dwFlags & DDSD_ALL) == 0) return DDERR_UNSUPPORTED; From 32f508cba3ffd4d684b5aec5d9ac133620940047 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:18:25 +0200 Subject: [PATCH 0894/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ba7b0eb..d5fef35 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From fdcf9a7d1a7ea1b3273bc2d80339f28ada7d4f19 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:45:50 +0200 Subject: [PATCH 0895/1724] #309 Fix for Nancy Draw: Last Train to Blue Moon Canyon "SetSurfaceDesc() error" --- src/ddsurface.c | 69 ++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index e6770a4..8b6ae1d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1225,9 +1225,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD dbg_dump_dds_flags(lpDDSD->dwFlags); dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps); - DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - - if (((lpDDSD->dwFlags & req_flags) != req_flags) && (lpDDSD->dwFlags & DDSD_ALL) == 0) + if ((lpDDSD->dwFlags & DDSD_LPSURFACE) == 0) return DDERR_UNSUPPORTED; @@ -1262,32 +1260,51 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->mapping = NULL; } - - switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) + if (lpDDSD->dwFlags & DDSD_PIXELFORMAT) { - case 8: - This->bpp = 8; - break; - case 15: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - case 16: - This->bpp = 16; - break; - case 24: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - case 32: - This->bpp = 32; - break; - default: - This->bpp = 8; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - break; + switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) + { + case 0: + break; + case 8: + This->bpp = 8; + break; + case 15: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 16: + This->bpp = 16; + break; + case 24: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 32: + This->bpp = 32; + break; + default: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + break; + } + } + + if (lpDDSD->dwFlags & DDSD_WIDTH) + { + This->width = lpDDSD->dwWidth; + } + + if (lpDDSD->dwFlags & DDSD_HEIGHT) + { + This->height = lpDDSD->dwHeight; + } + + if (lpDDSD->dwFlags & DDSD_PITCH) + { + This->pitch = lpDDSD->lPitch; + } + + if (lpDDSD->dwFlags & DDSD_LPSURFACE) + { + This->surface = lpDDSD->lpSurface; } - This->width = lpDDSD->dwWidth; - This->height = lpDDSD->dwHeight; - This->surface = lpDDSD->lpSurface; - This->pitch = lpDDSD->lPitch; This->bytes_pp = This->bpp / 8; This->size = This->pitch * This->height; This->custom_buf = TRUE; From 0ad0e740432304c5e38acf370298057d2c7d02b5 Mon Sep 17 00:00:00 2001 From: Afevis Date: Wed, 15 May 2024 17:44:34 -0400 Subject: [PATCH 0896/1724] Adds supported games --- README.md | 156 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 127 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 30cb84f..655624f 100644 --- a/README.md +++ b/README.md @@ -57,37 +57,135 @@ Some games may require additional steps before they can be used with cnc-ddraw,   ### Supported Games - - - Command & Conquer Gold - - Command & Conquer: Red Alert - - Command & Conquer: Tiberian Sun - - Command & Conquer: Red Alert 2 - - Captain Claw - - Carmageddon - - Carmageddon 2 - - Warcraft 2 - - StarCraft - - Diablo - - Diablo 2 - - Age of Empires - - Age of Empires II - - Theme Hospital - - Populous: The Beginning - - Outlaws - - Dungeon Keeper - - Dark Reign: The Future of War - - Star Wars: Galactic Battlegrounds - - Atomic Bomberman - - Dune 2000 - - Oddworld: Abe's Oddysee - - Commandos - - Red Baron 3D - - F-16 Multirole Fighter - - F-22 Raptor - - Nox +- Age of Empires +- Age of Empires II +- Age of Wonders +- Age of Wonders 2 +- Age of Wonders: Shadow Magic +- Alien Nations +- American Conquest (Steam+GOG) +- Amerzone +- Anstoss 3 +- Arcanum +- Atomic Bomberman +- Atrox +- Baldr Force EXE +- Baldur's Gate +- Baldur's Gate 2 +- Blade & Sword +- Caesar III (Sierra - 1998) +- Capitalism II +- Capitalism Lab +- Captain Claw +- Carmageddon +- Carmageddon 2 +- Casino Empire (AKA Hoyle Casino) +- Chaos Gate +- Command & Conquer Gold +- Command & Conquer: Red Alert +- Command & Conquer: Red Alert 2 +- Command & Conquer: Red Alert 2: Yuri's Revenge +- Command & Conquer: Tiberian Sun +- Commandos +- Corsairs Gold +- Cossacks (Steam+GOG) +- Dark Reign: The Future of War +- Daytona USA (Sega - 1996) +- Desperados: Wanted Dead or Alive +- Diablo +- Diablo 2 + Lord of Destruction +- Divine Divinity +- Dragon Throne: Battle of Red Cliffs +- Dune 2000 +- Dungeon Keeper +- Dungeon Keeper 2 +- Economic War +- Eggsucker +- Enemy Infestation +- EV Nova +- F-16 Multirole Fighter +- F-22 Raptor +- Fairy Tale About Father Frost, Ivan and Nastya +- Fallout +- Fallout 2 +- Future Cop L.A.P.D +- Grand Theft Auto +- Gruntz +- Hearts of Iron 2 +- Heroes of Might and Magic III +- Heroes of Might and Magic IV +- Hooligans: Storm over Europe +- Hugo Gold +- Hugo Wild River +- Icewind Dale 2 +- Infantry Online +- Jagged Alliance 2 +- Jagged Alliance 2: Unfinished Business +- Jagged Alliance 2: Wildfire +- KKND Xtreme +- KKND2: Krossfire +- Knights and Merchants +- Kohan: Immortal Sovereigns +- Lionheart +- Locomotion +- LodePNG +- Mech Warrior 3 +- Megaman X4 +- Microsoft Detours +- Moorhuhn +- Moorhuhn 2 +- Nancy Drew: Secrets Can Kill +- Nancy Drew: Stay Tuned For Danger +- Need For Speed: High Stakes +- Need For Speed: III Hot Pursuit +- New Robinson +- NexusTk +- Nox +- Nox (Westwood - 2000) +- Oddworld: Abe's Exoddus +- Oddworld: Abe's Oddysee +- Outlaws +- Outlive +- Pharaoh (Sierra - 1999) +- Populous: The Beginning +- Quest for Glory 5 +- Rage of Mages 2 +- Red Baron 3D +- Reksio and the Pirate Treasure (aka Reksio si Comoara Piratilor) +- Road Rash +- RollerCoaster Tycoon +- Settlers 3 +- Sim City 3000 +- Sim Copter +- Sim Theme Park (aka Theme Park World) +- Sole Survivor +- Space Rangers +- Star Wars Jedi Knight: Dark Forces II +- Star Wars: Galactic Battlegrounds +- StarCraft +- Starship Titanic +- Start Trek Armada +- Steel Panthers: World At War +- Stronghold Crusader HD +- Theme Hospital +- Three Kingdoms: Fate of the Dragon +- Total Annihilation +- Total Annihilation (Unofficial Beta Patch v3.9.02) +- Total Annihilation: Kingdoms +- Twisted Metal +- Twisted Metal 2 +- Tzar: The Burden of the Crown +- Vermeer +- Virtua Fighter PC +- War Wind +- Warcraft 2 +- Wizardry 8 +- Wizards and Warriors +- Worms 2 +- Zeus: Master of Olympus - ... -There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. +There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. [![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) From 219da4771486bbcd427486b0a8089413162fd92c Mon Sep 17 00:00:00 2001 From: Afevis Date: Wed, 15 May 2024 17:47:43 -0400 Subject: [PATCH 0897/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 655624f..2b74eb3 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed: High Stakes -- Need For Speed: III Hot Pursuit +- Need For Speed III: Hot Pursuit - New Robinson - NexusTk - Nox From 0eee142a684abf910b8ad1047fc55e3208c2a7f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 May 2024 23:59:47 +0200 Subject: [PATCH 0898/1724] remove LodePNG and Detours from the list (they're no games, they're 3rd party libraries) --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2b74eb3..f1e2b1f 100644 --- a/README.md +++ b/README.md @@ -128,10 +128,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Lionheart - Locomotion -- LodePNG - Mech Warrior 3 - Megaman X4 -- Microsoft Detours - Moorhuhn - Moorhuhn 2 - Nancy Drew: Secrets Can Kill From 96fdf3021a6baff24ab31f0d9b463489293c3fb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 00:44:36 +0200 Subject: [PATCH 0899/1724] add all games I currently have installed --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f1e2b1f..cbda751 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 +- Balls Of Steel - Blade & Sword - Caesar III (Sierra - 1998) - Capitalism II @@ -87,8 +88,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Red Alert 2: Yuri's Revenge - Command & Conquer: Tiberian Sun - Commandos +- Commandos - Beyond The Call Of Duty - Corsairs Gold - Cossacks (Steam+GOG) +- Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Desperados: Wanted Dead or Alive @@ -112,6 +115,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Grand Theft Auto - Gruntz - Hearts of Iron 2 +- Heroes of Might and Magic II - Heroes of Might and Magic III - Heroes of Might and Magic IV - Hooligans: Storm over Europe @@ -126,16 +130,17 @@ Some games may require additional steps before they can be used with cnc-ddraw, - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns -- Lionheart +- Lionheart - Legacy of the Crusader - Locomotion - Mech Warrior 3 - Megaman X4 - Moorhuhn - Moorhuhn 2 +- Moorhuhn Winter Editon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Need For Speed: High Stakes - Need For Speed III: Hot Pursuit +- Need For Speed: High Stakes - New Robinson - NexusTk - Nox @@ -145,13 +150,20 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pharaoh (Sierra - 1999) +- Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Quest for Glory 5 - Rage of Mages 2 - Red Baron 3D -- Reksio and the Pirate Treasure (aka Reksio si Comoara Piratilor) +- Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) +- Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) +- Reksio and the Pirate Treasure (AKA Reksio si Comoara Piratilor) +- Reksio and the Time Machine (AKA Reksio si Masina Timpului) +- Reksio and the UFO (AKA Reksio si OZN-ul) +- Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Septerra Core - Settlers 3 - Sim City 3000 - Sim Copter @@ -165,6 +177,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Start Trek Armada - Steel Panthers: World At War - Stronghold Crusader HD +- Stronghold HD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation From 10f4d8b4847e006d97eb3366e215f2fed54e075b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 01:20:13 +0200 Subject: [PATCH 0900/1724] allow custom amount of framebuffers --- inc/render_ogl.h | 5 +- src/render_ogl.c | 138 ++++++++++++++++++++++++----------------------- 2 files changed, 75 insertions(+), 68 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 4de364f..9c594c4 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -5,6 +5,7 @@ #include "opengl_utils.h" #define TEXTURE_COUNT 4 +#define FBO_COUNT 1 typedef struct OGLRENDERER { @@ -26,8 +27,8 @@ typedef struct OGLRENDERER GLuint main_vbos[3]; GLuint main_vao; GLint frame_count_uni_loc; - GLuint frame_buffer_id; - GLuint frame_buffer_tex_id; + GLuint frame_buffer_id[FBO_COUNT]; + GLuint frame_buffer_tex_id[FBO_COUNT]; GLint scale_tex_coord_attr_loc; GLuint scale_vbos[3]; GLuint scale_vao; diff --git a/src/render_ogl.c b/src/render_ogl.c index 8e50e38..7226e15 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -570,76 +570,82 @@ static void ogl_init_scale_program() }; glUniformMatrix4fv(glGetUniformLocation(g_ogl.scale_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); - glGenFramebuffers(1, &g_ogl.frame_buffer_id); - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); + glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); + glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - glGenTextures(1, &g_ogl.frame_buffer_tex_id); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - g_ogl.surface_tex); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id, 0); - - GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, draw_buffers); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + for (int i = 0; i < FBO_COUNT; i++) { - glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[i]); - if (glDeleteFramebuffers) - glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA8, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + g_ogl.surface_tex); - if (glDeleteProgram) - glDeleteProgram(g_ogl.scale_program); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); - g_ogl.scale_program = 0; + GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, draw_buffers); - if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); - - if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); - - if (g_ogl.main_program) + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); - static const GLfloat vertex_coord_pal[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat tex_coord_pal[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + if (glDeleteFramebuffers) + glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); + + if (glDeleteProgram) + glDeleteProgram(g_ogl.scale_program); + + g_ogl.scale_program = 0; + + if (glDeleteBuffers) + glDeleteBuffers(3, g_ogl.scale_vbos); + + if (glDeleteVertexArrays) + glDeleteVertexArrays(1, &g_ogl.scale_vao); + + if (g_ogl.main_program) + { + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); + static const GLfloat vertex_coord_pal[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); + GLfloat tex_coord_pal[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + + break; } } @@ -866,7 +872,7 @@ static void ogl_render() glViewport(0, 0, g_ddraw.width, g_ddraw.height); - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); glBindVertexArray(g_ogl.main_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); @@ -894,7 +900,7 @@ static void ogl_render() glUseProgram(g_ogl.scale_program); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); static int frames = 1; if (g_ogl.frame_count_uni_loc != -1) @@ -951,13 +957,13 @@ static void ogl_delete_context(HGLRC context) if (g_ogl.scale_program) { - glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); + glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); if (glDeleteBuffers) glDeleteBuffers(3, g_ogl.scale_vbos); if (glDeleteFramebuffers) - glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); + glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); if (glDeleteVertexArrays) glDeleteVertexArrays(1, &g_ogl.scale_vao); From 38f191e0dc4cc4fa2da7d17c781b9868a418d1ca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:14:56 +0200 Subject: [PATCH 0901/1724] add games from ddraw.ini to readme --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cbda751..e2b53d9 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, ### Supported Games - Age of Empires +- Age of Empires: The Rise of Rome - Age of Empires II +- Age of Empires II: The Conquerors - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic @@ -67,16 +69,27 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Amerzone - Anstoss 3 - Arcanum +- Anno 1602 +- Atlantis +- Atlantis 2 +- Atlantis 3 - Atomic Bomberman - Atrox +- Airline Tycoon Deluxe - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 - Balls Of Steel - Blade & Sword +- Blood II - The Chosen +- Close Combat 2: A Bridge Too Far +- Close Combat 3: The Russian Front +- Close Combat 4: The Battle of the Bulge +- Close Combat 5: Invasion: Normandy - Caesar III (Sierra - 1998) - Capitalism II - Capitalism Lab +- Call To Power 2 - Captain Claw - Carmageddon - Carmageddon 2 @@ -87,6 +100,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Red Alert 2 - Command & Conquer: Red Alert 2: Yuri's Revenge - Command & Conquer: Tiberian Sun +- Command & Conquer: Sole Survivor - Commandos - Commandos - Beyond The Call Of Duty - Corsairs Gold @@ -95,7 +109,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Desperados: Wanted Dead or Alive +- Deadlock 2 - Diablo +- Diablo: Hellfire - Diablo 2 + Lord of Destruction - Divine Divinity - Dragon Throne: Battle of Red Cliffs @@ -105,7 +121,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Economic War - Eggsucker - Enemy Infestation -- EV Nova +- Escape Velocity Nova - F-16 Multirole Fighter - F-22 Raptor - Fairy Tale About Father Frost, Ivan and Nastya @@ -113,7 +129,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout 2 - Future Cop L.A.P.D - Grand Theft Auto +- Grand Theft Auto: London 1969 +- Grand Theft Auto: London 1961 +- Hard Truck: Road to Victory - Gruntz +- G-Police - Hearts of Iron 2 - Heroes of Might and Magic II - Heroes of Might and Magic III @@ -122,6 +142,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hugo Gold - Hugo Wild River - Icewind Dale 2 +- Invictus +- Interstate 76 - Infantry Online - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business @@ -130,26 +152,33 @@ Some games may require additional steps before they can be used with cnc-ddraw, - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns +- Kings Quest 8 +- Konung +- Konung 2 - Lionheart - Legacy of the Crusader - Locomotion - Mech Warrior 3 +- Majesty Gold +- Majesty Gold HD - Megaman X4 - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger +- Nancy Draw: Last Train to Blue Moon Canyon - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson - NexusTk -- Nox - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee - Outlaws - Outlive - Pharaoh (Sierra - 1999) +- Pax Imperia +- Railroad Tycoon II - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Quest for Glory 5 @@ -168,16 +197,22 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) -- Sole Survivor - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds +- Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft - Starship Titanic - Start Trek Armada - Steel Panthers: World At War +- Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- Shadow Watch +- Shadow Flare +- Uprising +- Uprising 2 +- Shogo - Mobile Armor Division - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -193,7 +228,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Wizardry 8 - Wizards and Warriors - Worms 2 +- Worms Armageddon - Zeus: Master of Olympus +- Poseidon: Master of Atlantis - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From dd80ff4bc0fae85ad6d10c5ad456037e5c3baf30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:17:12 +0200 Subject: [PATCH 0902/1724] sort entries --- README.md | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e2b53d9..9a878f5 100644 --- a/README.md +++ b/README.md @@ -58,49 +58,49 @@ Some games may require additional steps before they can be used with cnc-ddraw, ### Supported Games - Age of Empires -- Age of Empires: The Rise of Rome - Age of Empires II - Age of Empires II: The Conquerors +- Age of Empires: The Rise of Rome - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic +- Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) - Amerzone +- Anno 1602 - Anstoss 3 - Arcanum -- Anno 1602 - Atlantis - Atlantis 2 - Atlantis 3 - Atomic Bomberman - Atrox -- Airline Tycoon Deluxe - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 - Balls Of Steel - Blade & Sword - Blood II - The Chosen -- Close Combat 2: A Bridge Too Far -- Close Combat 3: The Russian Front -- Close Combat 4: The Battle of the Bulge -- Close Combat 5: Invasion: Normandy - Caesar III (Sierra - 1998) +- Call To Power 2 - Capitalism II - Capitalism Lab -- Call To Power 2 - Captain Claw - Carmageddon - Carmageddon 2 - Casino Empire (AKA Hoyle Casino) - Chaos Gate +- Close Combat 2: A Bridge Too Far +- Close Combat 3: The Russian Front +- Close Combat 4: The Battle of the Bulge +- Close Combat 5: Invasion: Normandy - Command & Conquer Gold - Command & Conquer: Red Alert - Command & Conquer: Red Alert 2 - Command & Conquer: Red Alert 2: Yuri's Revenge -- Command & Conquer: Tiberian Sun - Command & Conquer: Sole Survivor +- Command & Conquer: Tiberian Sun - Commandos - Commandos - Beyond The Call Of Duty - Corsairs Gold @@ -108,11 +108,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) -- Desperados: Wanted Dead or Alive - Deadlock 2 +- Desperados: Wanted Dead or Alive - Diablo -- Diablo: Hellfire - Diablo 2 + Lord of Destruction +- Diablo: Hellfire - Divine Divinity - Dragon Throne: Battle of Red Cliffs - Dune 2000 @@ -128,12 +128,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout - Fallout 2 - Future Cop L.A.P.D -- Grand Theft Auto -- Grand Theft Auto: London 1969 -- Grand Theft Auto: London 1961 -- Hard Truck: Road to Victory -- Gruntz - G-Police +- Grand Theft Auto +- Grand Theft Auto: London 1961 +- Grand Theft Auto: London 1969 +- Gruntz +- Hard Truck: Road to Victory - Hearts of Iron 2 - Heroes of Might and Magic II - Heroes of Might and Magic III @@ -142,31 +142,31 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hugo Gold - Hugo Wild River - Icewind Dale 2 -- Invictus -- Interstate 76 - Infantry Online +- Interstate 76 +- Invictus - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire +- Kings Quest 8 - KKND Xtreme - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns -- Kings Quest 8 - Konung - Konung 2 - Lionheart - Legacy of the Crusader - Locomotion -- Mech Warrior 3 - Majesty Gold - Majesty Gold HD +- Mech Warrior 3 - Megaman X4 - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon +- Nancy Draw: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Draw: Last Train to Blue Moon Canyon - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson @@ -176,13 +176,14 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Oddworld: Abe's Oddysee - Outlaws - Outlive -- Pharaoh (Sierra - 1999) - Pax Imperia -- Railroad Tycoon II +- Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning +- Poseidon: Master of Atlantis - Quest for Glory 5 - Rage of Mages 2 +- Railroad Tycoon II - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -194,6 +195,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - RollerCoaster Tycoon - Septerra Core - Settlers 3 +- Shadow Flare +- Shadow Watch +- Shogo - Mobile Armor Division - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) @@ -208,11 +212,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD -- Shadow Watch -- Shadow Flare -- Uprising -- Uprising 2 -- Shogo - Mobile Armor Division - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -221,6 +220,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown +- Uprising +- Uprising 2 - Vermeer - Virtua Fighter PC - War Wind @@ -230,7 +231,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus -- Poseidon: Master of Atlantis - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From f0c4c91cd302a6a5e684e09eb4fb43b130cb9671 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:17:52 +0200 Subject: [PATCH 0903/1724] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a878f5..fab5559 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Draw: Last Train to Blue Moon Canyon +- Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit From c3bab6f2e4c8aed968b8370348335af45b5d8147 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:49:18 +0200 Subject: [PATCH 0904/1724] add few more game names taken from issues --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fab5559..9c4f2c1 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Commandos - Beyond The Call Of Duty - Corsairs Gold - Cossacks (Steam+GOG) +- Cultures - The Discovery of Vinland - Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) @@ -115,6 +116,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Diablo: Hellfire - Divine Divinity - Dragon Throne: Battle of Red Cliffs +- DuelSavior +- DuelSavior: Justice - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 @@ -127,6 +130,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 +- Final fantasy VII +- Final fantasy VIII - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -164,7 +169,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Drew: Last Train to Blue Moon Canyon +- Nancy Draw: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit @@ -176,6 +181,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Oddworld: Abe's Oddysee - Outlaws - Outlive +- Pacific General - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) @@ -193,6 +199,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Sega Rally +- Sega Touring Car - Septerra Core - Settlers 3 - Shadow Flare @@ -201,6 +209,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) +- SimCoaster / Theme Park Inc - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds @@ -231,6 +240,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus +- Zuma Deluxe - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From c096e3b683e37c67ec8d5cfcc7b30216241e29dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:49:55 +0200 Subject: [PATCH 0905/1724] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c4f2c1..80cfad3 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Draw: Last Train to Blue Moon Canyon +- Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit From e6fea47fc7ef9fe12d059ed3e9308f277773bd91 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 07:15:29 +0200 Subject: [PATCH 0906/1724] add some more games from an old list --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 80cfad3..7dcdf93 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Diablo - Diablo 2 + Lord of Destruction - Diablo: Hellfire +- Disciples +- Disciples 2 - Rise of the Elves - Divine Divinity - Dragon Throne: Battle of Red Cliffs - DuelSavior @@ -134,6 +136,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Final fantasy VIII - Future Cop L.A.P.D - G-Police +- G-POLICE - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 @@ -153,7 +156,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire +- Jazz Jackrabbit 2 +- Killing Time - Kings Quest 8 +- Kings Quest Mask of Eternity - KKND Xtreme - KKND2: Krossfire - Knights and Merchants @@ -162,6 +168,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Konung 2 - Lionheart - Legacy of the Crusader - Locomotion +- Lode Runner 2 - Majesty Gold - Majesty Gold HD - Mech Warrior 3 @@ -169,6 +176,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon +- Moto Racer +- Moto Racer 2 - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger @@ -182,11 +191,14 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pacific General +- Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Poseidon: Master of Atlantis +- Pro Pinball - Big Race USA +- Pro Pinball - Fantastic Journey - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -199,6 +211,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Sanitarium - Sega Rally - Sega Touring Car - Septerra Core @@ -210,6 +223,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc +- Sonic 3D Blast - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds @@ -234,7 +248,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Vermeer - Virtua Fighter PC - War Wind +- War Wind II - Human Onslaught - Warcraft 2 +- Warlords 3: Darklords Rising +- Warlords Battlecry +- Warlords Battlecry 2 +- Warlords Battlecry 3 - Wizardry 8 - Wizards and Warriors - Worms 2 From 0d1c635a84727185c91f1e1475b72200de838f5f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 07:17:08 +0200 Subject: [PATCH 0907/1724] remove duplicate entries --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 7dcdf93..2bb28e3 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Final fantasy VIII - Future Cop L.A.P.D - G-Police -- G-POLICE - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 @@ -158,8 +157,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 - Killing Time -- Kings Quest 8 -- Kings Quest Mask of Eternity +- Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire - Knights and Merchants From d2d0be1264c2fe09fedc592dfc19cafa626a0f25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 21:08:47 +0200 Subject: [PATCH 0908/1724] don't hook new mesa3d libs --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 4ea34b7..f25b020 100644 --- a/src/hook.c +++ b/src/hook.c @@ -516,6 +516,8 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) /* Don't hook reshade/swiftshader/mesa3d */ if (_strcmpi(mod_filename, "opengl32") == 0 || + _strcmpi(mod_filename, "libgallium_wgl") == 0 || + _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From de8f51401d91cf9ec56a95d94f84923feb1698c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 May 2024 03:34:19 +0200 Subject: [PATCH 0909/1724] Update README.md --- README.md | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2bb28e3..5aa4f9e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, 1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game -Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once. +Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once.   @@ -68,12 +68,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Alien Nations - American Conquest (Steam+GOG) - Amerzone -- Anno 1602 +- Anno 1602: Creation of a New World - Anstoss 3 -- Arcanum -- Atlantis -- Atlantis 2 -- Atlantis 3 +- Arcanum: Of Steamworks and Magick Obscura +- Atlantis: The Lost Tales +- Atlantis 2: Beyond Atlantis +- Atlantis 3: The New World - Atomic Bomberman - Atrox - Baldr Force EXE @@ -103,6 +103,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Tiberian Sun - Commandos - Commandos - Beyond The Call Of Duty +- Commandos 2 - Corsairs Gold - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland @@ -112,7 +113,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Deadlock 2 - Desperados: Wanted Dead or Alive - Diablo -- Diablo 2 + Lord of Destruction +- Diablo 2 +- Diablo 2: Lord of Destruction - Diablo: Hellfire - Disciples - Disciples 2 - Rise of the Elves @@ -148,10 +150,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hooligans: Storm over Europe - Hugo Gold - Hugo Wild River +- Icewind Dale - Icewind Dale 2 - Infantry Online - Interstate 76 -- Invictus +- Invictus: In the Shadow of Olympus - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire @@ -170,6 +173,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Majesty Gold - Majesty Gold HD - Mech Warrior 3 +- Metal Gear Solid - Megaman X4 - Moorhuhn - Moorhuhn 2 @@ -227,6 +231,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft +- StarCraft: Broodwars - Starship Titanic - Start Trek Armada - Steel Panthers: World At War @@ -241,8 +246,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown -- Uprising -- Uprising 2 +- Uprising: Join or Die +- Uprising 2: Lead and Destroy - Vermeer - Virtua Fighter PC - War Wind From 6fbdf136a972222294ad6c7f72b927ed53467d26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 05:19:55 +0200 Subject: [PATCH 0910/1724] =?UTF-8?q?add=20support=20for=20AMD=20FidelityF?= =?UTF-8?q?X=E2=84=A2=20Super=20Resolution=20(FSR),=20xBRZ-multipass=20and?= =?UTF-8?q?=20other=202-pass=20shaders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/render_ogl.h | 15 +- src/render_ogl.c | 414 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 352 insertions(+), 77 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 9c594c4..8033aad 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -5,13 +5,14 @@ #include "opengl_utils.h" #define TEXTURE_COUNT 4 -#define FBO_COUNT 1 +#define FBO_COUNT 2 typedef struct OGLRENDERER { HGLRC context; GLuint main_program; - GLuint scale_program; + GLuint shader1_program; + GLuint shader2_program; BOOL got_error; int surface_tex_width; int surface_tex_height; @@ -29,11 +30,15 @@ typedef struct OGLRENDERER GLint frame_count_uni_loc; GLuint frame_buffer_id[FBO_COUNT]; GLuint frame_buffer_tex_id[FBO_COUNT]; - GLint scale_tex_coord_attr_loc; - GLuint scale_vbos[3]; - GLuint scale_vao; + GLint shader1_tex_coord_attr_loc; + GLint shader2_tex_coord_attr_loc; + GLuint shader1_vbos[3]; + GLuint shader2_vbos[3]; + GLuint shader1_vao; + GLuint shader2_vao; BOOL use_opengl; BOOL filter_bilinear; + BOOL shader2_upscale; } OGLRENDERER; DWORD WINAPI ogl_render_main(void); diff --git a/src/render_ogl.c b/src/render_ogl.c index 7226e15..e2e9f8e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -17,7 +17,8 @@ static HGLRC ogl_create_context(HDC hdc); static void ogl_build_programs(); static void ogl_create_textures(int width, int height); static void ogl_init_main_program(); -static void ogl_init_scale_program(); +static void ogl_init_shader1_program(); +static void ogl_init_shader2_program(); static void ogl_render(); static void ogl_delete_context(HGLRC context); static BOOL ogl_texture_upload_test(); @@ -51,7 +52,8 @@ DWORD WINAPI ogl_render_main(void) ogl_build_programs(); ogl_create_textures(g_ddraw.width, g_ddraw.height); ogl_init_main_program(); - ogl_init_scale_program(); + ogl_init_shader1_program(); + ogl_init_shader2_program(); g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); @@ -131,8 +133,9 @@ static HGLRC ogl_create_context(HDC hdc) static void ogl_build_programs() { - g_ogl.main_program = g_ogl.scale_program = 0; + g_ogl.main_program = g_ogl.shader1_program = g_ogl.shader2_program = 0; + g_ogl.shader2_upscale = FALSE; BOOL core_profile = wglCreateContextAttribsARB != NULL; if (g_oglu_got_version3) @@ -151,11 +154,10 @@ static void ogl_build_programs() } BOOL bilinear = FALSE; + char shader_path[MAX_PATH] = { 0 }; if (g_ogl.main_program) { - char shader_path[MAX_PATH] = { 0 }; - strncpy(shader_path, g_config.shader, sizeof(shader_path)); shader_path[sizeof(shader_path) - 1] = '\0'; /* strncpy fix */ @@ -170,6 +172,7 @@ static void ogl_build_programs() strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || @@ -177,14 +180,19 @@ static void ogl_build_programs() g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack) { - g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); + g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); - if (!g_ogl.scale_program && + if (g_ogl.shader1_program && strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL) + { + g_ogl.shader2_upscale = TRUE; + } + + if (!g_ogl.shader1_program && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack)) { - g_ogl.scale_program = + g_ogl.shader1_program = oglu_build_program( _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : PASSTHROUGH_VERT_SHADER, @@ -207,6 +215,16 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } + if (g_ogl.shader1_program) + { + if (strlen(shader_path) <= sizeof(shader_path) - 8) + { + strcat(shader_path, ".pass1"); + + g_ogl.shader2_program = oglu_build_program_from_file(shader_path, core_profile); + } + } + g_ogl.filter_bilinear = strstr(g_config.shader, "bilinear.glsl") != NULL || bilinear; } @@ -225,11 +243,14 @@ static void ogl_build_programs() static void ogl_create_textures(int width, int height) { + int w = g_ogl.shader2_program ? max(width, g_ddraw.render.viewport.width) : width; + int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; + g_ogl.surface_tex_width = - width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; + w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w <= 16384 ? 16384 : w; g_ogl.surface_tex_height = - height <= 512 ? 512 : height <= 1024 ? 1024 : height <= 2048 ? 2048 : height <= 4096 ? 4096 : height; + h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h <= 16384 ? 16384 : h; g_ogl.surface_tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); @@ -398,7 +419,7 @@ static void ogl_init_main_program() glGenBuffers(3, g_ogl.main_vbos); - if (g_ogl.scale_program) + if (g_ogl.shader1_program) { glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); static const GLfloat vertex_coord[] = { @@ -477,53 +498,78 @@ static void ogl_init_main_program() } } -static void ogl_init_scale_program() +static void ogl_init_shader1_program() { - if (!g_ogl.scale_program) + if (!g_ogl.shader1_program) return; - glUseProgram(g_ogl.scale_program); + glUseProgram(g_ogl.shader1_program); - GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "VertexCoord"); - g_ogl.scale_tex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "TexCoord"); - g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.scale_program, "FrameCount"); + GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); + g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); + g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); - glGenBuffers(3, g_ogl.scale_vbos); + glGenBuffers(3, g_ogl.shader1_vbos); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); - static const GLfloat vertext_coord[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader2_program) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); + static const GLfloat vertext_coord[] = { + -1.0f,-1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + 0.0f, g_ogl.scale_h, + g_ogl.scale_w, g_ogl.scale_h, + g_ogl.scale_w, 0.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + else + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); + static const GLfloat vertext_coord[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glGenVertexArrays(1, &g_ogl.scale_vao); - glBindVertexArray(g_ogl.scale_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); + glGenVertexArrays(1, &g_ogl.shader1_vao); + glBindVertexArray(g_ogl.shader1_vao); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.scale_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.scale_vbos[2]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]); static const GLushort indices[] = { 0, 1, 2, @@ -542,23 +588,23 @@ static void ogl_init_scale_program() output_size[0] = (float)g_ddraw.render.viewport.width; output_size[1] = (float)g_ddraw.render.viewport.height; - GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize"); + GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); if (loc != -1) glUniform2fv(loc, 1, output_size); - loc = glGetUniformLocation(g_ogl.scale_program, "TextureSize"); + loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); if (loc != -1) glUniform2fv(loc, 1, texture_size); - loc = glGetUniformLocation(g_ogl.scale_program, "InputSize"); + loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); if (loc != -1) glUniform2fv(loc, 1, input_size); - loc = glGetUniformLocation(g_ogl.scale_program, "FrameDirection"); + loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.scale_program, "Texture"); + loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); if (loc != -1) glUniform1i(loc, 0); @@ -568,12 +614,14 @@ static void ogl_init_scale_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.scale_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - for (int i = 0; i < FBO_COUNT; i++) + int fbo_count = g_ogl.shader2_program ? 2 : 1; + + for (int i = 0; i < fbo_count; i++) { glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[i]); @@ -603,16 +651,24 @@ static void ogl_init_scale_program() if (glDeleteFramebuffers) glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); - if (glDeleteProgram) - glDeleteProgram(g_ogl.scale_program); + glUseProgram(0); - g_ogl.scale_program = 0; + if (glDeleteProgram) + { + glDeleteProgram(g_ogl.shader1_program); + + if (g_ogl.shader2_program) + glDeleteProgram(g_ogl.shader2_program); + } + + g_ogl.shader1_program = 0; + g_ogl.shader2_program = 0; if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); + glDeleteBuffers(3, g_ogl.shader1_vbos); if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); + glDeleteVertexArrays(1, &g_ogl.shader1_vao); if (g_ogl.main_program) { @@ -652,6 +708,110 @@ static void ogl_init_scale_program() glBindFramebuffer(GL_FRAMEBUFFER, 0); } +static void ogl_init_shader2_program() +{ + if (!g_ogl.shader1_program || !g_ogl.shader2_program) + return; + + glUseProgram(g_ogl.shader2_program); + + GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); + g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); + + glGenBuffers(3, g_ogl.shader2_vbos); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); + GLfloat vertex_coord[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord), vertex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + float scale_w = g_ogl.shader2_upscale ? g_ogl.scale_w : (float)g_ddraw.render.viewport.width / g_ogl.surface_tex_width; + float scale_h = g_ogl.shader2_upscale ? g_ogl.scale_h : (float)g_ddraw.render.viewport.height / g_ogl.surface_tex_height; + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + scale_w, 0.0f, + scale_w, scale_h, + 0.0f, scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glGenVertexArrays(1, &g_ogl.shader2_vao); + glBindVertexArray(g_ogl.shader2_vao); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); + glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(vertex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); + static const GLushort indices[] = + { + 0, 1, 2, + 0, 2, 3, + }; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + glBindVertexArray(0); + + float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; + + input_size[0] = g_ogl.shader2_upscale ? (float)g_ddraw.width : (float)g_ddraw.render.viewport.width; + input_size[1] = g_ogl.shader2_upscale ? (float)g_ddraw.height : (float)g_ddraw.render.viewport.height; + texture_size[0] = (float)g_ogl.surface_tex_width; + texture_size[1] = (float)g_ogl.surface_tex_height; + output_size[0] = (float)g_ddraw.render.viewport.width; + output_size[1] = (float)g_ddraw.render.viewport.height; + + GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); + if (loc != -1) + glUniform2fv(loc, 1, output_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); + if (loc != -1) + glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection"); + if (loc != -1) + glUniform1i(loc, 1); + + loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); + if (loc != -1) + glUniform1i(loc, 0); + + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); + if (loc != -1) + glUniform1i(loc, 1); + + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + + const float mvp_matrix[16] = { + 1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1, + }; + glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); +} + static void ogl_render() { BOOL needs_update = FALSE; @@ -820,19 +980,51 @@ static void ogl_render() if (scale_changed) { - if (g_ogl.scale_program && g_ogl.main_program) + if (g_ogl.shader2_upscale && g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) { - glBindVertexArray(g_ogl.scale_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - GLfloat texCoord[] = { + glBindVertexArray(g_ogl.shader2_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + GLfloat tex_coord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, g_ogl.scale_h, 0.0f, g_ogl.scale_h, }; - glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.scale_tex_coord_attr_loc); + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + else if (g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) + { + glBindVertexArray(g_ogl.shader1_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + 0.0f, g_ogl.scale_h, + g_ogl.scale_w, g_ogl.scale_h, + g_ogl.scale_w, 0.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + else if (g_ogl.shader1_program && g_ogl.main_program) + { + glBindVertexArray(g_ogl.shader1_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -840,13 +1032,13 @@ static void ogl_render() { glBindVertexArray(g_ogl.main_vao); glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat texCoord[] = { + GLfloat tex_coord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, g_ogl.scale_h, 0.0f, g_ogl.scale_h, }; - glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -865,7 +1057,73 @@ static void ogl_render() glActiveTexture(GL_TEXTURE0); } - if (g_ogl.scale_program && g_ogl.main_program) + if (g_ogl.shader1_program && g_ogl.shader2_program && g_ogl.main_program) + { + /* draw surface into framebuffer */ + glUseProgram(g_ogl.main_program); + + glViewport(0, 0, g_ddraw.width, g_ddraw.height); + + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); + + glBindVertexArray(g_ogl.main_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + + /* apply shader1 */ + + if (!g_ogl.shader2_upscale) + { + glViewport(0, 0, g_ddraw.render.viewport.width, g_ddraw.render.viewport.height); + } + + glUseProgram(g_ogl.shader1_program); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[1]); + + glBindVertexArray(g_ogl.shader1_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + /* apply shader2 */ + + if (g_ddraw.child_window_exists) + { + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); + } + else + { + glViewport( + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); + } + + glUseProgram(g_ogl.shader2_program); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[1]); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + + glBindVertexArray(g_ogl.shader2_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + } + else if (g_ogl.shader1_program && g_ogl.main_program) { /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); @@ -898,7 +1156,7 @@ static void ogl_render() /* apply filter */ - glUseProgram(g_ogl.scale_program); + glUseProgram(g_ogl.shader1_program); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); @@ -906,7 +1164,7 @@ static void ogl_render() if (g_ogl.frame_count_uni_loc != -1) glUniform1i(g_ogl.frame_count_uni_loc, frames++); - glBindVertexArray(g_ogl.scale_vao); + glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); } @@ -955,18 +1213,27 @@ static void ogl_delete_context(HGLRC context) if (glUseProgram) glUseProgram(0); - if (g_ogl.scale_program) + if (g_ogl.shader1_program) { glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); + glDeleteBuffers(3, g_ogl.shader1_vbos); if (glDeleteFramebuffers) glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); + glDeleteVertexArrays(1, &g_ogl.shader1_vao); + } + + if (g_ogl.shader2_program) + { + if (glDeleteBuffers) + glDeleteBuffers(3, g_ogl.shader2_vbos); + + if (glDeleteVertexArrays) + glDeleteVertexArrays(1, &g_ogl.shader2_vao); } if (glDeleteProgram) @@ -974,8 +1241,11 @@ static void ogl_delete_context(HGLRC context) if (g_ogl.main_program) glDeleteProgram(g_ogl.main_program); - if (g_ogl.scale_program) - glDeleteProgram(g_ogl.scale_program); + if (g_ogl.shader1_program) + glDeleteProgram(g_ogl.shader1_program); + + if (g_ogl.shader2_program) + glDeleteProgram(g_ogl.shader2_program); } if (g_oglu_got_version3) From ec48aac4f9a06fd9fe4d960b9ea89117e95aa787 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 06:20:13 +0200 Subject: [PATCH 0911/1724] add missing frame counter --- inc/render_ogl.h | 3 ++- src/render_ogl.c | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 8033aad..2547ff3 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -27,7 +27,8 @@ typedef struct OGLRENDERER GLint main_vertex_coord_attr_loc; GLuint main_vbos[3]; GLuint main_vao; - GLint frame_count_uni_loc; + GLint shader1_frame_count_uni_loc; + GLint shader2_frame_count_uni_loc; GLuint frame_buffer_id[FBO_COUNT]; GLuint frame_buffer_tex_id[FBO_COUNT]; GLint shader1_tex_coord_attr_loc; diff --git a/src/render_ogl.c b/src/render_ogl.c index e2e9f8e..f3a894c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -507,7 +507,7 @@ static void ogl_init_shader1_program() GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); - g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); glGenBuffers(3, g_ogl.shader1_vbos); @@ -717,6 +717,7 @@ static void ogl_init_shader2_program() GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); + g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount"); glGenBuffers(3, g_ogl.shader2_vbos); @@ -1059,6 +1060,9 @@ static void ogl_render() if (g_ogl.shader1_program && g_ogl.shader2_program && g_ogl.main_program) { + static int frames = 0; + frames++; + /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); @@ -1088,6 +1092,9 @@ static void ogl_render() glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[1]); + if (g_ogl.shader1_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames); + glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); @@ -1116,6 +1123,9 @@ static void ogl_render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + if (g_ogl.shader2_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader2_frame_count_uni_loc, frames); + glBindVertexArray(g_ogl.shader2_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); @@ -1161,8 +1171,8 @@ static void ogl_render() glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); static int frames = 1; - if (g_ogl.frame_count_uni_loc != -1) - glUniform1i(g_ogl.frame_count_uni_loc, frames++); + if (g_ogl.shader1_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames++); glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); From 4d9657cbc89d131345cd2f33f379abf520e125e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 07:01:07 +0200 Subject: [PATCH 0912/1724] increase dropdown count --- config/ConfigFormUnit.dfm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index a69b94f..1805a5d 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3249,7 +3249,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 10 + DropDownCount = 13 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 From 2b7699ffdf0bb6334734c5f03401708bc79e8778 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 07:23:09 +0200 Subject: [PATCH 0913/1724] add fsr to known upscalers list --- src/render_ogl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index f3a894c..5ff4dd8 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -169,6 +169,7 @@ static void ogl_build_programs() /* detect common upscaling shaders and disable them if no upscaling is required */ BOOL is_upscaler = + strstr(g_config.shader, "fsr.glsl") != NULL || strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || From 43d4adf282ed859f6aecf0cf488e8b9739f68bb4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 08:47:54 +0200 Subject: [PATCH 0914/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d5fef35..07aba87 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6b1f08e10882241e26b939ee14425b66a93536ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 May 2024 06:02:21 +0200 Subject: [PATCH 0915/1724] export DDGetProcAddress so fan patched games have access to the real GetProcAddress --- exports.def | 1 + src/dllmain.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/exports.def b/exports.def index ff672bc..44bfcd8 100644 --- a/exports.def +++ b/exports.def @@ -21,3 +21,4 @@ EXPORTS GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA DDIsWindowed + DDGetProcAddress diff --git a/src/dllmain.c b/src/dllmain.c index 108c9e0..637f5e5 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -147,6 +147,11 @@ BOOL DDIsWindowed() return g_config.windowed && !g_config.fullscreen; } +FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) +{ + return real_GetProcAddress(hModule, lpProcName); +} + HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); From 4e1b52b97e26bb9182d2da426b719d4d709324b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:03:22 +0200 Subject: [PATCH 0916/1724] #311 add preset for Nancy Drew: Message in a Haunted Mansion --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index fdabd7c..a45fc9d 100644 --- a/src/config.c +++ b/src/config.c @@ -879,6 +879,12 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" + "; Nancy Drew: Message in a Haunted Mansion\n" + "[Game/3]\n" + "checkfile=.\\DataFiles\\ASABYBD.cal\n" + "limit_bltfast=true\n" + "maxgameticks=600\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From e3b05ea108f70cbd7477565b802b3ee37cc0a12b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:05:20 +0200 Subject: [PATCH 0917/1724] update supported games in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5aa4f9e..8458be8 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger +- Nancy Drew: Message in a Haunted Mansion +- Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From b55593cb4cbeb4d2eb9ecd5e3087a76b61e481e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:55:23 +0200 Subject: [PATCH 0918/1724] #311 fix fullscreen issues with opengl/gdi in nancy drew games --- src/dd.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dd.c b/src/dd.c index bd54438..c8fa433 100644 --- a/src/dd.c +++ b/src/dd.c @@ -916,6 +916,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_CLIENTEDGE)) + { + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); + } + if (IsWine()) { real_SetWindowLongA( @@ -1019,6 +1026,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_CLIENTEDGE)) + { + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); + } + BOOL d3d9_active = FALSE; if (g_ddraw.renderer == d3d9_render_main) From accfd91f984e85387ba6efe47e2ef7b5fced1359 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:55:36 +0200 Subject: [PATCH 0919/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 07aba87..ee7d471 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 07f11bf57795ebdc0e7dd1928acafcdcc699dec2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 07:03:58 +0200 Subject: [PATCH 0920/1724] keep commented out debug code --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index c8fa433..c183ecc 100644 --- a/src/dd.c +++ b/src/dd.c @@ -991,6 +991,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + //TRACE(" GetWindowLongA style=%p, exstyle=%p\n", real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + int menu_height = 0; if (GetMenu(g_ddraw.hwnd)) From c18223e80adf5f605327ae694c0a6f7b59b36015 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 04:38:10 +0200 Subject: [PATCH 0921/1724] #292 fix mousei input issues in diablo 1 --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6b229ed..b2c4a5f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1353,6 +1353,7 @@ HWND WINAPI fake_CreateWindowExA( g_ddraw.bnet_active = TRUE; mouse_unlock(); + ReleaseCapture(); } POINT pt = { 0, 0 }; From 418df164469da393a424deb34ecf94438bb5fd22 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 04:55:27 +0200 Subject: [PATCH 0922/1724] fix mousei input issues in diablo 1 --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7ab3324..faf6514 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -734,6 +734,7 @@ HWND WINAPI fake_CreateWindowExA( g_ddraw->bnet_active = TRUE; SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL); mouse_unlock(); + ReleaseCapture(); } POINT pt = { 0, 0 }; From 06290bbe9db8267d4fb6c57a78daecc6ee402c9f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 06:59:17 +0200 Subject: [PATCH 0923/1724] remove balls of steel from supported games list --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8458be8..2786201 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 -- Balls Of Steel - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) From 504c2eb1c5ac88d4f7fa417e3603260a50a4c9f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 23:23:27 +0200 Subject: [PATCH 0924/1724] add new setting to fake current display mode --- inc/config.h | 2 +- src/config.c | 5 +++-- src/dd.c | 57 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/inc/config.h b/inc/config.h index ec737eb..33b5b7c 100644 --- a/inc/config.h +++ b/inc/config.h @@ -76,6 +76,7 @@ typedef struct CNCDDRAWCONFIG int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; + char fake_mode[128]; /* Hotkeys */ @@ -97,7 +98,6 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; - BOOL vermeer_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a45fc9d..93c0c67 100644 --- a/src/config.c +++ b/src/config.c @@ -89,6 +89,7 @@ void cfg_load() GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); + GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); /* Hotkeys */ @@ -107,7 +108,6 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.vermeer_hack, "vermeer_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -302,6 +302,7 @@ static void cfg_create_ini() "min_font_size=0\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" + ";fake_mode=640x480x32\n" "\n" "\n" "\n" @@ -1055,7 +1056,7 @@ static void cfg_create_ini() "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" - "vermeer_hack=true\n" + "fake_mode=640x480x32\n" "\n" "; Wizardry 8\n" "[Wiz8]\n" diff --git a/src/dd.c b/src/dd.c index c183ecc..a305890 100644 --- a/src/dd.c +++ b/src/dd.c @@ -476,41 +476,56 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) memset(lpDDSurfaceDesc, 0, size); + unsigned long width = 1024; + unsigned long height = 768; + unsigned long bpp = 16; + + if (g_ddraw.width) + { + width = g_ddraw.width; + height = g_ddraw.height; + bpp = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); + bpp = strtoul(e + 1, &e, 0); + } + lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = bpp; lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwHeight = g_ddraw.height ? g_ddraw.height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw.width ? g_ddraw.width : 1024; + lpDDSurfaceDesc->dwWidth = width; + lpDDSurfaceDesc->dwHeight = height; - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - - if (g_ddraw.bpp == 32 || g_config.vermeer_hack) + if (bpp == 32) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } - else if (g_ddraw.bpp != 8) + else if (bpp == 8) + { + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + } + else { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } return DD_OK; @@ -1298,9 +1313,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (g_config.vermeer_hack) + if (g_config.fake_mode[0]) { - dd_SetDisplayMode(640, 480, 16, 0); + char* e = &g_config.fake_mode[0]; + + unsigned long width = strtoul(e, &e, 0); + unsigned long height = strtoul(e + 1, &e, 0); + unsigned long bpp = strtoul(e + 1, &e, 0); + + dd_SetDisplayMode(width, height, bpp, 0); } } From 0cf0533654f4089e6ab8b9776718f5a9c6605b96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 23:51:48 +0200 Subject: [PATCH 0925/1724] #313 Add partial support for American Girls Dress Designer (Fullscreen only, no upscaling) --- inc/utils.h | 1 + src/config.c | 4 ++++ src/dd.c | 17 ++++++++++++++--- src/utils.c | 8 ++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 253ec11..2263142 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -17,6 +17,7 @@ void util_toggle_maximize(); void util_toggle_fullscreen(); BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle); void util_set_window_rect(int x, int y, int width, int height, UINT flags); +BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam); BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lParam); BOOL util_detect_low_res_screen(); diff --git a/src/config.c b/src/config.c index 93c0c67..00f65c9 100644 --- a/src/config.c +++ b/src/config.c @@ -387,6 +387,10 @@ static void cfg_create_ini() "guard_lines=300\n" "minfps=-2\n" "\n" + "; American Girls Dress Designer\n" + "[Dress Designer]\n" + "fake_mode=640x480x32\n" + "\n" "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" diff --git a/src/dd.c b/src/dd.c index a305890..599e8c4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1166,12 +1166,23 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { dbg_dump_scl_flags(dwFlags); - if (hwnd == NULL) + if (!hwnd) { - return DD_OK; + if (!g_ddraw.hwnd && g_config.fake_mode[0]) + { + EnumThreadWindows(GetCurrentThreadId(), (WNDENUMPROC)util_enum_thread_wnd_proc, 0); + hwnd = g_ddraw.hwnd; + + if (!hwnd) + return DD_OK; + } + else + { + return DD_OK; + } } - if (g_ddraw.hwnd == NULL) + if (!g_ddraw.hwnd) { g_ddraw.hwnd = hwnd; } diff --git a/src/utils.c b/src/utils.c index 0a87f08..6013650 100644 --- a/src/utils.c +++ b/src/utils.c @@ -551,6 +551,14 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) } } +BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) +{ + if (!g_ddraw.hwnd) + g_ddraw.hwnd = hwnd; + + return FALSE; +} + BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; From a3afe9e5982d50d6b89e8f0d8a3bb89f5a28be7a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 07:12:33 +0200 Subject: [PATCH 0926/1724] fix crash in JazzJackrabbit 2 --- src/ddsurface.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8b6ae1d..bfc2cc3 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -826,6 +826,17 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps return DD_OK; } + if (lpDdsCaps->dwCaps & DDSCAPS_FLIP) + { + if (This->backbuffer) + { + IDirectDrawSurface_AddRef(This->backbuffer); + *lpDDsurface = This->backbuffer; + } + + return DD_OK; + } + return DDERR_NOTFOUND; } From c540a1e45c23e2c11c635d7075bd3016f4032f91 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:20:14 +0200 Subject: [PATCH 0927/1724] #314 add preset for JazzJackrabbit2 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 00f65c9..4675db6 100644 --- a/src/config.c +++ b/src/config.c @@ -749,6 +749,12 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Jazz Jackrabbit 2 plus\n" + "[Jazz2]\n" + "keytogglefullscreen=0x08\n" + "custom_width=800\n" + "custom_height=450\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From eed6edfa4e961dbe6869db5547be4545a46558e9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:39:27 +0200 Subject: [PATCH 0928/1724] add preset for nonplus jjr2 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 4675db6..f00039b 100644 --- a/src/config.c +++ b/src/config.c @@ -755,6 +755,12 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Jazz Jackrabbit 2 plus\n" + "[Jazz2_NonPlus]\n" + "keytogglefullscreen=0x08\n" + "custom_width=800\n" + "custom_height=450\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From 1d4403db57b1d3a1983c90ed7617c8c6603f9846 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:41:33 +0200 Subject: [PATCH 0929/1724] fix name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f00039b..94bcdc6 100644 --- a/src/config.c +++ b/src/config.c @@ -755,7 +755,7 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" - "; Jazz Jackrabbit 2 plus\n" + "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" "keytogglefullscreen=0x08\n" "custom_width=800\n" From c1a14a31d533a9023b463554296c553d9a492d66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 02:26:46 +0200 Subject: [PATCH 0930/1724] add new setting to enable (very bugged) resize in wine --- inc/config.h | 1 + src/config.c | 2 ++ src/dd.c | 2 +- src/wndproc.c | 13 ++++++------- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index 33b5b7c..135f0df 100644 --- a/inc/config.h +++ b/inc/config.h @@ -77,6 +77,7 @@ typedef struct CNCDDRAWCONFIG BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; + BOOL wine_allow_resize; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 94bcdc6..5af9fa0 100644 --- a/src/config.c +++ b/src/config.c @@ -90,6 +90,7 @@ void cfg_load() GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); + GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); /* Hotkeys */ @@ -303,6 +304,7 @@ static void cfg_create_ini() "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" + "wine_allow_resize=false\n" "\n" "\n" "\n" diff --git a/src/dd.c b/src/dd.c index 599e8c4..41aa9aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -938,7 +938,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (IsWine()) + if (!g_config.wine_allow_resize && IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, diff --git a/src/wndproc.c b/src/wndproc.c index 69e9d4b..4f53765 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -431,15 +431,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - /* - else if (g_ddraw.wine) + else if (!in_size_move && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) { - WindowRect.right = LOWORD(lParam); - WindowRect.bottom = HIWORD(lParam); - if (WindowRect.right != g_ddraw.render.width || WindowRect.bottom != g_ddraw.render.height) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp); + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); + + if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } - */ } } From 08583924842c92ac1d04405147cc1d3499ffd4e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 04:55:55 +0200 Subject: [PATCH 0931/1724] simplify GetAttachedSurface --- src/ddsurface.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bfc2cc3..5471417 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -810,29 +810,13 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, IDirectDrawSurfaceImpl** lpDDsurface) { - if (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER) - { - if (This->backbuffer) - { - IDirectDrawSurface_AddRef(This->backbuffer); - *lpDDsurface = This->backbuffer; - } - else - { - IDirectDrawSurface_AddRef(This); - *lpDDsurface = This; - } + if (!lpDdsCaps || !lpDDsurface) + return DDERR_INVALIDPARAMS; - return DD_OK; - } - - if (lpDdsCaps->dwCaps & DDSCAPS_FLIP) + if (This->backbuffer && (This->backbuffer->caps & lpDdsCaps->dwCaps) == lpDdsCaps->dwCaps) { - if (This->backbuffer) - { - IDirectDrawSurface_AddRef(This->backbuffer); - *lpDDsurface = This->backbuffer; - } + IDirectDrawSurface_AddRef(This->backbuffer); + *lpDDsurface = This->backbuffer; return DD_OK; } From 283510f14ca94dd878deb5f612b86e40c4f6ddd1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 05:19:12 +0200 Subject: [PATCH 0932/1724] bump vesion --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index ee7d471..8e7b0a0 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 4 +#define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 99e0cf8b4adb4a423b0f1fb873bd077ce439b266 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 22:16:32 +0200 Subject: [PATCH 0933/1724] log CreateWindowExA calls --- inc/debug.h | 1 + src/debug.c | 139 +++++++++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 20 +++++++ 3 files changed, 160 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index f7c81d1..f16a944 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -13,6 +13,7 @@ void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); void dbg_printf(const char* fmt, ...); void dbg_init(); +void dbg_dump_wnd_styles(DWORD style, DWORD exstyle); void dbg_dump_swp_flags(DWORD flags); void dbg_dump_ddp_flags(DWORD flags); void dbg_dump_scl_flags(DWORD flags); diff --git a/src/debug.c b/src/debug.c index a25916a..12f9ca3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -278,6 +278,145 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } +void dbg_dump_wnd_styles(DWORD style, DWORD exstyle) +{ +#ifdef _DEBUG + if (style & WS_BORDER) { + TRACE(" WS_BORDER\n"); + } + if (style & WS_CAPTION) { + TRACE(" WS_CAPTION\n"); + } + if (style & WS_CHILD) { + TRACE(" WS_CHILD\n"); + } + if (style & WS_CHILDWINDOW) { + TRACE(" WS_CHILDWINDOW\n"); + } + if (style & WS_CLIPCHILDREN) { + TRACE(" WS_CLIPCHILDREN\n"); + } + if (style & WS_CLIPSIBLINGS) { + TRACE(" WS_CLIPSIBLINGS\n"); + } + if (style & WS_DISABLED) { + TRACE(" WS_DISABLED\n"); + } + if (style & WS_DLGFRAME) { + TRACE(" WS_DLGFRAME\n"); + } + if (style & WS_GROUP) { + TRACE(" WS_GROUP\n"); + } + if (style & WS_HSCROLL) { + TRACE(" WS_HSCROLL\n"); + } + if (style & WS_ICONIC) { + TRACE(" WS_ICONIC\n"); + } + if (style & WS_MAXIMIZE) { + TRACE(" WS_MAXIMIZE\n"); + } + if (style & WS_MAXIMIZEBOX) { + TRACE(" WS_MAXIMIZEBOX\n"); + } + if (style & WS_MINIMIZE) { + TRACE(" WS_MINIMIZE\n"); + } + if (style & WS_MINIMIZEBOX) { + TRACE(" WS_MINIMIZEBOX\n"); + } + if (style & WS_POPUP) { + TRACE(" WS_POPUP\n"); + } + if (style & WS_SIZEBOX) { + TRACE(" WS_SIZEBOX\n"); + } + if (style & WS_SYSMENU) { + TRACE(" WS_SYSMENU\n"); + } + if (style & WS_TABSTOP) { + TRACE(" WS_TABSTOP\n"); + } + if (style & WS_THICKFRAME) { + TRACE(" WS_THICKFRAME\n"); + } + if (style & WS_VISIBLE) { + TRACE(" WS_VISIBLE\n"); + } + if (style & WS_VSCROLL) { + TRACE(" WS_VSCROLL\n"); + } + + if (exstyle & WS_EX_ACCEPTFILES) { + TRACE(" WS_EX_ACCEPTFILES\n"); + } + if (exstyle & WS_EX_APPWINDOW) { + TRACE(" WS_EX_APPWINDOW\n"); + } + if (exstyle & WS_EX_CLIENTEDGE) { + TRACE(" WS_EX_CLIENTEDGE\n"); + } + if (exstyle & WS_EX_COMPOSITED) { + TRACE(" WS_EX_COMPOSITED\n"); + } + if (exstyle & WS_EX_CONTEXTHELP) { + TRACE(" WS_EX_CONTEXTHELP\n"); + } + if (exstyle & WS_EX_CONTROLPARENT) { + TRACE(" WS_EX_CONTROLPARENT\n"); + } + if (exstyle & WS_EX_DLGMODALFRAME) { + TRACE(" WS_EX_DLGMODALFRAME\n"); + } + if (exstyle & WS_EX_LAYERED) { + TRACE(" WS_EX_LAYERED\n"); + } + if (exstyle & WS_EX_LAYOUTRTL) { + TRACE(" WS_EX_LAYOUTRTL\n"); + } + if (exstyle & WS_EX_LEFTSCROLLBAR) { + TRACE(" WS_EX_LEFTSCROLLBAR\n"); + } + if (exstyle & WS_EX_MDICHILD) { + TRACE(" WS_EX_MDICHILD\n"); + } + if (exstyle & WS_EX_NOACTIVATE) { + TRACE(" WS_EX_NOACTIVATE\n"); + } + if (exstyle & WS_EX_NOINHERITLAYOUT) { + TRACE(" WS_EX_NOINHERITLAYOUT\n"); + } + if (exstyle & WS_EX_NOPARENTNOTIFY) { + TRACE(" WS_EX_NOPARENTNOTIFY\n"); + } + //if (exstyle & WS_EX_NOREDIRECTIONBITMAP) { + // TRACE(" WS_EX_NOREDIRECTIONBITMAP\n"); + //} + if (exstyle & WS_EX_RIGHT) { + TRACE(" WS_EX_RIGHT\n"); + } + if (exstyle & WS_EX_RTLREADING) { + TRACE(" WS_EX_RTLREADING\n"); + } + if (exstyle & WS_EX_STATICEDGE) { + TRACE(" WS_EX_STATICEDGE\n"); + } + if (exstyle & WS_EX_TOOLWINDOW) { + TRACE(" WS_EX_TOOLWINDOW\n"); + } + if (exstyle & WS_EX_TOPMOST) { + TRACE(" WS_EX_TOPMOST\n"); + } + if (exstyle & WS_EX_TRANSPARENT) { + TRACE(" WS_EX_TRANSPARENT\n"); + } + if (exstyle & WS_EX_WINDOWEDGE) { + TRACE(" WS_EX_WINDOWEDGE\n"); + } +#endif +} + void dbg_dump_swp_flags(DWORD flags) { #ifdef _DEBUG diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b2c4a5f..737b95b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1285,6 +1285,26 @@ HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { + TRACE("CreateWindowExA(" + "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " + "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", + dwExStyle, + lpClassName, + lpWindowName, + dwStyle, + X, + Y, + nWidth, + nHeight, + hWndParent, + hMenu, + hInstance, + lpParam); + + TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd); + + dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && From 17a4dde30a12f1ff170469ef54e9ed7f363ccdf1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 03:30:51 +0200 Subject: [PATCH 0934/1724] log return value of CreateWindowExA --- src/winapi_hooks.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 737b95b..b1e6754 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1285,7 +1285,7 @@ HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { - TRACE("CreateWindowExA(" + TRACE("-> CreateWindowExA(" "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", dwExStyle, @@ -1404,7 +1404,7 @@ HWND WINAPI fake_CreateWindowExA( } } - return real_CreateWindowExA( + HWND hwnd = real_CreateWindowExA( dwExStyle, lpClassName, lpWindowName, @@ -1417,6 +1417,10 @@ HWND WINAPI fake_CreateWindowExA( hMenu, hInstance, lpParam); + + TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd); + + return hwnd; } HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv) From 0bce13b314232813474b1ccc1b4c4c7f5bbbc75b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 03:36:49 +0200 Subject: [PATCH 0935/1724] add Barbie(tm) Beach Vacation(tm) to supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2786201..edbbf29 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Atlantis 3: The New World - Atomic Bomberman - Atrox +- Barbie(tm) Beach Vacation(tm) - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 From 2f2367e5b5602b023b95394e5ed37ccd988ec274 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 07:29:30 +0200 Subject: [PATCH 0936/1724] hook BitBlt --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 3 +++ src/ddsurface.c | 4 ++-- src/hook.c | 2 ++ src/utils.c | 2 +- src/winapi_hooks.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ebb7c01..ae3a404 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -45,6 +45,7 @@ typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND); typedef HWND(WINAPI* GETFOREGROUNDWINDOWPROC)(); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); +typedef BOOL(WINAPI* BITBLTPROC)(HDC, int, int, int, int, HDC, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); @@ -97,6 +98,7 @@ extern SHOWWINDOWPROC real_ShowWindow; extern GETTOPWINDOWPROC real_GetTopWindow; extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow; extern STRETCHBLTPROC real_StretchBlt; +extern BITBLTPROC real_BitBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 839eccc..d7e6efe 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -40,6 +40,9 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); +BOOL WINAPI fake_BitBlt( + HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop); + int WINAPI fake_SetDIBitsToDevice( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); diff --git a/src/ddsurface.c b/src/ddsurface.c index 5471417..30377ae 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -573,11 +573,11 @@ HRESULT dds_BltFast( } else { - BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + real_BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); } /* - BitBlt( + real_BitBlt( dst_dc, dwX, dwY, diff --git a/src/hook.c b/src/hook.c index f25b020..1b2efb3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -42,6 +42,7 @@ SHOWWINDOWPROC real_ShowWindow = ShowWindow; GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow; GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; +BITBLTPROC real_BitBlt = BitBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; @@ -127,6 +128,7 @@ HOOKLIST g_hook_hooklist[] = { "gdi32.dll", { + { "BitBlt", (PROC)fake_BitBlt, (PROC*)&real_BitBlt, HOOK_SKIP_2 }, { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, diff --git a/src/utils.c b/src/utils.c index 6013650..4d29bfb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -625,7 +625,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2); - BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); + real_BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); ReleaseDC(hwnd, dst_dc); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b1e6754..c530b43 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -823,6 +823,48 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +BOOL WINAPI fake_BitBlt( + HDC hdc, + int x, + int y, + int cx, + int cy, + HDC hdcSrc, + int x1, + int y1, + DWORD rop) +{ + if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) + { + HDC primary_dc; + dds_GetDC(g_ddraw.primary, &primary_dc); + + if (primary_dc) + { + int result = + real_BitBlt( + primary_dc, + x, + y, + cx, + cy, + hdcSrc, + x1, + y1, + rop); + + dds_ReleaseDC(g_ddraw.primary, primary_dc); + + return result; + } + } + } + + return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop); +} + int WINAPI fake_SetDIBitsToDevice( HDC hdc, int xDest, From 10ec35d458327252f0860091a199863fbca87523 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 02:02:00 +0200 Subject: [PATCH 0937/1724] fix alignment --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 12f9ca3..c9b5d1f 100644 --- a/src/debug.c +++ b/src/debug.c @@ -282,7 +282,7 @@ void dbg_dump_wnd_styles(DWORD style, DWORD exstyle) { #ifdef _DEBUG if (style & WS_BORDER) { - TRACE(" WS_BORDER\n"); + TRACE(" WS_BORDER\n"); } if (style & WS_CAPTION) { TRACE(" WS_CAPTION\n"); From 5bbe1299d2f7d172ba1c582c6e05d2688cfb1eaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:08:38 +0200 Subject: [PATCH 0938/1724] add test patches for Clue Finders 4th --- inc/wndproc.h | 1 + src/dd.c | 4 +++- src/ddclipper.c | 28 ++++++++++++++++++++++++---- src/ddsurface.c | 14 +++++++++++--- src/wndproc.c | 5 +++++ 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index 3cb6a97..f066a04 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,6 +9,7 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 +#define WM_ACTIVATEAPP_DDRAW WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/dd.c b/src/dd.c index 41aa9aa..709414f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -921,7 +921,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); @@ -1003,6 +1003,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); + + real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP_DDRAW, 1, 0); } else { diff --git a/src/ddclipper.c b/src/ddclipper.c index 28fc283..72a87e1 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -66,25 +66,45 @@ HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - /* Keep this commented out until we found a game that actually needs it if (This->hwnd) return DDERR_CLIPPERISUSINGHWND; if (This->region) DeleteObject(This->region); - if (lpClipList) + if (lpClipList && lpClipList->rdh.nCount >= 1) { - This->region = ExtCreateRegion(NULL, 0, lpClipList); + RECT* rc = (RECT*)lpClipList->Buffer; + + This->region = CreateRectRgnIndirect(&rc[0]); if (!This->region) return DDERR_INVALIDCLIPLIST; + + for (int i = 1; i < lpClipList->rdh.nCount; ++i) + { + HRGN region = CreateRectRgnIndirect(&rc[i]); + + if (!region) + return DDERR_INVALIDCLIPLIST; + + if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) + { + DeleteObject(region); + DeleteObject(This->region); + This->region = NULL; + + return DDERR_INVALIDCLIPLIST; + } + + DeleteObject(region); + } } else { This->region = NULL; } - */ + return DD_OK; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 30377ae..7d06d6c 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -86,12 +86,13 @@ HRESULT dds_Blt( BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - /* Disable this for now (needs more testing) if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size))) + HRESULT result = IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size); + + if (SUCCEEDED(result)) { RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); @@ -122,8 +123,15 @@ HRESULT dds_Blt( return DD_OK; } } + else if (result == DDERR_NOCLIPLIST) + { + return DDERR_NOCLIPLIST; + } + else + { + return DDERR_INVALIDCLIPLIST; + } } - */ if (dst_rect.right < 0) dst_rect.right = 0; diff --git a/src/wndproc.c b/src/wndproc.c index 4f53765..4b80ecb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -175,6 +175,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg = WM_DISPLAYCHANGE; break; } + case WM_ACTIVATEAPP_DDRAW: + { + uMsg = WM_ACTIVATEAPP; + break; + } case WM_D3D9DEVICELOST: { if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && From 63033840d9d0f57e163645420e9c911904f84bcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:29:14 +0200 Subject: [PATCH 0939/1724] improve error checks --- src/ddclipper.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index 72a87e1..d4ab56d 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -69,11 +69,14 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (This->hwnd) return DDERR_CLIPPERISUSINGHWND; - if (This->region) - DeleteObject(This->region); - - if (lpClipList && lpClipList->rdh.nCount >= 1) + if (lpClipList) { + if (!lpClipList->rdh.nCount) + return DDERR_INVALIDCLIPLIST; + + if (This->region) + DeleteObject(This->region); + RECT* rc = (RECT*)lpClipList->Buffer; This->region = CreateRectRgnIndirect(&rc[0]); @@ -88,7 +91,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (!region) return DDERR_INVALIDCLIPLIST; - if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) + if (CombineRgn(This->region, region, This->region, RGN_XOR) == ERROR) { DeleteObject(region); DeleteObject(This->region); @@ -102,6 +105,9 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR } else { + if (This->region) + DeleteObject(This->region); + This->region = NULL; } From 490969356f78a21e2d205c478a63dc116404c3bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:32:00 +0200 Subject: [PATCH 0940/1724] use RGN_OR --- src/ddclipper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index d4ab56d..5d67f28 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -91,7 +91,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (!region) return DDERR_INVALIDCLIPLIST; - if (CombineRgn(This->region, region, This->region, RGN_XOR) == ERROR) + if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) { DeleteObject(region); DeleteObject(This->region); From 98363a85c25c3e19eb6fd5a9935d8bac18a29d68 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 20:06:48 +0200 Subject: [PATCH 0941/1724] add oreset for ClueFinders 4th --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 5af9fa0..4647f18 100644 --- a/src/config.c +++ b/src/config.c @@ -663,6 +663,13 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; ClueFinders 4th Grade Adventures\n" + "[4thadv32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" From bbab7a018a1315b697768c8a5e31858d1818db15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 22:59:07 +0200 Subject: [PATCH 0942/1724] add presets for other learning company games --- src/config.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/config.c b/src/config.c index 4647f18..a34bbd5 100644 --- a/src/config.c +++ b/src/config.c @@ -670,6 +670,20 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; ClueFinders Math Adventures (1998)\n" + "[TCFM32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders(R) Reading Adventures Ages 9-12\n" + "[cfread]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" @@ -947,6 +961,13 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" + "[RRM69_32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From 9ced91af14c6f627d58341f5bd01cacf2ea890d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 01:15:30 +0200 Subject: [PATCH 0943/1724] add experimental wing32 hooks --- inc/winapi_hooks.h | 6 ++++++ src/hook.c | 10 ++++++++++ src/winapi_hooks.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index d7e6efe..3608cc2 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -40,6 +40,12 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); +BOOL WINAPI fake_WinGStretchBlt( + HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc); + +BOOL WINAPI fake_WinGBitBlt( + HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1); + BOOL WINAPI fake_BitBlt( HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop); diff --git a/src/hook.c b/src/hook.c index 1b2efb3..b6653a8 100644 --- a/src/hook.c +++ b/src/hook.c @@ -138,6 +138,16 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + /* + { + "WING32.DLL", + { + { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, HOOK_SKIP_2 }, + { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } + }, + */ { "kernel32.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c530b43..33399ac 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -823,6 +823,21 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +BOOL WINAPI fake_WinGStretchBlt( + HDC hdcDest, + int xDest, + int yDest, + int wDest, + int hDest, + HDC hdcSrc, + int xSrc, + int ySrc, + int wSrc, + int hSrc) +{ + return fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); +} + BOOL WINAPI fake_BitBlt( HDC hdc, int x, @@ -860,11 +875,39 @@ BOOL WINAPI fake_BitBlt( return result; } } + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + { + return real_StretchBlt( + g_ddraw.render.hdc, + x + g_ddraw.render.viewport.x, + y + g_ddraw.render.viewport.y, + (int)(cx * g_ddraw.render.scale_w), + (int)(cy * g_ddraw.render.scale_h), + hdcSrc, + x1, + y1, + cx, + cy, + rop); + } } return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop); } +BOOL WINAPI fake_WinGBitBlt( + HDC hdc, + int x, + int y, + int cx, + int cy, + HDC hdcSrc, + int x1, + int y1) +{ + return fake_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, SRCCOPY); +} + int WINAPI fake_SetDIBitsToDevice( HDC hdc, int xDest, From 0fa70b5c382aa62983aa6a4d028dc4721537ed05 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 01:52:44 +0200 Subject: [PATCH 0944/1724] add presets for Reader Rabbit games --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index a34bbd5..7d1ee3e 100644 --- a/src/config.c +++ b/src/config.c @@ -968,6 +968,22 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Reader Rabbit Reading Ages 4-6\n" + "[rrirjw32]\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "\n" + "; Reader Rabbit Reading Ages 6-9\n" + "[irj2w32]\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From f2bee3d0d28e8dbbacf7664d918d6c6a72a1e20e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 03:28:35 +0200 Subject: [PATCH 0945/1724] adjust gdi hooks --- src/winapi_hooks.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33399ac..a00b834 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -807,8 +807,8 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( g_ddraw.render.hdc, - xDest + g_ddraw.render.viewport.x, - yDest + g_ddraw.render.viewport.y, + (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -879,8 +879,8 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( g_ddraw.render.hdc, - x + g_ddraw.render.viewport.x, - y + g_ddraw.render.viewport.y, + (x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, @@ -1022,8 +1022,8 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( g_ddraw.render.hdc, - xDest + g_ddraw.render.viewport.x, - yDest + g_ddraw.render.viewport.y, + (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), (int)(DestHeight * g_ddraw.render.scale_h), xSrc, From c0d8c77f90d8e0021bb00b95515772575f81237b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 04:02:48 +0200 Subject: [PATCH 0946/1724] set and restore mode --- src/winapi_hooks.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a00b834..df3fc30 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -835,7 +835,11 @@ BOOL WINAPI fake_WinGStretchBlt( int wSrc, int hSrc) { - return fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); + int mode = SetStretchBltMode(hdcDest, COLORONCOLOR); + BOOL result = fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); + SetStretchBltMode(hdcDest, mode); + + return result; } BOOL WINAPI fake_BitBlt( From 009bc4e2e8daab1f4b72af4abb303e5c363cb222 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 04:34:28 +0200 Subject: [PATCH 0947/1724] send WM_ACTIVATEAPP only once --- inc/wndproc.h | 1 - src/dd.c | 5 ++++- src/wndproc.c | 9 ++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index f066a04..3cb6a97 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,7 +9,6 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 -#define WM_ACTIVATEAPP_DDRAW WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/dd.c b/src/dd.c index 709414f..d12355d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1004,7 +1004,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); - real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP_DDRAW, 1, 0); + if (dwFlags & SDM_MODE_SET_BY_GAME) + { + real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); + } } else { diff --git a/src/wndproc.c b/src/wndproc.c index 4b80ecb..9ce3a43 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -175,11 +175,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg = WM_DISPLAYCHANGE; break; } - case WM_ACTIVATEAPP_DDRAW: - { - uMsg = WM_ACTIVATEAPP; - break; - } case WM_D3D9DEVICELOST: { if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && @@ -672,10 +667,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.windowed || g_config.noactivateapp) { - /* let it pass through once (tiberian sun) */ + /* let it pass through once (tiberian sun / ClueFinders) */ static BOOL one_time; - if (wParam && !one_time && g_config.tshack) + if (wParam && !one_time) { one_time = TRUE; break; From 103f78276b844c0dcf653ad99a0e0e78b054f63a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:01:54 +0200 Subject: [PATCH 0948/1724] make clipper threadsafe for TA --- inc/IDirectDrawClipper.h | 1 + src/IDirectDraw/IDirectDrawClipper.c | 2 ++ src/ddclipper.c | 48 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/inc/IDirectDrawClipper.h b/inc/IDirectDrawClipper.h index 7e5161f..95510e6 100644 --- a/inc/IDirectDrawClipper.h +++ b/inc/IDirectDrawClipper.h @@ -16,6 +16,7 @@ typedef struct IDirectDrawClipperImpl ULONG ref; HWND hwnd; HRGN region; + CRITICAL_SECTION cs; } IDirectDrawClipperImpl; diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 86aaaa6..b07390f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -31,6 +31,8 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) if (This->region) DeleteObject(This->region); + DeleteCriticalSection(&This->cs); + HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/ddclipper.c b/src/ddclipper.c index 5d67f28..14ec412 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -7,11 +7,19 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) { + EnterCriticalSection(&This->cs); + if (!This->region) + { + LeaveCriticalSection(&This->cs); return DDERR_NOCLIPLIST; + } if (!lpdwSiz) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } HRGN region = NULL; @@ -20,11 +28,16 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l region = CreateRectRgnIndirect(lpRect); if (!region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } if (CombineRgn(region, This->region, region, RGN_AND) == ERROR) { DeleteObject(region); + + LeaveCriticalSection(&This->cs); return DDERR_GENERIC; } } @@ -39,40 +52,64 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l DeleteObject(region); if (*lpdwSiz == 0) + { + LeaveCriticalSection(&This->cs); return DDERR_REGIONTOOSMALL; + } + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { + EnterCriticalSection(&This->cs); + if (!lphWnd) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } *lphWnd = This->hwnd; + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { + EnterCriticalSection(&This->cs); + if (!lpbChanged) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } *lpbChanged = FALSE; /* Always return FALSE - See ddc_SetHWnd for remarks */ + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { + EnterCriticalSection(&This->cs); + if (This->hwnd) + { + LeaveCriticalSection(&This->cs); return DDERR_CLIPPERISUSINGHWND; + } if (lpClipList) { if (!lpClipList->rdh.nCount) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } if (This->region) DeleteObject(This->region); @@ -82,14 +119,20 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR This->region = CreateRectRgnIndirect(&rc[0]); if (!This->region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } for (int i = 1; i < lpClipList->rdh.nCount; ++i) { HRGN region = CreateRectRgnIndirect(&rc[i]); if (!region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) { @@ -97,6 +140,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR DeleteObject(This->region); This->region = NULL; + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; } @@ -111,17 +155,20 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR This->region = NULL; } + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { + EnterCriticalSection(&This->cs); /* We don't use the regions from the hwnd here since everything is emulated and we need the entire emulated surface to be redrawn all the time */ This->hwnd = hWnd; + LeaveCriticalSection(&This->cs); return DD_OK; } @@ -137,6 +184,7 @@ HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, c->lpVtbl = &g_ddc_vtbl; IDirectDrawClipper_AddRef(c); + InitializeCriticalSection(&c->cs); *lplpDDClipper = c; From c764419b961716cfea700312355e644028d53b83 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:10:15 +0200 Subject: [PATCH 0949/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 8e7b0a0..d68ee97 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 3ca98837235888ba1589cc812f70bc4bbddbd6a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:16:04 +0200 Subject: [PATCH 0950/1724] disable CF hack for now --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index d12355d..44c13a9 100644 --- a/src/dd.c +++ b/src/dd.c @@ -921,7 +921,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); + //(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From b219aca1664cbf3918c83acc7ad258d567c5a1ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:17:57 +0200 Subject: [PATCH 0951/1724] update debug code --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 44c13a9..d5a2fec 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1012,7 +1012,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - //TRACE(" GetWindowLongA style=%p, exstyle=%p\n", real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); int menu_height = 0; From ed0f9ccbc94ae340ed5b81bf09ba0af7aea8d028 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:31:25 +0200 Subject: [PATCH 0952/1724] fix warnings --- src/winapi_hooks.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index df3fc30..c886c7d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -807,8 +807,8 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( g_ddraw.render.hdc, - (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -883,8 +883,8 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( g_ddraw.render.hdc, - (x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, @@ -1026,8 +1026,8 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( g_ddraw.render.hdc, - (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, + (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), (int)(DestHeight * g_ddraw.render.scale_h), xSrc, From 47ae27e1d2838532190828a3714a92c36cf983e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:40:31 +0200 Subject: [PATCH 0953/1724] update RR presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 7d1ee3e..3747a30 100644 --- a/src/config.c +++ b/src/config.c @@ -975,6 +975,8 @@ static void cfg_create_ini() "width=0\n" "height=0\n" "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Reader Rabbit Reading Ages 6-9\n" "[irj2w32]\n" @@ -983,6 +985,8 @@ static void cfg_create_ini() "width=0\n" "height=0\n" "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; ROAD RASH\n" "[RoadRash]\n" From 115617591c6dbf37ea250ccde09f90a6b16662a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:27:28 +0200 Subject: [PATCH 0954/1724] #316 add presets for learning company games --- src/config.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 3747a30..e83191a 100644 --- a/src/config.c +++ b/src/config.c @@ -670,8 +670,29 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; ClueFinders Math Adventures (1998)\n" - "[TCFM32]\n" + "; ClueFinders 4th Grade Adventures\n" + "[4thad32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 5th Grade Adventures\n" + "[5thadv32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 5th Grade Adventures\n" + "[5thad32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 6th Grade Adventures\n" + "[CF6]\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -684,6 +705,20 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; ClueFinders Math Adventures 1.0\n" + "[TCFM32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders Math Adventures 2.0\n" + "[cfmath32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" From 2efe3567ca966784b3cd514185337342317cc8e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:36:18 +0200 Subject: [PATCH 0955/1724] add workaround for learning company games --- inc/config.h | 1 + src/config.c | 10 ++++++++++ src/dd.c | 5 +++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 135f0df..0e8f869 100644 --- a/inc/config.h +++ b/inc/config.h @@ -99,6 +99,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL learning_company_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index e83191a..e1c62f0 100644 --- a/src/config.c +++ b/src/config.c @@ -109,6 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); + GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -665,6 +666,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -672,6 +674,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -679,6 +682,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -686,6 +690,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -693,6 +698,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -700,6 +706,7 @@ static void cfg_create_ini() "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -707,6 +714,7 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -714,6 +722,7 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -998,6 +1007,7 @@ static void cfg_create_ini() "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" diff --git a/src/dd.c b/src/dd.c index d5a2fec..53faeec 100644 --- a/src/dd.c +++ b/src/dd.c @@ -918,11 +918,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + DWORD rem_flags = (g_config.learning_company_hack ? WS_SYSMENU : 0) | WS_MAXIMIZE; + real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); - //(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(rem_flags)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From 99c25fee735701ef39527131e4588637d22b873e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:39:50 +0200 Subject: [PATCH 0956/1724] update supported games list --- README.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index edbbf29..2af04d1 100644 --- a/README.md +++ b/README.md @@ -71,15 +71,15 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura -- Atlantis: The Lost Tales - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World +- Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Barbie(tm) Beach Vacation(tm) - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 +- Barbie(tm) Beach Vacation(tm) - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) @@ -95,6 +95,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge - Close Combat 5: Invasion: Normandy +- ClueFinders 4th Grade Adventures +- ClueFinders 5th Grade Adventures +- ClueFinders 6th Grade Adventures +- ClueFinders Math Adventures 1.0 +- ClueFinders Math Adventures 2.0 +- ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert - Command & Conquer: Red Alert 2 @@ -173,17 +179,17 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Majesty Gold - Majesty Gold HD - Mech Warrior 3 -- Metal Gear Solid - Megaman X4 +- Metal Gear Solid - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 - Nancy Drew: Last Train to Blue Moon Canyon +- Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes @@ -206,6 +212,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Reading Ages 4-6 +- Reader Rabbit Reading Ages 6-9 +- Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -248,8 +257,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown -- Uprising: Join or Die - Uprising 2: Lead and Destroy +- Uprising: Join or Die - Vermeer - Virtua Fighter PC - War Wind From 50144f08c547f91c1134ff40029138c18e9c53f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:57:38 +0200 Subject: [PATCH 0957/1724] only save window size if resized by user --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 9ce3a43..365c683 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -431,7 +431,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - else if (!in_size_move && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) + else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); From 7835f17e7707f96f0319b51feb7c58d7684b2af3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:22:11 +0200 Subject: [PATCH 0958/1724] #316 add preset for Reader Rabbit Learn To Read With Phonics --- README.md | 1 + src/config.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index 2af04d1..490695c 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Learn To Read With Phonics - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) diff --git a/src/config.c b/src/config.c index e1c62f0..ecab385 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,14 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Learn To Read With Phonics\n" + "[Superr]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" "learning_company_hack=true\n" From 8662d030f767b61192faca90766c25a32ab33d15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:33:22 +0200 Subject: [PATCH 0959/1724] add presets for Reader Rabbit Toddler --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index ecab385..f22e0a2 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,22 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Toddler: Fly the Dreamship\n" + "[Fly the Dreamship]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Reader Rabbit Toddler: Playtime for Baby\n" + "[rrbaby]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" "learning_company_hack=true\n" From 5bc7504fa8cdc48512142245c90b384ea7cad4f1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:36:29 +0200 Subject: [PATCH 0960/1724] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 490695c..f17615d 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Toddler: Playtime for Baby +- Reader Rabbit Toddler: Fly the Dreamship - Reader Rabbit Learn To Read With Phonics - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 From c13483248f5327c3762bf0bb3689663775274199 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:37:29 +0200 Subject: [PATCH 0961/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d68ee97..3affdbe 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 07a9ba78db4869752dfb6c56eace604a7d762242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 23:33:47 +0200 Subject: [PATCH 0962/1724] set default values in SetDisplayMode --- src/dd.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/dd.c b/src/dd.c index 53faeec..cd03c7b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -578,6 +578,30 @@ HRESULT dd_RestoreDisplayMode() HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags) { + if (!dwWidth) + { + dwWidth = g_ddraw.width; + + if (!dwWidth) + dwWidth = 800; + } + + if (!dwHeight) + { + dwHeight = g_ddraw.height; + + if (!dwHeight) + dwHeight = 600; + } + + if (!dwBPP) + { + dwBPP = g_ddraw.bpp; + + if (!dwBPP) + dwBPP = 16; + } + if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; From 9674705685284bb7a6b6b6450ba1235c6bd99fbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 23:54:19 +0200 Subject: [PATCH 0963/1724] re-align code --- src/dd.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/dd.c b/src/dd.c index cd03c7b..9a3e4aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -579,28 +579,13 @@ HRESULT dd_RestoreDisplayMode() HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags) { if (!dwWidth) - { - dwWidth = g_ddraw.width; - - if (!dwWidth) - dwWidth = 800; - } + dwWidth = g_ddraw.width ? g_ddraw.width : 800; if (!dwHeight) - { - dwHeight = g_ddraw.height; - - if (!dwHeight) - dwHeight = 600; - } + dwHeight = g_ddraw.height ? g_ddraw.height : 600; if (!dwBPP) - { - dwBPP = g_ddraw.bpp; - - if (!dwBPP) - dwBPP = 16; - } + dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; From 94c718b5b1eaff48a70c0bf3656ba32797d320b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 00:33:05 +0200 Subject: [PATCH 0964/1724] adjust clipper logging and make clipper less strict --- inc/ddclipper.h | 1 + src/IDirectDraw/IDirectDrawClipper.c | 8 ++++---- src/ddclipper.c | 13 +++++++++++++ src/ddsurface.c | 17 ++++++++--------- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/inc/ddclipper.h b/inc/ddclipper.h index f9c02c4..3f23c93 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -12,6 +12,7 @@ HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged); HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags); HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); +HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); #endif diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index b07390f..34cd4de 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -47,7 +47,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, @@ -56,7 +56,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -86,9 +86,9 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index 14ec412..eeec712 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -172,6 +172,19 @@ HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) return DD_OK; } +HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect) +{ + EnterCriticalSection(&This->cs); + + if (This->region) + DeleteObject(This->region); + + This->region = CreateRectRgnIndirect(lpRect); + + LeaveCriticalSection(&This->cs); + return DD_OK; +} + HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter) { if (!lplpDDClipper) diff --git a/src/ddsurface.c b/src/ddsurface.c index 7d06d6c..c56d407 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -11,6 +11,7 @@ #include "utils.h" #include "blt.h" #include "config.h" +#include "ddclipper.h" #include "versionhelpers.h" @@ -90,7 +91,7 @@ HRESULT dds_Blt( { DWORD size = 0; - HRESULT result = IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size); + HRESULT result = ddc_GetClipList(This->clipper, &dst_rect, NULL, &size); if (SUCCEEDED(result)) { @@ -98,7 +99,7 @@ HRESULT dds_Blt( if (list) { - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) + if (SUCCEEDED(ddc_GetClipList(This->clipper, &dst_rect, list, &size))) { RECT* dst_c_rect = (RECT*)list->Buffer; @@ -125,11 +126,13 @@ HRESULT dds_Blt( } else if (result == DDERR_NOCLIPLIST) { - return DDERR_NOCLIPLIST; + TRACE(" DDERR_NOCLIPLIST\n"); + //return DDERR_NOCLIPLIST; } else { - return DDERR_INVALIDCLIPLIST; + TRACE(" DDERR_INVALIDCLIPLIST\n"); + //return DDERR_INVALIDCLIPLIST; } } @@ -1023,12 +1026,8 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpC if ((This->caps & DDSCAPS_PRIMARYSURFACE) && lpClipper->hwnd) { - if (lpClipper->region) - DeleteObject(lpClipper->region); - RECT rc = { 0, 0, This->width, This->height }; - - lpClipper->region = CreateRectRgnIndirect(&rc); + ddc_SetClipRect(lpClipper, &rc); } } From 798cfb654339864b7771837477f07bbde01b2d50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 00:53:50 +0200 Subject: [PATCH 0965/1724] ignore clippers that use a hwnd for now --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c56d407..bceeb72 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -87,7 +87,7 @@ HRESULT dds_Blt( BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) + if (This->clipper && !This->clipper->hwnd && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; From 4771d1f4adb1aad77b1415dfaa3ab908839e5f31 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 02:46:17 +0200 Subject: [PATCH 0966/1724] fix scaling bug --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c886c7d..5667ffd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -808,7 +808,7 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt( g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -884,7 +884,7 @@ BOOL WINAPI fake_BitBlt( return real_StretchBlt( g_ddraw.render.hdc, (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, From 9e61e993e8c621d7eeb8f68f134b50242acce21c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 03:08:25 +0200 Subject: [PATCH 0967/1724] use originl DC if possible --- src/winapi_hooks.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5667ffd..bd565e8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -806,7 +806,7 @@ BOOL WINAPI fake_StretchBlt( else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), @@ -853,7 +853,9 @@ BOOL WINAPI fake_BitBlt( int y1, DWORD rop) { - if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + HWND hwnd = WindowFromDC(hdc); + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -882,7 +884,7 @@ BOOL WINAPI fake_BitBlt( else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), @@ -1025,7 +1027,7 @@ int WINAPI fake_StretchDIBits( { return real_StretchDIBits( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), From 5b9d8d0d1655b840a08b206ede73f05bf416f11f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 20:53:50 +0200 Subject: [PATCH 0968/1724] Carmen Sandiego's Great Chase --- src/config.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/config.c b/src/config.c index f22e0a2..9469b4d 100644 --- a/src/config.c +++ b/src/config.c @@ -78,6 +78,7 @@ void cfg_load() GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); + g_config.allow_wmactivate = TRUE; GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -482,6 +483,18 @@ static void cfg_create_ini() "[Carma2_SW]\n" "noactivateapp=true\n" "\n" + "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" + "[TIME32]\n" + "learning_company_hack=true\n" + "allow_wmactivate=true\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Captain Claw\n" "[claw]\n" "adjmouse=true\n" From 37a04d75980e69016238b46253b96aceb4cca0ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 21:54:49 +0200 Subject: [PATCH 0969/1724] improve logging for windows --- src/utils.c | 28 ++++++++++++++++++++++++++-- src/winapi_hooks.c | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 4d29bfb..c7de295 100644 --- a/src/utils.c +++ b/src/utils.c @@ -553,10 +553,34 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) { - if (!g_ddraw.hwnd) + LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); + + if (!g_ddraw.hwnd && !(sytle & WS_DISABLED)) g_ddraw.hwnd = hwnd; - return FALSE; +#ifdef _DEBUG + char class[MAX_PATH] = { 0 }; + GetClassNameA(hwnd, class, sizeof(class) - 1); + + char title[MAX_PATH] = { 0 }; + GetWindowTextA(hwnd, title, sizeof(title) - 1); + + RECT pos = { 0 }; + real_GetWindowRect(hwnd, &pos); + + RECT size = { 0 }; + real_GetClientRect(hwnd, &size); + + LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); + + TRACE( + "%s(class=%s, title=%s, X=%d, Y=%d, nWidth=%d, nHeight=%d)\n", + __FUNCTION__, class, title, pos.left, pos.top, size.right, size.bottom); + + dbg_dump_wnd_styles(sytle, exsytle); +#endif + + return TRUE; } BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index bd565e8..f688ee6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1318,6 +1318,8 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( BOOL WINAPI fake_DestroyWindow(HWND hWnd) { + TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + BOOL result = real_DestroyWindow(hWnd); if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) From cf3d0c51ada0a509cf38e90f53681a0900003cb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 22:23:47 +0200 Subject: [PATCH 0970/1724] #313 improve American Girls Dress Designer support and merge changes into master --- src/config.c | 4 ++++ src/dd.c | 19 ++++++++----------- src/utils.c | 8 ++++---- src/winapi_hooks.c | 18 +++++++++++++++++- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/config.c b/src/config.c index 9469b4d..45e4c95 100644 --- a/src/config.c +++ b/src/config.c @@ -394,6 +394,10 @@ static void cfg_create_ini() "; American Girls Dress Designer\n" "[Dress Designer]\n" "fake_mode=640x480x32\n" + "border=false\n" + "posX=0\n" + "posY=0\n" + "nonexclusive=true\n" "\n" "; Age of Wonders 2\n" "[AoW2]\n" diff --git a/src/dd.c b/src/dd.c index 9a3e4aa..d2eee80 100644 --- a/src/dd.c +++ b/src/dd.c @@ -546,18 +546,15 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } - if (g_ddraw.renderer != gdi_render_main) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) diff --git a/src/utils.c b/src/utils.c index c7de295..9b0ce23 100644 --- a/src/utils.c +++ b/src/utils.c @@ -553,9 +553,12 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) { + RECT size = { 0 }; + real_GetClientRect(hwnd, &size); + LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); - if (!g_ddraw.hwnd && !(sytle & WS_DISABLED)) + if (!g_ddraw.hwnd && !(sytle & WS_DISABLED) && size.right > 0 && size.bottom > 0) g_ddraw.hwnd = hwnd; #ifdef _DEBUG @@ -568,9 +571,6 @@ BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) RECT pos = { 0 }; real_GetWindowRect(hwnd, &pos); - RECT size = { 0 }; - real_GetClientRect(hwnd, &size); - LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); TRACE( diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f688ee6..9b51570 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -11,6 +11,7 @@ #include "mouse.h" #include "wndproc.h" #include "render_gdi.h" +#include "render_d3d9.h" #include "directinput.h" #include "ddsurface.h" #include "ddclipper.h" @@ -1320,13 +1321,28 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) + { + dd_RestoreDisplayMode(); + + if (g_ddraw.renderer == d3d9_render_main) + { + d3d9_release(); + } + } + BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (result && g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) { g_ddraw.hwnd = NULL; g_ddraw.wndproc = NULL; g_ddraw.render.hdc = NULL; + + if (g_config.fake_mode[0]) + { + dd_SetCooperativeLevel(NULL, DDSCL_NORMAL); + } } if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active) From ea63cf08bdd45cb3927d364c1db4d55d9d49f1b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 22:24:50 +0200 Subject: [PATCH 0971/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f17615d..4d0efdc 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) +- American Girls Dress Designer - Amerzone - Anno 1602: Creation of a New World - Anstoss 3 From 6276cc81683ef6cae5b7f11516a7060ec425d968 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 23:31:34 +0200 Subject: [PATCH 0972/1724] #318 add presets for Knights and Merchants The Shattered Kingdom --- src/config.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/config.c b/src/config.c index 45e4c95..c805588 100644 --- a/src/config.c +++ b/src/config.c @@ -951,6 +951,16 @@ static void cfg_create_ini() "[KKND2]\n" "noactivateapp=true\n" "\n" + "; Knights and Merchants The Shattered Kingdom\n" + "[KaM_800]\n" + "limit_bltfast=true\n" + "maxgameticks=60\n" + "\n" + "; Knights and Merchants The Shattered Kingdom\n" + "[KaM_1024]\n" + "limit_bltfast=true\n" + "maxgameticks=60\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From f32f20e38e872191f2c8975d77fadb31e36e21e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 23:43:02 +0200 Subject: [PATCH 0973/1724] update reame --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d0efdc..4ebf6af 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire -- Knights and Merchants +- Knights and Merchants: The Shattered Kingdom +- Knights and Merchants: The Peasants Rebellion - Kohan: Immortal Sovereigns - Konung - Konung 2 From 203f6b0ccf146735e4caab0f85f4adac9297a0c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 01:05:36 +0200 Subject: [PATCH 0974/1724] remove debug setting --- src/config.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index c805588..2f7b06d 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); - g_config.allow_wmactivate = TRUE; GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -110,7 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); + //GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 0b29eb3d0eec1c84ff560a5bc9444a7b3de5d3ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 01:10:00 +0200 Subject: [PATCH 0975/1724] fix for last commit --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2f7b06d..156f23e 100644 --- a/src/config.c +++ b/src/config.c @@ -109,7 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - //GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); + GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 4de6eee162d34b0b415b27bc910e47f03118a07c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 04:28:05 +0200 Subject: [PATCH 0976/1724] make sure we got move+close menu items --- inc/config.h | 1 - src/config.c | 14 -------------- src/dd.c | 4 +--- src/winapi_hooks.c | 7 +++++++ 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/inc/config.h b/inc/config.h index 0e8f869..135f0df 100644 --- a/inc/config.h +++ b/inc/config.h @@ -99,7 +99,6 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; - BOOL learning_company_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 156f23e..379ce15 100644 --- a/src/config.c +++ b/src/config.c @@ -109,7 +109,6 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -488,7 +487,6 @@ static void cfg_create_ini() "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" - "learning_company_hack=true\n" "allow_wmactivate=true\n" "renderer=gdi\n" "adjmouse=false\n" @@ -682,7 +680,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -690,7 +687,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -698,7 +694,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -706,7 +701,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -714,7 +708,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -722,7 +715,6 @@ static void cfg_create_ini() "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -730,7 +722,6 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -738,7 +729,6 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1033,7 +1023,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1041,7 +1030,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Playtime for Baby\n" "[rrbaby]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1049,7 +1037,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1057,7 +1044,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" diff --git a/src/dd.c b/src/dd.c index d2eee80..494177a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -924,12 +924,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - DWORD rem_flags = (g_config.learning_company_hack ? WS_SYSMENU : 0) | WS_MAXIMIZE; - real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(rem_flags)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9b51570..af89ac0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -534,6 +534,13 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { + /* Make sure we got close/move menu items (Almost all of the The Learning Company games) */ + HMENU menu = GetSystemMenu(hWnd, FALSE); + if (!menu || GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND) == -1 || GetMenuState(menu, SC_MOVE, MF_BYCOMMAND) == -1) + { + GetSystemMenu(hWnd, TRUE); + } + if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; From 8f12004d67325db6ce636d34c40cd0c65225036e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 05:10:25 +0200 Subject: [PATCH 0977/1724] tweak aero snap hack --- inc/wndproc.h | 1 + src/wndproc.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index 3cb6a97..43a1e8e 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,6 +9,7 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 +#define WM_RESTORE_STYLE WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/wndproc.c b/src/wndproc.c index 365c683..812f96f 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -477,7 +477,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } - case WM_NCMOUSELEAVE: + case WM_RESTORE_STYLE: { if (!IsWine()) /* hack: disable aero snap */ { @@ -488,7 +488,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); } } - break; + return 0; } case WM_SYSCOMMAND: { @@ -499,6 +499,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if ((style & WS_MAXIMIZEBOX)) { real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); + PostMessageA(g_ddraw.hwnd, WM_RESTORE_STYLE, 0, 0); } } From 815deee85deb8ae05bb4c1ef19281616fd749fe2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 05:54:28 +0200 Subject: [PATCH 0978/1724] don't allow games to hide the taskbar --- src/winapi_hooks.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index af89ac0..aecb9aa 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -532,6 +532,12 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { + /* Don't hide the taskbar (Some of The Learning Company games) */ + if (nCmdShow == SW_HIDE && hWnd && hWnd != g_ddraw.hwnd && hWnd == FindWindowA("Shell_TrayWnd", NULL)) + { + return TRUE; + } + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { /* Make sure we got close/move menu items (Almost all of the The Learning Company games) */ From 33476726d2c39268c5db8ed250bd590fd7413975 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 06:16:57 +0200 Subject: [PATCH 0979/1724] update learning company games presets --- inc/config.h | 1 + src/config.c | 55 +++++++++++++++++----------------------------------- src/dd.c | 7 +++++-- 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/inc/config.h b/inc/config.h index 135f0df..4d56eac 100644 --- a/inc/config.h +++ b/inc/config.h @@ -78,6 +78,7 @@ typedef struct CNCDDRAWCONFIG BOOL center_cursor_fix; char fake_mode[128]; BOOL wine_allow_resize; + BOOL lock_mouse_top_left; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 379ce15..2604d52 100644 --- a/src/config.c +++ b/src/config.c @@ -91,6 +91,7 @@ void cfg_load() GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); + GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); /* Hotkeys */ @@ -112,6 +113,9 @@ void cfg_load() GameHandlesClose = GameHandlesClose || g_config.infantryhack; + if (g_config.lock_mouse_top_left) + g_config.adjmouse = FALSE; + ini_free(&g_config.ini); } @@ -305,6 +309,7 @@ static void cfg_create_ini() "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" "wine_allow_resize=false\n" + "lock_mouse_top_left=false\n" "\n" "\n" "\n" @@ -489,7 +494,7 @@ static void cfg_create_ini() "[TIME32]\n" "allow_wmactivate=true\n" "renderer=gdi\n" - "adjmouse=false\n" + "lock_mouse_top_left=true\n" "width=0\n" "height=0\n" "resizable=false\n" @@ -680,59 +685,43 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Divine Divinity\n" "[div]\n" @@ -1023,31 +1012,23 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Toddler: Playtime for Baby\n" "[rrbaby]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" diff --git a/src/dd.c b/src/dd.c index 494177a..5a72770 100644 --- a/src/dd.c +++ b/src/dd.c @@ -878,8 +878,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; - g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + if (!g_config.lock_mouse_top_left) + { + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + } g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; g_ddraw.mouse.rc.top = g_ddraw.mouse.y_adjust; From 380e2d03ed4639409fe82ae94703a87388175ccc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 06:18:00 +0200 Subject: [PATCH 0980/1724] update Carmen Sandiego preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2604d52..7dbac8c 100644 --- a/src/config.c +++ b/src/config.c @@ -494,7 +494,7 @@ static void cfg_create_ini() "[TIME32]\n" "allow_wmactivate=true\n" "renderer=gdi\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" "width=0\n" "height=0\n" "resizable=false\n" From bf249eeafe7eef4c34c65e73ebe5ec2e12aaa19f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 07:41:00 +0200 Subject: [PATCH 0981/1724] #316 update presets for the learning company games --- README.md | 35 +++++++++++-- src/config.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4ebf6af..4ea9137 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arthur's Pet Chase +- Arthur's Sand Castle Contest - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -81,6 +83,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldur's Gate - Baldur's Gate 2 - Barbie(tm) Beach Vacation(tm) +- Batman: Justice Unbalanced +- Batman: Toxic Chill - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) @@ -96,11 +100,15 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge - Close Combat 5: Invasion: Normandy +- ClueFinders 3rd Grade Adventures - ClueFinders 4th Grade Adventures - ClueFinders 5th Grade Adventures - ClueFinders 6th Grade Adventures - ClueFinders Math Adventures 1.0 - ClueFinders Math Adventures 2.0 +- ClueFinders Mystery Mansion +- ClueFinders Search +- ClueFinders toy - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert @@ -149,6 +157,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 - Heroes of Might and Magic II @@ -170,8 +179,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire -- Knights and Merchants: The Shattered Kingdom - Knights and Merchants: The Peasants Rebellion +- Knights and Merchants: The Shattered Kingdom - Kohan: Immortal Sovereigns - Konung - Konung 2 @@ -214,11 +223,22 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II -- Reader Rabbit Toddler: Playtime for Baby -- Reader Rabbit Toddler: Fly the Dreamship +- Reader Rabbit 1st Grade +- Reader Rabbit 2nd Grade +- Reader Rabbit Dreamship Tales +- Reader Rabbit Kindergarten +- Reader Rabbit Kindergarten +- Reader Rabbit Kindergarten: Creative +- Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics +- Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade +- Reader Rabbit Learning Creations: Calendar +- Reader Rabbit Learning Creations: Music +- Reader Rabbit Learning Creations: Paint - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 +- Reader Rabbit Toddler: Fly the Dreamship +- Reader Rabbit Toddler: Playtime for Baby - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) @@ -243,17 +263,23 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers +- SpongeBob SquarePants: Typing - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft - StarCraft: Broodwars +- StarFlyers Alien Space Chase +- StarFlyers Royal Jewel Rescue - Starship Titanic - Start Trek Armada - Steel Panthers: World At War +- Strawberry Shortcake: Amazing Cookie Party - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- The Powerpuff Girls - Princess Snorebucks +- The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -278,6 +304,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus +- Zoombinis Island Odyssey +- Zoombinis Logical Journey +- Zoombinis Mountain Rescue - Zuma Deluxe - ... diff --git a/src/config.c b/src/config.c index 7dbac8c..fc0d04f 100644 --- a/src/config.c +++ b/src/config.c @@ -457,6 +457,26 @@ static void cfg_create_ini() "[AT]\n" "fixchilds=0\n" "\n" + "; Arthur's Pet Chase\n" + "[ArthurPP]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Arthur's Sand Castle Contest\n" + "[ArthurSC]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Batman: Toxic Chill\n" + "[Bat1]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Batman: Justice Unbalanced\n" + "[Bat2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" @@ -683,6 +703,26 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; ClueFinders search\n" + "[CFSEARCH]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders Mystery\n" + "[ClueFinders Mystery Mansion]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders Toy\n" + "[ToyStore]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders 3rd Grade Adventures\n" + "[3rdadv32]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" "fixchilds=3\n" @@ -811,6 +851,11 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Hamtaro: Wake Up Snoozer!\n" + "[Ham]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" @@ -1030,6 +1075,61 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit 1st Grade\n" + "[RR1]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit 2nd Grade\n" + "[RR2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten\n" + "[RRK]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade\n" + "[Learn to read Grades 1-2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Calendar \n" + "[Calendar]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Music\n" + "[Music]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Paint\n" + "[Paint]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Dreamship Tales\n" + "[Dreamship Tales]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten\n" + "[rrk32]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten: Creative\n" + "[creative ]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten: Learning Creations\n" + "[Learning Creations]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" "renderer=gdi\n" @@ -1063,6 +1163,26 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" + "; Strawberry Shortcake: Amazing Cookie Party\n" + "[Strawberry]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; SpongeBob SquarePants: Typing\n" + "[SPT]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; StarFlyers Royal Jewel Rescue\n" + "[Royal Jewel Rescue]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; StarFlyers Alien Space Chase\n" + "[Alien Space Chase]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" @@ -1122,6 +1242,11 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; The Powerpuff Girls(TM) Mojo Jojo's Clone Zone / The Powerpuff Girls - Princess Snorebucks\n" + "[Powerpuff Girls]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1214,6 +1339,21 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" + "; Zoombinis Logical Journey\n" + "[Zoombinis Logicial Journey]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Zoombinis Mountain Rescue\n" + "[zoombini2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Zoombinis Island Odyssey\n" + "[Zoombinis Island Odyssey]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" , fh); fclose(fh); From 54a619b3a1c71b9b79964d590a0bf39d0e72aa5e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 07:43:19 +0200 Subject: [PATCH 0982/1724] fix section name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index fc0d04f..15450a6 100644 --- a/src/config.c +++ b/src/config.c @@ -1121,7 +1121,7 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Kindergarten: Creative\n" - "[creative ]\n" + "[creative]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From dd22c448caa2b6f4a2b9d5a93df68418d4248860 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 08:11:52 +0200 Subject: [PATCH 0983/1724] update game names --- README.md | 1 - src/config.c | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4ea9137..a6d35cf 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit 2nd Grade - Reader Rabbit Dreamship Tales - Reader Rabbit Kindergarten -- Reader Rabbit Kindergarten - Reader Rabbit Kindergarten: Creative - Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics diff --git a/src/config.c b/src/config.c index 15450a6..0e135c3 100644 --- a/src/config.c +++ b/src/config.c @@ -703,17 +703,17 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" - "; ClueFinders search\n" + "; ClueFinders Search and Solve Adventures\n" "[CFSEARCH]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" - "; ClueFinders Mystery\n" + "; ClueFinders Mystery Mansion\n" "[ClueFinders Mystery Mansion]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" - "; ClueFinders Toy\n" + "; ClueFinders The Incredible Toy Store Adventure\n" "[ToyStore]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" From b2199157e855ad26e6692741940dd21c504e7992 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 08:12:29 +0200 Subject: [PATCH 0984/1724] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a6d35cf..84ad6c5 100644 --- a/README.md +++ b/README.md @@ -107,8 +107,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - ClueFinders Math Adventures 1.0 - ClueFinders Math Adventures 2.0 - ClueFinders Mystery Mansion -- ClueFinders Search -- ClueFinders toy +- ClueFinders Search and Solve Adventures +- Cluefinders The Incredible Toy Store Adventure - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert From 5e215bcaa52637ae01101e4e7a594666b3c98c66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 21:45:12 +0200 Subject: [PATCH 0985/1724] add preset for Little Bear Kindergarten Thinking Adventurest --- README.md | 2 ++ src/config.c | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 84ad6c5..abd796a 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Little Bear Rainy Day Activities +- Little Bear Kindergarten Thinking Adventures - Lionheart - Legacy of the Crusader - Locomotion - Lode Runner 2 diff --git a/src/config.c b/src/config.c index 0e135c3..b38a8d2 100644 --- a/src/config.c +++ b/src/config.c @@ -984,6 +984,16 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=60\n" "\n" + "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" + "[LBSTART]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Little Bear Kindergarten Thinking Adventurest\n" + "[LBSTART]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From 966c925af58b91e35c3c316034870c07a1379a87 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 21:50:38 +0200 Subject: [PATCH 0986/1724] fix preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index b38a8d2..d29fd3d 100644 --- a/src/config.c +++ b/src/config.c @@ -985,7 +985,7 @@ static void cfg_create_ini() "maxgameticks=60\n" "\n" "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" - "[LBSTART]\n" + "[LBPR]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From f0fee78c56b41c73607378bc954d802f9c10628e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 22:27:03 +0200 Subject: [PATCH 0987/1724] adjust presets --- src/config.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index d29fd3d..6839cab 100644 --- a/src/config.c +++ b/src/config.c @@ -986,13 +986,21 @@ static void cfg_create_ini() "\n" "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Little Bear Kindergarten Thinking Adventurest\n" "[LBSTART]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Lionheart\n" "[Lionheart]\n" From fada7b82dd6be1015b7363d9333d4203f3219e8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 23:30:49 +0200 Subject: [PATCH 0988/1724] fake desktop window size --- src/winapi_hooks.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index aecb9aa..a8cc502 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -222,9 +222,10 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) if (lpRect && g_ddraw.ref && g_ddraw.hwnd && + g_ddraw.width && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - if (g_ddraw.hwnd == hWnd) + if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) { lpRect->bottom = g_ddraw.height; lpRect->left = 0; @@ -253,7 +254,8 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) { if (lpRect && g_ddraw.ref && - g_ddraw.hwnd == hWnd && + g_ddraw.width && + (g_ddraw.hwnd == hWnd || hWnd == GetDesktopWindow()) && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { lpRect->bottom = g_ddraw.height; From 7f0b122e29517e31bd691e9237c748b5ede17456 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 02:34:53 +0200 Subject: [PATCH 0989/1724] add preset for Arthur's Wilderness Rescue --- src/config.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 6839cab..ae1ebbc 100644 --- a/src/config.c +++ b/src/config.c @@ -457,6 +457,10 @@ static void cfg_create_ini() "[AT]\n" "fixchilds=0\n" "\n" + "; Arthur's Wilderness Rescue\n" + "[ArthurPP]\n" + "renderer=gdi\n" + "\n" "; Arthur's Pet Chase\n" "[ArthurPP]\n" "fixchilds=3\n" @@ -993,7 +997,7 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Little Bear Kindergarten Thinking Adventurest\n" + "; Little Bear Kindergarten Thinking Adventures\n" "[LBSTART]\n" "adjmouse=false\n" "width=0\n" From f5e0e954903b5f8de61c400489cfe494145a854a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:00:23 +0200 Subject: [PATCH 0990/1724] hook GetWindowPlacement --- inc/hook.h | 6 ++++-- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 27 +++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ae3a404..15b49df 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -17,7 +17,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[32]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[33]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -53,10 +53,11 @@ typedef int (WINAPI* SETDIBITSTODEVICEPROC)( typedef int (WINAPI* STRETCHDIBITSPROC)( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); -typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); +typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); +typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -105,6 +106,7 @@ extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; +extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3608cc2..89a948c 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); +BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index b6653a8..459661d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,7 @@ SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; +GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -95,6 +96,7 @@ HOOKLIST g_hook_hooklist[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, + { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a8cc502..0c80b72 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -732,6 +732,33 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w return result; } +BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) +{ + BOOL result = real_GetWindowPlacement(hWnd, lpwndpl); + + if (result && + lpwndpl && + g_ddraw.ref && + g_ddraw.hwnd && + g_ddraw.width && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + { + if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) + { + lpwndpl->rcNormalPosition.bottom = g_ddraw.height; + lpwndpl->rcNormalPosition.left = 0; + lpwndpl->rcNormalPosition.right = g_ddraw.width; + lpwndpl->rcNormalPosition.top = 0; + } + else + { + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); + } + } + + return result; +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 52e35e9dd45ba153e62471c2cd433a6eedd19c74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:00:57 +0200 Subject: [PATCH 0991/1724] fix preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index ae1ebbc..bbd577f 100644 --- a/src/config.c +++ b/src/config.c @@ -458,7 +458,7 @@ static void cfg_create_ini() "fixchilds=0\n" "\n" "; Arthur's Wilderness Rescue\n" - "[ArthurPP]\n" + "[Arthur]\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From ee3ba56534ed370e90bbcb604d6dfda0f4d8c331 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:59:41 +0200 Subject: [PATCH 0992/1724] update Arthur preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index bbd577f..8e9102e 100644 --- a/src/config.c +++ b/src/config.c @@ -459,6 +459,7 @@ static void cfg_create_ini() "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" + "hook_peekmessage=true\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From c0c43fc43f34af066ae7760213ad28cb84d664e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 04:32:14 +0200 Subject: [PATCH 0993/1724] add presets for little bear games --- README.md | 3 +++ src/config.c | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index abd796a..3f1fd67 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arthur's Wilderness Rescue - Arthur's Pet Chase - Arthur's Sand Castle Contest - Atlantis 2: Beyond Atlantis @@ -184,6 +185,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Little Bear Toddler Discovery Adventures +- Little Bear Preschool Thinking Adventures - Little Bear Rainy Day Activities - Little Bear Kindergarten Thinking Adventures - Lionheart - Legacy of the Crusader diff --git a/src/config.c b/src/config.c index 8e9102e..73abef9 100644 --- a/src/config.c +++ b/src/config.c @@ -989,7 +989,7 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=60\n" "\n" - "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" + "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" "width=0\n" @@ -998,7 +998,7 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Little Bear Kindergarten Thinking Adventures\n" + "; Little Bear Kindergarten/Preschool Thinking Adventures\n" "[LBSTART]\n" "adjmouse=false\n" "width=0\n" @@ -1007,6 +1007,15 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Little Bear Toddler Discovery Adventures\n" + "[LBT]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From 275f10e6e26e911d9ec8bc8cfc6bc415a4493f26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 06:28:16 +0200 Subject: [PATCH 0994/1724] add preset for scooby doo --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 3f1fd67..ecb29c8 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Road Rash - RollerCoaster Tycoon - Sanitarium +- Scooby-Doo(TM), Case File #2 The Scary Stone Dragon - Sega Rally - Sega Touring Car - Septerra Core diff --git a/src/config.c b/src/config.c index 73abef9..0910668 100644 --- a/src/config.c +++ b/src/config.c @@ -1195,6 +1195,11 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" + "; Scooby-Doo(TM), Case File #2 The Scary Stone Dragon\n" + "[Case File #2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Strawberry Shortcake: Amazing Cookie Party\n" "[Strawberry]\n" "fixchilds=3\n" From e7bd262681cb4ea1d29209caf6061bec8cd70445 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 06:37:32 +0200 Subject: [PATCH 0995/1724] update readme with supported games --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ecb29c8..ad85ba0 100644 --- a/README.md +++ b/README.md @@ -255,6 +255,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon +- Scooby-Doo(TM), Phantom of the Knight(TM) +- Scooby-Doo(TM), Showdown in Ghost Town(TM) - Sega Rally - Sega Touring Car - Septerra Core From e3314c0b4829526449cd36db3e550838dff4738a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 07:20:44 +0200 Subject: [PATCH 0996/1724] add presets for madeline math + adds new seetings to disable compat mode warnings --- README.md | 2 ++ inc/config.h | 1 + src/config.c | 35 +++++++++++++++++++++++++++++++++++ src/dllmain.c | 3 ++- 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ad85ba0..9374554 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Lionheart - Legacy of the Crusader - Locomotion - Lode Runner 2 +- Madeline 1st Grade Math +- Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD - Mech Warrior 3 diff --git a/inc/config.h b/inc/config.h index 4d56eac..2bf06ad 100644 --- a/inc/config.h +++ b/inc/config.h @@ -79,6 +79,7 @@ typedef struct CNCDDRAWCONFIG char fake_mode[128]; BOOL wine_allow_resize; BOOL lock_mouse_top_left; + BOOL no_compat_warning; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 0910668..64fe101 100644 --- a/src/config.c +++ b/src/config.c @@ -92,6 +92,7 @@ void cfg_load() GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); + GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); /* Hotkeys */ @@ -310,6 +311,7 @@ static void cfg_create_ini() ";fake_mode=640x480x32\n" "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" + "no_compat_warning=false\n" "\n" "\n" "\n" @@ -1020,6 +1022,39 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Madeline 1st Grade Math\n" + "[madmath1]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Madeline 1st Grade Math: Progress Report\n" + "[madpr]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Madeline 2nd Grade Math\n" + "[madmath2]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Majesty Gold\n" "[Majesty]\n" "minfps=-2\n" diff --git a/src/dllmain.c b/src/dllmain.c index 637f5e5..0f9e5c4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -72,7 +72,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) "then try to start the game again.", s); - MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); + if (!g_config.no_compat_warning) + MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); break; } From b2fedc278b8e22bd1356340aeb1416d2132bb969 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 08:50:58 +0200 Subject: [PATCH 0997/1724] add Cyberchase games to supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9374554..923c7a0 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 +- Cyberchase Castleblanca Quest +- Cyberchase Carnival Chaos - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 From 6e3a6207dad1a0b72ab15a320cce97294383d957 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 08:56:02 +0200 Subject: [PATCH 0998/1724] cleanup readme --- README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 923c7a0..4d59dda 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - ClueFinders Math Adventures 2.0 - ClueFinders Mystery Mansion - ClueFinders Search and Solve Adventures -- Cluefinders The Incredible Toy Store Adventure +- ClueFinders The Incredible Toy Store Adventure - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert @@ -236,17 +236,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit 2nd Grade - Reader Rabbit Dreamship Tales - Reader Rabbit Kindergarten -- Reader Rabbit Kindergarten: Creative -- Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics -- Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade -- Reader Rabbit Learning Creations: Calendar -- Reader Rabbit Learning Creations: Music -- Reader Rabbit Learning Creations: Paint +- Reader Rabbit Learning Creations - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 -- Reader Rabbit Toddler: Fly the Dreamship -- Reader Rabbit Toddler: Playtime for Baby +- Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) From 188ef913c37c3097344c02b890f695c6d41640a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 21:32:02 +0200 Subject: [PATCH 0999/1724] adjust peek/getmessage hooks --- src/winapi_hooks.c | 60 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 0c80b72..f9d23af 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -701,7 +701,9 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lpMsg->lParam = MAKELPARAM(x, y); - fake_GetCursorPos(&lpMsg->pt); + + lpMsg->pt.x = x; + lpMsg->pt.y = y; break; } @@ -716,8 +718,32 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && g_config.hook_getmessage) - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (g_config.hook_getmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + } return result; } @@ -726,8 +752,32 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_config.hook_peekmessage) - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (g_config.hook_peekmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + } return result; } From c4a939eea270380f765ac89109c7e80732209117 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 21:32:32 +0200 Subject: [PATCH 1000/1724] update preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 64fe101..bc13b7c 100644 --- a/src/config.c +++ b/src/config.c @@ -461,7 +461,6 @@ static void cfg_create_ini() "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" - "hook_peekmessage=true\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From cff92182f989c673899106b6be0fe17cddd842f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 22:07:07 +0200 Subject: [PATCH 1001/1724] add missing NULL check --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f9d23af..90ff88b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -718,7 +718,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (g_config.hook_getmessage) { @@ -752,7 +752,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (g_config.hook_peekmessage) { From 4f5c332cd58a2adb9547f5abb4a2c4d57e8706fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 22:53:01 +0200 Subject: [PATCH 1002/1724] don't send WM_ACTIVATEAPP yet (needs more testing) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 5a72770..529b1b2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1015,7 +1015,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (dwFlags & SDM_MODE_SET_BY_GAME) { - real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); + //real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); } } else From f9d2cb0d1f708daeed03557418e7346d851933d1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 23:55:30 +0200 Subject: [PATCH 1003/1724] simplify cursor code --- src/winapi_hooks.c | 108 ++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 90ff88b..a5fe94d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -30,65 +30,31 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (!real_GetCursorPos(&pt)) return FALSE; - realpt.x = pt.x; - realpt.y = pt.y; + realpt = pt; - if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) { - /* fallback solution for possible ClipCursor failure */ - int diffx = 0, diffy = 0; - - int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; - int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; - - pt.x -= g_ddraw.mouse.x_adjust; - pt.y -= g_ddraw.mouse.y_adjust; - - if (pt.x < 0) - { - diffx = pt.x; - pt.x = 0; - } - - if (pt.y < 0) - { - diffy = pt.y; - pt.y = 0; - } - - if (pt.x > max_width) - { - diffx = pt.x - max_width; - pt.x = max_width; - } - - if (pt.y > max_height) - { - diffy = pt.y - max_height; - pt.y = max_height; - } - - if (diffx || diffy) - real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); - - int x = 0; - int y = 0; + int x = max(pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(pt.y - g_ddraw.mouse.y_adjust, 0); if (g_config.adjmouse) { - x = min((DWORD)(roundf(pt.x * g_ddraw.mouse.unscale_x)), g_ddraw.width - 1); - y = min((DWORD)(roundf(pt.y * g_ddraw.mouse.unscale_y)), g_ddraw.height - 1); - } - else - { - x = min(pt.x, g_ddraw.width - 1); - y = min(pt.y, g_ddraw.height - 1); + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); } - if (g_config.vhack && !g_ddraw.isworms2 && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + if (g_config.vhack && + !g_ddraw.isworms2 && + !g_config.devmode && + !g_ddraw.bnet_active && + InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { - diffx = 0; - diffy = 0; + int diffx = 0; + int diffy = 0; if (x > g_ddraw.upscale_hack_width) { @@ -117,16 +83,6 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } - else if (lpPoint && g_ddraw.bnet_active && real_ScreenToClient(g_ddraw.hwnd, &pt)) - { - if (pt.x > 0 && pt.x < g_ddraw.width && pt.y > 0 && pt.y < g_ddraw.height) - { - lpPoint->x = pt.x; - lpPoint->y = pt.y; - - return TRUE; - } - } if (lpPoint) { @@ -720,11 +676,8 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) { int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); @@ -737,12 +690,20 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); } + + if (g_config.hook_getmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } } return result; @@ -754,11 +715,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) { int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); @@ -771,12 +729,20 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); } + + if (g_config.hook_peekmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } } return result; From 66de7d5d1e158cf9f7cbd6e348f2e7bf85920238 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 00:55:04 +0200 Subject: [PATCH 1004/1724] remove old code --- src/dd.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 529b1b2..72f968c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1012,11 +1012,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); - - if (dwFlags & SDM_MODE_SET_BY_GAME) - { - //real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); - } } else { From 0e9e3f9d7a9d380b3cfad11ef3a3223008ee8f3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 01:49:43 +0200 Subject: [PATCH 1005/1724] remove conditions --- src/winapi_hooks.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a5fe94d..4ba6d04 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -676,8 +676,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && - (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); @@ -715,8 +714,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && - (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); From 0be22be87b155aedbf00c2e5b6252cb635616c8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 02:23:30 +0200 Subject: [PATCH 1006/1724] make sure we don'T double hook --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4ba6d04..c0a2f38 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -674,7 +674,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { @@ -712,7 +712,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { From 5c1f822a35e4d1223dc43fee2ca7cb011bde7ad8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 02:43:20 +0200 Subject: [PATCH 1007/1724] #319 fix moving cursor bug in Nancy drew games (macOS) --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index 72f968c..fe94379 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1056,6 +1056,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if ((exstyle & WS_EX_CLIENTEDGE)) { + swp_flags |= SWP_FRAMECHANGED; + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } From cee57257f2ba7dbeb45daa62b4a0d04a01a8f60c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 03:55:19 +0200 Subject: [PATCH 1008/1724] update presets --- README.md | 2 ++ src/config.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/README.md b/README.md index 4d59dda..eb96c1e 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 - Reader Rabbit Toddler +- Reader Rabbit Math Ages 4-6 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) +- Reader Rabbit Preschool 2002 - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) diff --git a/src/config.c b/src/config.c index bc13b7c..f5715e8 100644 --- a/src/config.c +++ b/src/config.c @@ -1136,11 +1136,26 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit Math Ages 4-6\n" + "[RRM46]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit Preschool 2002\n" + "[Preschool Sparkle Star Rescue]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Preschool 2002\n" + "[RRP]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit 1st Grade\n" "[RR1]\n" "fixchilds=3\n" From fd303a3191c466e30467a46e6b47e6011abfd14c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 04:13:31 +0200 Subject: [PATCH 1009/1724] add another RR preset --- README.md | 1 + src/config.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index eb96c1e..2f388cd 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Math Ages 4-6 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Reader Rabbit Preschool 2002 +- Reader Rabbit Thinking Ages 4-6 (US) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) diff --git a/src/config.c b/src/config.c index f5715e8..dbf2f20 100644 --- a/src/config.c +++ b/src/config.c @@ -1121,6 +1121,15 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Thinking Ages 4-6 (US)\n" + "[rrta32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" "fixchilds=3\n" From a08be3e9227bbc7b609242c4fd8342cf9d6df0b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 04:55:55 +0200 Subject: [PATCH 1010/1724] add preset for TLC launcher --- inc/config.h | 1 + src/IDirectDraw/IDirectDraw.c | 2 +- src/config.c | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index 2bf06ad..abaa180 100644 --- a/inc/config.h +++ b/inc/config.h @@ -101,6 +101,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL tlc_hack; } CNCDDRAWCONFIG; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 1e6f6a4..3bd8379 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -487,7 +487,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DD_OK; + HRESULT ret = g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/config.c b/src/config.c index dbf2f20..e868036 100644 --- a/src/config.c +++ b/src/config.c @@ -111,6 +111,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); + GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -1359,6 +1360,18 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The Learning Company Launcher\n" + "[TLCLauncher]\n" + "tlc_hack=true\n" + "windowed=true\n" + "fullscreen=false\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From 4b153ee11f1527c1cab728bb64744bbe2bb8683f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 05:46:26 +0200 Subject: [PATCH 1011/1724] don't save cursor post on peek/get message --- src/winapi_hooks.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c0a2f38..9ee2eab 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -689,9 +689,6 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { @@ -727,9 +724,6 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { From a5649a808bf54f73f7cb3b619e10e9594e8337ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 07:55:16 +0200 Subject: [PATCH 1012/1724] add preset for Nancy Drew: Secret of Shadow Ranch --- README.md | 1 + src/config.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 2f388cd..f95129d 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Nancy Drew: Treasure in the Royal Tower +- Nancy Drew: The Secret of Shadow Ranch - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson diff --git a/src/config.c b/src/config.c index e868036..37d7f0e 100644 --- a/src/config.c +++ b/src/config.c @@ -1086,6 +1086,12 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=600\n" "\n" + "; Nancy Drew: Secret of Shadow Ranch\n" + "[Game/4]\n" + "checkfile=.\\DataFiles\\DGEBody.cal\n" + "limit_bltfast=true\n" + "maxgameticks=1000\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From 99f388407b97ab7a9948060252163c4349c56fce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 21:12:07 +0200 Subject: [PATCH 1013/1724] always force primary update with flip --- src/ddsurface.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bceeb72..5c52221 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,12 +419,12 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if (g_ddraw.ticks_limiter.tick_length > 0) @@ -651,15 +651,14 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - DWORD time = timeGetTime(); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; @@ -1005,14 +1004,7 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - - DWORD time = timeGetTime(); - - if (!(This->flags & DDSD_BACKBUFFERCOUNT) || - (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) - { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - } + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return DD_OK; @@ -1191,15 +1183,14 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - DWORD time = timeGetTime(); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) util_limit_game_ticks(); } From edb0f430916cd81ff73305a026f12e351214b4a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 21:43:33 +0200 Subject: [PATCH 1014/1724] tweak ticks limiter for nancy drew games --- inc/config.h | 2 +- inc/dd.h | 7 ++++++- src/IDirectDraw/IDirectDraw.c | 2 +- src/config.c | 18 ++++++++++-------- src/dd.c | 11 +++++++++++ src/ddsurface.c | 24 +++++++----------------- 6 files changed, 36 insertions(+), 28 deletions(-) diff --git a/inc/config.h b/inc/config.h index abaa180..0e9f89d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -47,6 +47,7 @@ typedef struct CNCDDRAWCONFIG BOOL noactivateapp; int maxgameticks; + int limiter_type; int minfps; BOOL nonexclusive; BOOL singlecpu; @@ -62,7 +63,6 @@ typedef struct CNCDDRAWCONFIG int hook; int guard_lines; int max_resolutions; - BOOL limit_bltfast; BOOL lock_surfaces; BOOL allow_wmactivate; BOOL flipclear; diff --git a/inc/dd.h b/inc/dd.h index 01e535e..e28249a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -24,6 +24,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); +HRESULT dd_TestCooperativeLevel(); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); @@ -45,13 +46,17 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define SDM_LEAVE_WINDOWED 0x00000002l #define SDM_LEAVE_FULLSCREEN 0x00000004l +#define LIMIT_AUTO 0 +#define LIMIT_TESTCOOP 1 +#define LIMIT_BLTFAST 2 + typedef struct SPEEDLIMITER { DWORD tick_length; LONGLONG tick_length_ns; HANDLE htimer; LARGE_INTEGER due_time; - BOOL use_blt_or_flip; + BOOL dds_unlock_limiter_disabled; } SPEEDLIMITER; struct IDirectDrawSurfaceImpl; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3bd8379..3de9572 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -487,7 +487,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; + HRESULT ret = dd_TestCooperativeLevel(); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/config.c b/src/config.c index 37d7f0e..0b4c5a3 100644 --- a/src/config.c +++ b/src/config.c @@ -59,6 +59,7 @@ void cfg_load() GET_BOOL(g_config.noactivateapp, "noactivateapp", FALSE); GET_INT(g_config.maxgameticks, "maxgameticks", 0); + GET_INT(g_config.limiter_type, "limiter_type", LIMIT_AUTO); GET_INT(g_config.minfps, "minfps", 0); GET_BOOL(g_config.nonexclusive, "nonexclusive", FALSE); GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); @@ -75,7 +76,6 @@ void cfg_load() GET_INT(g_config.hook, "hook", 4); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); - GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); GET_BOOL(g_config.flipclear, "flipclear", FALSE); @@ -262,6 +262,9 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" + "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast\n" + "limiter_type=0\n" + "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" "; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)\n" "minfps=0\n" @@ -295,7 +298,6 @@ static void cfg_create_ini() "hook=4\n" "guard_lines=200\n" "max_resolutions=0\n" - "limit_bltfast=false\n" "lock_surfaces=false\n" "allow_wmactivate=false\n" "flipclear=false\n" @@ -779,7 +781,7 @@ static void cfg_create_ini() "[AdSanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" @@ -983,12 +985,12 @@ static void cfg_create_ini() "\n" "; Knights and Merchants The Shattered Kingdom\n" "[KaM_800]\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=60\n" "\n" "; Knights and Merchants The Shattered Kingdom\n" "[KaM_1024]\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=60\n" "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" @@ -1083,13 +1085,13 @@ static void cfg_create_ini() "; Nancy Drew: Message in a Haunted Mansion\n" "[Game/3]\n" "checkfile=.\\DataFiles\\ASABYBD.cal\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=600\n" "\n" "; Nancy Drew: Secret of Shadow Ranch\n" "[Game/4]\n" "checkfile=.\\DataFiles\\DGEBody.cal\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=1000\n" "\n" "; Nox\n" @@ -1382,7 +1384,7 @@ static void cfg_create_ini() "[sanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "\n" "; RollerCoaster Tycoon\n" "[rct]\n" diff --git a/src/dd.c b/src/dd.c index fe94379..20203fe 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1531,6 +1531,17 @@ HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) return DD_OK; } +HRESULT dd_TestCooperativeLevel() +{ + if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) + { + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; + util_limit_game_ticks(); + } + + return g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; +} + HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid) { if (!pDDDI) diff --git a/src/ddsurface.c b/src/ddsurface.c index 5c52221..2c14a2a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -429,7 +429,7 @@ HRESULT dds_Blt( if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -659,9 +659,9 @@ HRESULT dds_BltFast( if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) + if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -810,7 +810,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -1133,12 +1133,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (erase) { - BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; - - DDBLTFX fx = { .dwFillColor = 0xFE }; - IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - - g_ddraw.ticks_limiter.use_blt_or_flip = x; + blt_clear(This->surface, 0xFE, This->size); } } @@ -1172,12 +1167,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseDC(hwnd, hdc); } - BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; - - DDBLTFX fx = { .dwFillColor = 0 }; - IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - - g_ddraw.ticks_limiter.use_blt_or_flip = x; + blt_clear(This->surface, 0x00, This->size); } @@ -1191,7 +1181,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) util_limit_game_ticks(); } } From b0a3db30a566cfcd05db9f4968af2dd3a159ccfd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 22:51:26 +0200 Subject: [PATCH 1015/1724] short SDM calls --- src/utils.c | 10 +++++----- src/wndproc.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index 9b0ce23..09238fe 100644 --- a/src/utils.c +++ b/src/utils.c @@ -434,7 +434,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = TRUE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); mouse_lock(); } @@ -443,7 +443,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = FALSE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); //mouse_lock(); } @@ -460,7 +460,7 @@ void util_toggle_fullscreen() } g_config.window_state = g_config.windowed = FALSE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_WINDOWED); + dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); mouse_lock(); @@ -496,7 +496,7 @@ void util_toggle_fullscreen() ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_FULLSCREEN); + dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_FULLSCREEN); //mouse_lock(); } } @@ -547,7 +547,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } } diff --git a/src/wndproc.c b/src/wndproc.c index 812f96f..86a9c4c 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -282,7 +282,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam in_size_move = FALSE; if (!g_ddraw.render.thread) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } break; } @@ -437,7 +437,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = HIWORD(lParam); if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } } } From 9b32e255922fffa771ddb15aa0e4611880a9be11 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:35:13 +0200 Subject: [PATCH 1016/1724] update nancy drew presets --- src/config.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index 0b4c5a3..47e0289 100644 --- a/src/config.c +++ b/src/config.c @@ -1082,17 +1082,11 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" - "; Nancy Drew: Message in a Haunted Mansion\n" + "; Nancy Drew (All games)\n" "[Game/3]\n" - "checkfile=.\\DataFiles\\ASABYBD.cal\n" - "limiter_type=2\n" - "maxgameticks=600\n" - "\n" - "; Nancy Drew: Secret of Shadow Ranch\n" - "[Game/4]\n" - "checkfile=.\\DataFiles\\DGEBody.cal\n" - "limiter_type=2\n" - "maxgameticks=1000\n" + "checkfile=.\\Nancy.cid\n" + "limiter_type=1\n" + "maxgameticks=120\n" "\n" "; Nox\n" "[NOX]\n" From d0b23e5273a50f8e49961ceab4de27cea01669c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:54:33 +0200 Subject: [PATCH 1017/1724] hook quicktime by default --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 459661d..c6ef7df 100644 --- a/src/hook.c +++ b/src/hook.c @@ -540,6 +540,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (is_local || _strcmpi(mod_filename, "mciavi32") == 0 || + _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -605,6 +606,7 @@ void hook_revert(HOOKLIST* hooks) if (is_local || _strcmpi(mod_filename, "mciavi32") == 0 || + _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) From 2301ba971bed191b554c9b640878945973da10c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:55:10 +0200 Subject: [PATCH 1018/1724] update American Girls Dress Designer preset --- src/config.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/config.c b/src/config.c index 47e0289..6205ecd 100644 --- a/src/config.c +++ b/src/config.c @@ -402,9 +402,6 @@ static void cfg_create_ini() "; American Girls Dress Designer\n" "[Dress Designer]\n" "fake_mode=640x480x32\n" - "border=false\n" - "posX=0\n" - "posY=0\n" "nonexclusive=true\n" "\n" "; Age of Wonders 2\n" From c66b972f6853e5c6c601aba6b4a1447862f34bff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 02:20:21 +0200 Subject: [PATCH 1019/1724] fix chils windows in dress designer --- src/render_gdi.c | 2 +- src/winapi_hooks.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 78f7d5d..d67bee9 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -93,7 +93,7 @@ DWORD WINAPI gdi_render_main(void) memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); } - if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE)) + if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE) || g_ddraw.child_window_exists) { RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9ee2eab..d4431b0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -38,7 +38,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) int x = max(pt.x - g_ddraw.mouse.x_adjust, 0); int y = max(pt.y - g_ddraw.mouse.y_adjust, 0); - if (g_config.adjmouse) + if (g_config.adjmouse && !g_ddraw.child_window_exists) { x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); @@ -1464,6 +1464,16 @@ HWND WINAPI fake_CreateWindowExA( dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* The American Girls Dress Designer */ + if (HIWORD(lpClassName) && + _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_config.fake_mode[0] && + (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) + { + dwStyle &= ~WS_POPUP; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && From dd04e8ce74d9cb74431e309b839adce35d734e81 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 04:08:14 +0200 Subject: [PATCH 1020/1724] fix TLC launcher fullscreen mode --- src/config.c | 2 -- src/winapi_hooks.c | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 6205ecd..3a252ad 100644 --- a/src/config.c +++ b/src/config.c @@ -1362,8 +1362,6 @@ static void cfg_create_ini() "; The Learning Company Launcher\n" "[TLCLauncher]\n" "tlc_hack=true\n" - "windowed=true\n" - "fullscreen=false\n" "adjmouse=false\n" "width=0\n" "height=0\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d4431b0..065de5d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -511,7 +511,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) if (nCmdShow == SW_MAXIMIZE) nCmdShow = SW_NORMAL; - if (nCmdShow == SW_MINIMIZE && g_config.hook != 2) + if (nCmdShow == SW_MINIMIZE && g_config.hook != 2 && !g_config.tlc_hack) return TRUE; } From 416c6a8d92725d40e7aa02343fa149c1f889551d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 06:30:00 +0200 Subject: [PATCH 1021/1724] detect learning company games and remove presets --- src/config.c | 238 ++++----------------------------------------- src/winapi_hooks.c | 23 ++++- 2 files changed, 37 insertions(+), 224 deletions(-) diff --git a/src/config.c b/src/config.c index 3a252ad..e03a05e 100644 --- a/src/config.c +++ b/src/config.c @@ -463,26 +463,6 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" - "; Arthur's Pet Chase\n" - "[ArthurPP]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Arthur's Sand Castle Contest\n" - "[ArthurSC]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Batman: Toxic Chill\n" - "[Bat1]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Batman: Justice Unbalanced\n" - "[Bat2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" @@ -700,6 +680,24 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; ClueFinders Math Adventures 1.0\n" + "[TCFM32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders Math Adventures 1.0\n" + "[cfmath32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Call To Power 2\n" "[ctp2]\n" "maintas=false\n" @@ -709,66 +707,6 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" - "; ClueFinders Search and Solve Adventures\n" - "[CFSEARCH]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Mystery Mansion\n" - "[ClueFinders Mystery Mansion]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders The Incredible Toy Store Adventure\n" - "[ToyStore]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 3rd Grade Adventures\n" - "[3rdadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 4th Grade Adventures\n" - "[4thadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 4th Grade Adventures\n" - "[4thad32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 5th Grade Adventures\n" - "[5thadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 5th Grade Adventures\n" - "[5thad32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 6th Grade Adventures\n" - "[CF6]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders(R) Reading Adventures Ages 9-12\n" - "[cfread]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Math Adventures 1.0\n" - "[TCFM32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Math Adventures 2.0\n" - "[cfmath32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" @@ -857,11 +795,6 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" - "; Hamtaro: Wake Up Snoozer!\n" - "[Ham]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" @@ -1130,96 +1063,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Reader Rabbit Toddler: Fly the Dreamship\n" - "[Fly the Dreamship]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Toddler: Playtime for Baby\n" - "[rrbaby]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learn To Read With Phonics\n" - "[Superr]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Math Ages 4-6\n" - "[RRM46]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" - "[RRM69_32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Preschool 2002\n" - "[Preschool Sparkle Star Rescue]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Preschool 2002\n" - "[RRP]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit 1st Grade\n" - "[RR1]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit 2nd Grade\n" - "[RR2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten\n" - "[RRK]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade\n" - "[Learn to read Grades 1-2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Calendar \n" - "[Calendar]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Music\n" - "[Music]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Paint\n" - "[Paint]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Dreamship Tales\n" - "[Dreamship Tales]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten\n" - "[rrk32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten: Creative\n" - "[creative]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten: Learning Creations\n" - "[Learning Creations]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" "renderer=gdi\n" @@ -1253,31 +1096,6 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" - "; Scooby-Doo(TM), Case File #2 The Scary Stone Dragon\n" - "[Case File #2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Strawberry Shortcake: Amazing Cookie Party\n" - "[Strawberry]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; SpongeBob SquarePants: Typing\n" - "[SPT]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; StarFlyers Royal Jewel Rescue\n" - "[Royal Jewel Rescue]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; StarFlyers Alien Space Chase\n" - "[Alien Space Chase]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" @@ -1337,11 +1155,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; The Powerpuff Girls(TM) Mojo Jojo's Clone Zone / The Powerpuff Girls - Princess Snorebucks\n" - "[Powerpuff Girls]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1444,21 +1257,6 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" - "; Zoombinis Logical Journey\n" - "[Zoombinis Logicial Journey]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Zoombinis Mountain Rescue\n" - "[zoombini2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Zoombinis Island Odyssey\n" - "[Zoombinis Island Odyssey]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" , fh); fclose(fh); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 065de5d..ed87c1e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1464,9 +1464,25 @@ HWND WINAPI fake_CreateWindowExA( dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* Almost all of the Learning Company Games */ + if (!dwExStyle && + HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 && + !lpWindowName && + dwStyle == WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS && + !X && + !Y && + g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && + g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + !hMenu) + { + dwExStyle = WS_EX_TRANSPARENT; + g_config.lock_mouse_top_left = TRUE; + g_config.adjmouse = FALSE; + dd_SetDisplayMode(0, 0, 0, 0); + } + /* The American Girls Dress Designer */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && g_config.fake_mode[0] && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) @@ -1475,8 +1491,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Center Claw DVD movies */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "Afx:400000:3") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { From fb858f3f083dbf2582b8eea80314e1cdd361a3b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:29:48 +0200 Subject: [PATCH 1022/1724] set up .ini section once and then reuse it --- inc/config.h | 1 + src/config.c | 69 +++++++++++++++++++++++++++++++--------------- src/winapi_hooks.c | 3 +- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/inc/config.h b/inc/config.h index 0e9f89d..f6744a4 100644 --- a/inc/config.h +++ b/inc/config.h @@ -18,6 +18,7 @@ typedef struct CNCDDRAWCONFIG char dll_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; char dll_file_ext[MAX_PATH]; + char game_section[MAX_PATH]; INIFILE ini; BOOL d3d9on12; BOOL opengl_core; diff --git a/src/config.c b/src/config.c index e03a05e..90b5a07 100644 --- a/src/config.c +++ b/src/config.c @@ -18,6 +18,7 @@ static void cfg_create_ini(); static BOOL cfg_get_bool(LPCSTR key, BOOL default_value); static int cfg_get_int(LPCSTR key, int default_value); static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); +static DWORD cfg_get_game_section(LPSTR buf, DWORD size); #define GET_INT(a,b,c) a = cfg_get_int(b, c); TRACE("%s=%d\n", b, a) #define GET_BOOL(a,b,c) a = cfg_get_bool(b, c); TRACE("%s=%s\n", b, a ? "true" : "false") @@ -1333,11 +1334,15 @@ static void cfg_init() } ini_create(&g_config.ini, g_config.ini_path); + cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); } -static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) +static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { - char buf[MAX_PATH] = { 0 }; + if (!buf || size == 0) + return 0; + + char tmp[MAX_PATH] = { 0 }; if (IsWine()) { @@ -1346,26 +1351,29 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, if (ini_section_exists(&g_config.ini, section)) { - DWORD x = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - - if (x > 0) - return x; - - return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + strncpy(buf, section, size - 1); + buf[size - 1] = 0; + return strlen(buf); } } - DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); - - if (s > 0) + if (ini_section_exists(&g_config.ini, g_config.process_file_name)) { - if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", buf, sizeof(buf)) > 0) + if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", tmp, sizeof(tmp)) > 0) { - if (FILE_EXISTS(buf)) - return s; + if (FILE_EXISTS(tmp)) + { + strncpy(buf, g_config.process_file_name, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } else - return s; + { + strncpy(buf, g_config.process_file_name, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } for (int i = 2; i < 10; i++) @@ -1373,19 +1381,36 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - DWORD s = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - - if (s > 0) + if (ini_section_exists(&g_config.ini, section)) { - if (ini_get_string(&g_config.ini, section, "checkfile", "", buf, sizeof(buf)) > 0) + if (ini_get_string(&g_config.ini, section, "checkfile", "", tmp, sizeof(tmp)) > 0) { - if (FILE_EXISTS(buf)) - return s; + if (FILE_EXISTS(tmp)) + { + strncpy(buf, section, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } } } - return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + buf[0] = 0; + + return 0; +} + +static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR buf, DWORD size) +{ + if (g_config.game_section[0]) + { + DWORD s = ini_get_string(&g_config.ini, g_config.game_section, key, "", buf, size); + + if (s > 0) + return s; + } + + return ini_get_string(&g_config.ini, "ddraw", key, default_value, buf, size); } static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ed87c1e..6302498 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1473,7 +1473,8 @@ HWND WINAPI fake_CreateWindowExA( !Y && g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - !hMenu) + !hMenu && + !g_config.game_section[0]) { dwExStyle = WS_EX_TRANSPARENT; g_config.lock_mouse_top_left = TRUE; From d8f29883b744240620ac4347c80600826201e288 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:41:03 +0200 Subject: [PATCH 1023/1724] fix warnings --- src/config.c | 8 ++++---- src/winapi_hooks.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 90b5a07..1bb06ff 100644 --- a/src/config.c +++ b/src/config.c @@ -1351,7 +1351,7 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) if (ini_section_exists(&g_config.ini, section)) { - strncpy(buf, section, size - 1); + strncpy(buf, section, size); buf[size - 1] = 0; return strlen(buf); } @@ -1363,14 +1363,14 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { if (FILE_EXISTS(tmp)) { - strncpy(buf, g_config.process_file_name, size - 1); + strncpy(buf, g_config.process_file_name, size); buf[size - 1] = 0; return strlen(buf); } } else { - strncpy(buf, g_config.process_file_name, size - 1); + strncpy(buf, g_config.process_file_name, size); buf[size - 1] = 0; return strlen(buf); } @@ -1387,7 +1387,7 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { if (FILE_EXISTS(tmp)) { - strncpy(buf, section, size - 1); + strncpy(buf, section, size); buf[size - 1] = 0; return strlen(buf); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6302498..b64dda1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1468,7 +1468,7 @@ HWND WINAPI fake_CreateWindowExA( if (!dwExStyle && HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 && !lpWindowName && - dwStyle == WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS && + dwStyle == (WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS) && !X && !Y && g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && From 087cfcc9fd474139078e0c43617bb788b4f9d089 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:41:48 +0200 Subject: [PATCH 1024/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 3affdbe..04f5b86 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 13df4b3cac1bcc52cbdb5a42d521e88789b96ccb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 20:43:38 +0200 Subject: [PATCH 1025/1724] fix windowed mode in some games --- src/winapi_hooks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b64dda1..652436c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1641,7 +1641,19 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD } } - return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + HRESULT result = real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( From 6eaac8642d90b9be0143af6ffd5f079cd8a35afe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 22:59:12 +0200 Subject: [PATCH 1026/1724] fix cutscene playback on windows 7 --- src/hook.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index c6ef7df..372d891 100644 --- a/src/hook.c +++ b/src/hook.c @@ -9,6 +9,7 @@ #include "dllmain.h" #include "config.h" #include "utils.h" +#include "versionhelpers.h" #ifdef _MSC_VER #include "detours.h" @@ -537,9 +538,10 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) continue; BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || @@ -603,9 +605,10 @@ void hook_revert(HOOKLIST* hooks) _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || From 7d0eeb7810d94d1146e8349464e05c4108d5f3cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 23:04:06 +0200 Subject: [PATCH 1027/1724] make sure quarts and msvfw are hooked --- inc/hook.h | 3 ++- inc/winapi_hooks.h | 3 ++- src/IDirectDraw/IDirectDraw.c | 1 + src/hook.c | 9 ++++++++- src/winapi_hooks.c | 17 +++++++++++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 15b49df..e2a5b87 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -1,7 +1,6 @@ #ifndef HOOK_H #define HOOK_H -#define WIN32_LEAN_AND_MEAN #include @@ -71,6 +70,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); +typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); extern GETCURSORPOSPROC real_GetCursorPos; @@ -119,6 +119,7 @@ extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; +extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 89a948c..3ce0ba3 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -1,7 +1,6 @@ #ifndef WINAPI_HOOKS_H #define WINAPI_HOOKS_H -#define WIN32_LEAN_AND_MEAN #include @@ -79,6 +78,8 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam); + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3de9572..f0ee793 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDraw.h" #include "IDirect3D.h" diff --git a/src/hook.c b/src/hook.c index 372d891..f65d714 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,4 +1,3 @@ -#define WIN32_LEAN_AND_MEAN #include #include #include "directinput.h" @@ -63,6 +62,7 @@ LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; +MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; HOOKLIST g_hook_hooklist[] = @@ -112,6 +112,13 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + { + "winmm.dll", + { + { "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } + }, { "dinput.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 652436c..98d5126 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1656,6 +1656,23 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD return result; } +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam) +{ + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; +} + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { From fb6521fee18bf8815406a6996a72bc27e94ade71 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 23:08:13 +0200 Subject: [PATCH 1028/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 04f5b86..ee20179 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From f9fa52a61f807f327311c2c5fcfd54fcd2472ea9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 01:54:14 +0200 Subject: [PATCH 1029/1724] fix lock_mouse_top_left setting --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 20203fe..13e3262 100644 --- a/src/dd.c +++ b/src/dd.c @@ -882,6 +882,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + + if (g_config.lock_mouse_top_left) + { + g_ddraw.mouse.x_adjust = 0; + g_ddraw.mouse.y_adjust = 0; } g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; From 04693dfb96e22576a391791d0bce67850924e5bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 01:54:27 +0200 Subject: [PATCH 1030/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ee20179..b0c68f3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From bdc54afcf09eb9b3c4a00732e6a1cebd5c47b12e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 02:02:27 +0200 Subject: [PATCH 1031/1724] fix build --- src/dd.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 13e3262..6fa8c9a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -878,10 +878,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - if (!g_config.lock_mouse_top_left) - { - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; - g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; if (g_config.lock_mouse_top_left) { From 802a9e2f9685bbf9faf238b25e5b4ce6d15b5164 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 02:05:44 +0200 Subject: [PATCH 1032/1724] improve cursor lock click checks --- src/wndproc.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 86a9c4c..b2ebd71 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -842,6 +842,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); } + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); @@ -927,8 +930,25 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.devmode && !g_mouse_locked) { - int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); From b2e9e427f248ff5cfc7f21bb73d95c4a8efff4ba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:17:57 +0200 Subject: [PATCH 1033/1724] fix atrox cutscenes --- src/dd.c | 3 +-- src/winapi_hooks.c | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 6fa8c9a..65d6d61 100644 --- a/src/dd.c +++ b/src/dd.c @@ -908,6 +908,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } + dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) @@ -1018,8 +1019,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); - int menu_height = 0; if (GetMenu(g_ddraw.hwnd)) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 98d5126..2e457ea 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -466,8 +466,8 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI } else { - //real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); - //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); + real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); } } @@ -479,8 +479,8 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI } else { - //real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); - //return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); + return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } } } From 5de8cb476165207f25815e020830da9a6cbb8486 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:18:35 +0200 Subject: [PATCH 1034/1724] disable debug code --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 65d6d61..ea370aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -908,7 +908,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } - dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) From 9ac954b7c69f30d4e0de5314ff11077c0eab39c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:19:12 +0200 Subject: [PATCH 1035/1724] update atrox preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 1bb06ff..47d1b7f 100644 --- a/src/config.c +++ b/src/config.c @@ -365,6 +365,7 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "nonexclusive=true\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 3f611106834d0c508ea527f6d9a268ce1b169bb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:53:07 +0200 Subject: [PATCH 1036/1724] add preset for scooby doo case 1 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 47d1b7f..8611dc5 100644 --- a/src/config.c +++ b/src/config.c @@ -1090,6 +1090,12 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" + "[Case File #1]\n" + "windowed=true\n" + "nonexclusive=true\n" + "fake_mode=640x480x32\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" From fa8bc4558a1905b070957b78dfc75ad039c04c43 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 09:38:55 +0200 Subject: [PATCH 1037/1724] enable wing32 hooks --- src/hook.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index f65d714..f26ca90 100644 --- a/src/hook.c +++ b/src/hook.c @@ -148,7 +148,6 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, - /* { "WING32.DLL", { @@ -157,7 +156,6 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, - */ { "kernel32.dll", { From 3715f372b9edaff98d84be66ec365161ac08e128 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 09:44:34 +0200 Subject: [PATCH 1038/1724] add preset for Putt-Putt Saves The Zoo --- README.md | 1 + src/config.c | 5 +++++ src/winapi_hooks.c | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f95129d..b4712c5 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey +- Putt-Putt Saves The Zoo - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II diff --git a/src/config.c b/src/config.c index 8611dc5..93cb282 100644 --- a/src/config.c +++ b/src/config.c @@ -1048,6 +1048,11 @@ static void cfg_create_ini() "[Pharaoh]\n" "adjmouse=true\n" "\n" + "; Putt-Putt Saves The Zoo\n" + "[PUTTZOO]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" "; Pax Imperia\n" "[Pax Imperia]\n" "nonexclusive=true\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2e457ea..09a8a9e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -858,10 +858,10 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, - (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(wDest * g_ddraw.render.scale_w), - (int)(hDest * g_ddraw.render.scale_h), + (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf(wDest * g_ddraw.render.scale_w)), + (int)(roundf(hDest * g_ddraw.render.scale_h)), hdcSrc, xSrc, ySrc, @@ -936,10 +936,10 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(cx * g_ddraw.render.scale_w), - (int)(cy * g_ddraw.render.scale_h), + (int)(roundf(x * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf(y * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf(cx * g_ddraw.render.scale_w)), + (int)(roundf(cy * g_ddraw.render.scale_h)), hdcSrc, x1, y1, @@ -1079,10 +1079,10 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(DestWidth * g_ddraw.render.scale_w), - (int)(DestHeight * g_ddraw.render.scale_h), + (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf(DestWidth * g_ddraw.render.scale_w)), + (int)(roundf(DestHeight * g_ddraw.render.scale_h)), xSrc, ySrc, SrcWidth, From 38d442545d0d67d2835a138a2b30a90ebc1c3aeb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 21:42:46 +0200 Subject: [PATCH 1039/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index b0c68f3..138aeb8 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 648fe238cab483bdcd45872ab84c37a8e5103864 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 22:17:26 +0200 Subject: [PATCH 1040/1724] tweak hook function --- inc/hook.h | 2 +- src/dd.c | 2 +- src/dllmain.c | 2 +- src/hook.c | 10 +++++----- src/winapi_hooks.c | 12 ++++++------ 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index e2a5b87..893238f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -125,7 +125,7 @@ extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; extern HOOKLIST g_hook_hooklist[]; -void hook_init(BOOL initial_hook); +void hook_init(); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); diff --git a/src/dd.c b/src/dd.c index ea370aa..cc2d248 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1202,7 +1202,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_ddraw.wndproc) { - hook_init(FALSE); + hook_init(); g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); diff --git a/src/dllmain.c b/src/dllmain.c index 0f9e5c4..c131c54 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -121,7 +121,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } timeBeginPeriod(1); - hook_init(TRUE); + hook_init(); break; } case DLL_PROCESS_DETACH: diff --git a/src/hook.c b/src/hook.c index f26ca90..9d9b54c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -632,9 +632,9 @@ void hook_revert(HOOKLIST* hooks) } } -void hook_init(BOOL initial_hook) +void hook_init() { - if (initial_hook) + if (!g_hook_active) { if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE)) { @@ -646,7 +646,7 @@ void hook_init(BOOL initial_hook) if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) { #if defined(_DEBUG) && defined(_MSC_VER) - if (initial_hook) + if (!g_hook_active) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); @@ -655,12 +655,12 @@ void hook_init(BOOL initial_hook) } #endif - if (initial_hook) + if (!g_hook_active) { hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } - hook_create((HOOKLIST*)&g_hook_hooklist, initial_hook); + hook_create((HOOKLIST*)&g_hook_hooklist, !g_hook_active); g_hook_active = TRUE; } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 09a8a9e..560a8b8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1195,7 +1195,7 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1223,7 +1223,7 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1251,7 +1251,7 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1279,7 +1279,7 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1650,7 +1650,7 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD if ((!quartz_dll && GetModuleHandleA("quartz")) || (!msvfw32_dll && GetModuleHandleA("msvfw32"))) { - hook_init(FALSE); + hook_init(); } return result; @@ -1667,7 +1667,7 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR if ((!quartz_dll && GetModuleHandleA("quartz")) || (!msvfw32_dll && GetModuleHandleA("msvfw32"))) { - hook_init(FALSE); + hook_init(); } return result; From b8162e61a33d9d366bb33b0a83886131cc29b937 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 22:45:07 +0200 Subject: [PATCH 1041/1724] remove warwind preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 93cb282..ac412f3 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,10 +1262,6 @@ static void cfg_create_ini() "height=0\n" "resizable=false\n" "\n" - "; War Wind\n" - "[WW]\n" - "minfps=-1\n" - "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From ba43c9525cbbe0f2a17eec5c93368b738a3b1721 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 23:53:49 +0200 Subject: [PATCH 1042/1724] Revert "remove warwind preset" This reverts commit b8162e61a33d9d366bb33b0a83886131cc29b937. --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ac412f3..93cb282 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,6 +1262,10 @@ static void cfg_create_ini() "height=0\n" "resizable=false\n" "\n" + "; War Wind\n" + "[WW]\n" + "minfps=-1\n" + "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From fbaabef443a59f22842e3d216bd3db205cdfbe7f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 23:57:21 +0200 Subject: [PATCH 1043/1724] revert some changes --- src/ddsurface.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 2c14a2a..ba876c0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,12 +419,12 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if (g_ddraw.ticks_limiter.tick_length > 0) @@ -651,14 +651,15 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; @@ -1004,7 +1005,14 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); + + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || + (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) + { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + } } return DD_OK; @@ -1173,14 +1181,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) util_limit_game_ticks(); } From 2fe2ee7a40ea71a90f79445cb9ec73a4e92e8082 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 00:07:29 +0200 Subject: [PATCH 1044/1724] update HoMM3 preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 93cb282..7aee353 100644 --- a/src/config.c +++ b/src/config.c @@ -815,10 +815,12 @@ static void cfg_create_ini() "\n" "; Heroes of Might and Magic III\n" "[Heroes3]\n" + "renderer=opengl\n" "game_handles_close=true\n" "\n" "; Heroes of Might and Magic III HD Mod\n" "[Heroes3 HD]\n" + "renderer=opengl\n" "game_handles_close=true\n" "\n" "; Hard Truck: Road to Victory\n" From d6c354f1d486e44f4b1c34cb4a61fba3aadc82a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 01:16:41 +0200 Subject: [PATCH 1045/1724] add presets for Pizza Syndicate --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 7aee353..6f555eb 100644 --- a/src/config.c +++ b/src/config.c @@ -1055,6 +1055,14 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=3\n" "\n" + "; Pizza Syndicate\n" + "[Pizza2]\n" + "renderer=opengl\n" + "\n" + "; Pizza Syndicate - Mehr Biss (Mission CD)\n" + "[Pizza_Mission]\n" + "renderer=opengl\n" + "\n" "; Pax Imperia\n" "[Pax Imperia]\n" "nonexclusive=true\n" From 8534ff44f2fd10413204e5142783cfd95e8b6255 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 01:19:56 +0200 Subject: [PATCH 1046/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b4712c5..dff4659 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Stay Tuned For Danger - Nancy Drew: Treasure in the Royal Tower - Nancy Drew: The Secret of Shadow Ranch +- Nancy Drew: Danger on Deception Island - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From b6e94810147161f1b95fa36c60fc2b5d105978ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:04:28 +0200 Subject: [PATCH 1047/1724] add presets for humongous games --- README.md | 21 ++++++++++++ src/config.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/README.md b/README.md index dff4659..98076b2 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout 2 - Final fantasy VII - Final fantasy VIII +- Freddi Fish +- Freddi Fish 4 +- Freddi Fish's One-Stop Fun Shop +- Freddi Fish: The Case of the Creature of Coral Cove +- Freddi Fish: The Case of the Haunted Schoolhouse - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -225,6 +230,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Pacific General - Patrician 3 - Pax Imperia +- Pajama Sam: No Need to Hide When It's Dark Outside +- Pajama Sam +- Pajama Sam's Games to Play on Any Day +- Pajama Sam 3 +- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) +- Pajama Sam's One-Stop Fun Shop - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning @@ -232,6 +243,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey - Putt-Putt Saves The Zoo +- Putt-Putt's One-Stop Fun Shop +- Putt-Putt and Pep's Dog On A Stick +- Putt-Putt Joins the Circus +- Putt-Putt: Travels Through Time +- Putt-Putt: Pep's Birthday Surprise +- Putt-Putt and Pep's Balloon-o-Rama - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -274,6 +291,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers +- SPY Fox: Hold the Mustard +- SPY Fox in Dry Cereal +- SPY Fox : Some Assembly Required +- SPY Fox: Operation Ozone - SpongeBob SquarePants: Typing - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds diff --git a/src/config.c b/src/config.c index 6f555eb..d61fa28 100644 --- a/src/config.c +++ b/src/config.c @@ -770,6 +770,31 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Freddi Fish\n" + "[FreddiSCS]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish\n" + "[FREDDI4]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" + "; Freddi Fish's One-Stop Fun Shop\n" + "[FreddisFunShop]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: The Case of the Creature of Coral Cove\n" + "[freddicove]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: The Case of the Haunted Schoolhouse\n" + "[FreddiCHSH]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: Maze Madness\n" + "[Maze]\n" + "renderer=gdi\n" + "\n" "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" @@ -1046,6 +1071,30 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Pajama Sam's Games to Play on Any Day\n" + "[PJGAMES]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam\n" + "[PajamaTAL]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam: No Need to Hide When It's Dark Outside\n" + "[PajamaNHD]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam 3\n" + "[Pajama3]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm)\n" + "[PajamaLRS]\n" + "keytogglefullscreen=0x08\n" + "\n" + "; Pajama Sam's One-Stop Fun Shop\n" + "[SamsFunShop]\n" + "renderer=gdi\n" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1055,6 +1104,34 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=3\n" "\n" + "; Putt-Putt's One-Stop Fun Shop\n" + "[PuttsFunShop]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt and Pep's Dog On A Stick\n" + "[DOG]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Joins the Circus\n" + "[puttcircus]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Enters The Race\n" + "[UKPuttRace]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt: Travels Through Time\n" + "[PuttTTT]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt and Pep's Balloon-o-Rama\n" + "[Balloon]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt: Pep's Birthday Surprise\n" + "[PuttsFunShop]\n" + "keytogglefullscreen=0x08\n" + "\n" "; Pizza Syndicate\n" "[Pizza2]\n" "renderer=opengl\n" @@ -1145,6 +1222,26 @@ static void cfg_create_ini() "[Rangers]\n" "hook_peekmessage=true\n" "\n" + "; SPYFox: Hold the Mustard\n" + "[mustard]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox in Dry Cereal (2008)\n" + "[SpyFox]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox in Dry Cereal (2001)\n" + "[SPYFOXDC]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox : Some Assembly Required\n" + "[SPYFOXSR]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox: Operation Ozone\n" + "[spyozon]\n" + "renderer=gdi\n" + "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" "resolutions=2\n" From d4a268ead1fd898ac2bc26296bc4ed951bfcbe67 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:05:40 +0200 Subject: [PATCH 1048/1724] bump version --- README.md | 1 + inc/version.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98076b2..ff6b8a8 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish's One-Stop Fun Shop - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse +- Freddi Fish: Maze Madness - Future Cop L.A.P.D - G-Police - Grand Theft Auto diff --git a/inc/version.h b/inc/version.h index 138aeb8..aef7c2f 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 7 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From d0dbb16b9bb0901af998f7f9b83e0076047d42d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:15:16 +0200 Subject: [PATCH 1049/1724] ignore WM_PAINT and WM_ERASEBKGND if there's no primary surface --- src/wndproc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index b2ebd71..81c1b30 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -968,12 +968,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_ddraw.primary) + { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + } + break; } case WM_ERASEBKGND: { - if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) + if (g_ddraw.primary && (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)) { InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); From a291508432e5e5d5244656bd969e3fe05cbc2817 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 04:44:58 +0200 Subject: [PATCH 1050/1724] log ini section --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index d61fa28..46d6a48 100644 --- a/src/config.c +++ b/src/config.c @@ -1454,6 +1454,8 @@ static void cfg_init() ini_create(&g_config.ini, g_config.ini_path); cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); + + TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); } static DWORD cfg_get_game_section(LPSTR buf, DWORD size) From 702c136c537ac7dbc04f0762540a82a2c55c3f16 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 06:05:13 +0200 Subject: [PATCH 1051/1724] tweak debug logs --- src/utils.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/utils.c b/src/utils.c index 09238fe..de9fc99 100644 --- a/src/utils.c +++ b/src/utils.c @@ -592,22 +592,15 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - /* - TRACE( - " util_enum_child_proc width=%u, Height=%u, left=%d, top=%d\n", - size.right, - size.bottom, - pos.left, - pos.top); - */ - char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE(" AVIWINDOW class=%s, style=%p, exstyle=%p\n", class_name, style, exstyle); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top); + + //dbg_dump_wnd_styles(real_GetWindowLongA(hwnd, GWL_STYLE), exstyle); if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || From b8924026195b06dd22f761bebb684c8c59d481ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 08:55:58 +0200 Subject: [PATCH 1052/1724] add presets for blues clues --- README.md | 2 ++ inc/version.h | 2 +- src/config.c | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ff6b8a8..25b42e8 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Batman: Toxic Chill - Blade & Sword - Blood II - The Chosen +- Blue's 123 Time Activities +- Blue's Treasure Hunt - Caesar III (Sierra - 1998) - Call To Power 2 - Capitalism II diff --git a/inc/version.h b/inc/version.h index aef7c2f..4b648df 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 7 +#define VERSION_REVISION 8 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 46d6a48..1f1408f 100644 --- a/src/config.c +++ b/src/config.c @@ -484,6 +484,19 @@ static void cfg_create_ini() "checkfile=.\\SOUND.REZ\n" "noactivateapp=true\n" "\n" + "; Blue's 123 Time Activities\n" + "[Blues123Time]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" + "; Blue's Treasure Hunt\n" + "[Blue'sTreasureHunt-Disc1]\n" + "renderer=gdi\n" + "\n" + "; Blue's Treasure Hunt\n" + "[Blue'sTreasureHunt-Disc2]\n" + "renderer=gdi\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "noactivateapp=true\n" From caf03df76204d87e87b111e9678a12f4f5303438 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 09:13:51 +0200 Subject: [PATCH 1053/1724] add filename to logs --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 1f1408f..b9ed2aa 100644 --- a/src/config.c +++ b/src/config.c @@ -1468,7 +1468,8 @@ static void cfg_init() ini_create(&g_config.ini, g_config.ini_path); cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); - TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); + TRACE("filename = %s\n", g_config.process_file_name); + TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); } static DWORD cfg_get_game_section(LPSTR buf, DWORD size) From 4d5b95ac8f998c1889d6cc6743b7bfb38efdd8fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 20:09:37 +0200 Subject: [PATCH 1054/1724] update presets --- inc/version.h | 2 +- src/config.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 4b648df..6752d80 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 8 +#define VERSION_REVISION 9 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index b9ed2aa..494d8c2 100644 --- a/src/config.c +++ b/src/config.c @@ -497,6 +497,14 @@ static void cfg_create_ini() "[Blue'sTreasureHunt-Disc2]\n" "renderer=gdi\n" "\n" + "; Blue's Reading Time Activities\n" + "[Blue's Reading Time]\n" + "renderer=gdi\n" + "\n" + "; Blue's ArtTime Activities\n" + "[ArtTime]\n" + "renderer=gdi\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "noactivateapp=true\n" @@ -783,6 +791,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Freddi 1\n" + "[Freddi1]\n" + "renderer=gdi\n" + "\n" "; Freddi Fish\n" "[FreddiSCS]\n" "renderer=gdi\n" From dfeb081cabf588e8a954e6d0dd6e65032257577b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 22:26:16 +0200 Subject: [PATCH 1055/1724] add Freddi Water Worries preset --- README.md | 53 ++++++++++++++++++++++++++-------------------------- src/config.c | 4 ++++ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 25b42e8..edab12e 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura -- Arthur's Wilderness Rescue - Arthur's Pet Chase - Arthur's Sand Castle Contest +- Arthur's Wilderness Rescue - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -126,8 +126,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 -- Cyberchase Castleblanca Quest - Cyberchase Carnival Chaos +- Cyberchase Castleblanca Quest - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 @@ -159,9 +159,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish - Freddi Fish 4 - Freddi Fish's One-Stop Fun Shop +- Freddi Fish: Maze Madness - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse -- Freddi Fish: Maze Madness +- Freddi Water Worries - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -195,11 +196,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 -- Little Bear Toddler Discovery Adventures +- Lionheart - Legacy of the Crusader +- Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures - Little Bear Rainy Day Activities -- Little Bear Kindergarten Thinking Adventures -- Lionheart - Legacy of the Crusader +- Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 - Madeline 1st Grade Math @@ -214,13 +215,13 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 +- Nancy Drew: Danger on Deception Island - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Drew: Treasure in the Royal Tower - Nancy Drew: The Secret of Shadow Ranch -- Nancy Drew: Danger on Deception Island +- Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson @@ -231,27 +232,27 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pacific General +- Pajama Sam +- Pajama Sam 3 +- Pajama Sam's Games to Play on Any Day +- Pajama Sam's One-Stop Fun Shop +- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) +- Pajama Sam: No Need to Hide When It's Dark Outside - Patrician 3 - Pax Imperia -- Pajama Sam: No Need to Hide When It's Dark Outside -- Pajama Sam -- Pajama Sam's Games to Play on Any Day -- Pajama Sam 3 -- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) -- Pajama Sam's One-Stop Fun Shop - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey -- Putt-Putt Saves The Zoo -- Putt-Putt's One-Stop Fun Shop +- Putt-Putt and Pep's Balloon-o-Rama - Putt-Putt and Pep's Dog On A Stick - Putt-Putt Joins the Circus -- Putt-Putt: Travels Through Time +- Putt-Putt Saves The Zoo +- Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise -- Putt-Putt and Pep's Balloon-o-Rama +- Putt-Putt: Travels Through Time - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -261,13 +262,13 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Kindergarten - Reader Rabbit Learn To Read With Phonics - Reader Rabbit Learning Creations +- Reader Rabbit Math Ages 4-6 +- Reader Rabbit Preschool 2002 - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 -- Reader Rabbit Toddler -- Reader Rabbit Math Ages 4-6 -- Reader Rabbit's(R) Math Ages 6 - 9 (2002) -- Reader Rabbit Preschool 2002 - Reader Rabbit Thinking Ages 4-6 (US) +- Reader Rabbit Toddler +- Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -294,11 +295,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers -- SPY Fox: Hold the Mustard -- SPY Fox in Dry Cereal -- SPY Fox : Some Assembly Required -- SPY Fox: Operation Ozone - SpongeBob SquarePants: Typing +- SPY Fox : Some Assembly Required +- SPY Fox in Dry Cereal +- SPY Fox: Hold the Mustard +- SPY Fox: Operation Ozone - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns diff --git a/src/config.c b/src/config.c index 494d8c2..c695cd2 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,10 @@ static void cfg_create_ini() "[Freddi1]\n" "renderer=gdi\n" "\n" + "; Freddi Water Worries\n" + "[Water]\n" + "renderer=gdi\n" + "\n" "; Freddi Fish\n" "[FreddiSCS]\n" "renderer=gdi\n" From 5112aa76e4ea750a196cec68c2a12efb86ccba66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 03:40:29 +0200 Subject: [PATCH 1056/1724] fix movies in atrox --- src/config.c | 1 - src/utils.c | 16 ++++++++++++---- src/winapi_hooks.c | 24 +++++++++++++++++++++--- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index c695cd2..41c23e4 100644 --- a/src/config.c +++ b/src/config.c @@ -366,7 +366,6 @@ static void cfg_create_ini() "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" - "fixchilds=0\n" "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" diff --git a/src/utils.c b/src/utils.c index de9fc99..8c8072c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -590,17 +590,25 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) RECT size; RECT pos; - if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) + if (real_GetClientRect(hwnd, &size) && + real_GetWindowRect(hwnd, &pos) && + size.right > 1 && + size.bottom > 1) { char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); - //dbg_dump_wnd_styles(real_GetWindowLongA(hwnd, GWL_STYLE), exstyle); + //dbg_dump_wnd_styles(style, exstyle); + + /* Atrox */ + if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) + return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 560a8b8..664d16e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -834,6 +834,7 @@ BOOL WINAPI fake_StretchBlt( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || @@ -846,8 +847,22 @@ BOOL WINAPI fake_StretchBlt( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + BOOL result = - real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); + real_StretchBlt( + primary_dc, + xDest + pt.x, + yDest + pt.y, + wDest, + hDest, + hdcSrc, + xSrc, + ySrc, + wSrc, + hSrc, + rop); dds_ReleaseDC(g_ddraw.primary, primary_dc); @@ -1053,11 +1068,14 @@ int WINAPI fake_StretchDIBits( if (primary_dc) { + POINT pt = {0}; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_StretchDIBits( primary_dc, - xDest, - yDest, + xDest + pt.x, + yDest + pt.y, DestWidth, DestHeight, xSrc, From d6786bc725deaa54825fd85bdafbcef5b8f4b0dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 03:55:40 +0200 Subject: [PATCH 1057/1724] add missing scaling code to SetDIBitsToDevice --- src/winapi_hooks.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 664d16e..6a73990 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -994,7 +994,9 @@ int WINAPI fake_SetDIBitsToDevice( const BITMAPINFO* lpbmi, UINT ColorUse) { - if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + HWND hwnd = WindowFromDC(hdc); + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1023,6 +1025,24 @@ int WINAPI fake_SetDIBitsToDevice( return result; } } + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + { + return + real_StretchDIBits( + hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, + (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf(w * g_ddraw.render.scale_w)), + (int)(roundf(h * g_ddraw.render.scale_h)), + xSrc, + ySrc, + w, + h, + lpvBits, + lpbmi, + ColorUse, + SRCCOPY); + } } return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); @@ -1056,6 +1076,7 @@ int WINAPI fake_StretchDIBits( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || From 65977a8268f22809caf903c3545c46ec93cec800 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 06:29:55 +0200 Subject: [PATCH 1058/1724] improve logging --- src/utils.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8c8072c..f103bce 100644 --- a/src/utils.c +++ b/src/utils.c @@ -587,6 +587,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; + HWND parent = GetParent(hwnd); RECT size; RECT pos; @@ -601,10 +602,15 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); +#ifdef _DEBUG_X + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); - //dbg_dump_wnd_styles(style, exstyle); + dbg_dump_wnd_styles(style, exstyle); +#endif + + if (parent != g_ddraw.hwnd) + return TRUE; /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -657,7 +663,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } - return FALSE; + return parent == g_ddraw.hwnd ? FALSE : TRUE; } static unsigned char util_get_pixel(int x, int y) From 9cc00bd6cf127e22b4428357d030d060f9d7c2d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 06:59:01 +0200 Subject: [PATCH 1059/1724] Revert "improve logging" This reverts commit 65977a8268f22809caf903c3545c46ec93cec800. --- src/utils.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/utils.c b/src/utils.c index f103bce..8c8072c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -587,7 +587,6 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; - HWND parent = GetParent(hwnd); RECT size; RECT pos; @@ -602,15 +601,10 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); -#ifdef _DEBUG_X - TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); - dbg_dump_wnd_styles(style, exstyle); -#endif - - if (parent != g_ddraw.hwnd) - return TRUE; + //dbg_dump_wnd_styles(style, exstyle); /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -663,7 +657,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } - return parent == g_ddraw.hwnd ? FALSE : TRUE; + return FALSE; } static unsigned char util_get_pixel(int x, int y) From 515db2b2e38117ffea3e814348135ea5527b7954 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 07:28:13 +0200 Subject: [PATCH 1060/1724] fix esc not working in some games (skipping movies) --- src/wndproc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 81c1b30..3d0a986 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -798,8 +798,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { - PostMessageA(video_hwnd, uMsg, wParam, lParam); - return 0; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; @@ -812,8 +812,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { - PostMessageA(video_hwnd, uMsg, wParam, lParam); - return 0; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; @@ -910,8 +910,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { - PostMessageA(video_hwnd, uMsg, wParam, lParam); - return 0; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; From 5c0b9462b94c9a4fe654e257f1c5a0961525e29b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 09:17:48 +0200 Subject: [PATCH 1061/1724] add more presets for gdi games --- README.md | 1 + inc/version.h | 2 +- src/config.c | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index edab12e..7402a11 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish: Maze Madness - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse +- Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch - Freddi Water Worries - Future Cop L.A.P.D - G-Police diff --git a/inc/version.h b/inc/version.h index 6752d80..b527eba 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 9 +#define VERSION_REVISION 10 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 41c23e4..81d8a00 100644 --- a/src/config.c +++ b/src/config.c @@ -794,6 +794,10 @@ static void cfg_create_ini() "[Freddi1]\n" "renderer=gdi\n" "\n" + "; Freddi Fish : The Case of the Hogfish Rustlers of Briny Gulch\n" + "[Freddihrbg]\n" + "renderer=gdi\n" + "\n" "; Freddi Water Worries\n" "[Water]\n" "renderer=gdi\n" @@ -1123,6 +1127,10 @@ static void cfg_create_ini() "[SamsFunShop]\n" "renderer=gdi\n" "\n" + "; Pajama Sam DON'T FEAR THE DARK\n" + "[pjSam]\n" + "renderer=gdi\n" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1156,6 +1164,14 @@ static void cfg_create_ini() "[Balloon]\n" "renderer=gdi\n" "\n" + "; Putt-Putt Travels Through Time\n" + "[PUTTPUTTTTT]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Joins the Circus\n" + "[puttputtjtc]\n" + "renderer=gdi\n" + "\n" "; Putt-Putt: Pep's Birthday Surprise\n" "[PuttsFunShop]\n" "keytogglefullscreen=0x08\n" @@ -1254,6 +1270,10 @@ static void cfg_create_ini() "[mustard]\n" "renderer=gdi\n" "\n" + "; SPYFox 2\n" + "[Spyfox 2]\n" + "renderer=gdi\n" + "\n" "; SPY Fox in Dry Cereal (2008)\n" "[SpyFox]\n" "renderer=gdi\n" @@ -1270,6 +1290,10 @@ static void cfg_create_ini() "[spyozon]\n" "renderer=gdi\n" "\n" + "; SPY Fox: Operation Ozone\n" + "[spyfoxozu]\n" + "renderer=gdi\n" + "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" "resolutions=2\n" From 8091f3aa45844e553f205ef93094caa6625d22aa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 19:43:31 +0200 Subject: [PATCH 1062/1724] update presets --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 81d8a00..138c8e3 100644 --- a/src/config.c +++ b/src/config.c @@ -1131,6 +1131,10 @@ static void cfg_create_ini() "[pjSam]\n" "renderer=gdi\n" "\n" + "; Pajama Sam 3: You Are What You Eat From Your Head To Your Feet\n" + "[UKpajamaEAT]\n" + "renderer=gdi\n" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1270,8 +1274,8 @@ static void cfg_create_ini() "[mustard]\n" "renderer=gdi\n" "\n" - "; SPYFox 2\n" - "[Spyfox 2]\n" + "; SPY Fox: Some Assembly Required\n" + "[Spyfox2]\n" "renderer=gdi\n" "\n" "; SPY Fox in Dry Cereal (2008)\n" From f57832e0b96492a1aae15aaf765420703e20364e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 19:44:57 +0200 Subject: [PATCH 1063/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7402a11..53369a1 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Pajama Sam's One-Stop Fun Shop - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside +- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) From 55413ffd61cb1e3503760bbf75bb36be68ba88e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 21:35:28 +0200 Subject: [PATCH 1064/1724] add original polish names for reksio games --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 53369a1..1b93902 100644 --- a/README.md +++ b/README.md @@ -272,12 +272,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D -- Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) -- Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) -- Reksio and the Pirate Treasure (AKA Reksio si Comoara Piratilor) -- Reksio and the Time Machine (AKA Reksio si Masina Timpului) -- Reksio and the UFO (AKA Reksio si OZN-ul) -- Reksio and the Wizards (AKA Reksio si Magicienii) +- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) +- Reksio and the UFO (Reksio i Ufo) +- Reksio and the Wizards (Reksio i Czarodzieje) +- Reksio and the Time Machine (Reksio i Wehikuł Czasu) +- Reksio and Captain Nemo (Reksio i Kapitan Nemo) +- Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Road Rash - RollerCoaster Tycoon - Sanitarium From 8bab67b6cd018bef2ff90b44c0f00963d51d6c61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 21:54:05 +0200 Subject: [PATCH 1065/1724] improve debug logging --- src/utils.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8c8072c..cbe96d9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -601,10 +601,17 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); +#ifdef _DEBUG_X + HWND parent = GetParent(hwnd); - //dbg_dump_wnd_styles(style, exstyle); + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); + + dbg_dump_wnd_styles(style, exstyle); + + if (parent != g_ddraw.hwnd) + return TRUE; +#endif /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -657,7 +664,11 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } +#ifdef _DEBUG_X + return TRUE; +#else return FALSE; +#endif } static unsigned char util_get_pixel(int x, int y) From addd3538b57404145a1e72e3c947b9042eacff77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Jun 2024 00:04:35 +0200 Subject: [PATCH 1066/1724] add some testing code for claw dvd movies --- src/winapi_hooks.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6a73990..d244c44 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1532,9 +1532,13 @@ HWND WINAPI fake_CreateWindowExA( /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { + //dwStyle &= ~WS_POPUP; + //dwExStyle = WS_EX_TRANSPARENT; + POINT pt = { 0, 0 }; real_ClientToScreen(g_ddraw.hwnd, &pt); @@ -1548,8 +1552,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Road Rash movies */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "AVI Window") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & WS_POPUP)) { From ca0589ebc60d9bb74fabefb4481990470692323e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 02:29:48 +0200 Subject: [PATCH 1067/1724] copy StretchBltMode from original DC --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d244c44..818955f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -850,6 +850,11 @@ BOOL WINAPI fake_StretchBlt( POINT pt = { 0 }; real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int org_mode = SetStretchBltMode(hdcDest, COLORONCOLOR); + SetStretchBltMode(hdcDest, org_mode); + + int mode = SetStretchBltMode(primary_dc, org_mode); + BOOL result = real_StretchBlt( primary_dc, @@ -864,6 +869,8 @@ BOOL WINAPI fake_StretchBlt( hSrc, rop); + SetStretchBltMode(primary_dc, mode); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; From 913026f8aa5074355a21936788025a8ab8c84d9c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 02:30:12 +0200 Subject: [PATCH 1068/1724] look for MCIQTZ_Window class childs --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index cbe96d9..734b5b2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -619,6 +619,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIQTZ_Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0 || From 43bedd649ed720267bc9aace731fcc0eb1aea977 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 03:02:18 +0200 Subject: [PATCH 1069/1724] add preset for The X-Files DVD --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 138c8e3..fecdeb3 100644 --- a/src/config.c +++ b/src/config.c @@ -1348,6 +1348,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The X-Files DVD\n" + "[XFiles]\n" + "windowed=true\n" + "fullscreen=true\n" + "\n" "; The Learning Company Launcher\n" "[TLCLauncher]\n" "tlc_hack=true\n" From 58d0500ad1fc8ca76130b48d5ad6c9bdb26689b3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 03:50:10 +0200 Subject: [PATCH 1070/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b93902..ed77895 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold HD - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone +- The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation From 4df9dfc654b44a39aea67fcefa0b222aaf3cafd1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 04:55:33 +0200 Subject: [PATCH 1071/1724] bump version --- inc/version.h | 4 ++-- src/config.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index b527eba..f3a1b27 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 5 +#define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 10 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index fecdeb3..3e3f7e7 100644 --- a/src/config.c +++ b/src/config.c @@ -1352,6 +1352,7 @@ static void cfg_create_ini() "[XFiles]\n" "windowed=true\n" "fullscreen=true\n" + "toggle_borderless=true\n" "\n" "; The Learning Company Launcher\n" "[TLCLauncher]\n" From 0246dd44e952ff0037e2f6b4eb0987c0708c7bae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jun 2024 01:01:12 +0200 Subject: [PATCH 1072/1724] make sure we only let the first WM_ACTIVATEAPP pass through --- src/wndproc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3d0a986..43abdcf 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -671,10 +671,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* let it pass through once (tiberian sun / ClueFinders) */ static BOOL one_time; - if (wParam && !one_time) + if (!one_time) { one_time = TRUE; - break; + + if (wParam) + break; } if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) From cfc6c041039badb44c9a08d0a1f75580fe0a9504 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jun 2024 01:11:37 +0200 Subject: [PATCH 1073/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index f3a1b27..83a7bc4 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 8269b41b5c539b144d8e8886eed18bf437b9c6d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:28:18 +0200 Subject: [PATCH 1074/1724] add preset for Robin Hood - The Legend of Sherwood --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index 3e3f7e7..79a945d 100644 --- a/src/config.c +++ b/src/config.c @@ -1230,6 +1230,15 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Robin Hood - The Legend of Sherwood (GOG)\n" + "[Game/4]\n" + "checkfile=.\\Robin Hood.exe\n" + "singlecpu=false\n" + "\n" + "; Robin Hood - The Legend of Sherwood\n" + "[Robin Hood]\n" + "singlecpu=false\n" + "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" "windowed=true\n" From d3416988f31f25ae9311689e4fa44206fa9a6efd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:38:10 +0200 Subject: [PATCH 1075/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ed77895..3714a69 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Road Rash +- Robin Hood - The Legend of Sherwood - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon From 0c6a0fba4b6388433f3a41fa423780b5d722e9bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:56:29 +0200 Subject: [PATCH 1076/1724] remove duplicate code --- src/dd.c | 49 +++++++++++-------------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/src/dd.c b/src/dd.c index cc2d248..73ebcf6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -541,20 +541,18 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (!g_ddraw.render.run) + if (g_ddraw.render.run) { - return DD_OK; - } + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } } if (!g_config.windowed) @@ -1433,32 +1431,7 @@ ULONG dd_Release() cfg_save(); } - if (g_ddraw.render.run) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } - } - - if (!g_config.windowed) - { - if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) - { - if (!d3d9_reset(TRUE)) - d3d9_release(); - } - else - { - ChangeDisplaySettings(NULL, 0); - } - } + dd_RestoreDisplayMode(); if (g_ddraw.render.hdc) { From e19d896dab73ba17747d3736746d2d027ed4bcc8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 22:08:23 +0200 Subject: [PATCH 1077/1724] Revert "remove duplicate code" This reverts commit 0c6a0fba4b6388433f3a41fa423780b5d722e9bc. --- src/dd.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 73ebcf6..cc2d248 100644 --- a/src/dd.c +++ b/src/dd.c @@ -541,18 +541,20 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (g_ddraw.render.run) + if (!g_ddraw.render.run) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + return DD_OK; + } - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) @@ -1431,7 +1433,32 @@ ULONG dd_Release() cfg_save(); } - dd_RestoreDisplayMode(); + if (g_ddraw.render.run) + { + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } + } + + if (!g_config.windowed) + { + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) + { + if (!d3d9_reset(TRUE)) + d3d9_release(); + } + else + { + ChangeDisplaySettings(NULL, 0); + } + } if (g_ddraw.render.hdc) { From 4385f77b52f8110e8b752c468486dc3dfd78dea3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 00:02:39 +0200 Subject: [PATCH 1078/1724] hook EnumDisplaySettingsA --- inc/hook.h | 4 +++- inc/version.h | 2 +- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 893238f..cd1dab8 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[33]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -57,6 +57,7 @@ typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); +typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -107,6 +108,7 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; +extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/version.h b/inc/version.h index 83a7bc4..3b43e44 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3ce0ba3..6e2965d 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); +BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 9d9b54c..91d18db 100644 --- a/src/hook.c +++ b/src/hook.c @@ -50,6 +50,7 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; +ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -98,6 +99,7 @@ HOOKLIST g_hook_hooklist[] = { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, + { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 818955f..26ebc7c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -767,6 +767,39 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) return result; } +BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) +{ + BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode); + + if (result && !lpszDeviceName && lpDevMode && iModeNum == ENUM_CURRENT_SETTINGS) + { + if (g_ddraw.ref && g_ddraw.width) + { + lpDevMode->dmPelsWidth = g_ddraw.width; + lpDevMode->dmPelsHeight = g_ddraw.height; + lpDevMode->dmBitsPerPel = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + lpDevMode->dmPelsWidth = strtoul(e, &e, 0); + lpDevMode->dmPelsHeight = strtoul(e + 1, &e, 0); + lpDevMode->dmBitsPerPel = strtoul(e + 1, &e, 0); + } + else + { + lpDevMode->dmPelsWidth = 1024; + lpDevMode->dmPelsHeight = 768; + lpDevMode->dmBitsPerPel = 16; + } + + lpDevMode->dmDisplayFrequency = 60; + } + + return result; +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 526a068a9aa87bb33a3508d4102f96bbc1b3003e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 00:05:04 +0200 Subject: [PATCH 1079/1724] use real_ functions --- src/dd.c | 8 ++++---- src/utils.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index cc2d248..db0623f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -62,7 +62,7 @@ HRESULT dd_EnumDisplayModes( memset(®_m, 0, sizeof(DEVMODE)); reg_m.dmSize = sizeof(DEVMODE); - if (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) + if (real_EnumDisplaySettingsA(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) { max_w = reg_m.dmPelsWidth; max_h = reg_m.dmPelsHeight; @@ -138,7 +138,7 @@ HRESULT dd_EnumDisplayModes( memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { TRACE_EXT( " %u: %ux%u@%u %u bpp | flags=0x%08X, FO=%u\n", @@ -177,7 +177,7 @@ HRESULT dd_EnumDisplayModes( BOOL custom_res_injected = FALSE; - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && bpp == m.dmBitsPerPel && @@ -607,7 +607,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mode.dmSize = sizeof(DEVMODE); g_ddraw.mode.dmDriverExtra = 0; - if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) + if (real_EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) { g_ddraw.mode.dmSize = sizeof(DEVMODE); g_ddraw.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; diff --git a/src/utils.c b/src/utils.c index 734b5b2..48218b2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -308,7 +308,7 @@ BOOL util_get_lowest_resolution( memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { if (m.dmPelsWidth >= min_width && m.dmPelsHeight >= min_height && From 38a6785ff8e7ba1d36c21f4129c2ae770c9a4855 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 22:00:38 +0200 Subject: [PATCH 1080/1724] #323 remove dinput hooks when dlls is being unloaded --- src/directinput.c | 88 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 6dd5e5e..13d06b8 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -19,10 +19,15 @@ DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; DIRECTINPUT8CREATEPROC real_DirectInput8Create; static DICREATEDEVICEPROC real_di_CreateDevice; +static PROC* di_CreateDevice_vtbl_addr; static DICREATEDEVICEEXPROC real_di_CreateDeviceEx; +static PROC* di_CreateDeviceEx_vtbl_addr; static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel; +static PROC* did_SetCooperativeLevel_vtbl_addr; static DIDGETDEVICEDATAPROC real_did_GetDeviceData; +static PROC* did_GetDeviceData_vtbl_addr; static DIDGETDEVICESTATEPROC real_did_GetDeviceState; +static PROC* did_GetDeviceState_vtbl_addr; static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) @@ -121,17 +126,20 @@ static HRESULT WINAPI fake_di_CreateDevice( if (!real_did_SetCooperativeLevel) { + did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + + did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + + did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -158,17 +166,20 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (!real_did_SetCooperativeLevel) { + did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + + did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + + did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -186,7 +197,7 @@ HRESULT WINAPI fake_DirectInputCreateA( if (!real_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA"); if (real_DirectInputCreateA == fake_DirectInputCreateA) { @@ -204,8 +215,10 @@ HRESULT WINAPI fake_DirectInputCreateA( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -222,7 +235,7 @@ HRESULT WINAPI fake_DirectInputCreateW( if (!real_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW == fake_DirectInputCreateW) { @@ -240,8 +253,10 @@ HRESULT WINAPI fake_DirectInputCreateW( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -259,7 +274,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (!real_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx == fake_DirectInputCreateEx) { @@ -277,8 +292,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } if (SUCCEEDED(result) && @@ -287,8 +304,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) && !g_config.no_dinput_hook) { + di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; + real_di_CreateDeviceEx = - (DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx); + (DICREATEDEVICEEXPROC)hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); } return result; @@ -306,7 +325,7 @@ HRESULT WINAPI fake_DirectInput8Create( if (!real_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)real_GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create"); if (real_DirectInput8Create == fake_DirectInput8Create) { @@ -324,8 +343,10 @@ HRESULT WINAPI fake_DirectInput8Create( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -383,6 +404,31 @@ void dinput_hook_init() void dinput_hook_exit() { + if (di_CreateDevice_vtbl_addr && *di_CreateDevice_vtbl_addr == (PROC)fake_di_CreateDevice) + { + hook_func(di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); + } + + if (di_CreateDeviceEx_vtbl_addr && *di_CreateDeviceEx_vtbl_addr == (PROC)fake_di_CreateDeviceEx) + { + hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); + } + + if (did_SetCooperativeLevel_vtbl_addr && *did_SetCooperativeLevel_vtbl_addr == (PROC)fake_did_SetCooperativeLevel) + { + hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); + } + + if (did_GetDeviceData_vtbl_addr && *did_GetDeviceData_vtbl_addr == (PROC)fake_did_GetDeviceData) + { + hook_func(did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); + } + + if (did_GetDeviceState_vtbl_addr && *did_GetDeviceState_vtbl_addr == (PROC)fake_did_GetDeviceState) + { + hook_func(did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); + } + #ifdef _MSC_VER if (g_dinput_hook_active) { From c67d80282a3de592a5d354f185ec9d4f977e4235 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 22:08:44 +0200 Subject: [PATCH 1081/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3714a69..c35f44e 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- Sudden Strike 2 - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD From 32349fd6a49d3b021e4301f5dbeba889a791d69b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jun 2024 02:58:20 +0200 Subject: [PATCH 1082/1724] simplify code --- src/directinput.c | 88 ++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 51 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 13d06b8..e5e4dd5 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -19,19 +19,24 @@ DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; DIRECTINPUT8CREATEPROC real_DirectInput8Create; static DICREATEDEVICEPROC real_di_CreateDevice; -static PROC* di_CreateDevice_vtbl_addr; static DICREATEDEVICEEXPROC real_di_CreateDeviceEx; -static PROC* di_CreateDeviceEx_vtbl_addr; static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel; -static PROC* did_SetCooperativeLevel_vtbl_addr; static DIDGETDEVICEDATAPROC real_did_GetDeviceData; -static PROC* did_GetDeviceData_vtbl_addr; static DIDGETDEVICESTATEPROC real_did_GetDeviceState; -static PROC* did_GetDeviceState_vtbl_addr; + +static PROC* g_di_CreateDevice_vtbl_addr; +static PROC* g_di_CreateDeviceEx_vtbl_addr; +static PROC* g_did_SetCooperativeLevel_vtbl_addr; +static PROC* g_did_GetDeviceData_vtbl_addr; +static PROC* g_did_GetDeviceState_vtbl_addr; + static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) { + if (!org_func) + return 0; + PROC org = *org_func; DWORD old_protect; @@ -126,20 +131,20 @@ static HRESULT WINAPI fake_di_CreateDevice( if (!real_did_SetCooperativeLevel) { - did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -166,20 +171,20 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (!real_did_SetCooperativeLevel) { - did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -215,10 +220,10 @@ HRESULT WINAPI fake_DirectInputCreateA( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -253,10 +258,10 @@ HRESULT WINAPI fake_DirectInputCreateW( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -292,10 +297,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } if (SUCCEEDED(result) && @@ -304,10 +309,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) && !g_config.no_dinput_hook) { - di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; + g_di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; real_di_CreateDeviceEx = - (DICREATEDEVICEEXPROC)hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); + (DICREATEDEVICEEXPROC)hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); } return result; @@ -343,10 +348,10 @@ HRESULT WINAPI fake_DirectInput8Create( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -404,30 +409,11 @@ void dinput_hook_init() void dinput_hook_exit() { - if (di_CreateDevice_vtbl_addr && *di_CreateDevice_vtbl_addr == (PROC)fake_di_CreateDevice) - { - hook_func(di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); - } - - if (di_CreateDeviceEx_vtbl_addr && *di_CreateDeviceEx_vtbl_addr == (PROC)fake_di_CreateDeviceEx) - { - hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); - } - - if (did_SetCooperativeLevel_vtbl_addr && *did_SetCooperativeLevel_vtbl_addr == (PROC)fake_did_SetCooperativeLevel) - { - hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); - } - - if (did_GetDeviceData_vtbl_addr && *did_GetDeviceData_vtbl_addr == (PROC)fake_did_GetDeviceData) - { - hook_func(did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); - } - - if (did_GetDeviceState_vtbl_addr && *did_GetDeviceState_vtbl_addr == (PROC)fake_did_GetDeviceState) - { - hook_func(did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); - } + hook_func(g_di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); + hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); + hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); + hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); + hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); #ifdef _MSC_VER if (g_dinput_hook_active) From 8316f89eb4d6b4f68bffaff2b4ab18ed0225acb5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jun 2024 03:00:50 +0200 Subject: [PATCH 1083/1724] add NULL check --- src/directinput.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directinput.c b/src/directinput.c index e5e4dd5..bf5e3d5 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -34,7 +34,7 @@ static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) { - if (!org_func) + if (!org_func || !new_func) return 0; PROC org = *org_func; From afef91cb7fab7344bddba11832b18ebb88f5290e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 00:38:23 +0200 Subject: [PATCH 1084/1724] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c35f44e..4637a7a 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,10 @@ Some games may require additional steps before they can be used with cnc-ddraw,   +Need help and don't have a github account? Ask on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) + +  + ### Hotkeys * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor From 05a79a8cbf8f00e3d2e4018e53a2fa27107c6fbc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 00:41:24 +0200 Subject: [PATCH 1085/1724] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4637a7a..9bce324 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -Need help and don't have a github account? Ask on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) +Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required)   From c7312c2c07b73958ede09bfa4bc69c6d31a6f680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 02:47:31 +0200 Subject: [PATCH 1086/1724] allow to toggle windowed mode with F4 in HoMM games --- inc/config.h | 1 + src/config.c | 7 +++++++ src/wndproc.c | 9 +++++++++ 3 files changed, 17 insertions(+) diff --git a/inc/config.h b/inc/config.h index f6744a4..f0b8275 100644 --- a/inc/config.h +++ b/inc/config.h @@ -103,6 +103,7 @@ typedef struct CNCDDRAWCONFIG BOOL stronghold_hack; BOOL mgs_hack; BOOL tlc_hack; + BOOL homm_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 79a945d..80c787e 100644 --- a/src/config.c +++ b/src/config.c @@ -113,6 +113,7 @@ void cfg_load() GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); + GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -874,11 +875,17 @@ static void cfg_create_ini() "[Heroes3]\n" "renderer=opengl\n" "game_handles_close=true\n" + "homm_hack=true\n" "\n" "; Heroes of Might and Magic III HD Mod\n" "[Heroes3 HD]\n" "renderer=opengl\n" "game_handles_close=true\n" + "homm_hack=true\n" + "\n" + "; Heroes of Might and Magic IV\n" + "[heroes4]\n" + "homm_hack=true\n" "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" diff --git a/src/wndproc.c b/src/wndproc.c index 43abdcf..ebde744 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -777,6 +777,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { + if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + { + util_toggle_fullscreen(); + return 0; + } + if (g_config.hotkeys.unlock_cursor1 && (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { @@ -808,6 +814,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYUP: { + if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + return 0; + if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw.primary); From 02605d2b45f7c5fff4185bd4dbab85fb6682c7e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 02:50:41 +0200 Subject: [PATCH 1087/1724] add preset for Master of Puppets mod --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 80c787e..324f8be 100644 --- a/src/config.c +++ b/src/config.c @@ -883,6 +883,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "homm_hack=true\n" "\n" + "; Heroes of Might and Magic III - Master of Puppets mod\n" + "[MoP]\n" + "game_handles_close=true\n" + "homm_hack=true\n" + "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" "homm_hack=true\n" From 30de4d7df42380c4850fbbf6f8a12529d6a30183 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Jun 2024 05:28:06 +0200 Subject: [PATCH 1088/1724] use high resolutuion timer by default --- inc/dd.h | 4 ++++ inc/versionhelpers.h | 4 ++++ src/dd.c | 25 ++++++++++++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index e28249a..8a074da 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -50,6 +50,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 +#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION +#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 8acf6f5..3aa5742 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -119,6 +119,10 @@ VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } +VERSIONHELPERAPI IsWindows10Version1803OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 17134, 0); +} + VERSIONHELPERAPI IsWindows11OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } diff --git a/src/dd.c b/src/dd.c index db0623f..c6dfc7e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1578,12 +1578,28 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.minfps > 0) g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); + + HANDLE (WINAPI *createTimerExW)(LPSECURITY_ATTRIBUTES, LPCWSTR, DWORD, DWORD) = NULL; + + if (!IsWine() && IsWindows10Version1803OrGreater()) + { + createTimerExW = (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "CreateWaitableTimerExW"); + } + + DWORD timer_flags = CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION; + /* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */ - g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_fpsl.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_fpsl.htimer) + g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) { - g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.ticks_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_ddraw.ticks_limiter.htimer) + g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float len = 1000.0f / g_config.maxgameticks; g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); @@ -1593,7 +1609,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) { /* always using 60 fps for flip... */ - g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.flip_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_ddraw.flip_limiter.htimer) + g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float flip_len = 1000.0f / 60; g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); From a0abcb20be68d80531eb9ce4c5ca9545fdb33a4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Jun 2024 06:06:27 +0200 Subject: [PATCH 1089/1724] define CREATE_WAITABLE_TIMER_MANUAL_RESET in header --- inc/dd.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 8a074da..73a1202 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -54,6 +54,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 #endif +#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET +#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; From 69ad0c2ac677702dbd27c25709d651a2553b8304 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 02:36:20 +0200 Subject: [PATCH 1090/1724] improve debug logs --- src/IDirect3D/IDirect3D.c | 28 +++-- src/IDirect3D/IDirect3D2.c | 20 ++-- src/IDirect3D/IDirect3D3.c | 34 +++--- src/IDirect3D/IDirect3D7.c | 26 +++-- src/IDirectDraw/IDirectDraw.c | 97 ++++++++++------- src/IDirectDraw/IDirectDrawClipper.c | 31 ++++-- src/IDirectDraw/IDirectDrawGammaControl.c | 20 +++- src/IDirectDraw/IDirectDrawPalette.c | 29 +++-- src/IDirectDraw/IDirectDrawSurface.c | 123 ++++++++++++---------- 9 files changed, 255 insertions(+), 153 deletions(-) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 352430f..d1e6cc9 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,7 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +87,7 @@ HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__FindDevice(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index d84598f..84169ae 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -1,10 +1,12 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -12,7 +14,7 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +22,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -37,7 +39,7 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +47,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +55,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +63,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +71,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +79,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 0978d4a..736572a 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +87,7 @@ HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -85,7 +95,7 @@ HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, i HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -93,7 +103,7 @@ HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -101,7 +111,7 @@ HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EvictManagedTextures(IDirect3D3Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 99c36bb..364b957 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,7 @@ HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, i HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EvictManagedTextures(IDirect3D7Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index f0ee793..6c58b22 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,5 +1,6 @@ #include #include +#include #include "IDirectDraw.h" #include "IDirect3D.h" #include "IAMMediaStream.h" @@ -11,10 +12,11 @@ #include "hook.h" #include "config.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = E_NOINTERFACE; @@ -158,7 +160,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; #ifdef _DEBUG @@ -173,7 +175,7 @@ ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -196,7 +198,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__Compact(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -209,12 +211,13 @@ HRESULT __stdcall IDirectDraw__CreateClipper( IUnknown FAR* pUnkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, dwFlags, lplpDDClipper, - pUnkOuter); + pUnkOuter, + _ReturnAddress()); HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); @@ -230,13 +233,14 @@ HRESULT __stdcall IDirectDraw__CreatePalette( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDColorArray, lpDDPalette, - unkOuter); + unkOuter, + _ReturnAddress()); HRESULT ret = dd_CreatePalette(dwFlags, lpDDColorArray, (IDirectDrawPaletteImpl**)lpDDPalette, unkOuter); @@ -251,12 +255,13 @@ HRESULT __stdcall IDirectDraw__CreateSurface( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n", + "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, lpDDSurface, - unkOuter); + unkOuter, + _ReturnAddress()); HRESULT ret = dd_CreateSurface( @@ -274,7 +279,7 @@ HRESULT __stdcall IDirectDraw__DuplicateSurface( LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPDIRECTDRAWSURFACE7* lpDDDestSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_CANTDUPLICATE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -288,13 +293,14 @@ HRESULT __stdcall IDirectDraw__EnumDisplayModes( LPDDENUMMODESCALLBACK2 lpEnumModesCallback) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurfaceDesc, lpContext, - lpEnumModesCallback); + lpEnumModesCallback, + _ReturnAddress()); HRESULT ret = dd_EnumDisplayModes( @@ -314,7 +320,7 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -322,7 +328,7 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -330,7 +336,14 @@ HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) { - TRACE("-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p)\n", __FUNCTION__, This, lpDDDriverCaps, lpDDEmulCaps); + TRACE( + "-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p) [%p]\n", + __FUNCTION__, + This, + lpDDDriverCaps, + lpDDEmulCaps, + _ReturnAddress()); + HRESULT ret = dd_GetCaps((LPDDCAPS_DX1)lpDDDriverCaps, (LPDDCAPS_DX1)lpDDEmulCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -338,7 +351,7 @@ HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDrive HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_GetDisplayMode((LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -346,7 +359,7 @@ HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACE HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpNumCodes, LPDWORD lpCodes) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -354,7 +367,7 @@ HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpN HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAWSURFACE7* lplpGDIDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); @@ -363,7 +376,7 @@ HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAW HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWORD lpdwFreq) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_GetMonitorFrequency(lpdwFreq); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -371,7 +384,7 @@ HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWOR HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwScanLine) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_UNSUPPORTED; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -379,7 +392,7 @@ HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwSc HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPBOOL lpbIsInVB) { - TRACE("-> %s(This=%p, lpbIsInVB=%p)\n", __FUNCTION__, This, lpbIsInVB); + TRACE("-> %s(This=%p, lpbIsInVB=%p) [%p]\n", __FUNCTION__, This, lpbIsInVB, _ReturnAddress()); HRESULT ret = dd_GetVerticalBlankStatus(lpbIsInVB); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -387,7 +400,7 @@ HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPB HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -395,7 +408,7 @@ HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_RestoreDisplayMode(); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -403,7 +416,7 @@ HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND hwnd, DWORD dwFlags) { - TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X)\n", __FUNCTION__, This, hwnd, dwFlags); + TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", __FUNCTION__, This, hwnd, dwFlags, _ReturnAddress()); HRESULT ret = dd_SetCooperativeLevel(hwnd, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -411,7 +424,15 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { - TRACE("-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d)\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP); + TRACE( + "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d) [%p]\n", + __FUNCTION__, + This, + dwWidth, + dwHeight, + dwBPP, + _ReturnAddress()); + HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -426,14 +447,15 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( DWORD dwFlags) { TRACE( - "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d)\n", + "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d) [%p]\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP, dwRefreshRate, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); @@ -443,7 +465,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( HRESULT __stdcall IDirectDraw__WaitForVerticalBlank(IDirectDrawImpl* This, DWORD dwFlags, HANDLE hEvent) { - TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p)\n", __FUNCTION__, This, dwFlags, hEvent); + TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, dwFlags, hEvent, _ReturnAddress()); HRESULT ret = dd_WaitForVerticalBlank(dwFlags, hEvent); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -456,12 +478,13 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( LPDWORD lpdwFree) { TRACE( - "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p)\n", + "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p) [%p]\n", __FUNCTION__, This, lpDDCaps, lpdwTotal, - lpdwFree); + lpdwFree, + _ReturnAddress()); HRESULT ret = dd_GetAvailableVidMem((LPDDSCAPS)lpDDCaps, lpdwTotal, lpdwFree); @@ -471,7 +494,7 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, LPDIRECTDRAWSURFACE7* lplpDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -479,7 +502,7 @@ HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -487,7 +510,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_TestCooperativeLevel(); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -495,7 +518,7 @@ HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags) { - TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); + TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, pDDDI, dwFlags, _ReturnAddress()); HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -503,7 +526,7 @@ HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDE HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_CURRENTLYNOTAVAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -511,7 +534,7 @@ HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pMode HRESULT __stdcall IDirectDraw__EvaluateMode(IDirectDrawImpl* This, DWORD dwFlags, DWORD* pTimeout) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 34cd4de..9dba68f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -1,10 +1,20 @@ +#include #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) + HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -12,7 +22,7 @@ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* Thi ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -47,12 +57,13 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p) [%p]\n", __FUNCTION__, This, lpRect, lpClipList, - lpdwSiz); + lpdwSiz, + _ReturnAddress()); HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); @@ -62,7 +73,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { - TRACE("-> %s(This=%p, lphWnd=%p)\n", __FUNCTION__, This, lphWnd); + TRACE("-> %s(This=%p, lphWnd=%p) [%p]\n", __FUNCTION__, This, lphWnd, _ReturnAddress()); HRESULT ret = ddc_GetHWnd(This, lphWnd); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -70,7 +81,7 @@ HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -78,7 +89,7 @@ HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, L HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { - TRACE("-> %s(This=%p, lpbChanged=%p)\n", __FUNCTION__, This, lpbChanged); + TRACE("-> %s(This=%p, lpbChanged=%p) [%p]\n", __FUNCTION__, This, lpbChanged, _ReturnAddress()); HRESULT ret = ddc_IsClipListChanged(This, lpbChanged); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -86,7 +97,7 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpClipList, dwFlags, _ReturnAddress()); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -94,7 +105,7 @@ HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); + TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p) [%p]\n", __FUNCTION__, This, dwFlags, hWnd, _ReturnAddress()); HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); TRACE("<- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 7676bc2..71f10d9 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -1,9 +1,19 @@ +#include #include "IDirectDrawGammaControl.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) + HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -11,7 +21,7 @@ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaContro ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -19,7 +29,7 @@ ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* Thi ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -36,7 +46,7 @@ ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* Th HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -44,7 +54,7 @@ HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlI HRESULT __stdcall IDirectDrawGammaControl__SetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 2767478..6d221b6 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -1,12 +1,21 @@ +#include #include "IDirectDrawPalette.h" #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -14,7 +23,7 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* Thi ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -22,7 +31,7 @@ ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -42,7 +51,7 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) HRESULT __stdcall IDirectDrawPalette__GetCaps(IDirectDrawPaletteImpl* This, LPDWORD lpdwCaps) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p)\n", __FUNCTION__, This, lpdwCaps); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p) [%p]\n", __FUNCTION__, This, lpdwCaps, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -56,13 +65,14 @@ HRESULT __stdcall IDirectDrawPalette__GetEntries( LPPALETTEENTRY lpEntries) { TRACE( - "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p)\n", + "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p) [%p]\n", __FUNCTION__, This, dwFlags, dwBase, dwNumEntries, - lpEntries); + lpEntries, + _ReturnAddress()); HRESULT ret = ddp_GetEntries(This, dwFlags, dwBase, dwNumEntries, lpEntries); @@ -76,7 +86,7 @@ HRESULT __stdcall IDirectDrawPalette__Initialize( DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -90,13 +100,14 @@ HRESULT __stdcall IDirectDrawPalette__SetEntries( LPPALETTEENTRY lpEntries) { TRACE_EXT( - "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p)\n", + "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p) [%p]\n", __FUNCTION__, This, dwFlags, dwStartingEntry, dwCount, - lpEntries); + lpEntries, + _ReturnAddress()); HRESULT ret = ddp_SetEntries(This, dwFlags, dwStartingEntry, dwCount, lpEntries); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 7445f99..23c8e33 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDrawSurface.h" #include "IDirectDrawGammaControl.h" @@ -5,10 +6,11 @@ #include "dd.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = S_OK; if (riid) @@ -60,7 +62,7 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -68,7 +70,7 @@ ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -138,7 +140,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, lpDDSurface=%p)\n", __FUNCTION__, This, lpDDSurface); + TRACE("-> %s(This=%p, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, lpDDSurface, _ReturnAddress()); HRESULT ret = dds_AddAttachedSurface(This, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -146,7 +148,7 @@ HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__AddOverlayDirtyRect(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -161,14 +163,15 @@ HRESULT __stdcall IDirectDrawSurface__Blt( LPDDBLTFX lpDDBltFx) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p)\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p) [%p]\n", __FUNCTION__, This, lpDestRect, lpDDSrcSurface, lpSrcRect, dwFlags, - lpDDBltFx); + lpDDBltFx, + _ReturnAddress()); HRESULT ret = dds_Blt(This, lpDestRect, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags, lpDDBltFx); @@ -182,7 +185,7 @@ HRESULT __stdcall IDirectDrawSurface__BltBatch( DWORD dwCount, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -197,14 +200,15 @@ HRESULT __stdcall IDirectDrawSurface__BltFast( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X)\n", + "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwX, dwY, lpDDSrcSurface, lpSrcRect, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dds_BltFast(This, dwX, dwY, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags); @@ -217,7 +221,7 @@ HRESULT __stdcall IDirectDrawSurface__DeleteAttachedSurface( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p)\n", __FUNCTION__, This, dwFlags, lpDDSurface); + TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurface, _ReturnAddress()); HRESULT ret = dds_DeleteAttachedSurface(This, dwFlags, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -229,11 +233,12 @@ HRESULT __stdcall IDirectDrawSurface__EnumAttachedSurfaces( LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { TRACE( - "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p)\n", + "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", __FUNCTION__, This, lpContext, - lpEnumSurfacesCallback); + lpEnumSurfacesCallback, + _ReturnAddress()); HRESULT ret = dds_EnumAttachedSurfaces(This, lpContext, (LPDDENUMSURFACESCALLBACK)lpEnumSurfacesCallback); @@ -247,7 +252,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -259,11 +264,12 @@ HRESULT __stdcall IDirectDrawSurface__Flip( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X)\n", + "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSurfaceTargetOverride, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dds_Flip(This, (IDirectDrawSurfaceImpl*)lpDDSurfaceTargetOverride, dwFlags); @@ -276,15 +282,23 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface( LPDDSCAPS2 lpDdsCaps, LPDIRECTDRAWSURFACE7 FAR* lpDDsurface) { - TRACE("-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p)\n", __FUNCTION__, This, lpDdsCaps->dwCaps, lpDDsurface); + TRACE( + "-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p) [%p]\n", + __FUNCTION__, + This, + lpDdsCaps->dwCaps, + lpDDsurface, + _ReturnAddress()); + HRESULT ret = dds_GetAttachedSurface(This, (LPDDSCAPS)lpDdsCaps, (IDirectDrawSurfaceImpl**)lpDDsurface); + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -292,7 +306,7 @@ HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS2 lpDDSCaps) { - TRACE("-> %s(This=%p, lpDDSCaps=%p)\n", __FUNCTION__, This, lpDDSCaps); + TRACE("-> %s(This=%p, lpDDSCaps=%p) [%p]\n", __FUNCTION__, This, lpDDSCaps, _ReturnAddress()); HRESULT ret = dds_GetCaps(This, (LPDDSCAPS)lpDDSCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -300,7 +314,7 @@ HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDD HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper) { - TRACE_EXT("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); + TRACE_EXT("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); HRESULT ret = dds_GetClipper(This, (IDirectDrawClipperImpl**)lpClipper); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -308,7 +322,7 @@ HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); HRESULT ret = dds_GetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -316,7 +330,7 @@ HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) { - TRACE_EXT("-> %s(This=%p, lpHDC=%p)\n", __FUNCTION__, This, lpHDC); + TRACE_EXT("-> %s(This=%p, lpHDC=%p) [%p]\n", __FUNCTION__, This, lpHDC, _ReturnAddress()); HRESULT ret = dds_GetDC(This, lpHDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -324,7 +338,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -332,7 +346,7 @@ HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* This, LPLONG lplX, LPLONG lplY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTAOVERLAYSURFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -340,7 +354,7 @@ HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette) { - TRACE("-> %s(This=%p, lplpDDPalette=%p)\n", __FUNCTION__, This, lplpDDPalette); + TRACE("-> %s(This=%p, lplpDDPalette=%p) [%p]\n", __FUNCTION__, This, lplpDDPalette, _ReturnAddress()); HRESULT ret = dds_GetPalette(This, (IDirectDrawPaletteImpl**)lplpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -348,7 +362,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat) { - TRACE_EXT("-> %s(This=%p, ...)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p, ...) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_GetPixelFormat(This, ddpfPixelFormat); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -356,7 +370,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc); + TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, _ReturnAddress()); HRESULT ret = dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -367,7 +381,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( LPDIRECTDRAW lpDD, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -375,7 +389,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( HRESULT __stdcall IDirectDrawSurface__IsLost(IDirectDrawSurfaceImpl* This) { - //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -389,13 +403,14 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HANDLE hEvent) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p)\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, lpDestRect, lpDDSurfaceDesc, dwFlags, - hEvent); + hEvent, + _ReturnAddress()); HRESULT ret = dds_Lock(This, lpDestRect, (LPDDSURFACEDESC)lpDDSurfaceDesc, dwFlags, hEvent); @@ -405,7 +420,7 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_ReleaseDC(This, hDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -413,7 +428,7 @@ HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HD HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -421,7 +436,7 @@ HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper) { - TRACE("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); + TRACE("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); HRESULT ret = dds_SetClipper(This, (IDirectDrawClipperImpl*)lpClipper); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -429,7 +444,7 @@ HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); HRESULT ret = dds_SetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -437,7 +452,7 @@ HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* This, LONG lX, LONG lY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -445,7 +460,7 @@ HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette) { - TRACE("-> %s(This=%p, lpDDPalette=%p)\n", __FUNCTION__, This, lpDDPalette); + TRACE("-> %s(This=%p, lpDDPalette=%p) [%p]\n", __FUNCTION__, This, lpDDPalette, _ReturnAddress()); HRESULT ret = dds_SetPalette(This, (IDirectDrawPaletteImpl*)lpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -453,7 +468,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE_EXT("-> %s(This=%p, lpRect=%p)\n", __FUNCTION__, This, lpRect); + TRACE_EXT("-> %s(This=%p, lpRect=%p) [%p]\n", __FUNCTION__, This, lpRect, _ReturnAddress()); HRESULT ret = dds_Unlock(This, lpRect); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -467,7 +482,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -475,7 +490,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( HRESULT __stdcall IDirectDrawSurface__UpdateOverlayDisplay(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -486,7 +501,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSReference) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -494,7 +509,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_GetDDInterface(This, lplpDD); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -502,7 +517,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -510,7 +525,7 @@ HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWO HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -518,7 +533,7 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSD, dwFlags); + TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSD, dwFlags, _ReturnAddress()); HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -531,7 +546,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPrivateData( DWORD dwSize, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_OUTOFMEMORY; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -543,7 +558,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( LPVOID lpBuffer, LPDWORD lpdwBufferSize) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -551,7 +566,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* This, REFGUID rtag) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -559,7 +574,7 @@ HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* Th HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* This, LPDWORD lpdwValue) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -567,7 +582,7 @@ HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -575,7 +590,7 @@ HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceIm HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, DWORD dwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -583,7 +598,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, LPDWORD lpdwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -591,7 +606,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD dwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -599,7 +614,7 @@ HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD HRESULT __stdcall IDirectDrawSurface__GetLOD(IDirectDrawSurfaceImpl* This, LPDWORD lpdwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; From 0290ccf0e98b9751c77f0221042fb901d12f523b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 02:40:31 +0200 Subject: [PATCH 1091/1724] fix for last commit --- src/IDirect3D/IDirect3D2.c | 26 +++++++++++++++++--------- src/IDirectDraw/IDirectDrawSurface.c | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 84169ae..d25c2f5 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -6,15 +6,23 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -22,7 +30,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -39,7 +47,7 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -47,7 +55,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -55,7 +63,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -63,7 +71,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -71,7 +79,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -79,7 +87,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 23c8e33..48dbca4 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -252,7 +252,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; From 0ce1f4970c2b53c47c89bd71f2b715f652e37844 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 05:37:11 +0200 Subject: [PATCH 1092/1724] improve logging --- src/directinput.c | 17 ++++++++++------- src/winapi_hooks.c | 31 +++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index bf5e3d5..12382b2 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,5 +1,6 @@ #include #include +#include #include "directinput.h" #include "debug.h" #include "hook.h" @@ -7,6 +8,8 @@ #include "mouse.h" #include "config.h" +#pragma intrinsic(_ReturnAddress) + #ifdef _MSC_VER #include "detours.h" #endif @@ -53,7 +56,7 @@ static PROC hook_func(PROC* org_func, PROC new_func) static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) { - TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); + TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress()); if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { @@ -118,7 +121,7 @@ static HRESULT WINAPI fake_di_CreateDevice( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDevice\n"); + TRACE("DirectInput CreateDevice [%p]\n", _ReturnAddress()); HRESULT result = real_di_CreateDevice(This, rguid, lplpDIDevice, pUnkOuter); @@ -158,7 +161,7 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDeviceEx\n"); + TRACE("DirectInput CreateDeviceEx [%p]\n", _ReturnAddress()); HRESULT result = real_di_CreateDeviceEx(This, rguid, riid, lplpDIDevice, pUnkOuter); @@ -197,7 +200,7 @@ HRESULT WINAPI fake_DirectInputCreateA( LPDIRECTINPUTA* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateA\n"); + TRACE("DirectInputCreateA [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateA) { @@ -235,7 +238,7 @@ HRESULT WINAPI fake_DirectInputCreateW( LPDIRECTINPUTW* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateW\n"); + TRACE("DirectInputCreateW [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateW) { @@ -274,7 +277,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateEx\n"); + TRACE("DirectInputCreateEx [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateEx) { @@ -325,7 +328,7 @@ HRESULT WINAPI fake_DirectInput8Create( LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInput8Create\n"); + TRACE("DirectInput8Create [%p]\n", _ReturnAddress()); if (!real_DirectInput8Create) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 26ebc7c..b3a4cce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -550,7 +550,13 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { - TRACE("SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d)\n", idHook, lpfn, hmod, dwThreadId); + TRACE( + "SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d) [%p]\n", + idHook, + lpfn, + hmod, + dwThreadId, + _ReturnAddress()); if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { @@ -1261,7 +1267,7 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + TRACE("LoadLibraryA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); } #endif @@ -1289,7 +1295,7 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod); + TRACE("LoadLibraryW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); } #endif @@ -1317,7 +1323,7 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + TRACE("LoadLibraryExA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); } #endif @@ -1345,7 +1351,7 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod); + TRACE("LoadLibraryExW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); } #endif @@ -1370,7 +1376,7 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) char mod_path[MAX_PATH] = { 0 }; if (hModule && GetModuleFileNameA(hModule, mod_path, MAX_PATH)) { - TRACE("GetProcAddress %s (%s)\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path); + TRACE("GetProcAddress %s (%s) [%p]\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path, _ReturnAddress()); } #endif @@ -1448,7 +1454,7 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( BOOL WINAPI fake_DestroyWindow(HWND hWnd) { - TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) { @@ -1525,7 +1531,7 @@ HWND WINAPI fake_CreateWindowExA( { TRACE("-> CreateWindowExA(" "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " - "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", + "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p) [%p]\n", dwExStyle, lpClassName, lpWindowName, @@ -1537,7 +1543,8 @@ HWND WINAPI fake_CreateWindowExA( hWndParent, hMenu, hInstance, - lpParam); + lpParam, + _ReturnAddress()); TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd); @@ -1694,7 +1701,11 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD { if (rclsid && riid) { - TRACE("CoCreateInstance rclsid = %08X, riid = %08X\n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); + TRACE( + "CoCreateInstance rclsid = %08X, riid = %08X [%p]\n", + ((GUID*)rclsid)->Data1, + ((GUID*)riid)->Data1, + _ReturnAddress()); if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { From f82987ceec6a84b0a7bbe6f6a1d23ae9e10454c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 05:37:55 +0200 Subject: [PATCH 1093/1724] add header --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b3a4cce..b1b3ab1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "debug.h" #include "config.h" #include "dd.h" @@ -19,6 +20,7 @@ #include "hook.h" #include "directinput.h" +#pragma intrinsic(_ReturnAddress) BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 188a41ee740d05a0847525958cc63e48ac99e7bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 06:14:17 +0200 Subject: [PATCH 1094/1724] fix mingw build --- src/IDirect3D/IDirect3D.c | 7 +++++++ src/IDirect3D/IDirect3D2.c | 7 +++++++ src/IDirect3D/IDirect3D3.c | 7 +++++++ src/IDirect3D/IDirect3D7.c | 7 +++++++ src/IDirectDraw/IDirectDraw.c | 8 ++++++++ src/IDirectDraw/IDirectDrawClipper.c | 7 +++++++ src/IDirectDraw/IDirectDrawGammaControl.c | 7 +++++++ src/IDirectDraw/IDirectDrawPalette.c | 7 +++++++ src/IDirectDraw/IDirectDrawSurface.c | 7 +++++++ src/directinput.c | 7 +++++++ src/winapi_hooks.c | 7 +++++++ 11 files changed, 78 insertions(+) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index d1e6cc9..7702407 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index d25c2f5..ed8c5dc 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 736572a..38d6d64 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 364b957..85eb13e 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 6c58b22..8295bbd 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -12,7 +12,15 @@ #include "hook.h" #include "config.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ + HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 9dba68f..7270fd2 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -3,7 +3,14 @@ #include "ddclipper.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 71f10d9..d234ba3 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -2,7 +2,14 @@ #include "IDirectDrawGammaControl.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 6d221b6..89c8f2b 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -4,7 +4,14 @@ #include "ddsurface.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 48dbca4..8624667 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -6,7 +6,14 @@ #include "dd.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/directinput.c b/src/directinput.c index 12382b2..b542bc2 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -8,7 +8,14 @@ #include "mouse.h" #include "config.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ #ifdef _MSC_VER #include "detours.h" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b1b3ab1..807e3cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -20,7 +20,14 @@ #include "hook.h" #include "directinput.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 78265056605bf59410dc5856615f4b929fae5c1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 06:19:41 +0200 Subject: [PATCH 1095/1724] fix logging --- src/directinput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index b542bc2..059e034 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -85,7 +85,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( LPDWORD pdwInOut, DWORD dwFlags) { - //TRACE("DirectInput GetDeviceData\n"); + //TRACE("DirectInput GetDeviceData [%p]\n", _ReturnAddress()); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); @@ -107,7 +107,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) { - //TRACE("DirectInput GetDeviceState\n"); + //TRACE("DirectInput GetDeviceState [%p]\n", _ReturnAddress()); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); From 12715febe9d55d88cd85b5652e0de615e088f507 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 21 Jun 2024 23:00:40 +0200 Subject: [PATCH 1096/1724] set pixel format only for opengl renderer (prevents loading of open32.dll) --- src/dd.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index c6dfc7e..fda72bd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1211,19 +1211,20 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); - PIXELFORMATDESCRIPTOR pfd; - memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + if (g_ddraw.renderer == ogl_render_main) + { + PIXELFORMATDESCRIPTOR pfd; + memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = - PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw.renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; + pfd.iLayerType = PFD_MAIN_PLANE; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; - pfd.iLayerType = PFD_MAIN_PLANE; - - SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); + SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); + } } if (!g_config.devmode) From c86b6f01a237688305954c059e62dc42230f9bba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 22 Jun 2024 01:19:25 +0200 Subject: [PATCH 1097/1724] move debug code defines into header --- inc/debug.h | 10 +++++++ src/IDirect3D/IDirect3D.c | 9 ------ src/IDirect3D/IDirect3D2.c | 9 ------ src/IDirect3D/IDirect3D3.c | 9 ------ src/IDirect3D/IDirect3D7.c | 9 ------ src/IDirectDraw/IDirectDraw.c | 10 ------- src/IDirectDraw/IDirectDrawClipper.c | 9 ------ src/IDirectDraw/IDirectDrawGammaControl.c | 9 ------ src/IDirectDraw/IDirectDrawPalette.c | 9 ------ src/IDirectDraw/IDirectDrawSurface.c | 9 ------ src/directinput.c | 10 ------- src/utils.c | 34 +++++++++++++++++++++++ src/winapi_hooks.c | 9 ------ 13 files changed, 44 insertions(+), 101 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index f16a944..72efcf1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -3,6 +3,7 @@ #define WIN32_LEAN_AND_MEAN #include +#include LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); @@ -31,6 +32,15 @@ extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else +#pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ + //#define _DEBUG 1 /* use OutputDebugStringA rather than printf */ diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 7702407..0aaa1e8 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index ed8c5dc..50ae5ec 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 38d6d64..9cc65bd 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 85eb13e..5d64fc6 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 8295bbd..ee6c653 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,6 +1,5 @@ #include #include -#include #include "IDirectDraw.h" #include "IDirect3D.h" #include "IAMMediaStream.h" @@ -12,15 +11,6 @@ #include "hook.h" #include "config.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ - HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 7270fd2..86b8a2f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -1,16 +1,7 @@ -#include #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index d234ba3..65f61fa 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -1,15 +1,6 @@ -#include #include "IDirectDrawGammaControl.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 89c8f2b..a5429ea 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -1,17 +1,8 @@ -#include #include "IDirectDrawPalette.h" #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 8624667..8984571 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -1,4 +1,3 @@ -#include #include #include "IDirectDrawSurface.h" #include "IDirectDrawGammaControl.h" @@ -6,14 +5,6 @@ #include "dd.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/directinput.c b/src/directinput.c index 059e034..4c29144 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,6 +1,5 @@ #include #include -#include #include "directinput.h" #include "debug.h" #include "hook.h" @@ -8,15 +7,6 @@ #include "mouse.h" #include "config.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ - #ifdef _MSC_VER #include "detours.h" #endif diff --git a/src/utils.c b/src/utils.c index 48218b2..be3c430 100644 --- a/src/utils.c +++ b/src/utils.c @@ -155,6 +155,40 @@ void util_limit_game_ticks() if (GetCurrentThreadId() != g_ddraw.gui_thread_id) return; + /* + static void (WINAPI * getSystemTimePreciseAsFileTime)(LPFILETIME); + + if (!getSystemTimePreciseAsFileTime) + { + getSystemTimePreciseAsFileTime = GetProcAddress(LoadLibraryA("Kernel32.dll"), "GetSystemTimePreciseAsFileTime"); + + //if (!getSystemTimePreciseAsFileTime) + // getSystemTimePreciseAsFileTime = GetSystemTimeAsFileTime; + } + + + if (1) + { + FILETIME ft = { 0 }; + getSystemTimePreciseAsFileTime(&ft); + + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) + { + memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + } + else + { + while (TRUE) + { + getSystemTimePreciseAsFileTime(&ft); + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) <= 0) + break; + } + } + + g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; + } + else */ if (g_ddraw.ticks_limiter.htimer) { FILETIME ft = { 0 }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 807e3cf..b3a4cce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,7 +1,6 @@ #include #include #include -#include #include "debug.h" #include "config.h" #include "dd.h" @@ -20,14 +19,6 @@ #include "hook.h" #include "directinput.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 824b366d5d3fb53eb62259e5423824ddbca24ff1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 25 Jun 2024 02:30:32 +0200 Subject: [PATCH 1098/1724] update airline tycoon preset --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 324f8be..b3b50e6 100644 --- a/src/config.c +++ b/src/config.c @@ -459,7 +459,8 @@ static void cfg_create_ini() "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" - "fixchilds=0\n" + "lock_mouse_top_left=false\n" + "fixchilds=3\n" "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" From c1b0b9b816211cebf8229218a7b9cfc1c2e66f9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 25 Jun 2024 23:14:11 +0200 Subject: [PATCH 1099/1724] fix AT preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index b3b50e6..d429fd3 100644 --- a/src/config.c +++ b/src/config.c @@ -459,7 +459,7 @@ static void cfg_create_ini() "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" - "lock_mouse_top_left=false\n" + "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" "; Arthur's Wilderness Rescue\n" From b651a026abb05da93ebe0a2d2590bdf9ea91da1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jun 2024 20:54:41 +0200 Subject: [PATCH 1100/1724] update supported games in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9bce324..6dd6d04 100644 --- a/README.md +++ b/README.md @@ -322,11 +322,13 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Stronghold Crusader HD - Stronghold HD - Sudden Strike 2 +- The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon +- Throne of Darkness - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From adff08b8b15a740bfed11480537895f10b327df2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jun 2024 20:58:05 +0200 Subject: [PATCH 1101/1724] add preset for The Missing on Lost Island --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index d429fd3..8b2d44a 100644 --- a/src/config.c +++ b/src/config.c @@ -1370,6 +1370,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The Missing on Lost Island\n" + "[Island]\n" + "lock_mouse_top_left=true\n" + "fixchilds=3\n" + "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" From 2239c67a72c22a3e1c04e12d9255d1ab5992aba8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 01:12:20 +0200 Subject: [PATCH 1102/1724] add check for TMediaPlayer --- src/utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/utils.c b/src/utils.c index be3c430..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,6 +697,9 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } + + if (strcmp(class_name, "TMediaPlayer") == 0) + return TRUE; } #ifdef _DEBUG_X From cdd09496adcbd2452737f1399e23807906e73cdb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 21:42:37 +0200 Subject: [PATCH 1103/1724] fix discord invite link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6dd6d04..ee33179 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) +Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/afWXJNDDF5) (No registration required)   From ae08ecdf451e14be1da3c3b26a39a81f58d7ad30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:29:38 +0200 Subject: [PATCH 1104/1724] testing webhook --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..400f80f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + // webhook test if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From b8ad4b27ddd7c269c38ddcf12b535e63f718e5de Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:31:02 +0200 Subject: [PATCH 1105/1724] test 2 --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 400f80f..19b74be 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // webhook test + // webhook test 2 if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 9bfb52fcb966d9cac477c8cd76df99eea9b7f960 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:31:53 +0200 Subject: [PATCH 1106/1724] revert changes --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 19b74be..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // webhook test 2 + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From fcc4269754daceabe2f3a7f6bb90107827a842c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:36:57 +0200 Subject: [PATCH 1107/1724] testing discord webhook <@1017990327593881620> --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..ea47ef9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + // ping discordf user test if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From f1349f086cf77ba8d5e4630986c39c396585fc78 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:37:25 +0200 Subject: [PATCH 1108/1724] Revert "testing discord webhook <@1017990327593881620>" This reverts commit fcc4269754daceabe2f3a7f6bb90107827a842c7. --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index ea47ef9..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // ping discordf user test + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From e373042dc9e262c320dcf29bcc4063532f814dbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:38:10 +0200 Subject: [PATCH 1109/1724] <@1017990327593881620> test --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..f4d6f2e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + //ff if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 31df9d244fca7f9f9d0fb61fa26ed09bad69c0ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:39:23 +0200 Subject: [PATCH 1110/1724] <@1017990327593881620> revert changes --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f4d6f2e..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - //ff + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 8ac58b663a67fac7d985b9bbfeba939a82bad190 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 23:27:23 +0200 Subject: [PATCH 1111/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 3b43e44..0f1a3fe 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 9172074e6380f697e544779c8ed6680e860712b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Jun 2024 10:00:17 +0200 Subject: [PATCH 1112/1724] add preset for Final Liberation <@295717582948794378> --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 8b2d44a..d9e2fc3 100644 --- a/src/config.c +++ b/src/config.c @@ -787,6 +787,10 @@ static void cfg_create_ini() "[mrazik]\n" "guard_lines=0\n" "\n" + "; Final Liberation: Warhammer Epic 40000\n" + "[Epic40k]\n" + "hook_peekmessage=true\n" + "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "nonexclusive=true\n" From f54a3ec17185411458a52341fe7e2f0a3b434da9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 01:31:12 +0200 Subject: [PATCH 1113/1724] fix dds caps --- src/ddsurface.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index ba876c0..b6913ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1397,10 +1397,15 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_FRONTBUFFER; } + if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY)) + { + dst_surface->caps |= DDSCAPS_VIDEOMEMORY; + } + + dst_surface->caps |= DDSCAPS_VISIBLE; + dst_surface->width = g_ddraw.width; dst_surface->height = g_ddraw.height; - - dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } else { @@ -1575,11 +1580,21 @@ HRESULT dd_CreateSurface( desc.ddsCaps.dwCaps |= DDSCAPS_FLIP; } + if (dst_surface->caps & DDSCAPS_COMPLEX) + { + desc.ddsCaps.dwCaps |= DDSCAPS_COMPLEX; + } + if (dst_surface->caps & DDSCAPS_VIDEOMEMORY) { desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } + if (dst_surface->caps & DDSCAPS_SYSTEMMEMORY) + { + desc.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; From dfd37760819ebb94414966364e5580cf5ce3b784 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 04:24:27 +0200 Subject: [PATCH 1114/1724] add hack for c1 lowres --- inc/config.h | 1 + src/config.c | 3 +++ src/ddsurface.c | 14 +++++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index f0b8275..3a33eaf 100644 --- a/inc/config.h +++ b/inc/config.h @@ -104,6 +104,7 @@ typedef struct CNCDDRAWCONFIG BOOL mgs_hack; BOOL tlc_hack; BOOL homm_hack; + BOOL carma95_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index d9e2fc3..110ac17 100644 --- a/src/config.c +++ b/src/config.c @@ -114,6 +114,7 @@ void cfg_load() GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); + GET_BOOL(g_config.homm_hack, "carma95_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -510,11 +511,13 @@ static void cfg_create_ini() "[CARMA95]\n" "noactivateapp=true\n" "flipclear=true\n" + "carma95_hack=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" "noactivateapp=true\n" "flipclear=true\n" + "carma95_hack=true\n" "\n" "; Carmageddon 2\n" "[Carma2_SW]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index b6913ed..c392ef9 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -755,8 +755,16 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { - dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); - lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); + if (g_config.carma95_hack && g_ddraw.height == 200) + { + dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc); + lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This, (LPDDSURFACEDESC)&desc, lpContext); + } + else + { + dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); + lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); + } } return DD_OK; @@ -766,7 +774,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa { dbg_dump_dds_flip_flags(dwFlags); - if (This->backbuffer && !This->skip_flip) + if (This->backbuffer && !This->skip_flip && !(g_config.carma95_hack && g_ddraw.height == 200)) { EnterCriticalSection(&g_ddraw.cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; From c6fa7d389469257325f74aa30e1b9d7dbc485bf0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 04:25:23 +0200 Subject: [PATCH 1115/1724] fix setting name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 110ac17..1db05c4 100644 --- a/src/config.c +++ b/src/config.c @@ -114,7 +114,7 @@ void cfg_load() GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); - GET_BOOL(g_config.homm_hack, "carma95_hack", FALSE); + GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 8ef54bd5fa6229b840178042067381a9e7d5fd45 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 05:41:41 +0200 Subject: [PATCH 1116/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 0f1a3fe..de56bf0 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 4efb3cde520a0c1fd9ed0f2517169f4bedf2ee8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 05:47:30 +0200 Subject: [PATCH 1117/1724] add comment for c1 hack --- src/ddsurface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index c392ef9..2f6a873 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -755,6 +755,7 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { + /* Hack for carmageddon 1 lowres mode */ if (g_config.carma95_hack && g_ddraw.height == 200) { dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc); From 237715f85b561f72dc8e4bdbf2607fba7c557a64 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 08:04:31 +0200 Subject: [PATCH 1118/1724] don't hook mdraw (renamed ddraw.dll from GOG/stream) --- src/hook.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hook.c b/src/hook.c index 91d18db..c9641f4 100644 --- a/src/hook.c +++ b/src/hook.c @@ -541,6 +541,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "libgallium_wgl") == 0 || _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || + _strcmpi(mod_filename, "mdraw") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From dfca31fab99c6c50b22fa42340eb91fce4aa47c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 04:38:16 +0200 Subject: [PATCH 1119/1724] bump version <@1017990327593881620> testing long commit message - testing long commit message - testing long commit message --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index de56bf0..2ff2136 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 79b8b4d0839a824f21533b4d10a925a6d6637b3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 07:52:17 +0200 Subject: [PATCH 1120/1724] add temporary registry keys --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 ++++ inc/indeo.h | 7 +++++ src/dllmain.c | 3 ++ src/indeo.c | 61 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 inc/indeo.h create mode 100644 src/indeo.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index edfd7ab..c7d6352 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -49,6 +49,7 @@ + @@ -84,6 +85,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 34b47a6..7de9def 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -162,6 +162,9 @@ Source Files + + Source Files + @@ -281,6 +284,9 @@ Header Files + + Header Files + diff --git a/inc/indeo.h b/inc/indeo.h new file mode 100644 index 0000000..a83e007 --- /dev/null +++ b/inc/indeo.h @@ -0,0 +1,7 @@ +#ifndef INDEO_H +#define INDEO_H + +void indeo_enable(); +void indeo_disable(); + +#endif diff --git a/src/dllmain.c b/src/dllmain.c index c131c54..ff0874c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -9,6 +9,7 @@ #include "debug.h" #include "config.h" #include "hook.h" +#include "indeo.h" #include "versionhelpers.h" @@ -120,6 +121,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + indeo_enable(); timeBeginPeriod(1); hook_init(); break; @@ -133,6 +135,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_save(); + indeo_disable(); timeEndPeriod(1); dinput_hook_exit(); hook_exit(); diff --git a/src/indeo.c b/src/indeo.c new file mode 100644 index 0000000..fbaa113 --- /dev/null +++ b/src/indeo.c @@ -0,0 +1,61 @@ +#include + + +void indeo_enable() +{ + HKEY hkey; + LONG status = + RegCreateKeyExA( + HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE | KEY_QUERY_VALUE, + NULL, + &hkey, + NULL); + + if (status == ERROR_SUCCESS) + { + LPCTSTR iv31 = "ir32_32.dll"; + RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, iv31, strlen(iv31) + 1); + + LPCTSTR iv32 = "ir32_32.dll"; + RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, iv32, strlen(iv32) + 1); + + LPCTSTR iv41 = "ir41_32.ax"; + RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, iv41, strlen(iv41) + 1); + + LPCTSTR iv50 = "ir50_32.dll"; + RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, iv50, strlen(iv50) + 1); + + RegCloseKey(hkey); + } +} + +void indeo_disable() +{ + HKEY hkey; + LONG status = + RegCreateKeyExA( + HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE | KEY_QUERY_VALUE, + NULL, + &hkey, + NULL); + + if (status == ERROR_SUCCESS) + { + RegDeleteValueA(hkey, "vidc.iv31"); + RegDeleteValueA(hkey, "vidc.iv32"); + RegDeleteValueA(hkey, "vidc.iv41"); + RegDeleteValueA(hkey, "vidc.iv50"); + + RegCloseKey(hkey); + } +} From 12af03ef6d3f67a0a43266a78357492f9a8c4588 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 07:58:59 +0200 Subject: [PATCH 1121/1724] fix warnings --- src/indeo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/indeo.c b/src/indeo.c index fbaa113..65fa2ab 100644 --- a/src/indeo.c +++ b/src/indeo.c @@ -19,16 +19,16 @@ void indeo_enable() if (status == ERROR_SUCCESS) { LPCTSTR iv31 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, iv31, strlen(iv31) + 1); + RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, (const BYTE*)iv31, strlen(iv31) + 1); LPCTSTR iv32 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, iv32, strlen(iv32) + 1); + RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, (const BYTE*)iv32, strlen(iv32) + 1); LPCTSTR iv41 = "ir41_32.ax"; - RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, iv41, strlen(iv41) + 1); + RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, (const BYTE*)iv41, strlen(iv41) + 1); LPCTSTR iv50 = "ir50_32.dll"; - RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, iv50, strlen(iv50) + 1); + RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, (const BYTE*)iv50, strlen(iv50) + 1); RegCloseKey(hkey); } From 11e8df2f5a115a3534aba142620dbff9da35c14b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 21:25:16 +0200 Subject: [PATCH 1122/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee33179..5e18f0d 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Gorasul: The Legacy of the Dragon - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 From a7042cb23425ee581ce7af1d41e77f18fd5e0431 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 8 Jul 2024 23:29:04 +0200 Subject: [PATCH 1123/1724] #332 add preset for AOE1 RockNRor patch --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 1db05c4..a21b6ea 100644 --- a/src/config.c +++ b/src/config.c @@ -386,6 +386,12 @@ static void cfg_create_ini() "adjmouse=true\n" "resolutions=2\n" "\n" + "; Age of Empires: The Rise of Rome (RockNRor patch)\n" + "[EmpiresX_RockNRor]\n" + "nonexclusive=true\n" + "adjmouse=true\n" + "resolutions=2\n" + "\n" "; Age of Empires II\n" "[EMPIRES2]\n" "nonexclusive=true\n" From d93149d02e8bdb4e50b34ce3595beae37406cf3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jul 2024 22:29:59 +0200 Subject: [PATCH 1124/1724] add hints to settings that require upscaling --- config/ConfigFormUnit.cpp | 105 ++++++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 12 +++++ 2 files changed, 117 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3954825..a327efc 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -117,6 +117,8 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) void TConfigForm::ApplyTranslation(TIniFile *ini) { + Application->HintHidePause = 100 * 1000; + auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); int priID = SysLocale.PriLangID; @@ -178,6 +180,18 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30tick每秒", NULL); MaxgameticksCbx->AddItem(L"25tick每秒", NULL); MaxgameticksCbx->AddItem(L"15tick每秒", NULL); + + auto upscaleHint = + L"必须启用升级才能使此设置发挥作用。\n\n" + "要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" + "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) { LanguageImg->Visible = true; @@ -237,6 +251,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL); + + auto upscaleHint = + L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n" + "Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" + "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" + "y cambia el tamaño de la ventana."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) { LanguageImg->Visible = true; @@ -296,6 +323,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL); + + auto upscaleHint = + L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" + "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Präsentation \n" + "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" + "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; @@ -356,6 +396,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL); + + auto upscaleHint = + L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n" + "Чтобы включить масштабирование, установите для презентации режим \n" + "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" + "в 'Оконный' режиме и измените размер окна."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) { LanguageImg->Visible = true; @@ -415,6 +468,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL); + + auto upscaleHint = + L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n" + "A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" + "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" + "módban, és méretezze át az ablakot."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) { LanguageImg->Visible = true; @@ -474,6 +540,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); + + auto upscaleHint = + L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n" + "Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" + "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" + "et redimensionnez la fenêtre."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { LanguageImg->Visible = true; @@ -533,6 +612,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); + + auto upscaleHint = + L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n" + "Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" + "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" + "'In Finestra' e ridimensiona la finestra."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else { IsEnglish = true; @@ -638,6 +730,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 ticks per second", NULL); MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ + + auto upscaleHint = + L"Upscaling must be enabled for this setting to work. \n\n" + "To enable upscaling, set your presentation to either 'Borderless', \n" + "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" + "resize the window."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 1805a5d..b1e29df 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2727,6 +2727,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object VsyncLbl: TLabel Left = 40 @@ -2755,6 +2757,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object DevmodeLbl: TLabel Left = 40 @@ -2834,6 +2838,8 @@ object ConfigForm: TConfigForm Top = 132 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 0 OnClick = MaintasChkClick @@ -2852,6 +2858,8 @@ object ConfigForm: TConfigForm Top = 268 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 3 OnClick = AdjmouseChkClick @@ -3159,6 +3167,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object RendererPbox: TPaintBox Left = 40 @@ -3273,6 +3283,8 @@ object ConfigForm: TConfigForm Top = 277 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 5 OnClick = BoxingChkClick From 560a7222e9c93ad00c33036b35698a904fb8f31a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jul 2024 23:05:13 +0200 Subject: [PATCH 1125/1724] fix german translation --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index a327efc..f7b3579 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -326,7 +326,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) auto upscaleHint = L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" - "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Präsentation \n" + "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; From 4b4a6663badfeaa02640ad96decbbc51a03f26fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:17:53 +0200 Subject: [PATCH 1126/1724] add upscaling hint for shaders --- config/ConfigFormUnit.cpp | 216 +++++++++++++++++++++++++------------- config/ConfigFormUnit.dfm | 6 ++ 2 files changed, 150 insertions(+), 72 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f7b3579..d5a3357 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -181,17 +181,26 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25tick每秒", NULL); MaxgameticksCbx->AddItem(L"15tick每秒", NULL); - auto upscaleHint = - L"必须启用升级才能使此设置发挥作用。\n\n" - "要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" + System::UnicodeString shaderHint = + L"某些着色器仅在启用升级时才起作用。\n\n"; + + System::UnicodeString upscaleHint = + L"必须启用升级才能使此设置发挥作用。\n\n"; + + System::UnicodeString enableUpscaleHint = + L"要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) { LanguageImg->Visible = true; @@ -252,18 +261,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL); - auto upscaleHint = - L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n" - "Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" + System::UnicodeString shaderHint = + L"Algunos de los sombreadores solo funcionan cuando la ampliación está habilitada. \n\n"; + + System::UnicodeString upscaleHint = + L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" "y cambia el tamaño de la ventana."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) { LanguageImg->Visible = true; @@ -324,18 +342,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL); - auto upscaleHint = - L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" - "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" + System::UnicodeString shaderHint = + L"Einige der Shader funktionieren nur, wenn die Hochskalierung aktiviert ist. \n\n"; + + System::UnicodeString upscaleHint = + L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; @@ -397,18 +424,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL); - auto upscaleHint = - L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n" - "Чтобы включить масштабирование, установите для презентации режим \n" + System::UnicodeString shaderHint = + L"Некоторые шейдеры работают только при включенном масштабировании. \n\n"; + + System::UnicodeString upscaleHint = + L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Чтобы включить масштабирование, установите для презентации режим \n" "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" "в 'Оконный' режиме и измените размер окна."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) { LanguageImg->Visible = true; @@ -469,18 +505,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL); - auto upscaleHint = - L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n" - "A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" + System::UnicodeString shaderHint = + L"Néhány árnyékoló csak akkor működik, ha a felskálázás engedélyezve van. \n\n"; + + System::UnicodeString upscaleHint = + L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" "módban, és méretezze át az ablakot."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) { LanguageImg->Visible = true; @@ -541,18 +586,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); - auto upscaleHint = - L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n" - "Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" + System::UnicodeString shaderHint = + L"Certains shaders ne fonctionnent que lorsque la mise à l'échelle est activée. \n\n"; + + System::UnicodeString upscaleHint = + L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" "et redimensionnez la fenêtre."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { LanguageImg->Visible = true; @@ -613,18 +667,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); - auto upscaleHint = - L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n" - "Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" + System::UnicodeString shaderHint = + L"Alcuni shader funzionano solo quando l'upscaling è abilitato. \n\n"; + + System::UnicodeString upscaleHint = + L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" "'In Finestra' e ridimensiona la finestra."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else { IsEnglish = true; @@ -731,18 +794,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ - auto upscaleHint = - L"Upscaling must be enabled for this setting to work. \n\n" - "To enable upscaling, set your presentation to either 'Borderless', \n" + System::UnicodeString shaderHint = + L"Some of the shaders only work when upscaling is enabled. \n\n"; + + System::UnicodeString upscaleHint = + L"Upscaling must be enabled for this setting to work. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"To enable upscaling, set your presentation to either 'Borderless', \n" "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" "resize the window."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; } ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index b1e29df..6ed9761 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3125,6 +3125,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object MaxfpsLbl: TLabel Left = 40 @@ -3200,6 +3202,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True TabOrder = 6 Visible = False OnChange = ShaderD3DCbxChange @@ -3266,6 +3270,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True TabOrder = 3 OnChange = ShaderCbxChange end From b662011045bac278ade240be6b647f8e8edd6942 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:27:18 +0200 Subject: [PATCH 1127/1724] #288 disable shader combobox when gdi renderer is enabled --- config/ConfigFormUnit.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d5a3357..c4499e3 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -967,6 +967,9 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RendererCbx->ItemIndex = 0; } + ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); + ShaderCbx->Enabled = ShaderD3DCbx->Enabled; + try { TStringDynArray list = TDirectory::GetFiles( @@ -1553,6 +1556,9 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender) void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) { + ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); + ShaderCbx->Enabled = ShaderD3DCbx->Enabled; + if (ContainsStr(RendererCbx->Text, "Direct3D")) { ShaderLbl->Caption = From 241e3749b2b66620c9fb6e13e33d8787663591e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:48:40 +0200 Subject: [PATCH 1128/1724] show hints instantly --- config/ConfigFormUnit.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index c4499e3..f009fbf 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -118,6 +118,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) void TConfigForm::ApplyTranslation(TIniFile *ini) { Application->HintHidePause = 100 * 1000; + Application->HintPause = 0; auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); int priID = SysLocale.PriLangID; From 3204574eb572e3ebd355855c58132a4719413122 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 01:35:17 +0200 Subject: [PATCH 1129/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 2ff2136..088c32b 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 6 +#define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 6ba50718a796fcbbfa6b0aa559f98b1a9d25734a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 01:50:13 +0200 Subject: [PATCH 1130/1724] add preset for robin hood steam --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a21b6ea..cc0926b 100644 --- a/src/config.c +++ b/src/config.c @@ -1261,6 +1261,10 @@ static void cfg_create_ini() "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "\n" + "; Robin Hood - The Legend of Sherwood (Steam)\n" + "[_rh]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" From 5609e02f3a78122cb428b245a0541ad059df357e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 07:52:34 +0200 Subject: [PATCH 1131/1724] adjust tooltips --- config/ConfigFormUnit.cpp | 46 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f009fbf..d0e6992 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -189,8 +189,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"必须启用升级才能使此设置发挥作用。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" - "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; + L"要启用放大功能,请将演示文稿设置为“无边框”或“拉伸至全屏”。\n" + "为了使设置在“窗口化”演示中起作用,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -269,9 +269,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n"; System::UnicodeString enableUpscaleHint = - L"Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" - "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" - "y cambia el tamaño de la ventana."; + L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n" + "o 'Pantalla completa ampliada'. Para que la configuración funcione en \n" + "la presentación 'Ventana', debe cambiar el tamaño o maximizar la ventana."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -351,8 +351,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" - "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" - "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; + "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" + "Damit die Einstellung in der 'Fenstermodus' Darstellung funktioniert, \n" + "müssen Sie die Größe des Fensters ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -433,8 +434,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Чтобы включить масштабирование, установите для презентации режим \n" - "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" - "в 'Оконный' режиме и измените размер окна."; + "'Без границ' или 'Полноэкранный масштабированный'. Чтобы эта настройка \n" + "работала в 'оконной' презентации, необходимо изменить размер или развернуть окно."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -513,9 +514,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n"; System::UnicodeString enableUpscaleHint = - L"A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" - "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" - "módban, és méretezze át az ablakot."; + L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n" + "vagy 'Teljes képernyő felskálázva' értékre. Ahhoz, hogy a beállítás \n" + "működjön az 'Ablakban' prezentációban, át kell méretezni vagy \n" + "maximalizálni kell az ablakot."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -594,9 +596,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n"; System::UnicodeString enableUpscaleHint = - L"Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" - "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" - "et redimensionnez la fenêtre."; + L"Pour activer la mise à l'échelle, définissez votre présentation \n" + "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour que le \n" + "paramètre fonctionne dans la présentation 'Fenêtré', vous devez \n" + "redimensionner ou agrandir la fenêtre."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -675,9 +678,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; System::UnicodeString enableUpscaleHint = - L"Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" - "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" - "'In Finestra' e ridimensiona la finestra."; + L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" + "o 'Schermo Intero Ridimensionato'. Affinché l'impostazione funzioni \n" + "nella presentazione 'In Finestra', è necessario ridimensionare \n" + "o ingrandire la finestra."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -802,9 +806,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Upscaling must be enabled for this setting to work. \n\n"; System::UnicodeString enableUpscaleHint = - L"To enable upscaling, set your presentation to either 'Borderless', \n" - "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" - "resize the window."; + L"To enable upscaling, set your presentation to either 'Borderless' \n" + "or 'Fullscreen Upscaled'. For the setting to work in the 'Windowed' \n" + "presentation, you must resize or maximize the window."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 12e18985edecb4d84860bb4004eb0fd94b098b61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 08:05:00 +0200 Subject: [PATCH 1132/1724] adjust tooltips --- config/ConfigFormUnit.cpp | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d0e6992..1abb86e 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -190,7 +190,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"要启用放大功能,请将演示文稿设置为“无边框”或“拉伸至全屏”。\n" - "为了使设置在“窗口化”演示中起作用,您必须调整窗口大小或最大化窗口。"; + "对于'窗口化'演示,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -270,8 +270,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n" - "o 'Pantalla completa ampliada'. Para que la configuración funcione en \n" - "la presentación 'Ventana', debe cambiar el tamaño o maximizar la ventana."; + "o 'Pantalla completa ampliada'. Para la presentación 'Ventana', \n" + "debe cambiar el tamaño o maximizar la ventana."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -352,8 +352,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" - "Damit die Einstellung in der 'Fenstermodus' Darstellung funktioniert, \n" - "müssen Sie die Größe des Fensters ändern oder es maximieren."; + "Für die 'Fenster'-Darstellung müssen Sie die Größe des Fensters ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -434,8 +433,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Чтобы включить масштабирование, установите для презентации режим \n" - "'Без границ' или 'Полноэкранный масштабированный'. Чтобы эта настройка \n" - "работала в 'оконной' презентации, необходимо изменить размер или развернуть окно."; + "'Без границ' или 'Полноэкранный масштабированный'. Для презентации в \n" + "'Оконный' режиме необходимо изменить размер или развернуть окно."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -515,9 +514,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n" - "vagy 'Teljes képernyő felskálázva' értékre. Ahhoz, hogy a beállítás \n" - "működjön az 'Ablakban' prezentációban, át kell méretezni vagy \n" - "maximalizálni kell az ablakot."; + "vagy 'Teljes képernyő felskálázva' értékre. Az 'Ablakban' bemutatóhoz \n" + "át kell méretezni vagy maximalizálni kell az ablakot."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -597,9 +595,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Pour activer la mise à l'échelle, définissez votre présentation \n" - "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour que le \n" - "paramètre fonctionne dans la présentation 'Fenêtré', vous devez \n" - "redimensionner ou agrandir la fenêtre."; + "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour la \n" + "présentation 'Fenêtré', vous devez redimensionner ou agrandir la fenêtre."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -679,9 +676,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" - "o 'Schermo Intero Ridimensionato'. Affinché l'impostazione funzioni \n" - "nella presentazione 'In Finestra', è necessario ridimensionare \n" - "o ingrandire la finestra."; + "o 'Schermo Intero Ridimensionato'. Per la presentazione 'In Finestra', \n" + "è necessario ridimensionare o ingrandire la finestra."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -807,8 +803,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"To enable upscaling, set your presentation to either 'Borderless' \n" - "or 'Fullscreen Upscaled'. For the setting to work in the 'Windowed' \n" - "presentation, you must resize or maximize the window."; + "or 'Fullscreen Upscaled'. For the 'Windowed' presentation, \n" + "you must resize or maximize the window."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 4e7dfa7205235fe6420bab93bf9cea3a2958964c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 08:07:13 +0200 Subject: [PATCH 1133/1724] fix german tooltip --- config/ConfigFormUnit.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1abb86e..5f03c4b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -352,7 +352,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" - "Für die 'Fenster'-Darstellung müssen Sie die Größe des Fensters ändern oder es maximieren."; + "Für die 'Fenstermodus'-Darstellung müssen Sie die Größe des Fensters \n" + "ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From f30ab79f6bebdac4051b480cd25df0df97db1ca1 Mon Sep 17 00:00:00 2001 From: universal963 <36097923+universal963@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:24:53 +0800 Subject: [PATCH 1134/1724] Update Chinese translation of hints --- config/ConfigFormUnit.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 5f03c4b..9da37ad 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -183,14 +183,14 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15tick每秒", NULL); System::UnicodeString shaderHint = - L"某些着色器仅在启用升级时才起作用。\n\n"; + L"某些着色器仅在打开放大功能时生效。\n\n"; System::UnicodeString upscaleHint = - L"必须启用升级才能使此设置发挥作用。\n\n"; + L"必须打开放大功能才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用放大功能,请将演示文稿设置为“无边框”或“拉伸至全屏”。\n" - "对于'窗口化'演示,您必须调整窗口大小或最大化窗口。"; + L"要打开放大功能,请将显示方式设置为‘无边框’或‘拉伸至全屏’。\n" + "对于‘窗口化’显示方式,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 487e78a7088cb5f50ca249e8b1bc0833e7f0992d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Jul 2024 23:09:33 +0200 Subject: [PATCH 1135/1724] fix upscaling in AOE2 --- inc/version.h | 2 +- src/utils.c | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/inc/version.h b/inc/version.h index 088c32b..62c616d 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/utils.c b/src/utils.c index f983cd0..a1e8bf7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -624,31 +624,24 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) RECT size; RECT pos; - if (real_GetClientRect(hwnd, &size) && - real_GetWindowRect(hwnd, &pos) && - size.right > 1 && - size.bottom > 1) + if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos)) { char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - -#ifdef _DEBUG_X HWND parent = GetParent(hwnd); - TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); +#ifdef _DEBUG_X + LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); + + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p, style=%08X\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent, style); dbg_dump_wnd_styles(style, exstyle); - - if (parent != g_ddraw.hwnd) - return TRUE; #endif - /* Atrox */ - if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) + if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || strcmp(class_name, "Edit") == 0) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || From 6c53f51d7b2d4e8ba109f1b2c484fc3e545e1ca2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 03:58:36 +0200 Subject: [PATCH 1136/1724] detect other DirectDraw wrappers and error out --- inc/utils.h | 1 + src/dllmain.c | 85 ++++++++++++++++++++++++++++++++++++++++++--------- src/utils.c | 61 ++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 15 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 2263142..40eec1d 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,6 +6,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +BOOL util_caller_is_ddraw_wrapper(void* returnAddress); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_in_foreground(); diff --git a/src/dllmain.c b/src/dllmain.c index ff0874c..a2804d0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -10,6 +10,7 @@ #include "config.h" #include "hook.h" #include "indeo.h" +#include "utils.h" #include "versionhelpers.h" @@ -158,31 +159,74 @@ FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { - TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); - HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); + TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p) [%p]\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter, _ReturnAddress()); + + HRESULT ret; + + if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + { + if (lplpDD) + *lplpDD = NULL; + + ret = DDERR_GENERIC; + } + else + { + ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); + } + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { - TRACE("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter); + TRACE( + "-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p) [%p]\n", + __FUNCTION__, + (int)dwFlags, + lplpDDClipper, + pUnkOuter, + _ReturnAddress()); + HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - TRACE("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter); - HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); + TRACE( + "-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p) [%p]\n", + __FUNCTION__, + lpGuid, + lplpDD, + iid, + pUnkOuter, + _ReturnAddress()); + + HRESULT ret; + + if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + { + if (lplpDD) + *lplpDD = NULL; + + ret = DDERR_GENERIC; + } + else + { + ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); + } + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); + TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext); @@ -193,7 +237,13 @@ HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContex HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); + TRACE( + "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", + __FUNCTION__, + lpCallback, + lpContext, + dwFlags, + _ReturnAddress()); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL); @@ -204,7 +254,12 @@ HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); + TRACE( + "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", __FUNCTION__, + lpCallback, + lpContext, + dwFlags, + _ReturnAddress()); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL); @@ -215,7 +270,7 @@ HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); + TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext); @@ -226,7 +281,7 @@ HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpConte DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -234,7 +289,7 @@ DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) { - TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p)\n", __FUNCTION__, lpCmd, lpRetCmd); + TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p) [%p]\n", __FUNCTION__, lpCmd, lpRetCmd, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -242,7 +297,7 @@ HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) DWORD WINAPI AcquireDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -250,7 +305,7 @@ DWORD WINAPI AcquireDDThreadLock() DWORD WINAPI ReleaseDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -258,7 +313,7 @@ DWORD WINAPI ReleaseDDThreadLock() DWORD WINAPI DDInternalLock(DWORD a, DWORD b) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -266,7 +321,7 @@ DWORD WINAPI DDInternalLock(DWORD a, DWORD b) DWORD WINAPI DDInternalUnlock(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/utils.c b/src/utils.c index a1e8bf7..3ff958f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -69,6 +69,67 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +BOOL util_caller_is_ddraw_wrapper(void* returnAddress) +{ + HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); + HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); + HMODULE age_dll = GetModuleHandleA("age.dll"); + + HMODULE mod = NULL; + DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + + if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable wndmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable windmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable DxWnd and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + return FALSE; +} + BOOL util_is_bad_read_ptr(void* p) { MEMORY_BASIC_INFORMATION mbi = { 0 }; From 4974b6c9bdbbc02d921617ee72f21ec3764e0156 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 04:02:15 +0200 Subject: [PATCH 1137/1724] reorganize --- src/utils.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/utils.c b/src/utils.c index 3ff958f..75c4419 100644 --- a/src/utils.c +++ b/src/utils.c @@ -71,14 +71,10 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) BOOL util_caller_is_ddraw_wrapper(void* returnAddress) { - HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); - HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); - HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); - HMODULE age_dll = GetModuleHandleA("age.dll"); - HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) { MessageBoxA( @@ -91,6 +87,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) { MessageBoxA( @@ -103,6 +100,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) { MessageBoxA( @@ -115,6 +113,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE age_dll = GetModuleHandleA("age.dll"); if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) { MessageBoxA( From 8c3149982b8099424fc993a8a793966c2f81df1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 04:12:24 +0200 Subject: [PATCH 1138/1724] use shorter line for error message --- src/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 75c4419..ad207f5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -119,7 +119,8 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) MessageBoxA( NULL, "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Please disable the other wrapper by clicking in the game room on the very top \n" + "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", "Conflicting DirectDraw wrapper detected - cnc-ddraw", MB_OK | MB_TOPMOST); From cecfd5c61139f0e653a905f6abbc778e27518fae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 20:52:10 +0200 Subject: [PATCH 1139/1724] fix build config names --- cnc-ddraw.sln | 8 ++++---- cnc-ddraw.vcxproj | 24 ++++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index c579c3b..eca7295 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -16,10 +16,10 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMiniXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMiniXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLogXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLogXP|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32 diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index c7d6352..fda7e42 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -1,12 +1,12 @@  - - DebugLogMini + + DebugLogMiniXP Win32 - - DebugLog + + DebugLogXP Win32 @@ -144,14 +144,14 @@ true MultiByte - + DynamicLibrary false v141_xp true MultiByte - + DynamicLibrary false v141_xp @@ -171,10 +171,10 @@ - + - + @@ -196,13 +196,13 @@ false ddraw - + $(SolutionDir)bin\DebugLogXP\ $(SolutionDir)bin\DebugLogXP\ false ddraw - + $(SolutionDir)bin\DebugLogMiniXP\ $(SolutionDir)bin\DebugLogMiniXP\ false @@ -285,7 +285,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - + Level2 @@ -312,7 +312,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - + Level2 From 9ac5eda9bea23f524492b8b31ed0b0e10c47e032 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 22:47:40 +0200 Subject: [PATCH 1140/1724] improve ddraw wrapper detection --- inc/utils.h | 3 +- src/utils.c | 170 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 138 insertions(+), 35 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 40eec1d..beb1c57 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,7 +6,8 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); -BOOL util_caller_is_ddraw_wrapper(void* returnAddress); +FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); +BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_in_foreground(); diff --git a/src/utils.c b/src/utils.c index ad207f5..df961e1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -69,62 +69,164 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } -BOOL util_caller_is_ddraw_wrapper(void* returnAddress) +FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { + if (!mod || mod == INVALID_HANDLE_VALUE) + return NULL; + + __try + { + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + return NULL; + + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + if (nt_headers->Signature != IMAGE_NT_SIGNATURE) + return NULL; + + DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; + DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; + + if (import_desc_rva == 0 || import_desc_size == 0) + return NULL; + + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + + while (import_desc->FirstThunk) + { + if (!import_desc->OriginalFirstThunk || !import_desc->Name) + { + import_desc++; + continue; + } + + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + + if (_stricmp(imp_module_name, module_name) == 0) + { + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); + + while (first_thunk->u1.Function) + { + if (!o_first_thunk->u1.AddressOfData) + { + first_thunk++; + o_first_thunk++; + continue; + } + + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + + if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + { +#if defined(__GNUC__) + if (util_is_bad_read_ptr((void*)import->Name)) + continue; +#endif + + if (strcmp((const char*)import->Name, function_name) == 0 && first_thunk->u1.Function) + { + return (FARPROC)first_thunk->u1.Function; + } + } + + first_thunk++; + o_first_thunk++; + } + } + + import_desc++; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } + + return NULL; +} + +BOOL util_caller_is_ddraw_wrapper(void* return_address) +{ + void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); + void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); + + TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx); + HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); - if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) + if (wndmode_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable wndmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable wndmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); - if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) + if (windmode_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable windmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable windmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); - if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) + if (dxwnd_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable DxWnd and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable DxWnd and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE age_dll = GetModuleHandleA("age.dll"); - if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) + if (age_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top \n" - "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top \n" + "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } return FALSE; From 0fabacc58c12a89068556ecfe5782cfa5554c3d6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 23:48:48 +0200 Subject: [PATCH 1141/1724] keep it windows 2000 compatible for now --- src/utils.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/utils.c b/src/utils.c index df961e1..ceb4368 100644 --- a/src/utils.c +++ b/src/utils.c @@ -148,6 +148,12 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) BOOL util_caller_is_ddraw_wrapper(void* return_address) { + BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = + real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA");; + + if (!getModuleHandleExA) + return FALSE; + void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); @@ -159,9 +165,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll) { - if ((GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || - (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || - (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) + if ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) { MessageBoxA( NULL, @@ -177,9 +183,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); if (windmode_dll) { - if ((GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || - (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || - (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) + if ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) { MessageBoxA( NULL, @@ -195,9 +201,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); if (dxwnd_dll) { - if ((GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || - (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || - (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) + if ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) { MessageBoxA( NULL, @@ -213,9 +219,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE age_dll = GetModuleHandleA("age.dll"); if (age_dll) { - if ((GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || - (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || - (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) + if ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { MessageBoxA( NULL, From 86eb6020d7d06de85e51757baf534a1255eefffa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 00:09:03 +0200 Subject: [PATCH 1142/1724] fix warnings --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index ceb4368..bae65bc 100644 --- a/src/utils.c +++ b/src/utils.c @@ -149,7 +149,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) BOOL util_caller_is_ddraw_wrapper(void* return_address) { BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA");; + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA"); if (!getModuleHandleExA) return FALSE; From cd3bef1ceac543d93a5838e982ddb2195dcb6ee9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 01:11:55 +0200 Subject: [PATCH 1143/1724] use LoadLibrary --- src/utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index bae65bc..fe1db06 100644 --- a/src/utils.c +++ b/src/utils.c @@ -149,13 +149,13 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) BOOL util_caller_is_ddraw_wrapper(void* return_address) { BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA"); + (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); if (!getModuleHandleExA) return FALSE; - void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); - void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); + void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); + void* directDrawCreateEx = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx); From c850b0dcc3a0d8653dfdf85fef18287b561fc2bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:21:07 +0200 Subject: [PATCH 1144/1724] fix AOE2 textbox position --- inc/dd.h | 7 +++++++ src/dd.c | 23 +++++++++++++++++++++++ src/utils.c | 2 +- src/winapi_hooks.c | 25 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 73a1202..4a964f1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -158,6 +158,13 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; + struct + { + HWND hwnd; + int x; + int y; + } textbox; /* Age Of Empires 2 textbox align */ + } CNCDDRAW; #endif diff --git a/src/dd.c b/src/dd.c index fda72bd..e0d99be 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1149,6 +1149,29 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_lock(); } + if (g_ddraw.textbox.hwnd && + g_ddraw.textbox.x && + g_ddraw.textbox.y && + IsWindow(g_ddraw.textbox.hwnd) && + GetParent(g_ddraw.textbox.hwnd) == g_ddraw.hwnd) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(g_ddraw.textbox.hwnd, class_name, sizeof(class_name) - 1); + + if (_strcmpi(class_name, "Edit") == 0) + { + real_SetWindowPos( + g_ddraw.textbox.hwnd, + 0, + g_ddraw.textbox.x * g_ddraw.render.scale_w, + g_ddraw.textbox.y * g_ddraw.render.scale_h, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + ); + } + } + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) diff --git a/src/utils.c b/src/utils.c index fe1db06..a9e0f4a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -810,7 +810,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) dbg_dump_wnd_styles(style, exstyle); #endif - if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || strcmp(class_name, "Edit") == 0) + if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || _strcmpi(class_name, "Edit") == 0) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b3a4cce..8a58b46 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -371,6 +371,20 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO Y += pt.y; } } + else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hWnd, class_name, sizeof(class_name) - 1); + + if (_strcmpi(class_name, "Edit") == 0) + { + g_ddraw.textbox.x = X; + g_ddraw.textbox.y = Y; + + X *= g_ddraw.render.scale_w; + Y *= g_ddraw.render.scale_h; + } + } } return real_MoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint); @@ -1692,6 +1706,17 @@ HWND WINAPI fake_CreateWindowExA( hInstance, lpParam); + /* Age Of Empires 2 */ + if (!dwExStyle && + HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 && + !lpWindowName && + g_ddraw.ref && g_ddraw.width && + g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + hMenu == 1) + { + g_ddraw.textbox.hwnd = hwnd; + } + TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd); return hwnd; From d968d320c6964ca10596bb5b3809c1596029df1a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:29:26 +0200 Subject: [PATCH 1145/1724] fix textbox with maintain aspect ratio enabled --- src/dd.c | 4 ++-- src/winapi_hooks.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index e0d99be..313464b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,8 +1163,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowPos( g_ddraw.textbox.hwnd, 0, - g_ddraw.textbox.x * g_ddraw.render.scale_w, - g_ddraw.textbox.y * g_ddraw.render.scale_h, + g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w), + g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8a58b46..6ac4530 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -381,8 +381,8 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO g_ddraw.textbox.x = X; g_ddraw.textbox.y = Y; - X *= g_ddraw.render.scale_w; - Y *= g_ddraw.render.scale_h; + X = g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w); + Y = g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h); } } } From b472679643a7f4d1e6bdb974b997b2c10fcb815f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:43:43 +0200 Subject: [PATCH 1146/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 62c616d..cc32d36 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 2465b13d7381e2dbdb0fbe430321ea73a910ceb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:59:39 +0200 Subject: [PATCH 1147/1724] add comments for AOE2 textbox hack --- src/dd.c | 1 + src/winapi_hooks.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 313464b..9a5a745 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1149,6 +1149,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_lock(); } + /* Age Of Empires 2 textbox align */ if (g_ddraw.textbox.hwnd && g_ddraw.textbox.x && g_ddraw.textbox.y && diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6ac4530..424c831 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -373,6 +373,7 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO } else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width) { + /* Age Of Empires 2 textbox align */ char class_name[MAX_PATH] = { 0 }; GetClassNameA(hWnd, class_name, sizeof(class_name) - 1); @@ -1706,7 +1707,7 @@ HWND WINAPI fake_CreateWindowExA( hInstance, lpParam); - /* Age Of Empires 2 */ + /* Age Of Empires 2 textbox align */ if (!dwExStyle && HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 && !lpWindowName && From 25b4bb8ce593351cd7a65ed541614de072f0fae6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jul 2024 11:01:18 +0200 Subject: [PATCH 1148/1724] update Shadow Flare preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index cc0926b..bff5940 100644 --- a/src/config.c +++ b/src/config.c @@ -1367,8 +1367,6 @@ static void cfg_create_ini() "[ShadowFlare]\n" "nonexclusive=true\n" "adjmouse=true\n" - "maintas=false\n" - "boxing=false\n" "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" From 8b41ad1aa4dcea60c7e229e44b80ead15ea6d0b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Jul 2024 01:09:14 +0200 Subject: [PATCH 1149/1724] check registry key for voobly AOE2 windowed detection --- src/utils.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/utils.c b/src/utils.c index a9e0f4a..44772f2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -223,15 +223,30 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top \n" - "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + HKEY hkey; + LONG status = + RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Voobly\\Voobly\\game\\13", 0L, KEY_READ, &hkey); - return TRUE; + if (status == ERROR_SUCCESS) + { + char windowed[256] = { 0 }; + DWORD size = sizeof(windowed); + RegQueryValueExA(hkey, "windowmode", NULL, NULL, (PVOID)&windowed, &size); + RegCloseKey(hkey); + + if (tolower(windowed[0]) == 't') + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top " + "on 'Game', now select 'DirectX' and disable 'Start in Window-Mode'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + } } } From 7cb1fceac7caaecdb133141f392820d4d66559f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Jul 2024 01:50:31 +0200 Subject: [PATCH 1150/1724] fix warnings --- src/dd.c | 4 ++-- src/winapi_hooks.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9a5a745..c0ddbd4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1164,8 +1164,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowPos( g_ddraw.textbox.hwnd, 0, - g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w), - g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h), + (int)(g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w)), + (int)(g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h)), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 424c831..d260b22 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -382,8 +382,8 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO g_ddraw.textbox.x = X; g_ddraw.textbox.y = Y; - X = g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w); - Y = g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h); + X = (int)(g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w)); + Y = (int)(g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h)); } } } @@ -1713,7 +1713,7 @@ HWND WINAPI fake_CreateWindowExA( !lpWindowName && g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - hMenu == 1) + (int)hMenu == 1) { g_ddraw.textbox.hwnd = hwnd; } From 7ac53e1e970ae8627f1c34d028f051e40f312677 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 19 Jul 2024 07:35:21 +0200 Subject: [PATCH 1151/1724] add preset for Barbie(R) Photo Designer --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 5e18f0d..0c23ef2 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Baldur's Gate - Baldur's Gate 2 - Barbie(tm) Beach Vacation(tm) +- Barbie(R) Photo Designer - Batman: Justice Unbalanced - Batman: Toxic Chill - Blade & Sword diff --git a/src/config.c b/src/config.c index bff5940..b1842f0 100644 --- a/src/config.c +++ b/src/config.c @@ -473,6 +473,10 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" + "; Barbie(R) Photo Designer\n" + "[pdcam]\n" + "allow_wmactivate=true\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" From ce64c20ae690474a7117b9f9e027187633f64917 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:15:29 +0200 Subject: [PATCH 1152/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0c23ef2..32d7150 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD +- ​M.A.X. 2 Mechanized Assault & Exploration - Mech Warrior 3 - Megaman X4 - Metal Gear Solid From 751a1e94199dd84b81986113e56392d038fb0273 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:19:31 +0200 Subject: [PATCH 1153/1724] detect D3DWindower as well --- src/utils.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/utils.c b/src/utils.c index 44772f2..16bdd37 100644 --- a/src/utils.c +++ b/src/utils.c @@ -162,6 +162,24 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll"); + if (D3dHook_dll) + { + if ((getModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable D3DWindower and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + } + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll) { From 1f532f9f6fefdc757f4c9cc0f51ca7ca82626585 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:44:57 +0200 Subject: [PATCH 1154/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index cc32d36..a9eb822 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From f4f5c2d71b6a2ccbb160e64eebe7a66ebed0c23f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 21 Jul 2024 04:01:00 +0200 Subject: [PATCH 1155/1724] fix GL_OUT_OF_MEMORY error issues on high resolutions such as 8k and above --- inc/render_ogl.h | 1 - src/render_ogl.c | 73 +++++++++++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 2547ff3..8dbb9a4 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -16,7 +16,6 @@ typedef struct OGLRENDERER BOOL got_error; int surface_tex_width; int surface_tex_height; - int* surface_tex; GLenum surface_format; GLenum surface_type; GLuint surface_tex_ids[TEXTURE_COUNT]; diff --git a/src/render_ogl.c b/src/render_ogl.c index 5ff4dd8..ef18352 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,13 +248,10 @@ static void ogl_create_textures(int width, int height) int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; g_ogl.surface_tex_width = - w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w <= 16384 ? 16384 : w; + w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w; g_ogl.surface_tex_height = - h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h <= 16384 ? 16384 : h; - - g_ogl.surface_tex = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h; g_ogl.scale_w = (float)width / g_ogl.surface_tex_width; g_ogl.scale_h = (float)height / g_ogl.surface_tex_height; @@ -638,7 +635,7 @@ static void ogl_init_shader1_program() 0, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); @@ -704,6 +701,10 @@ static void ogl_init_shader1_program() break; } + else + { + glClear(GL_COLOR_BUFFER_BIT); + } } glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -1213,9 +1214,6 @@ static void ogl_render() static void ogl_delete_context(HGLRC context) { - if (g_ogl.surface_tex) - HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); - glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); if (g_ddraw.bpp == 8) @@ -1277,7 +1275,13 @@ static void ogl_delete_context(HGLRC context) static BOOL ogl_texture_upload_test() { - if (!g_ogl.surface_tex) + if (g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) + return TRUE; + + int* surface_tex = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + + if (!surface_tex) return TRUE; static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; @@ -1285,7 +1289,7 @@ static BOOL ogl_texture_upload_test() int i; for (i = 0; i < TEXTURE_COUNT; i++) { - memcpy(g_ogl.surface_tex, test_data, sizeof(test_data)); + memcpy(surface_tex, test_data, sizeof(test_data)); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[i]); @@ -1298,14 +1302,17 @@ static BOOL ogl_texture_upload_test() g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, - g_ogl.surface_tex); + surface_tex); - memset(g_ogl.surface_tex, 0, sizeof(test_data)); + memset(surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, surface_tex); - if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) + if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) + { + HeapFree(GetProcessHeap(), 0, surface_tex); return FALSE; + } } if (g_ddraw.bpp == 8) @@ -1323,32 +1330,41 @@ static BOOL ogl_texture_upload_test() 1, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); - memset(g_ogl.surface_tex, 0, sizeof(test_data)); + memset(surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); - if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) + if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) + { + HeapFree(GetProcessHeap(), 0, surface_tex); return FALSE; + } + } } + + HeapFree(GetProcessHeap(), 0, surface_tex); return TRUE; } static BOOL ogl_shader_test() { - if (!g_ogl.surface_tex) - return TRUE; - BOOL result = TRUE; - if (g_ddraw.bpp != 8) + if (g_ddraw.bpp != 8 || g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) return result; + int* surface_tex = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + + if (!surface_tex) + return TRUE; + if (g_oglu_got_version3 && g_ogl.main_program) { - memset(g_ogl.surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); + memset(surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); GLuint fbo_id = 0; glGenFramebuffers(1, &fbo_id); @@ -1369,7 +1385,7 @@ static BOOL ogl_shader_test() 0, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex_id, 0); @@ -1404,7 +1420,7 @@ static BOOL ogl_shader_test() g_ogl.surface_tex_height, g_ogl.surface_format, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); glViewport(0, 0, g_ogl.surface_tex_width, g_ogl.surface_tex_height); @@ -1423,12 +1439,12 @@ static BOOL ogl_shader_test() glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, fbo_tex_id); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); int i; for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) { - if (g_ogl.surface_tex[i] != 0x80808080) + if (surface_tex[i] != 0x80808080) { result = FALSE; break; @@ -1446,5 +1462,6 @@ static BOOL ogl_shader_test() glBindFramebuffer(GL_FRAMEBUFFER, 0); } + HeapFree(GetProcessHeap(), 0, surface_tex); return result; } From 4b5ded46f16f7f9b033418ea2de1d04215e09d4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 21 Jul 2024 07:18:09 +0200 Subject: [PATCH 1156/1724] reduce waiting time in SetDisplayMode( --- src/render_d3d9.c | 6 +++++- src/render_gdi.c | 6 +++++- src/render_ogl.c | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 05f29b9..c8e911e 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -549,7 +549,8 @@ DWORD WINAPI d3d9_render_main(void) DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -682,6 +683,9 @@ DWORD WINAPI d3d9_render_main(void) Sleep(50); } + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif diff --git a/src/render_gdi.c b/src/render_gdi.c index d67bee9..390fc56 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -41,7 +41,8 @@ DWORD WINAPI gdi_render_main(void) DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -162,6 +163,9 @@ DWORD WINAPI gdi_render_main(void) LeaveCriticalSection(&g_ddraw.cs); + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif diff --git a/src/render_ogl.c b/src/render_ogl.c index ef18352..2242ca3 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -837,7 +837,8 @@ static void ogl_render() DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ogl.use_opengl && g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -1201,6 +1202,9 @@ static void ogl_render() SwapBuffers(g_ddraw.render.hdc); + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif From e3b81f82506c2adea7d986f593292b836217cee3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 22 Jul 2024 09:02:31 +0200 Subject: [PATCH 1157/1724] only create opengl context once per window fixes issues on intel and improves performance --- inc/render_ogl.h | 4 +++ src/dd.c | 23 ++++++++++++++ src/render_ogl.c | 79 ++++++++++++++++++++++++++++------------------ src/winapi_hooks.c | 5 +++ 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 8dbb9a4..969c41a 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -9,6 +9,8 @@ typedef struct OGLRENDERER { + HWND hwnd; + HDC hdc; HGLRC context; GLuint main_program; GLuint shader1_program; @@ -42,5 +44,7 @@ typedef struct OGLRENDERER } OGLRENDERER; DWORD WINAPI ogl_render_main(void); +BOOL ogl_create(); +BOOL ogl_release(); #endif diff --git a/src/dd.c b/src/dd.c index c0ddbd4..6491f62 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1013,6 +1013,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.renderer = gdi_render_main; } } + else if (g_ddraw.renderer == ogl_render_main) + { + if (!ogl_create()) + { + ogl_release(); + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; + } + } if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); @@ -1093,6 +1102,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.renderer = gdi_render_main; } } + else if (g_ddraw.renderer == ogl_render_main) + { + if (!ogl_create()) + { + ogl_release(); + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; + } + } if (!d3d9_active || g_config.nonexclusive) { @@ -1485,6 +1503,11 @@ ULONG dd_Release() } } + if (g_ddraw.renderer == ogl_render_main) + { + ogl_release(); + } + if (g_ddraw.render.hdc) { ReleaseDC(g_ddraw.hwnd, g_ddraw.render.hdc); diff --git a/src/render_ogl.c b/src/render_ogl.c index 2242ca3..a56b295 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -13,26 +13,48 @@ static HGLRC ogl_create_core_context(HDC hdc); -static HGLRC ogl_create_context(HDC hdc); static void ogl_build_programs(); static void ogl_create_textures(int width, int height); static void ogl_init_main_program(); static void ogl_init_shader1_program(); static void ogl_init_shader2_program(); static void ogl_render(); -static void ogl_delete_context(HGLRC context); +static BOOL ogl_release_resources(); static BOOL ogl_texture_upload_test(); static BOOL ogl_shader_test(); static OGLRENDERER g_ogl; +BOOL ogl_create() +{ + if (g_ogl.hwnd == g_ddraw.hwnd && g_ogl.hdc == g_ddraw.render.hdc && g_ogl.context) + { + return TRUE; + } + + ogl_release(); + + g_ogl.context = xwglCreateContext(g_ddraw.render.hdc); + if (g_ogl.context) + { + g_ogl.hwnd = g_ddraw.hwnd; + g_ogl.hdc = g_ddraw.render.hdc; + + return TRUE; + } + + g_ogl.hwnd = NULL; + g_ogl.hdc = NULL; + + return FALSE; +} + DWORD WINAPI ogl_render_main(void) { Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - g_ogl.context = ogl_create_context(g_ddraw.render.hdc); - if (g_ogl.context) + if (xwglMakeCurrent(g_ogl.hdc, g_ogl.context) && glGetError() == GL_NO_ERROR) { oglu_init(); @@ -43,9 +65,9 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ddraw.render.hdc); + g_ogl.context = ogl_create_core_context(g_ogl.hdc); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw.render.hdc) && wglSwapIntervalEXT) + if (oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc) && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); @@ -62,9 +84,11 @@ DWORD WINAPI ogl_render_main(void) ogl_render(); - ogl_delete_context(g_ogl.context); + ogl_release_resources(); } + xwglMakeCurrent(NULL, NULL); + if (!g_ogl.use_opengl) { g_ddraw.show_driver_warning = TRUE; @@ -112,25 +136,6 @@ static HGLRC ogl_create_core_context(HDC hdc) return g_ogl.context; } -static HGLRC ogl_create_context(HDC hdc) -{ - HGLRC context = xwglCreateContext(hdc); - BOOL made_current = context && xwglMakeCurrent(hdc, context); - - if (!made_current || glGetError() != GL_NO_ERROR) - { - if (made_current) - { - xwglMakeCurrent(NULL, NULL); - xwglDeleteContext(context); - } - - context = 0; - } - - return context; -} - static void ogl_build_programs() { g_ogl.main_program = g_ogl.shader1_program = g_ogl.shader2_program = 0; @@ -1200,7 +1205,7 @@ static void ogl_render() if (g_ddraw.bnet_active) glClear(GL_COLOR_BUFFER_BIT); - SwapBuffers(g_ddraw.render.hdc); + SwapBuffers(g_ogl.hdc); if (!g_ddraw.render.run) break; @@ -1216,7 +1221,7 @@ static void ogl_render() InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } -static void ogl_delete_context(HGLRC context) +static BOOL ogl_release_resources() { glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); @@ -1273,8 +1278,22 @@ static void ogl_delete_context(HGLRC context) } } - xwglMakeCurrent(NULL, NULL); - xwglDeleteContext(context); + return TRUE; +} + +BOOL ogl_release() +{ + if (g_ddraw.render.thread) + return FALSE; + + if (g_ogl.context) + { + xwglMakeCurrent(NULL, NULL); + xwglDeleteContext(g_ogl.context); + g_ogl.context = NULL; + } + + return TRUE; } static BOOL ogl_texture_upload_test() diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d260b22..b856f0e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -12,6 +12,7 @@ #include "wndproc.h" #include "render_gdi.h" #include "render_d3d9.h" +#include "render_ogl.h" #include "directinput.h" #include "ddsurface.h" #include "ddclipper.h" @@ -1479,6 +1480,10 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { d3d9_release(); } + else if (g_ddraw.renderer == ogl_render_main) + { + ogl_release(); + } } BOOL result = real_DestroyWindow(hWnd); From 3ef9e29a8bc58b3ce523626e8f4855d01b256f49 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 22 Jul 2024 11:03:33 +0200 Subject: [PATCH 1158/1724] retry wglMakeCurrent at least once --- src/render_ogl.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index a56b295..84ec194 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -54,7 +54,15 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - if (xwglMakeCurrent(g_ogl.hdc, g_ogl.context) && glGetError() == GL_NO_ERROR) + BOOL made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); + if (!made_current) + { + /* make sure we retry at least once */ + Sleep(50); + made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); + } + + if (made_current && glGetError() == GL_NO_ERROR) { oglu_init(); From 86940e993749aa285c47c90f9aa3b3c52f6c317e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 23 Jul 2024 23:25:02 +0200 Subject: [PATCH 1159/1724] add new DDEnableZoom export --- exports.def | 1 + inc/dd.h | 5 +++++ src/dllmain.c | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/exports.def b/exports.def index 44bfcd8..1e25f0f 100644 --- a/exports.def +++ b/exports.def @@ -22,3 +22,4 @@ EXPORTS pvBmpBits = FakePrimarySurface DATA DDIsWindowed DDGetProcAddress + DDEnableZoom diff --git a/inc/dd.h b/inc/dd.h index 4a964f1..8fdd7a7 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -165,6 +165,11 @@ typedef struct CNCDDRAW int y; } textbox; /* Age Of Empires 2 textbox align */ + + struct + { + BOOL enabled; + } zoom; /* Age Of Empires 2 textbox align */ } CNCDDRAW; #endif diff --git a/src/dllmain.c b/src/dllmain.c index a2804d0..b75c335 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -147,13 +147,24 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) return TRUE; } +void DDEnableZoom() +{ + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + g_ddraw.zoom.enabled = TRUE; +} + BOOL DDIsWindowed() { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + return g_config.windowed && !g_config.fullscreen; } FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + return real_GetProcAddress(hModule, lpProcName); } From 0c393e24b4a61f175b40fa81cd949b52700022ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 23 Jul 2024 23:26:17 +0200 Subject: [PATCH 1160/1724] remove comment --- inc/dd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 8fdd7a7..bce317a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -169,7 +169,7 @@ typedef struct CNCDDRAW struct { BOOL enabled; - } zoom; /* Age Of Empires 2 textbox align */ + } zoom; } CNCDDRAW; #endif From f2f6ffe69f00a135bef4d950b5c2865ca3cf81c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 24 Jul 2024 07:58:55 +0200 Subject: [PATCH 1161/1724] initial zoom support --- src/dd.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 6491f62..819a0fd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -623,6 +623,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } + BOOL zooming = g_ddraw.zoom.enabled; + g_ddraw.zoom.enabled = FALSE; + g_ddraw.render.width = g_config.window_rect.right; g_ddraw.render.height = g_config.window_rect.bottom; @@ -665,15 +668,35 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - - if (g_ddraw.render.width < g_ddraw.width) + else if (zooming) { - g_ddraw.render.width = g_ddraw.width; + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) + { + /* Downscaling requires adjmouse to be enabled */ + g_config.adjmouse = TRUE; + } + + /* Do not change display resolution when zooming */ + g_ddraw.render.width = g_ddraw.render.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.render.mode.dmPelsHeight; + + /* Resize and alt+enter are not supported yet with zooming */ + g_config.resizable = FALSE; + g_config.hotkeys.toggle_fullscreen = 0; } - if (g_ddraw.render.height < g_ddraw.height) + if (!zooming || g_config.fullscreen) { - g_ddraw.render.height = g_ddraw.height; + if (g_ddraw.render.width < g_ddraw.width) + { + g_ddraw.render.width = g_ddraw.width; + } + + if (g_ddraw.render.height < g_ddraw.height) + { + g_ddraw.render.height = g_ddraw.height; + } } g_ddraw.render.run = TRUE; @@ -1114,7 +1137,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!d3d9_active || g_config.nonexclusive) { - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!zooming && ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { g_ddraw.render.run = FALSE; g_config.windowed = TRUE; From 9bd6cb9cc8ee5a3cea4a80c82910ae64563d5aa9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 24 Jul 2024 08:05:03 +0200 Subject: [PATCH 1162/1724] retry wglMakeCurrent up to 5 times on failure --- src/render_ogl.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 84ec194..9dc8770 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -54,12 +54,14 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - BOOL made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); - if (!made_current) + BOOL made_current = FALSE; + + for (int i = 0; i < 5; i++) { - /* make sure we retry at least once */ + if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) + break; + Sleep(50); - made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); } if (made_current && glGetError() == GL_NO_ERROR) From 2efc7f8a590670c10b10989646cde96f452b0510 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 25 Jul 2024 23:53:17 +0200 Subject: [PATCH 1163/1724] add preset for Emperor: Rise of the Middle Kingdom --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 32d7150..1659ea2 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Dungeon Keeper 2 - Economic War - Eggsucker +- Emperor: Rise of the Middle Kingdom - Enemy Infestation - Escape Velocity Nova - F-16 Multirole Fighter diff --git a/src/config.c b/src/config.c index b1842f0..4d030de 100644 --- a/src/config.c +++ b/src/config.c @@ -792,6 +792,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" + "; Emperor: Rise of the Middle Kingdom\n" + "[Emperor]\n" + "nonexclusive=true\n" + "\n" "; Enemy Infestation\n" "[EI]\n" "hook_getmessage=true\n" From 3a579e36cc03a502afd27cb34df56e635e6cf81f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:17:56 +0200 Subject: [PATCH 1164/1724] improve opengl error logs --- inc/render_ogl.h | 9 +++++++ src/render_ogl.c | 69 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 969c41a..bc4d39f 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -7,6 +7,15 @@ #define TEXTURE_COUNT 4 #define FBO_COUNT 2 +#ifdef _DEBUG +#define GL_CHECK(stmt) do { \ + stmt; \ + ogl_check_error(#stmt); \ + } while (0) +#else +#define GL_CHECK(stmt) stmt +#endif + typedef struct OGLRENDERER { HWND hwnd; diff --git a/src/render_ogl.c b/src/render_ogl.c index 9dc8770..a348ed6 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -22,6 +22,7 @@ static void ogl_render(); static BOOL ogl_release_resources(); static BOOL ogl_texture_upload_test(); static BOOL ogl_shader_test(); +static void ogl_check_error(const char* stmt); static OGLRENDERER g_ogl; @@ -53,7 +54,7 @@ DWORD WINAPI ogl_render_main(void) { Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - + GLenum err = GL_NO_ERROR; BOOL made_current = FALSE; for (int i = 0; i < 5; i++) @@ -64,9 +65,9 @@ DWORD WINAPI ogl_render_main(void) Sleep(50); } - if (made_current && glGetError() == GL_NO_ERROR) + if (made_current && (err = glGetError()) == GL_NO_ERROR) { - oglu_init(); + GL_CHECK(oglu_init()); TRACE("+--OpenGL-----------------------------------------\n"); TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); @@ -75,26 +76,36 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ogl.hdc); + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc) && wglSwapIntervalEXT) + BOOL got_swap_ctrl; + GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); + + if (got_swap_ctrl && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); - ogl_build_programs(); - ogl_create_textures(g_ddraw.width, g_ddraw.height); - ogl_init_main_program(); - ogl_init_shader1_program(); - ogl_init_shader2_program(); + GL_CHECK(ogl_build_programs()); + GL_CHECK(ogl_create_textures(g_ddraw.width, g_ddraw.height)); + GL_CHECK(ogl_init_main_program()); + GL_CHECK(ogl_init_shader1_program()); + GL_CHECK(ogl_init_shader2_program()); - g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); - g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); - g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; + GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test()); + GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test()); + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; - ogl_render(); + GL_CHECK(ogl_render()); - ogl_release_resources(); + GL_CHECK(ogl_release_resources()); + + while (glGetError() != GL_NO_ERROR); + } + else + { + TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); + ogl_check_error("xwglMakeCurrent()"); } xwglMakeCurrent(NULL, NULL); @@ -109,6 +120,19 @@ DWORD WINAPI ogl_render_main(void) return 0; } + +static void ogl_check_error(const char* stmt) +{ +#ifdef _DEBUG + GLenum err; + while ((err = glGetError()) != GL_NO_ERROR) + { + g_ogl.got_error = TRUE; + TRACE("OpenGL error %08x (%s)\n", err, stmt); + } +#endif +} + static HGLRC ogl_create_core_context(HDC hdc) { if (!wglCreateContextAttribsARB) @@ -259,6 +283,8 @@ static void ogl_build_programs() static void ogl_create_textures(int width, int height) { + GLenum err = GL_NO_ERROR; + int w = g_ogl.shader2_program ? max(width, g_ddraw.render.viewport.width) : width; int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; @@ -279,7 +305,13 @@ static void ogl_create_textures(int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + + if (err != GL_NO_ERROR) + { + TRACE("OpenGL error %08x (ogl_create_textures())\n", err); + ogl_check_error("ogl_create_textures()"); + } while (glGetError() != GL_NO_ERROR); @@ -952,7 +984,12 @@ static void ogl_render() GLenum err = glGetError(); if (err != GL_NO_ERROR && err != GL_INVALID_FRAMEBUFFER_OPERATION) + { g_ogl.use_opengl = FALSE; + + TRACE("OpenGL error %08x (ogl_render())\n", err); + ogl_check_error("ogl_render()"); + } } if (g_config.fixchilds) From 50b68a63bbe8a182e1b6f2b695e3b44a3ba72528 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 04:39:22 +0200 Subject: [PATCH 1165/1724] adjust preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 4d030de..0ca96a5 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,7 @@ static void cfg_create_ini() "; Emperor: Rise of the Middle Kingdom\n" "[Emperor]\n" "nonexclusive=true\n" + "adjmouse=true\n" "\n" "; Enemy Infestation\n" "[EI]\n" From 80356f76edd68a7967c4f292438ad209c70f352f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:37:14 +0200 Subject: [PATCH 1166/1724] =?UTF-8?q?add=20new=20limiter=20type=20"LIMIT?= =?UTF-8?q?=5FUNL=C3=96CK"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/dd.h | 1 + src/ddsurface.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index bce317a..a0bd368 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -49,6 +49,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_AUTO 0 #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 +#define LIMIT_UNLCK 3 #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f6a873..d20215b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1199,8 +1199,11 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) + if (g_ddraw.ticks_limiter.tick_length > 0 && + (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLCK)) + { util_limit_game_ticks(); + } } } From bc1a69330bb73b9461220e94882f9295366e69f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:38:03 +0200 Subject: [PATCH 1167/1724] add note about new limiter type --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0ca96a5..06f6ca4 100644 --- a/src/config.c +++ b/src/config.c @@ -265,7 +265,7 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast\n" + "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock\n" "limiter_type=0\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" From ca133861ebb30c5d2b05576c5a26496703bc745e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:39:39 +0200 Subject: [PATCH 1168/1724] add preset for Real War --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 1659ea2..50bcddc 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Reader Rabbit Thinking Ages 4-6 (US) - Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) +- Real War - Red Baron 3D - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) - Reksio and the UFO (Reksio i Ufo) diff --git a/src/config.c b/src/config.c index 06f6ca4..70a1b45 100644 --- a/src/config.c +++ b/src/config.c @@ -1260,6 +1260,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Real War\n" + "[RealWar]\n" + "limiter_type=3\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From cd0cfe5d5cc19928395f95c183691a0626a372e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:49:52 +0200 Subject: [PATCH 1169/1724] update Real War preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 70a1b45..26dc4c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,6 +1262,7 @@ static void cfg_create_ini() "\n" "; Real War\n" "[RealWar]\n" + "maxgameticks=60\n" "limiter_type=3\n" "\n" "; ROAD RASH\n" From d8b6395423d3b792bac9a5cca31bcffd4616531d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 23:17:16 +0200 Subject: [PATCH 1170/1724] enable "nonexclusive" by default --- src/config.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 26dc4c7..bd71fb7 100644 --- a/src/config.c +++ b/src/config.c @@ -62,7 +62,7 @@ void cfg_load() GET_INT(g_config.maxgameticks, "maxgameticks", 0); GET_INT(g_config.limiter_type, "limiter_type", LIMIT_AUTO); GET_INT(g_config.minfps, "minfps", 0); - GET_BOOL(g_config.nonexclusive, "nonexclusive", FALSE); + GET_BOOL(g_config.nonexclusive, "nonexclusive", TRUE); GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); @@ -274,7 +274,7 @@ static void cfg_create_ini() "\n" "; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers\n" "; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible\n" - "nonexclusive=false\n" + "nonexclusive=true\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "; Note: Disable this if the game is not running smooth or there are sound issues\n" @@ -589,6 +589,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2\n" "[game]\n" + "nonexclusive=false\n" "checkfile=.\\blowfish.dll\n" "tshack=true\n" "noactivateapp=true\n" @@ -600,6 +601,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun Demo\n" "[SUN]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -610,6 +612,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun - CnCNet\n" "[ts-spawn]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -620,6 +623,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[ra2]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -629,6 +633,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[Red Alert 2]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -638,6 +643,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge\n" "[gamemd]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -647,6 +653,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?\n" "[ra2md]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -656,6 +663,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet\n" "[gamemd-spawn]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -665,6 +673,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS\n" "[Yuri's Revenge]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" From 46f0fa29d4ef5d9301a7183ef872ed8b8ac0c1b5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 1 Aug 2024 09:27:01 +0200 Subject: [PATCH 1171/1724] #102 add -vietnamese - translation made by TheBuck338 @ github --- config/ConfigFormUnit.cpp | 87 +++++++++++++++++++++++++++ config/Resources/VN.png | Bin 0 -> 474 bytes config/cnc-ddraw config.cbproj | 64 ++++++++++++++++++++ config/cnc-ddraw config.cpp | 1 - config/cnc-ddraw config_resources.rc | 1 + src/config.c | 2 +- 6 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 config/Resources/VN.png diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 9da37ad..749c7e0 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -691,6 +691,87 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Hint = upscaleHint + enableUpscaleHint; BoxingChk->Hint = upscaleHint + enableUpscaleHint; } + else if (lang == "vietnamese" || (lang == "auto" && priID == LANG_VIETNAMESE)) { + LanguageImg->Visible = true; + + /* -vietnamese - made by TheBuck338 @ github */ + + ConfigForm->Caption = L"Thiết lập cnc-ddraw"; + DisplayBtn->Caption = L"Cài Đặt Hình Ảnh"; + AdvancedBtn->Caption = L"Cài Đặt Nâng Cao"; + HotkeyBtn->Caption = L"Cài Đặt Phím Tắt"; + CompatibilityBtn->Caption = L"Cài Đặt Tương Thích"; + RestoreDefaultsBtn->Caption = L"Khôi phục cài đặt gốc"; + PresentationLbl->Caption = L"Chế Độ Hiển Thị"; + MaintasLbl->Caption = L"Giữ nguyên tỉ lệ khung hình"; + VsyncLbl->Caption = L"Bật VSync"; + AdjmouseLbl->Caption = L"Điều chỉnh độ nhạy của chuột"; + DevmodeLbl->Caption = L"Khóa con trỏ vào cửa sổ / màn hình"; + RendererLbl->Caption = L"Trình kết xuất"; + BorderLbl->Caption = L"Hiển thị thanh tiêu đề trong chế độ cửa sổ"; + SavesettingsLbl->Caption = L"Ghi nhớ vị trí kích thước và cửa sổ"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Giới hạn tốc độ khung hình"; + BoxingLbl->Caption = L"Bật windowboxing / chia tỷ lệ theo số nguyên"; + ToggleWindowedLbl->Caption = L"Bật/tắt chế độ cửa sổ"; + MaximizeWindowLbl->Caption = L"Phóng to cửa sổ"; + UnlockCursor1Lbl->Caption = L"Mở khóa con trỏ 1"; + UnlockCursor2Lbl->Caption = L"Mở khóa con trỏ 2"; + ScreenshotLbl->Caption = L"Chụp màn hình"; + MaxgameticksLbl->Caption = L"Giới hạn tốc độ trò chơi"; + NoactivateappLbl->Caption = L"Sửa lỗi Alt+Tab"; + ResolutionsLbl->Caption = L"Mở khóa thêm độ phân giải màn hình"; + MinfpsLbl->Caption = L"Khắc phục hiện tượng giật hình khi sử dụng Freesync/G-Sync"; + SinglecpuLbl->Caption = L"Khắc phục các vấn đề về hiệu năng và âm thanh kém"; + NonexclusiveLbl->Caption = L"Sửa lỗi các video / phần tử UI không hiển thị"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Tự Động", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Toàn Màn Hình", NULL); + PresentationCbx->AddItem(L"Toàn Màn Hình Nâng Cao Độ Phân Giải", NULL); + PresentationCbx->AddItem(L"Toàn Màn Hình Không Viền", NULL); + PresentationCbx->AddItem(L"Cửa Sổ", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Không giới hạn", NULL); + MaxgameticksCbx->AddItem(L"Đồng bộ hóa với tần số quét màn hình", NULL); + MaxgameticksCbx->AddItem(L"Mô phỏng màn hình với tần số quét 60Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"500 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"250 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"125 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"60 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"30 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"25 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"15 ticks mỗi giây", NULL); + + System::UnicodeString shaderHint = + L"Một số shader chỉ hoạt động khi bật chế độ nâng cao độ phân giải. \n\n"; + + System::UnicodeString upscaleHint = + L"Phải bật chế độ nâng cao độ phân giải để cài đặt này hoạt động. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Để bật chế độ nâng cao độ phân giải, hãy đặt chế độ hiển thị của bạn\n" + "thành 'Toàn Màn Hình Không Viền' hoặc 'Toàn Màn Hình Nâng Cao Độ Phân Giải'.\n" + "Đối với chế độ 'Cửa Sổ', bạn phải thay đổi kích thước hoặc phóng to cửa sổ."; + + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; + } else { IsEnglish = true; @@ -737,6 +818,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_VIETNAMESE) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_VN"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } diff --git a/config/Resources/VN.png b/config/Resources/VN.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7cd48a3468a511e27c49a69194b0ef5564e615 GIT binary patch literal 474 zcmV<00VV#4P)@|4`Xj5kLT%B_22*h{r-RE_y1qN|Ns8=|JN^|IHRmA&<212VgZ}|A4N4# z+WpUe-rxU^{Q|504bi~x`!`SnKmf4-F(Xhl(8fQ1fG+vp^85d{-~aW0|NsB{f9tRR zg1`PJA~XO^2M8drlm7gLxRT-bpa1p0|1bLmQVm3Azy5pw{{IQ;B%q-{(*XjA3FM@| zf53hMJK)W)|CK-uK=ku}!>|93eu7kk5yVLV0R(o^Z;+)RSAk6exg_KF|98LtFaPy_ z#c#OrKtum9FaQJ)NCPuC$bbfbRI>n`@$3IHusZAC|2cmD|MKhqAD{+Mr~sV<5I`Ue zOuzpyNJ@f@0s0=KlTj9AB*>SXe;D}wK*A7+fQkVEi190GMB<5K2mlB$03I1qT8uIj Q5C8xG07*qoM6N<$f}XY6qW}N^ literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index dbd448c..155df07 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -203,6 +203,10 @@ RCDATA PngImage_US + + RCDATA + PngImage_VN + Base @@ -296,14 +300,74 @@ + + + cnc-ddraw_config.exe + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + 1 diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 4c3dd33..a69e541 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -11,7 +11,6 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- - #define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index a2ed1e5..9d29fa1 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -6,3 +6,4 @@ PngImage_HU RCDATA "Resources\\hu.png" PngImage_IT RCDATA "Resources\\IT.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" +PngImage_VN RCDATA "Resources\\VN.png" diff --git a/src/config.c b/src/config.c index bd71fb7..afcca44 100644 --- a/src/config.c +++ b/src/config.c @@ -347,7 +347,7 @@ static void cfg_create_ini() "; The following settings are for cnc-ddraw config.exe\n" "\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese\n" "configlang=auto\n" "\n" "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" From 5abd9452570e5fd3b437e58a6f70b43e125f39a9 Mon Sep 17 00:00:00 2001 From: Kappa971 <62349018+Kappa971@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:31:27 +0200 Subject: [PATCH 1172/1724] Update Italian translation --- config/ConfigFormUnit.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 749c7e0..f2b5aca 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -670,15 +670,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); System::UnicodeString shaderHint = - L"Alcuni shader funzionano solo quando l'upscaling è abilitato. \n\n"; + L"Alcuni shader funzionano solo quando il ridimensionamento dell'immagine è abilitato. \n\n"; System::UnicodeString upscaleHint = - L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; + L"Affinché questa impostazione funzioni, è necessario abilitare il ridimensionamento dell'immagine. \n\n"; System::UnicodeString enableUpscaleHint = - L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" - "o 'Schermo Intero Ridimensionato'. Per la presentazione 'In Finestra', \n" - "è necessario ridimensionare o ingrandire la finestra."; + L"Per abilitare il ridimensionamento dell'immagine, imposta la modalità di presentazione \n" + "su 'Senza Bordi o 'Schermo Intero Ridimensionato'. Per la modalità 'In Finestra', \n" + "è necessario ridimensionare o ingrandire la finestra manualmente."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From d0ba1de8b63c958fb7033ce915b5b45735c06b06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 05:35:36 +0200 Subject: [PATCH 1173/1724] update to c++ builder 12 --- config/cnc-ddraw config.cbproj | 207 ++++++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 1 deletion(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 155df07..b2de346 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -1,7 +1,7 @@  {E020D5C7-AE07-4DB9-9688-6D289E9FFF1A} - 19.5 + 20.1 VCL Application cnc-ddraw config.cpp @@ -10,6 +10,7 @@ Win32 1 c + cnc-ddraw config true @@ -24,6 +25,11 @@ Base true + + true + Base + true + true Base @@ -41,6 +47,12 @@ true true + + true + Cfg_1 + true + true + true Base @@ -58,6 +70,12 @@ true true + + true + Cfg_2 + true + true + JPHNE true @@ -101,6 +119,14 @@ 1033 $(BDS)\bin\default_app.manifest + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + false true @@ -141,6 +167,9 @@ PerMonitorV2 + + PerMonitorV2 + NDEBUG;$(Defines) None @@ -161,6 +190,9 @@ PerMonitorV2 + + PerMonitorV2 + 0 @@ -269,6 +301,16 @@ true + + + true + + + + + true + + true @@ -286,6 +328,16 @@ true + + + true + + + + + true + + @@ -298,6 +350,16 @@ true + + + true + + + + + true + + @@ -458,6 +520,16 @@ 1 + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + res\values @@ -478,6 +550,66 @@ 1 + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + res\values @@ -488,6 +620,16 @@ 1 + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + res\drawable @@ -658,6 +800,56 @@ 1 + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + 1 @@ -898,6 +1090,9 @@ 1 + + 1 + @@ -968,6 +1163,10 @@ Assets 1 + + Assets + 1 + @@ -978,6 +1177,10 @@ Assets 1 + + Assets + 1 + @@ -1191,10 +1394,12 @@ + True False + False 12 From 4fd2f9830194a84653ed5a78235c8fdd31db8a6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:22:50 +0200 Subject: [PATCH 1174/1724] only create opengl core context once --- src/render_ogl.c | 55 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index a348ed6..fa58df3 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -41,6 +41,44 @@ BOOL ogl_create() g_ogl.hwnd = g_ddraw.hwnd; g_ogl.hdc = g_ddraw.render.hdc; + GLenum err = GL_NO_ERROR; + BOOL made_current = FALSE; + + for (int i = 0; i < 5; i++) + { + if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) + break; + + Sleep(50); + } + + if (made_current && (err = glGetError()) == GL_NO_ERROR) + { + GL_CHECK(oglu_init()); + + TRACE("+--OpenGL-----------------------------------------\n"); + TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); + TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + TRACE("+------------------------------------------------\n"); + + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); + } + else + { + TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); + ogl_check_error("xwglMakeCurrent()"); + } + + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } + return TRUE; } @@ -69,15 +107,6 @@ DWORD WINAPI ogl_render_main(void) { GL_CHECK(oglu_init()); - TRACE("+--OpenGL-----------------------------------------\n"); - TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); - TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - TRACE("+------------------------------------------------\n"); - - GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); - BOOL got_swap_ctrl; GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); @@ -108,7 +137,13 @@ DWORD WINAPI ogl_render_main(void) ogl_check_error("xwglMakeCurrent()"); } - xwglMakeCurrent(NULL, NULL); + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } if (!g_ogl.use_opengl) { From 663743b49ffd69d3333731af0e9f18649cc4dc3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:55:05 +0200 Subject: [PATCH 1175/1724] make sure we don't get a random GL_INVALID_FRAMEBUFFER_OPERATION during test --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index fa58df3..4220a00 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1567,6 +1567,8 @@ static BOOL ogl_shader_test() glBindFramebuffer(GL_FRAMEBUFFER, 0); } + while (glGetError() != GL_NO_ERROR); + HeapFree(GetProcessHeap(), 0, surface_tex); return result; } From b50ff36ffc95c888b7acbeaa21c5e8a9f6d6a76a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:57:38 +0200 Subject: [PATCH 1176/1724] only check texture if no error --- src/render_ogl.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4220a00..5f47428 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -120,9 +120,11 @@ DWORD WINAPI ogl_render_main(void) GL_CHECK(ogl_init_shader1_program()); GL_CHECK(ogl_init_shader2_program()); + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test()); GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test()); g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; GL_CHECK(ogl_render()); @@ -1546,13 +1548,16 @@ static BOOL ogl_shader_test() glBindTexture(GL_TEXTURE_2D, fbo_tex_id); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); - int i; - for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) + if (glGetError() == GL_NO_ERROR) { - if (surface_tex[i] != 0x80808080) + int i; + for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) { - result = FALSE; - break; + if (surface_tex[i] != 0x80808080) + { + result = FALSE; + break; + } } } } From ec63d7fbe0c99d9a33dca55f670a1b8644d62ac5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 04:25:01 +0200 Subject: [PATCH 1177/1724] create experimental releases --- .github/workflows/build.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f553ba7..648427b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,6 +69,8 @@ jobs: - name: Prepare artifact run: | : + + mkdir -p cnc-ddraw-experimental if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then mkdir -p cnc-ddraw-release @@ -80,6 +82,8 @@ jobs: mkdir -p cnc-ddraw-releasexp cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/*" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then @@ -94,6 +98,8 @@ jobs: cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-debuglog.zip" "./cnc-ddraw-debuglogxp/*" fi if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then @@ -139,3 +145,13 @@ jobs: name: cnc-ddraw-debuglogminixp path: cnc-ddraw-debuglogminixp retention-days: 14 + + - name: Release experimental + uses: softprops/action-gh-release@v1 + with: + prerelease: true + name: experimental + tag_name: experimental + files: cnc-ddraw-experimental/* + fail_on_unmatched_files: true + draft: true \ No newline at end of file From d19d9aac23763ee63683539d5c8384546ff5f371 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 04:30:30 +0200 Subject: [PATCH 1178/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index a9eb822..e087ffd 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 64f01ec06ea1a808ee4ae78a6da53bc2c5d3579a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 05:56:08 +0200 Subject: [PATCH 1179/1724] #342 add preset for WarCraft 2000: Nuclear Epidemic --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index afcca44..30a959d 100644 --- a/src/config.c +++ b/src/config.c @@ -1476,6 +1476,12 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; WarCraft 2000: Nuclear Epidemic\n" + "[war2000]\n" + "resolutions=2\n" + "guard_lines=300\n" + "minfps=-2\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" From 94ed631c6e76c6f8d779a923d0ab9f947559d569 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 05:56:43 +0200 Subject: [PATCH 1180/1724] fix for last commit --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 30a959d..b183d56 100644 --- a/src/config.c +++ b/src/config.c @@ -1479,7 +1479,7 @@ static void cfg_create_ini() "; WarCraft 2000: Nuclear Epidemic\n" "[war2000]\n" "resolutions=2\n" - "guard_lines=300\n" + "guard_lines=600\n" "minfps=-2\n" "\n" "; Wizardry 8\n" From adc7934c67a2a5e79700729b4e47527d05a4e2ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 06:35:42 +0200 Subject: [PATCH 1181/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50bcddc..b50befa 100644 --- a/README.md +++ b/README.md @@ -346,6 +346,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Virtua Fighter PC - War Wind - War Wind II - Human Onslaught +- WarCraft 2000: Nuclear Epidemic - Warcraft 2 - Warlords 3: Darklords Rising - Warlords Battlecry From d71118454eef8d7a4a268579515059cc18585568 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 7 Aug 2024 04:20:21 +0200 Subject: [PATCH 1182/1724] improve logs --- src/directinput.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 4c29144..358374b 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -75,7 +75,16 @@ static HRESULT WINAPI fake_did_GetDeviceData( LPDWORD pdwInOut, DWORD dwFlags) { - //TRACE("DirectInput GetDeviceData [%p]\n", _ReturnAddress()); + /* + TRACE( + "DirectInput GetDeviceData(This=%p, cbObjectData=%lu, rgdod=%p, pdwInOut=%p, dwFlags=%lu) [%p]\n", + This, + cbObjectData, + rgdod, + pdwInOut, + dwFlags, + _ReturnAddress()); + */ HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); @@ -97,7 +106,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) { - //TRACE("DirectInput GetDeviceState [%p]\n", _ReturnAddress()); + //TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress()); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); From 30ae9630fba0a3532a1135959980e345dc3088be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Aug 2024 02:19:24 +0200 Subject: [PATCH 1183/1724] save pdb file for experimental release --- .github/workflows/build.yml | 3 ++- action.yml | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 648427b..0738790 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,7 +83,8 @@ jobs: cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/*" + cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.dll" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then diff --git a/action.yml b/action.yml index 86b657c..ca39872 100644 --- a/action.yml +++ b/action.yml @@ -46,10 +46,16 @@ outputs: release: description: 'Full path to ddraw.dll built with Release configuration' value: ${{ steps.build-release.outputs.ddraw-dll }} + release-pdb: + description: 'Full path to ddraw.pdb built with Release configuration' + value: ${{ steps.build-release.outputs.ddraw-pdb }} releasexp: description: 'Full path to ddraw.dll built with ReleaseXP configuration' value: ${{ steps.build-releasexp.outputs.ddraw-dll }} + releasexp-pdb: + description: 'Full path to ddraw.pdb built with ReleaseXP configuration' + value: ${{ steps.build-releasexp.outputs.ddraw-pdb }} debug: description: 'Full path to ddraw.dll built with Debug configuration' @@ -119,6 +125,7 @@ runs: "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi @@ -137,6 +144,7 @@ runs: "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi From 423ca1d5a3666c3d13a66cefdce06b738e688488 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Aug 2024 09:24:21 +0200 Subject: [PATCH 1184/1724] add IsAndroid function to versionhelpers header --- inc/versionhelpers.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 3aa5742..490f8fd 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -220,4 +220,12 @@ VERSIONHELPERAPI IsLinux(void) { return sysname && _strcmpi(sysname, "Linux") == 0; } +VERSIONHELPERAPI IsAndroid(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return release && strstr(release, "android") == 0; +} + #endif From d7d12e520feadc4f053990368b6f19c3e58b7eb0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Aug 2024 09:26:38 +0200 Subject: [PATCH 1185/1724] fix for last commit --- inc/versionhelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 490f8fd..0746d39 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -225,7 +225,7 @@ VERSIONHELPERAPI IsAndroid(void) { const char* release = NULL; verhelp_wine_get_host_version(&sysname, &release); - return release && strstr(release, "android") == 0; + return release && strstr(release, "android") != NULL; } #endif From b1c74f1628e6e7b7b7405ed653552342ae2b1f87 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 03:28:12 +0200 Subject: [PATCH 1186/1724] remove allow_wmactivate setting --- inc/config.h | 1 - src/config.c | 8 -------- src/wndproc.c | 19 +++++++++++++++---- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/inc/config.h b/inc/config.h index 3a33eaf..c111c6b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -65,7 +65,6 @@ typedef struct CNCDDRAWCONFIG int guard_lines; int max_resolutions; BOOL lock_surfaces; - BOOL allow_wmactivate; BOOL flipclear; BOOL fixmousehook; BOOL rgb555; diff --git a/src/config.c b/src/config.c index b183d56..6223d28 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); - GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -302,7 +301,6 @@ static void cfg_create_ini() "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" - "allow_wmactivate=false\n" "flipclear=false\n" "fixmousehook=false\n" "rgb555=false\n" @@ -368,7 +366,6 @@ static void cfg_create_ini() "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" - "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" "[BM]\n" @@ -473,10 +470,6 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" - "; Barbie(R) Photo Designer\n" - "[pdcam]\n" - "allow_wmactivate=true\n" - "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" @@ -535,7 +528,6 @@ static void cfg_create_ini() "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" - "allow_wmactivate=true\n" "renderer=gdi\n" "adjmouse=false\n" "width=0\n" diff --git a/src/wndproc.c b/src/wndproc.c index ebde744..d0e32ee 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -557,13 +557,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_ACTIVATE: { - if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE) + if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) { if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - if (wParam == WA_INACTIVE) + if (LOWORD(wParam) == WA_INACTIVE) { if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) { @@ -600,10 +600,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - //if (g_ddraw.windowed || g_ddraw.noactivateapp) + if (g_config.windowed || g_config.noactivateapp) + { + /* let it pass through once (Atrox) */ + static BOOL one_time; + + if (!one_time) + { + one_time = TRUE; + + if (LOWORD(wParam)) + break; + } - if (!g_config.allow_wmactivate) return 0; + } break; } From 6f540a960339d81fb40dfcda2779c6fbf9a8a7fb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:07:15 +0200 Subject: [PATCH 1187/1724] disable Vsync checkbox in case we are in borderelss or windowed mode to avoid unnecessary input lag --- config/ConfigFormUnit.cpp | 34 ++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 10 ---------- config/ConfigFormUnit.h | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f2b5aca..1d49427 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -1197,6 +1198,11 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) delete ini; + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + Initialized = true; } @@ -1618,8 +1624,31 @@ bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValu return s == "true" || s == "yes" || s == "1"; } +bool TConfigForm::VsyncAllowed() +{ + if (GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) { + return true; + } + + if (!IsWindows8OrGreater()) { + return true; + } + + if (NonexclusiveChk->State == tssOff && + (PresentationCbx->ItemIndex == 0 || PresentationCbx->ItemIndex == 1)) { + return true; + } + + return false; +} + void __fastcall TConfigForm::PresentationCbxChange(TObject *Sender) { + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + SaveSettings(); } @@ -1728,6 +1757,11 @@ void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) { + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + SaveSettings(); } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 6ed9761..a34dc9f 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2696,8 +2696,6 @@ object ConfigForm: TConfigForm ShowCaption = False TabOrder = 1 StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 DesignSize = ( 499 465) @@ -2885,7 +2883,6 @@ object ConfigForm: TConfigForm TabOrder = 5 StyleElements = [seFont, seBorder] OnClick = ThemePnlClick - ExplicitLeft = 471 end end object CompatibilityPnl: TPanel @@ -2901,8 +2898,6 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3083,8 +3078,6 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3309,8 +3302,6 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3538,7 +3529,6 @@ object ConfigForm: TConfigForm Color = clMenu ParentBackground = False TabOrder = 0 - ExplicitHeight = 467 DesignSize = ( 233 468) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8a8a14c..7eda35e 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,6 +118,7 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); + bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From 7454684654d0472f7c376e5d591c075cd80befc9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:08:55 +0200 Subject: [PATCH 1188/1724] align --- config/ConfigFormUnit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 7eda35e..8a46bf8 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,7 +118,7 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); - bool VsyncAllowed(); + bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From afb0fe75208ed6fc0ea7c1333395b4828d59a08c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:15:30 +0200 Subject: [PATCH 1189/1724] fix translation --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1d49427..4a0f97d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -306,7 +306,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; ShaderLbl->Caption = L"OpenGL Shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; - BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. + BoxingLbl->Caption = L"Windowboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; MaximizeWindowLbl->Caption = L"Fenster maximieren"; UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; From 5df1b00c6db5f8c6cfa5083e67d63b9ab9b75ebc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 06:14:05 +0200 Subject: [PATCH 1190/1724] add workaround for stretch blt's --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d20215b..7679807 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -239,7 +239,7 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - if (This->bpp != src_surface->bpp) + if (This->bpp != src_surface->bpp || (is_stretch_blt && This == src_surface)) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); From 555cf5de28d477fff70184e81962eb6efca3d9ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 08:33:08 +0200 Subject: [PATCH 1191/1724] fix typo --- inc/dd.h | 2 +- src/ddsurface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index a0bd368..9ba1bf5 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -49,7 +49,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_AUTO 0 #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 -#define LIMIT_UNLCK 3 +#define LIMIT_UNLOCK 3 #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 diff --git a/src/ddsurface.c b/src/ddsurface.c index 7679807..9dfe0c7 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1200,7 +1200,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (g_ddraw.ticks_limiter.tick_length > 0 && - (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLCK)) + (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK)) { util_limit_game_ticks(); } From 2aada45a6cf5c2470a694b0adfed990aa4f99465 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 08:58:00 +0200 Subject: [PATCH 1192/1724] adjust makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3371861..7a238b2 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,8 @@ ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif -SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) -OBJS := $(SRCS:c=o) res.o +SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc +OBJS := $(addsuffix .o, $(basename $(SRCS))) .PHONY: clean all all: $(TARGET) From f15cac18242860eebba86f60e65884f393b6d547 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 10:44:06 +0200 Subject: [PATCH 1193/1724] testing ddraw.ini gen --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0738790..cf74fdd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,8 +83,10 @@ jobs: cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + rundll32.exe ./cnc-ddraw-releasexp/ddraw.dll, DDIsWindowed + cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.dll" + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.*" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then From e0b7d26856e009427411c675a8f6a6244b04af20 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:45:05 +0200 Subject: [PATCH 1194/1724] add option to allow upscaling via shader2 must insert "-noscale" into filename to activate --- src/render_ogl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 5f47428..c618a33 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -259,7 +259,9 @@ static void ogl_build_programs() { g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); - if (g_ogl.shader1_program && strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL) + if (g_ogl.shader1_program && + (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || + strstr(g_config.shader, "-noscale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From 04c59441656a62e56104c4a1a4d6c57bedd73ca0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:48:10 +0200 Subject: [PATCH 1195/1724] use -shader2scale instead of -noscale in filenames --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index c618a33..e23d589 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -261,7 +261,7 @@ static void ogl_build_programs() if (g_ogl.shader1_program && (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "-noscale") != NULL)) + strstr(g_config.shader, "-shader2scale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From e23a0ce1d5cc93a35237ea6884bbcf1f10f5df14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:57:26 +0200 Subject: [PATCH 1196/1724] rename once more --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index e23d589..8be7c55 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -261,7 +261,7 @@ static void ogl_build_programs() if (g_ogl.shader1_program && (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "-shader2scale") != NULL)) + strstr(g_config.shader, "-pass1scale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From c7e4b81ad71562a4f3f91bdcf4b414a6afa89829 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 10:16:20 +0200 Subject: [PATCH 1197/1724] add experimental aspect_ratio setting (hidden for now) --- inc/config.h | 1 + src/config.c | 4 ++++ src/dd.c | 20 ++++++++++++++++++-- src/utils.c | 16 +++++++++++++++- src/wndproc.c | 26 +++++++++++++++++++++----- 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index c111c6b..5f132d7 100644 --- a/inc/config.h +++ b/inc/config.h @@ -29,6 +29,7 @@ typedef struct CNCDDRAWCONFIG BOOL windowed; BOOL maintas; BOOL boxing; + char aspect_ratio[16]; int maxfps; BOOL vsync; BOOL adjmouse; diff --git a/src/config.c b/src/config.c index 6223d28..3a28766 100644 --- a/src/config.c +++ b/src/config.c @@ -39,6 +39,7 @@ void cfg_load() GET_BOOL(g_config.windowed, "windowed", FALSE); GET_BOOL(g_config.maintas, "maintas", FALSE); GET_BOOL(g_config.boxing, "boxing", FALSE); + GET_STRING("aspect_ratio", "", g_config.aspect_ratio, sizeof(g_config.aspect_ratio)); GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); @@ -120,6 +121,9 @@ void cfg_load() if (g_config.lock_mouse_top_left) g_config.adjmouse = FALSE; + if (g_config.aspect_ratio[0]) + g_config.maintas = TRUE; + ini_free(&g_config.ini); } diff --git a/src/dd.c b/src/dd.c index 819a0fd..7d25dd0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -581,6 +581,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!dwHeight) dwHeight = g_ddraw.height ? g_ddraw.height : 600; + //if (dwHeight == 400) dwHeight = 480; + if (!dwBPP) dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; @@ -859,8 +861,22 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - double dst_ar = (double)g_ddraw.height / g_ddraw.width; - double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width; + double dst_ar; + double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width;; + + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + dst_ar = (double)cy / cx; + } + else + { + dst_ar = (double)g_ddraw.height / g_ddraw.width; + } g_ddraw.render.viewport.width = g_ddraw.render.width; g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); diff --git a/src/utils.c b/src/utils.c index 16bdd37..a24da1a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -622,9 +622,23 @@ void util_toggle_maximize() int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; - double dst_ar = (double)g_ddraw.height / g_ddraw.width; + double dst_ar; double src_ar = (double)h / w; + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + dst_ar = (double)cy / cx; + } + else + { + dst_ar = (double)g_ddraw.height / g_ddraw.width; + } + dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; diff --git a/src/wndproc.c b/src/wndproc.c index d0e32ee..9fa4e4a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -317,8 +317,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - double scaleH = (double)g_ddraw.height / g_ddraw.width; - double scaleW = (double)g_ddraw.width / g_ddraw.height; + double scale_h; + double scale_w; + + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + scale_h = (double)cy / cx; + scale_w = (double)cx / cy; + } + else + { + scale_h = (double)g_ddraw.height / g_ddraw.width; + scale_w = (double)g_ddraw.width / g_ddraw.height; + } switch (wParam) { @@ -327,19 +343,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)round(scale_h * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)round(scale_w * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)round(scale_h * clientrc.right - clientrc.bottom); break; } } From 79feefac26cc5517144e86ef59ac1c58ee8c80c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 10:19:28 +0200 Subject: [PATCH 1198/1724] remove test code --- src/dd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 7d25dd0..0da10a2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -581,8 +581,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!dwHeight) dwHeight = g_ddraw.height ? g_ddraw.height : 600; - //if (dwHeight == 400) dwHeight = 480; - if (!dwBPP) dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; From f49f09895b5e4e55bb8f8b1cd107086315e923f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:06:02 +0200 Subject: [PATCH 1199/1724] save and restore dc state --- inc/IDirectDrawSurface.h | 1 + src/dd.c | 2 +- src/ddsurface.c | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index e339450..f04e03a 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -38,6 +38,7 @@ typedef struct IDirectDrawSurfaceImpl PBITMAPINFO bmi; HBITMAP bitmap; HDC hdc; + int dc_state; DDCOLORKEY color_key; DWORD last_flip_tick; DWORD last_blt_tick; diff --git a/src/dd.c b/src/dd.c index 0da10a2..24625b1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1283,7 +1283,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { hook_init(); - g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + //g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); if (!g_ddraw.render.hdc) diff --git a/src/ddsurface.c b/src/ddsurface.c index 9dfe0c7..29df8a4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -914,6 +914,8 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; + InterlockedExchange(&This->dc_state, SaveDC(dc)); + return DD_OK; } @@ -1024,6 +1026,8 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) } } + RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); + return DD_OK; } From 35bc19f7313413f546fadb458ab542c474323eff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:10:34 +0200 Subject: [PATCH 1200/1724] add preset for Lapis --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index b50befa..7c033a6 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures diff --git a/src/config.c b/src/config.c index 3a28766..3be22d4 100644 --- a/src/config.c +++ b/src/config.c @@ -1024,6 +1024,10 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Lapis (lapis.mgame.com)\n" + "[Lapis]\n" + "hook_peekmessage=true\n" + "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" From b40fcdd14ed5117b3cec8c62fa18931fab333a14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:30:52 +0200 Subject: [PATCH 1201/1724] update lapis preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 3be22d4..fba9b20 100644 --- a/src/config.c +++ b/src/config.c @@ -1027,6 +1027,8 @@ static void cfg_create_ini() "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" "hook_peekmessage=true\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" From 9f12b35dc84531b58138cfdffd2e57c4f761c7a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:55:54 +0200 Subject: [PATCH 1202/1724] revert debug change --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 24625b1..0da10a2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1283,7 +1283,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { hook_init(); - //g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); if (!g_ddraw.render.hdc) From 1ce5acd05d3c93966531016b7e2f1773df958c60 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:58:52 +0200 Subject: [PATCH 1203/1724] update lapis preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index fba9b20..f6baa6b 100644 --- a/src/config.c +++ b/src/config.c @@ -1026,7 +1026,6 @@ static void cfg_create_ini() "\n" "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" - "hook_peekmessage=true\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From aa357c044d616b5cef7cef0192fbc87f49ebfb15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 14:20:13 +0200 Subject: [PATCH 1204/1724] set default size of primary surface to 1024x768 --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 29df8a4..bd28605 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1420,8 +1420,8 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_VISIBLE; - dst_surface->width = g_ddraw.width; - dst_surface->height = g_ddraw.height; + dst_surface->width = g_ddraw.width == 0 ? 1024 : g_ddraw.width; + dst_surface->height = g_ddraw.height == 0 ? 768 : g_ddraw.height; } else { From 33666bbd19e0e1444a3a90fb8d4544b1fc79f2b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 16:50:28 +0200 Subject: [PATCH 1205/1724] try to get at least some windowed games working with zero config --- inc/dd.h | 1 - src/dd.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 9ba1bf5..116d661 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -166,7 +166,6 @@ typedef struct CNCDDRAW int y; } textbox; /* Age Of Empires 2 textbox align */ - struct { BOOL enabled; diff --git a/src/dd.c b/src/dd.c index 0da10a2..444c4db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1427,6 +1427,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) dd_SetDisplayMode(width, height, bpp, 0); } + else if (!g_ddraw.width) + { + RECT rc = { 0 }; + real_GetClientRect(hwnd, &rc); + + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + } } return DD_OK; @@ -1579,10 +1586,30 @@ ULONG dd_Release() DeleteCriticalSection(&g_ddraw.cs); - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - if (g_ddraw.hwnd) + if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); + + /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ + if (g_ddraw.width) + { + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + AdjustWindowRectEx(&rc, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); + + real_SetWindowPos( + g_ddraw.hwnd, + 0, + 0, + 0, + (rc.right - rc.left), + (rc.bottom - rc.top), + SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); + } } memset(&g_ddraw, 0, sizeof(g_ddraw)); From 164365efd33ec4443e05d77b61219c7bdbc677fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Aug 2024 07:51:05 +0200 Subject: [PATCH 1206/1724] add new aspect_ratio to ddraw.ini --- inc/config.h | 2 +- src/config.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 5f132d7..1140fe0 100644 --- a/inc/config.h +++ b/inc/config.h @@ -28,8 +28,8 @@ typedef struct CNCDDRAWCONFIG BOOL fullscreen; BOOL windowed; BOOL maintas; - BOOL boxing; char aspect_ratio[16]; + BOOL boxing; int maxfps; BOOL vsync; BOOL adjmouse; diff --git a/src/config.c b/src/config.c index f6baa6b..e6d4c75 100644 --- a/src/config.c +++ b/src/config.c @@ -38,8 +38,8 @@ void cfg_load() GET_BOOL(g_config.fullscreen, "fullscreen", FALSE); GET_BOOL(g_config.windowed, "windowed", FALSE); GET_BOOL(g_config.maintas, "maintas", FALSE); - GET_BOOL(g_config.boxing, "boxing", FALSE); GET_STRING("aspect_ratio", "", g_config.aspect_ratio, sizeof(g_config.aspect_ratio)); + GET_BOOL(g_config.boxing, "boxing", FALSE); GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); @@ -197,6 +197,9 @@ static void cfg_create_ini() "; Maintain aspect ratio\n" "maintas=false\n" "\n" + "; Use custom aspect ratio - Example values: 4:3, 16:10, 16:9, 21:9\n" + "aspect_ratio=\n" + "\n" "; Windowboxing / Integer Scaling\n" "boxing=false\n" "\n" From 5ca3319e7a6a1adfc69d38502379ef232a78bef8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Aug 2024 15:30:07 +0200 Subject: [PATCH 1207/1724] update some older presets --- src/config.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/config.c b/src/config.c index e6d4c75..ba2992b 100644 --- a/src/config.c +++ b/src/config.c @@ -519,20 +519,14 @@ static void cfg_create_ini() "\n" "; Carmageddon\n" "[CARMA95]\n" - "noactivateapp=true\n" "flipclear=true\n" "carma95_hack=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" - "noactivateapp=true\n" "flipclear=true\n" "carma95_hack=true\n" "\n" - "; Carmageddon 2\n" - "[Carma2_SW]\n" - "noactivateapp=true\n" - "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" "renderer=gdi\n" @@ -962,35 +956,30 @@ static void cfg_create_ini() "[ja2]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2: Unfinished Business\n" "[JA2UB]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jedi Knight Dark Forces 2\n" @@ -1489,7 +1478,6 @@ static void cfg_create_ini() "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Worms 2\n" From af8a81b61821cdba2bfaed6473b8bc755ddc9735 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 06:03:41 +0200 Subject: [PATCH 1208/1724] Force redraw for GDI games --- src/render_d3d9.c | 8 ++++++++ src/render_ogl.c | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c8e911e..4a0d22f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -682,6 +682,14 @@ DWORD WINAPI d3d9_render_main(void) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); Sleep(50); } + else + { + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + } if (!g_ddraw.render.run) break; diff --git a/src/render_ogl.c b/src/render_ogl.c index 8be7c55..2975428 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1293,6 +1293,12 @@ static void ogl_render() SwapBuffers(g_ogl.hdc); + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + if (!g_ddraw.render.run) break; From 79b1812e5a3441ab2db250f40ee467c798cb21c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 07:34:54 +0200 Subject: [PATCH 1209/1724] hide msctls_statusbar32 --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index a24da1a..cdd64ba 100644 --- a/src/utils.c +++ b/src/utils.c @@ -861,6 +861,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || From 52b63d3d47f57f2c1f7eee5e0933b7b9188abf3e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 07:37:43 +0200 Subject: [PATCH 1210/1724] add preset for Callus 95 --- README.md | 1 + src/config.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 7c033a6..55c3326 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Blue's 123 Time Activities - Blue's Treasure Hunt - Caesar III (Sierra - 1998) +- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Call To Power 2 - Capitalism II - Capitalism Lab diff --git a/src/config.c b/src/config.c index ba2992b..3c3caf9 100644 --- a/src/config.c +++ b/src/config.c @@ -517,6 +517,16 @@ static void cfg_create_ini() "[ArtTime]\n" "renderer=gdi\n" "\n" + "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" + "[CALLUS95]\n" + "nonexclusive=true\n" + "devmode=true\n" + "\n" + "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" + "[CALLUS95p]\n" + "nonexclusive=true\n" + "devmode=true\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "flipclear=true\n" From 3efd6fc6ba91afda7af71d2bc1d47b39e562687e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 13:09:31 +0200 Subject: [PATCH 1211/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index e087ffd..58d6edb 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From a6adda6ace74e920fb99ddcdf9ab137335167204 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 13:13:25 +0200 Subject: [PATCH 1212/1724] add commented out test code --- src/winapi_hooks.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b856f0e..cc40985 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -819,6 +819,11 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV lpDevMode->dmDisplayFrequency = 60; } + if (result && !lpszDeviceName && lpDevMode && iModeNum != ENUM_CURRENT_SETTINGS) + { + //lpDevMode->dmBitsPerPel = 16; + } + return result; } From efb524ee4d3a63eda27541fbe0d48a7ee19fd02d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 14:23:29 +0200 Subject: [PATCH 1213/1724] add new optionm to fixchild= ini setting --- inc/dd.h | 2 +- src/config.c | 2 +- src/render_d3d9.c | 1 - src/render_gdi.c | 1 - src/render_ogl.c | 1 - src/utils.c | 5 +++-- src/wndproc.c | 21 --------------------- 7 files changed, 5 insertions(+), 28 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 116d661..750825d 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -32,6 +32,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define FIX_CHILDS_DETECT 1 #define FIX_CHILDS_DETECT_PAINT 2 #define FIX_CHILDS_DETECT_HIDE 3 +#define FIX_CHILDS_DETECT_HIDE_NOSCALE 4 #define RESLIST_NORMAL 0 #define RESLIST_MINI 1 @@ -150,7 +151,6 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; - HWND video_window_hwnd; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; diff --git a/src/config.c b/src/config.c index 3c3caf9..85f9dac 100644 --- a/src/config.c +++ b/src/config.c @@ -291,7 +291,7 @@ static void cfg_create_ini() "; Note: Set this to 1 if the game is crashing on startup\n" "resolutions=0\n" "\n" - "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide\n" + "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide, 4 = Display top left + hide\n" "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 4a0d22f..5c5bdeb 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -634,7 +634,6 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) diff --git a/src/render_gdi.c b/src/render_gdi.c index 390fc56..f4e5746 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -85,7 +85,6 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); } diff --git a/src/render_ogl.c b/src/render_ogl.c index 2975428..6584f80 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1034,7 +1034,6 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) diff --git a/src/utils.c b/src/utils.c index cdd64ba..110e55a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -861,6 +861,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE || strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || @@ -869,9 +870,9 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "MCIWndClass") == 0 || strcmp(class_name, "AVI Window") == 0) { - if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) + if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE) { - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); + g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; } if (!(exstyle & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 9fa4e4a..a12c2c5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -830,13 +830,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } case WM_KEYUP: @@ -847,13 +840,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw.primary); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } /* button up messages reactivate cursor lock */ @@ -945,13 +931,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam = MAKELPARAM(x, y); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } case WM_PARENTNOTIFY: From d1802eb4c51605ce6fa7b6d033d70590abde1e89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 14:26:26 +0200 Subject: [PATCH 1214/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 58d6edb..4451471 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 815e9f045b9d02cd065957f1d73eec1b684fcd9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Aug 2024 11:40:17 +0200 Subject: [PATCH 1215/1724] fix warning --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bd28605..25d8693 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -914,7 +914,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; - InterlockedExchange(&This->dc_state, SaveDC(dc)); + InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); return DD_OK; } From 2faed7325bf5b4af557a7c5042b9e19fcd0793ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 09:55:27 +0200 Subject: [PATCH 1216/1724] update HoMM 4 preset --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 85f9dac..3c8edab 100644 --- a/src/config.c +++ b/src/config.c @@ -94,6 +94,7 @@ void cfg_load() GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); /* Hotkeys */ @@ -104,8 +105,6 @@ void cfg_load() GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); /* Game specific settings */ - - GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); /* Added for HoMM4 */ GET_BOOL(g_config.armadahack, "armadahack", FALSE); GET_BOOL(g_config.tshack, "tshack", FALSE); @@ -925,6 +924,7 @@ static void cfg_create_ini() "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" + "remove_menu=true\n" "homm_hack=true\n" "\n" "; Hard Truck: Road to Victory\n" From 35f27746d1358f6e8c420d0ece1ef3c8af95bd1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 09:56:07 +0200 Subject: [PATCH 1217/1724] add remove_menu setting to ini template --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 3c8edab..bab62eb 100644 --- a/src/config.c +++ b/src/config.c @@ -322,6 +322,7 @@ static void cfg_create_ini() "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" "no_compat_warning=false\n" + "remove_menu=false\n" "\n" "\n" "\n" From 4078fdf9194d60425ca9e44f41c749138af19b3b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 10:44:54 +0200 Subject: [PATCH 1218/1724] use Alt+Backspace hokey combo for windowed toggle in Moorhuhn --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index bab62eb..db0a8c8 100644 --- a/src/config.c +++ b/src/config.c @@ -1112,6 +1112,10 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" + "; Moorhuhn\n" + "[Moorhuhn]\n" + "keytogglefullscreen=0x08\n" + "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "releasealt=true\n" From c838496b203335495aa3a7853e7b0a0775943888 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 11:01:48 +0200 Subject: [PATCH 1219/1724] update age of wonders presets --- src/config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index db0a8c8..ca7630c 100644 --- a/src/config.c +++ b/src/config.c @@ -420,13 +420,13 @@ static void cfg_create_ini() "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders 2\n" "[AoW2Compat]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders 2 Config Tool\n" @@ -436,13 +436,13 @@ static void cfg_create_ini() "; Age of Wonders: Shadow Magic\n" "[AoWSM]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders: Shadow Magic\n" "[AoWSMCompat]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders: Shadow Magic Config Tool\n" From 05685bffaec9ab4749dbff920f9cddfd8f3f807b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 11:09:49 +0200 Subject: [PATCH 1220/1724] always disable menu in fullscreen mode (keep it for borderelss only) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 444c4db..3449703 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1069,7 +1069,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (GetMenu(g_ddraw.hwnd)) { - if (g_config.remove_menu || !g_config.nonexclusive) + if (1) // g_config.remove_menu || !g_config.nonexclusive) { SetMenu(g_ddraw.hwnd, NULL); } From 5259dc153b167f1cb4e17952659c9eb3a6c17a02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 12:14:20 +0200 Subject: [PATCH 1221/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 4451471..ba3bff4 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 7 +#define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 36d1cf31aba45ccf2884a1f9d89d1ad5733795ca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 16:13:11 +0200 Subject: [PATCH 1222/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 55c3326..5ee1859 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Commandos - Commandos - Beyond The Call Of Duty - Commandos 2 +- Constructor - Corsairs Gold - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland From aa381cae814be095e3b26a1af65d51165945a43e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:52:17 +0200 Subject: [PATCH 1223/1724] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5ee1859..9015bd5 100644 --- a/README.md +++ b/README.md @@ -222,6 +222,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Mech Warrior 3 - Megaman X4 - Metal Gear Solid +- Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon From d0618c60a38d8c96c5d35f292d5502a9d6e4e815 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:52:32 +0200 Subject: [PATCH 1224/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ba3bff4..33a42f0 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From f903230ed5ebbe95f416166fdf795511ea928e94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:54:06 +0200 Subject: [PATCH 1225/1724] update callus 95 preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index ca7630c..862734d 100644 --- a/src/config.c +++ b/src/config.c @@ -519,11 +519,13 @@ static void cfg_create_ini() "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" + "windowed=true\n" "nonexclusive=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" + "windowed=true\n" "nonexclusive=true\n" "devmode=true\n" "\n" From 848b084655339df1161f56d0b89c19097d0ae0fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:56:49 +0200 Subject: [PATCH 1226/1724] update callus 95 preset --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 862734d..e090326 100644 --- a/src/config.c +++ b/src/config.c @@ -520,13 +520,13 @@ static void cfg_create_ini() "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" "windowed=true\n" - "nonexclusive=true\n" + "toggle_borderless=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" "windowed=true\n" - "nonexclusive=true\n" + "toggle_borderless=true\n" "devmode=true\n" "\n" "; Carmageddon\n" From 826cb5c4d5601331f9a029ada35abe8899dbf115 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 08:37:13 +0200 Subject: [PATCH 1227/1724] fix bmp screenshots --- src/ddsurface.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 25d8693..ae7be83 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1463,10 +1463,8 @@ HRESULT dd_CreateSurface( WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - if (clr_bits < 24) - { - dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits); - } + dst_surface->bmi->bmiHeader.biClrUsed = + dst_surface->bmi->bmiHeader.biCompression == BI_BITFIELDS ? 3 : (1 << clr_bits); dst_surface->bmi->bmiHeader.biSizeImage = ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; From 073709dc3a9a06eafa51ef3a24022ccc7890f2cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 08:53:08 +0200 Subject: [PATCH 1228/1724] update presets --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index e090326..8ff034e 100644 --- a/src/config.c +++ b/src/config.c @@ -519,12 +519,14 @@ static void cfg_create_ini() "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" + "game_handles_close=true\n" "windowed=true\n" "toggle_borderless=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" + "game_handles_close=true\n" "windowed=true\n" "toggle_borderless=true\n" "devmode=true\n" From 57d5a9cda3de0c8be579067e23afbccb8bcd6240 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:07:57 +0200 Subject: [PATCH 1229/1724] add fallout 2 workaround for window not showing up in taskbar sometimes --- src/winapi_hooks.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cc40985..02da8dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1602,6 +1602,14 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } + /* Fallout 2 */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && + _strcmpi(lpWindowName, "FALLOUT II") == 0) + { + /* Workaround for window not showing up in taskbar sometimes */ + dwExStyle |= WS_EX_APPWINDOW; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From cde053f218866a510761db9da7844e161b5b3a2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:16:56 +0200 Subject: [PATCH 1230/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 33a42f0..d2250e3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ab3aac113e57e089369475c680be00b430959dd5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:22:59 +0200 Subject: [PATCH 1231/1724] add comment --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 02da8dd..3bd5f3d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1646,6 +1646,7 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_VISIBLE; } + /* Battle.net */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd) { if (!g_ddraw.bnet_active) From 40ed99631129a0d26b3e602666892c2217fbd812 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 14:42:33 +0200 Subject: [PATCH 1232/1724] disable wayland detection for SteamDeck Not needed because the deck does automatically enabled gamescope and therefore games will not glitch --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3449703..080bbea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,7 +1163,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (IsWine() && + if (IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0) && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { From 136b5b30c596ed1374226e464203da448bd02782 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 14:50:03 +0200 Subject: [PATCH 1233/1724] add new IsSteamDeck function to versionhelpers --- inc/versionhelpers.h | 4 ++++ src/dd.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 0746d39..e8359ae 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -228,4 +228,8 @@ VERSIONHELPERAPI IsAndroid(void) { return release && strstr(release, "android") != NULL; } +VERSIONHELPERAPI IsSteamDeck(void) { + return IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0); +} + #endif diff --git a/src/dd.c b/src/dd.c index 080bbea..a875f92 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,7 +1163,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0) && + if (IsWine() && !IsSteamDeck() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { From a1d8559322ad317b0e9ff8c454cb352b85b0674a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 17:31:43 +0200 Subject: [PATCH 1234/1724] fix for last commit --- inc/versionhelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index e8359ae..8a59f74 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -229,7 +229,7 @@ VERSIONHELPERAPI IsAndroid(void) { } VERSIONHELPERAPI IsSteamDeck(void) { - return IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0); + return IsWine() && GetEnvironmentVariable("STEAMDECK", NULL, 0); } #endif From a0ec16ba4d16222aec03a3e8579343a5aeb9b3f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 09:07:50 +0200 Subject: [PATCH 1235/1724] add preset for constructor --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 8ff034e..30c6dae 100644 --- a/src/config.c +++ b/src/config.c @@ -696,6 +696,10 @@ static void cfg_create_ini() "[comandos_w10]\n" "maxgameticks=-1\n" "\n" + "; Constructor\n" + "[Game_W95]\n" + "noactivateapp=true\n" + "\n" "; Caesar III\n" "[c3]\n" "nonexclusive=true\n" From e6c5c4ede2f5e77d15d23fa2c64d41bd7a1023b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 12:26:12 +0200 Subject: [PATCH 1236/1724] enable workaround for fallout 1 as well --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3bd5f3d..40a4c96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1602,9 +1602,9 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } - /* Fallout 2 */ + /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && - _strcmpi(lpWindowName, "FALLOUT II") == 0) + strstr(lpWindowName, "FALLOUT")) { /* Workaround for window not showing up in taskbar sometimes */ dwExStyle |= WS_EX_APPWINDOW; From 283295a5c960e741cd4fbcb72b8fc0816deb0adb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 19:12:15 +0200 Subject: [PATCH 1237/1724] add DDSCL_FULLSCREEN check --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index a875f92..199d833 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1415,7 +1415,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } - if (dwFlags & DDSCL_NORMAL) + if ((dwFlags & DDSCL_NORMAL) && !(dwFlags & DDSCL_FULLSCREEN)) { if (g_config.fake_mode[0]) { From bdb249058a4a9dc92546c36dc9ccf4ae1ceb462a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Aug 2024 08:57:11 +0200 Subject: [PATCH 1238/1724] fix ddsCaps --- src/dd.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 199d833..36fc77d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -448,7 +448,18 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) lpDDDriverCaps->dwVidMemTotal = 16777216; lpDDDriverCaps->dwVidMemFree = 16777216; - lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP; + + lpDDDriverCaps->ddsCaps.dwCaps = + DDSCAPS_BACKBUFFER | + DDSCAPS_COMPLEX | + DDSCAPS_FLIP | + DDSCAPS_FRONTBUFFER | + DDSCAPS_OFFSCREENPLAIN | + DDSCAPS_PRIMARYSURFACE | + DDSCAPS_VIDEOMEMORY | + DDSCAPS_OWNDC | + DDSCAPS_LOCALVIDMEM | + DDSCAPS_NONLOCALVIDMEM; } if (lpDDEmulCaps) From dffed469478a8af89d784ced4766f2de5462270e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 08:36:46 +0200 Subject: [PATCH 1239/1724] Ignore errors from glGetString --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 6584f80..61d9d3f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -63,6 +63,8 @@ BOOL ogl_create() TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); + while (glGetError() != GL_NO_ERROR); /* Ignore errors from glGetString */ + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); } else From efd5bc6c323a39cbf9605c00edfc2d0082bd40c4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 09:19:32 +0200 Subject: [PATCH 1240/1724] use glGetStringi if available (fixes errors on core profile) --- inc/opengl_utils.h | 2 ++ src/opengl_utils.c | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index 63d2a73..4449951 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -108,6 +108,8 @@ extern PFNGLDRAWBUFFERSPROC glDrawBuffers; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLTEXBUFFERPROC glTexBuffer; +extern PFNGLGETINTEGERVPROC glGetIntegerv; +extern PFNGLGETSTRINGIPROC glGetStringi; extern HMODULE g_oglu_hmodule; extern BOOL g_oglu_got_version2; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 9e63d8a..8222f10 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -88,6 +88,8 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; PFNGLTEXBUFFERPROC glTexBuffer; +PFNGLGETINTEGERVPROC glGetIntegerv; +PFNGLGETSTRINGIPROC glGetStringi; HMODULE g_oglu_hmodule; BOOL g_oglu_got_version2; @@ -192,6 +194,8 @@ void oglu_init() wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB"); glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer"); + glGetIntegerv = (PFNGLGETINTEGERVPROC)xwglGetProcAddress("glGetIntegerv"); + glGetStringi = (PFNGLGETSTRINGIPROC)xwglGetProcAddress("glGetStringi"); char* glversion = (char*)glGetString(GL_VERSION); if (glversion) @@ -227,11 +231,24 @@ void oglu_init() BOOL oglu_ext_exists(char* ext, HDC hdc) { - char* glext = (char*)glGetString(GL_EXTENSIONS); - - if (glext) + if (glGetIntegerv && glGetStringi) { - if (strstr(glext, ext)) + GLint n = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &n); + + for (GLint i = 0; i < n; i++) + { + char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + + if (glext && strcmp(glext, ext) == 0) + return TRUE; + } + } + else + { + char* glext = (char*)glGetString(GL_EXTENSIONS); + + if (glext && strstr(glext, ext)) return TRUE; } From e79e076f0aca69d5717e50249c9992b55f6f1628 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 09:25:15 +0200 Subject: [PATCH 1241/1724] only ignore errors in debug build --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 61d9d3f..be0793e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -63,7 +63,9 @@ BOOL ogl_create() TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); +#ifdef _DEBUG while (glGetError() != GL_NO_ERROR); /* Ignore errors from glGetString */ +#endif GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); } From 0884be514d6ff40876df9ffdae862d56ea082ad4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 10:24:00 +0200 Subject: [PATCH 1242/1724] handle cases where DDSD_WIDTH and DDSD_HEIGHT passed to dd_EnumDisplayModes --- src/dd.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 36fc77d..b64c320 100644 --- a/src/dd.c +++ b/src/dd.c @@ -27,6 +27,7 @@ HRESULT dd_EnumDisplayModes( { dbg_dump_edm_flags(dwFlags); + DDSURFACEDESC2 s = { 0 }; DWORD bpp_filter = 0; if (lpDDSurfaceDesc) @@ -46,12 +47,48 @@ HRESULT dd_EnumDisplayModes( bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount; break; } + + if ((lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) && (lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT)) + { + TRACE(" dwWidth=%u, dwHeight=%u\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight); + + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwRefreshRate = 60; + s.dwHeight = lpDDSurfaceDesc->dwHeight; + s.dwWidth = lpDDSurfaceDesc->dwWidth; + + s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 8; + + if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 16) + { + s.ddpfPixelFormat.dwFlags = DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 16; + s.ddpfPixelFormat.dwRBitMask = 0xF800; + s.ddpfPixelFormat.dwGBitMask = 0x07E0; + s.ddpfPixelFormat.dwBBitMask = 0x001F; + } + else if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 32) + { + s.ddpfPixelFormat.dwFlags = DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 32; + s.ddpfPixelFormat.dwRBitMask = 0xFF0000; + s.ddpfPixelFormat.dwGBitMask = 0x00FF00; + s.ddpfPixelFormat.dwBBitMask = 0x0000FF; + } + + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; + + lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext); + return DD_OK; + } } } DWORD i = 0; DWORD res_count = 0; - DDSURFACEDESC2 s; /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ From 996e051edaf7968d5172999e98371068cc434064 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 15:27:23 +0200 Subject: [PATCH 1243/1724] update supported games --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9015bd5..cc6f69c 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https   ### Supported Games +- Addiction Pinball - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors From a8dfbff1f2b69641aa9acc4feda0552812a20d4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 15:27:42 +0200 Subject: [PATCH 1244/1724] add preset for Jeopardy! --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 30c6dae..2b449e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,10 @@ static void cfg_create_ini() "[JK]\n" "direct3d_passthrough=true\n" "\n" + "; Jeopardy! - NOT WORKING YET\n" + "[jeoppc]\n" + "singlecpu=false\n" + "\n" "; Kings Quest 8\n" "[Mask]\n" "renderer=opengl\n" From 8fe9a9370caca7e93e935795032b22d1b76ef434 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Aug 2024 11:41:31 +0200 Subject: [PATCH 1245/1724] tweak fake output of GetVerticalBlankStatus --- inc/dd.h | 10 +++++----- src/dd.c | 29 +++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 750825d..9ee8049 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -15,15 +15,15 @@ typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnk ULONG dd_AddRef(); ULONG dd_Release(); HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback); -HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); -HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); -HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); -HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps); HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); -HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); +HRESULT dd_RestoreDisplayMode(); +HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); +HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); +HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); +HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_TestCooperativeLevel(); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); diff --git a/src/dd.c b/src/dd.c index b64c320..1be2ec9 100644 --- a/src/dd.c +++ b/src/dd.c @@ -587,6 +587,27 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) return DD_OK; } +HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) +{ + if (!lpbIsInVB) + return DDERR_INVALIDPARAMS; + + static DWORD last_vb; + DWORD tick = GetTickCount(); + + if (last_vb + 16 > tick) + { + *lpbIsInVB = FALSE; + } + else + { + last_vb = tick; + *lpbIsInVB = TRUE; + } + + return DD_OK; +} + HRESULT dd_RestoreDisplayMode() { if (!g_ddraw.render.run) @@ -1685,14 +1706,6 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd return DD_OK; } -HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) -{ - if (lpbIsInVB) - *lpbIsInVB = TRUE; - - return DD_OK; -} - HRESULT dd_TestCooperativeLevel() { if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) From 9d31f76d3e0f4e631b2603933380dd030d4dd827 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Aug 2024 17:24:21 +0200 Subject: [PATCH 1246/1724] add presets --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 2b449e5..aa7b8fc 100644 --- a/src/config.c +++ b/src/config.c @@ -910,6 +910,10 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Hades Challenge\n" + "[HADESCH]\n" + "no_compat_warning=true\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" @@ -1167,6 +1171,10 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Paddle Bash Hotshot\n" + "[SPAGHSPaddle]\n" + "no_compat_warning=true\n" + "\n" "; Pajama Sam's Games to Play on Any Day\n" "[PJGAMES]\n" "renderer=gdi\n" From c7fe0b614bd4f263681522076af28d0ff095c4bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 08:28:59 +0200 Subject: [PATCH 1247/1724] fix STATUS_INVALID_CRUNTIME_PARAMETER crash with debug build --- src/debug.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index c9b5d1f..764bb50 100644 --- a/src/debug.c +++ b/src/debug.c @@ -104,7 +104,10 @@ void dbg_init() remove("cnc-ddraw-3.log"); g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); - setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); + if (g_dbg_log_file) + { + setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); + } TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); From 25ef20e7113c8a9826d48aacea8789855fe81dda Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 09:04:22 +0200 Subject: [PATCH 1248/1724] always create log files next to game exe --- src/debug.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/debug.c b/src/debug.c index 764bb50..9c53e72 100644 --- a/src/debug.c +++ b/src/debug.c @@ -18,6 +18,11 @@ LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; static FILE* g_dbg_log_file; +static char g_dbg_log_path1[MAX_PATH] = "cnc-ddraw-1.log"; +static char g_dbg_log_path2[MAX_PATH] = "cnc-ddraw-2.log"; +static char g_dbg_log_path3[MAX_PATH] = "cnc-ddraw-3.log"; +static char g_dbg_dmp_path1[MAX_PATH] = "cnc-ddraw-1.dmp"; +static char g_dbg_dmp_path2[MAX_PATH] = "cnc-ddraw-2.dmp"; static BOOL g_dbg_log_rotate; #ifdef _DEBUG @@ -27,12 +32,9 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; - char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_dbg_crash_count == 1 ? 1 : 2); - HANDLE dmp = CreateFile( - filename, + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, @@ -96,14 +98,32 @@ void dbg_init() { once = TRUE; - remove("cnc-ddraw-1.dmp"); - remove("cnc-ddraw-2.dmp"); + char exe_path[MAX_PATH] = { 0 }; + if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) + { + char drive[MAX_PATH] = { 0 }; + char dir[MAX_PATH] = { 0 }; + _splitpath(exe_path, drive, dir, NULL, NULL); - remove("cnc-ddraw-1.log"); - remove("cnc-ddraw-2.log"); - remove("cnc-ddraw-3.log"); + char game_path[MAX_PATH] = { 0 }; + _makepath(game_path, drive, dir, NULL, NULL); - g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); + _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.dmp"); + _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.dmp"); + + _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.log"); + _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.log"); + _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%s%s", game_path, "cnc-ddraw-3.log"); + } + + remove(g_dbg_dmp_path1); + remove(g_dbg_dmp_path2); + + remove(g_dbg_log_path1); + remove(g_dbg_log_path2); + remove(g_dbg_log_path3); + + g_dbg_log_file = fopen(g_dbg_log_path1, "w"); if (g_dbg_log_file) { setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); @@ -187,12 +207,15 @@ void dbg_printf(const char* fmt, ...) if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ { - char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_dbg_log_rotate ? 3 : 2); + g_dbg_log_file = + freopen( + g_dbg_log_rotate ? g_dbg_log_path3 : g_dbg_log_path2, + "w", + g_dbg_log_file); g_dbg_log_rotate = !g_dbg_log_rotate; - if ((g_dbg_log_file = freopen(filename, "w", g_dbg_log_file))) + if (g_dbg_log_file) { setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } From fc99383f2149ee3d446c2d015a5ad02cde337165 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 10:25:38 +0200 Subject: [PATCH 1249/1724] lie about SIZEPALETTE and NUMCOLORS in GetDeviceCaps --- src/winapi_hooks.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 40a4c96..86e95b2 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -856,13 +856,18 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { return g_ddraw.bpp; } - - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - index == RASTERCAPS && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + + if (g_ddraw.ref && g_ddraw.bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - return RC_PALETTE | real_GetDeviceCaps(hdc, index); + if (index == RASTERCAPS) + { + return RC_PALETTE | real_GetDeviceCaps(hdc, index); + } + + if (index == SIZEPALETTE || index == NUMCOLORS) + { + return 256; + } } return real_GetDeviceCaps(hdc, index); From 9565b2b50f326a8351808d83ea3919529200105f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 11:55:43 +0200 Subject: [PATCH 1250/1724] make sure we return proper resolution list when using windowed hack --- inc/dd.h | 1 + src/dd.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 9ee8049..fe8a902 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -158,6 +158,7 @@ typedef struct CNCDDRAW DWORD minfps_tick_len; DWORD gui_thread_id; BOOL show_driver_warning; + BOOL windowed_hack; struct { diff --git a/src/dd.c b/src/dd.c index 1be2ec9..fb3adf0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -161,7 +161,8 @@ HRESULT dd_EnumDisplayModes( } } - if ((g_ddraw.bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) + if (((g_ddraw.bpp && !g_ddraw.windowed_hack) && g_config.resolutions == RESLIST_NORMAL) || + g_config.resolutions == RESLIST_FULL) { TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); @@ -1498,12 +1499,18 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (!g_ddraw.width) { + g_ddraw.windowed_hack = TRUE; + RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } + else + { + g_ddraw.windowed_hack = FALSE; + } return DD_OK; } From e44b04956fae966391042fcb93d7f0c58d2019e1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:06:21 +0200 Subject: [PATCH 1251/1724] add preset for Axis & Allies --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index aa7b8fc..5ca4e59 100644 --- a/src/config.c +++ b/src/config.c @@ -477,6 +477,11 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" + "; Axis & Allies\n" + "[AxisAllies]\n" + "hook_peekmessage=true\n" + "maxgameticks=60\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" From 18f6b1e5ea2806fccf1f57a2b308c8f63c6c4af9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:10:50 +0200 Subject: [PATCH 1252/1724] add preset for Play with the Teletubbies --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 5ca4e59..2a6053c 100644 --- a/src/config.c +++ b/src/config.c @@ -1269,6 +1269,10 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" + "; Play with the Teletubbies\n" + "[PlayWTT]\n" + "hook=3\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From f64913b5e650f520a900713b929a1ae018a5e1e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:37:06 +0200 Subject: [PATCH 1253/1724] fix for windowed_hack --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index fb3adf0..a4a3e3a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -339,7 +339,7 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL) + if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL || g_ddraw.windowed_hack) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { From 1b0c518759e127838503eabbdb7dd934f80c9be6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:44:55 +0200 Subject: [PATCH 1254/1724] add preset for Girl Talk --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 2a6053c..a9e854b 100644 --- a/src/config.c +++ b/src/config.c @@ -903,6 +903,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Girl Talk\n" + "[GirlTalk]\n" + "resolutions=2\n" + "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" From 6ad443cfb19d799969f8c30c45dea424a443bad2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 16:02:32 +0200 Subject: [PATCH 1255/1724] uncomment ReleaseCapture call to prevent cursor issues in windowed mode --- src/dd.c | 5 +---- src/mouse.c | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index a4a3e3a..7887f07 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1378,10 +1378,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_config.devmode) { - HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); - - if (cursor != LoadCursor(NULL, IDC_WAIT)) - InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)cursor); + InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)real_SetCursor(LoadCursor(NULL, IDC_ARROW))); } int cursor_count = real_ShowCursor(TRUE) - 1; diff --git a/src/mouse.c b/src/mouse.c index c5b25eb..46aca13 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -63,7 +63,7 @@ void mouse_unlock() g_mouse_locked = FALSE; real_ClipCursor(NULL); - //ReleaseCapture(); + ReleaseCapture(); RECT rc = { 0 }; real_GetClientRect(g_ddraw.hwnd, &rc); From 00bb6254a0d5b0ad61817210b3b744d8d4c7be8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 07:35:31 +0200 Subject: [PATCH 1256/1724] Force access violation in debug build to produce a dmp file for debugging (disables watson) --- src/hook.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/hook.c b/src/hook.c index c9641f4..2889fdd 100644 --- a/src/hook.c +++ b/src/hook.c @@ -8,6 +8,7 @@ #include "dllmain.h" #include "config.h" #include "utils.h" +#include "patch.h" #include "versionhelpers.h" #ifdef _MSC_VER @@ -655,6 +656,12 @@ void hook_init() DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); + + if (!IsDebuggerPresent()) + { + /* Force access violation to produce a dmp file for debugging (disables watson) */ + PATCH_SET((void*)_invoke_watson, "\xC6\x05\x00\x00\x00\x00\x00"); + } } #endif From 1bdc2dc2b2b9490190d38be9c383fb3cd8bc6103 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 08:09:51 +0200 Subject: [PATCH 1257/1724] hook _invoke_watson --- inc/debug.h | 7 +++++++ src/debug.c | 22 ++++++++++++++++++++++ src/hook.c | 3 +-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 72efcf1..058e27a 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,6 +28,13 @@ void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_mes_to_str(int id); +__declspec(noreturn) void __cdecl dbg_invoke_watson( + _In_opt_z_ wchar_t const*, + _In_opt_z_ wchar_t const*, + _In_opt_z_ wchar_t const*, + _In_ unsigned int, + _In_ uintptr_t); + extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; diff --git a/src/debug.c b/src/debug.c index 9c53e72..0e2c90e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -88,6 +88,28 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) return EXCEPTION_EXECUTE_HANDLER; } + +__declspec(noreturn) void __cdecl dbg_invoke_watson( + wchar_t const* const expression, + wchar_t const* const function_name, + wchar_t const* const file_name, + unsigned int const line_number, + uintptr_t const reserved +) +{ + UNREFERENCED_PARAMETER(expression); + UNREFERENCED_PARAMETER(function_name); + UNREFERENCED_PARAMETER(file_name); + UNREFERENCED_PARAMETER(line_number); + UNREFERENCED_PARAMETER(reserved); + + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + /* Force access violation to produce a dmp file for debugging */ + *(int*)0 = 0; + + TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); +} #endif void dbg_init() diff --git a/src/hook.c b/src/hook.c index 2889fdd..378b4a0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -659,8 +659,7 @@ void hook_init() if (!IsDebuggerPresent()) { - /* Force access violation to produce a dmp file for debugging (disables watson) */ - PATCH_SET((void*)_invoke_watson, "\xC6\x05\x00\x00\x00\x00\x00"); + patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson); } } #endif From cbcbad0be4ae7bf31060d4998d603b2b2fc0b97d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 09:36:51 +0200 Subject: [PATCH 1258/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d2250e3..eeeaa0a 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 004951a9409d64862309be351e085c613ec4a2a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 10:11:37 +0200 Subject: [PATCH 1259/1724] ignore 0 GUID --- src/IDirectDraw/IDirectDraw.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index ee6c653..c104800 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -128,6 +128,12 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; */ } + else if (((GUID*)riid)->Data1 == 0 && ((GUID*)riid)->Data2 == 0 && ((GUID*)riid)->Data3 == 0) + { + TRACE("NOT_IMPLEMENTED GUID = 0 0 0\n"); + + ret = E_NOINTERFACE; + } else { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); From 248b62a3320742724599081a785b3502634d5fb5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 11:12:39 +0200 Subject: [PATCH 1260/1724] add NULL checks to QueryInterface --- src/IDirectDraw/IDirectDraw.c | 6 +++++- src/IDirectDraw/IDirectDrawClipper.c | 6 ++++++ src/IDirectDraw/IDirectDrawGammaControl.c | 6 ++++++ src/IDirectDraw/IDirectDrawPalette.c | 6 ++++++ src/IDirectDraw/IDirectDrawSurface.c | 6 +++++- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index c104800..7bff5f0 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -18,7 +18,11 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid HRESULT ret = E_NOINTERFACE; - if (riid) + if (!ppvObj) + { + ret = E_INVALIDARG; + } + else if (riid) { if (IsEqualGUID(&IID_IDirectDraw2, riid) || IsEqualGUID(&IID_IDirectDraw4, riid) || diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 86b8a2f..6270c09 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -14,6 +14,12 @@ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* Thi _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 65f61fa..d0bd36a 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -13,6 +13,12 @@ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaContro _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index a5429ea..0a6334a 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -15,6 +15,12 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* Thi _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 8984571..3eec3e6 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -11,7 +11,11 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = S_OK; - if (riid) + if (!ppvObj) + { + ret = E_INVALIDARG; + } + else if (riid) { if (IsEqualGUID(&IID_IDirectDrawSurface, riid) || IsEqualGUID(&IID_IDirectDrawSurface2, riid) || From 7a8db6c18994244b6bb681e5adc5bc6fd1890add Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 11:23:48 +0200 Subject: [PATCH 1261/1724] keep artifact's for 90 days --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf74fdd..ed50b00 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,35 +119,30 @@ jobs: with: name: cnc-ddraw-release path: cnc-ddraw-release - retention-days: 14 - name: Upload artifacts cnc-ddraw-releasexp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-releasexp path: cnc-ddraw-releasexp - retention-days: 14 - name: Upload artifacts cnc-ddraw-debug uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debug path: cnc-ddraw-debug - retention-days: 14 - name: Upload artifacts cnc-ddraw-debuglogxp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debuglogxp path: cnc-ddraw-debuglogxp - retention-days: 14 - name: Upload artifacts cnc-ddraw-debuglogminixp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debuglogminixp path: cnc-ddraw-debuglogminixp - retention-days: 14 - name: Release experimental uses: softprops/action-gh-release@v1 From b5eea287d561f2c576e4a3dad36a16e6930b3792 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 13:22:29 +0200 Subject: [PATCH 1262/1724] add git commit hash to file version and log --- .gitignore | 2 ++ cnc-ddraw.vcxproj | 30 ++++++++++++++++++++++++++++++ inc/version.h | 1 + res.rc | 12 ++++++++++-- src/debug.c | 16 +++++++++++++++- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 158b71e..1bffb6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +inc/version_tmp.h + # C++ Builder __astcache/ diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index fda7e42..498532a 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -230,6 +230,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -257,6 +263,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -284,6 +296,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -311,6 +329,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -338,6 +362,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + diff --git a/inc/version.h b/inc/version.h index eeeaa0a..9fef507 100644 --- a/inc/version.h +++ b/inc/version.h @@ -3,6 +3,7 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) +#define git_str(a) str(a) #define VERSION_MAJOR 6 #define VERSION_MINOR 8 diff --git a/res.rc b/res.rc index 69ba76c..9c361ce 100644 --- a/res.rc +++ b/res.rc @@ -1,5 +1,13 @@ #include "inc/version.h" +#ifndef __GNUC__ +#include "inc/version_tmp.h" +#endif + +#ifndef GIT_COMMIT +#define GIT_COMMIT UNKNOWN +#endif + 1 VERSIONINFO FILEVERSION VERSION PRODUCTVERSION VERSION @@ -10,13 +18,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING + VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING + VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index 0e2c90e..b21bf11 100644 --- a/src/debug.c +++ b/src/debug.c @@ -10,6 +10,14 @@ #include "version.h" #include "versionhelpers.h" +#ifndef __GNUC__ +#include "version_tmp.h" +#endif + +#ifndef GIT_COMMIT +#define GIT_COMMIT UNKNOWN +#endif + double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; @@ -151,7 +159,13 @@ void dbg_init() setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } - TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + TRACE( + "cnc-ddraw version = %d.%d.%d.%d (git~%s)\n", + VERSION_MAJOR, + VERSION_MINOR, + VERSION_BUILD, + VERSION_REVISION, + git_str(GIT_COMMIT)); HKEY hkey; LONG status = From 67e4c664f6e99d8d6ae9486ccc7d9465507ee4dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 13:27:09 +0200 Subject: [PATCH 1263/1724] fix for last commit --- cnc-ddraw.vcxproj | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 498532a..bd3ef90 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -231,10 +231,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -264,10 +266,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -297,10 +301,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -330,10 +336,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -363,10 +371,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + From f3ba703444278a30c8cec495e2ff7cf7691fb553 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 14:09:35 +0200 Subject: [PATCH 1264/1724] add git commit hash to mingw build as well --- Makefile | 2 ++ build.cmd | 2 +- res.rc | 6 ------ src/debug.c | 9 +-------- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 7a238b2..626761a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ -include config.mk TARGET = ddraw.dll +GIT_REV := $(shell git rev-parse --short @{0} || echo "UNKNOWN") +GIT_FILE := $(shell echo "#define GIT_COMMIT" $(GIT_REV) > inc/version_tmp.h) LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 diff --git a/build.cmd b/build.cmd index c9d3564..7613fd2 100644 --- a/build.cmd +++ b/build.cmd @@ -2,7 +2,7 @@ REM REM patch environment config REM -set PATH=C:\w64devkit\bin +set PATH=C:\w64devkit\bin;C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ make clean make REM make DEBUG=1 diff --git a/res.rc b/res.rc index 9c361ce..9bf5f3d 100644 --- a/res.rc +++ b/res.rc @@ -1,12 +1,6 @@ #include "inc/version.h" - -#ifndef __GNUC__ #include "inc/version_tmp.h" -#endif -#ifndef GIT_COMMIT -#define GIT_COMMIT UNKNOWN -#endif 1 VERSIONINFO FILEVERSION VERSION diff --git a/src/debug.c b/src/debug.c index b21bf11..27304cb 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,15 +8,8 @@ #include "debug.h" #include "hook.h" #include "version.h" -#include "versionhelpers.h" - -#ifndef __GNUC__ #include "version_tmp.h" -#endif - -#ifndef GIT_COMMIT -#define GIT_COMMIT UNKNOWN -#endif +#include "versionhelpers.h" double g_dbg_frame_time = 0; From 8e01f4e8851ebac5fe6cbcd0fd23311b334923ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 15:23:45 +0200 Subject: [PATCH 1265/1724] fix git path on VS 2019 --- cnc-ddraw.vcxproj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index bd3ef90..36a4677 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,8 +232,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -267,8 +267,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -302,8 +302,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -337,8 +337,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -372,8 +372,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 From 7c85e9c494cb2bdb4acb7db0d7503c919b714421 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 17:00:53 +0200 Subject: [PATCH 1266/1724] add preset for Thomas & Friends --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index a9e854b..79d6e62 100644 --- a/src/config.c +++ b/src/config.c @@ -1476,6 +1476,11 @@ static void cfg_create_ini() "noactivateapp=true\n" "limiter_type=2\n" "\n" + "; Thomas & Friends - The Great Festival Adventure\n" + "[Thomas]\n" + "no_compat_warning=true\n" + "noactivateapp=true\n" + "\n" "; RollerCoaster Tycoon\n" "[rct]\n" "no_dinput_hook=true\n" From 0f2a367c3641750512f78eb31123ec81a09d5e2a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 09:40:46 +0200 Subject: [PATCH 1267/1724] add git branch to logs --- Makefile | 7 +++-- cnc-ddraw.vcxproj | 65 +++++++++++++++++++++++++++++++++++++++-------- res.rc | 4 +-- src/debug.c | 5 ++-- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 626761a..35ef6e3 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,15 @@ -include config.mk TARGET = ddraw.dll -GIT_REV := $(shell git rev-parse --short @{0} || echo "UNKNOWN") -GIT_FILE := $(shell echo "#define GIT_COMMIT" $(GIT_REV) > inc/version_tmp.h) LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 +REV := $(shell git rev-parse --short HEAD || echo "UNKNOWN") +BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") +EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) +EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) + CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 36a4677..0658bb2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,8 +232,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -267,8 +276,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -302,8 +320,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -337,8 +364,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -372,8 +408,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 diff --git a/res.rc b/res.rc index 9bf5f3d..aefa936 100644 --- a/res.rc +++ b/res.rc @@ -12,13 +12,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" + VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" + VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index 27304cb..ac0990e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -153,12 +153,13 @@ void dbg_init() } TRACE( - "cnc-ddraw version = %d.%d.%d.%d (git~%s)\n", + "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, - git_str(GIT_COMMIT)); + git_str(GIT_COMMIT), + git_str(GIT_BRANCH)); HKEY hkey; LONG status = From c28e1d98dcd90fed76f3ebd90116562677a5185b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 09:47:19 +0200 Subject: [PATCH 1268/1724] make sure we got git dirty status logged as well --- Makefile | 2 +- cnc-ddraw.vcxproj | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 35ef6e3..f6a087c 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -REV := $(shell git rev-parse --short HEAD || echo "UNKNOWN") +REV := $(shell git describe --match=NeVeRmAtCh --always --abbrev=7 --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 0658bb2..21126c2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -239,7 +239,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -283,7 +283,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -327,7 +327,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -371,7 +371,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -415,7 +415,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% From 094d020e05379d1503b0b55f1805cabf6d7bfdb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 12:16:19 +0200 Subject: [PATCH 1269/1724] allow to override bpp via fake_mode --- src/winapi_hooks.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 86e95b2..da7a99c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -849,15 +849,27 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { - if (g_ddraw.ref && - g_ddraw.bpp && - index == BITSPIXEL && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + DWORD bpp = 0; + + if (g_ddraw.ref && g_ddraw.bpp) { - return g_ddraw.bpp; + bpp = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + strtoul(e, &e, 0); + strtoul(e + 1, &e, 0); + bpp = strtoul(e + 1, &e, 0); } - if (g_ddraw.ref && g_ddraw.bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp && index == BITSPIXEL && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + { + return bpp; + } + + if (bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { if (index == RASTERCAPS) { From ccbf60698a8ed50257e62779cb2a057d8bbf5306 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 12:34:36 +0200 Subject: [PATCH 1270/1724] allow to override SM_CXSCREEN and SM_CYSCREEN via fake_mode --- src/winapi_hooks.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index da7a99c..12e6056 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -307,13 +307,29 @@ BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) int WINAPI fake_GetSystemMetrics(int nIndex) { + DWORD width = 0; + DWORD height = 0; + if (g_ddraw.ref && g_ddraw.width) + { + width = g_ddraw.width; + height = g_ddraw.height; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); + } + + if (width) { if (nIndex == SM_CXSCREEN) - return g_ddraw.width; + return width; if (nIndex == SM_CYSCREEN) - return g_ddraw.height; + return height; } return real_GetSystemMetrics(nIndex); From 0e173ef6a859d1b3715a5ed4c0c437a87054aec2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 13:32:03 +0200 Subject: [PATCH 1271/1724] add preset for lego loco --- src/config.c | 12 +++++++++++- src/winapi_hooks.c | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 79d6e62..efe3bd2 100644 --- a/src/config.c +++ b/src/config.c @@ -711,7 +711,8 @@ static void cfg_create_ini() "adjmouse=true\n" "\n" "; Chris Sawyer's Locomotion\n" - "[LOCO]\n" + "[LOCO/2]\n" + "checkfile=.\\LOCO.EXE\n" "adjmouse=true\n" "\n" "; Cultures 2\n" @@ -1057,6 +1058,15 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; LEGO LOCO - NOT WORKING YET\n" + "[LOCO]\n" + "checkfile=.\\LEGO.INI\n" + "fake_mode=1024x768x16\n" + "posX=0\n" + "posY=0\n" + "border=false\n" + "fullscreen=false\n" + "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 12e6056..78e18ff 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1664,6 +1664,26 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Center Lego Loco overlays */ + if (_strcmpi(lpWindowName, "LEGO LOCO") == 0 && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_ddraw.width && + (dwStyle & WS_POPUP)) + { + /* not working currently, game probably moves it with SetWindowPos or MoveWindow afterwards + POINT pt = { 0, 0 }; + real_ClientToScreen(g_ddraw.hwnd, &pt); + + int added_height = g_ddraw.render.height - g_ddraw.height; + int added_width = g_ddraw.render.width - g_ddraw.width; + int align_y = added_height > 0 ? added_height / 2 : 0; + int align_x = added_width > 0 ? added_width / 2 : 0; + + X = pt.x + align_x; + Y = pt.y + align_y; + */ + } + /* Road Rash movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && From d6b2249c78a2e4d80a6585997a55d7252ed5e680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 13:52:36 +0200 Subject: [PATCH 1272/1724] add missing NULL checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78e18ff..1228626 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1637,7 +1637,7 @@ HWND WINAPI fake_CreateWindowExA( /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && - strstr(lpWindowName, "FALLOUT")) + lpWindowName && strstr(lpWindowName, "FALLOUT")) { /* Workaround for window not showing up in taskbar sometimes */ dwExStyle |= WS_EX_APPWINDOW; @@ -1665,7 +1665,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Center Lego Loco overlays */ - if (_strcmpi(lpWindowName, "LEGO LOCO") == 0 && + if (lpWindowName && _strcmpi(lpWindowName, "LEGO LOCO") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && g_ddraw.width && (dwStyle & WS_POPUP)) From 4d5882414c248884d4aeb8d285e2979060443e88 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 07:46:25 +0200 Subject: [PATCH 1273/1724] add batch file for debug builds + some git related tweaks --- Makefile | 4 ++-- build.cmd | 16 +++++++++++----- build_debug.cmd | 15 +++++++++++++++ cnc-ddraw.vcxproj | 10 +++++----- 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 build_debug.cmd diff --git a/Makefile b/Makefile index f6a087c..f87824e 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,9 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -REV := $(shell git describe --match=NeVeRmAtCh --always --abbrev=7 --dirty || echo "UNKNOWN") +COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) +ECOMMIT := $(shell echo "#define GIT_COMMIT" $(COMMIT) > inc/version_tmp.h) EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) CC = i686-w64-mingw32-gcc diff --git a/build.cmd b/build.cmd index 7613fd2..34bb56c 100644 --- a/build.cmd +++ b/build.cmd @@ -1,9 +1,15 @@ @echo off -REM -REM patch environment config -REM -set PATH=C:\w64devkit\bin;C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ + +set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ + +set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% + make clean make -REM make DEBUG=1 + pause diff --git a/build_debug.cmd b/build_debug.cmd new file mode 100644 index 0000000..755ec1f --- /dev/null +++ b/build_debug.cmd @@ -0,0 +1,15 @@ +@echo off + +set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ + +set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% + +make clean +make DEBUG=1 + +pause diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 21126c2..003f82c 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -239,7 +239,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -283,7 +283,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -327,7 +327,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -371,7 +371,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -415,7 +415,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% From 40e30163d18caa5a69c12d33a9fc5ee95a2750a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 10:44:09 +0200 Subject: [PATCH 1274/1724] simplify git code --- .gitignore | 2 +- Makefile | 4 +-- cnc-ddraw.vcxproj | 80 +++++++++++++++++++++++------------------------ res.rc | 6 ++-- src/debug.c | 6 ++-- 5 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index 1bffb6b..46accfc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -inc/version_tmp.h +inc/git.h # C++ Builder diff --git a/Makefile b/Makefile index f87824e..52c5804 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -ECOMMIT := $(shell echo "#define GIT_COMMIT" $(COMMIT) > inc/version_tmp.h) -EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) +ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) +EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 003f82c..e5c5955 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,17 +232,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -276,17 +276,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -320,17 +320,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -364,17 +364,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -408,17 +408,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 diff --git a/res.rc b/res.rc index aefa936..46f3908 100644 --- a/res.rc +++ b/res.rc @@ -1,5 +1,5 @@ #include "inc/version.h" -#include "inc/version_tmp.h" +#include "inc/git.h" 1 VERSIONINFO @@ -12,13 +12,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" + VALUE "FileVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" + VALUE "ProductVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index ac0990e..52f81ad 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,7 +8,7 @@ #include "debug.h" #include "hook.h" #include "version.h" -#include "version_tmp.h" +#include "git.h" #include "versionhelpers.h" @@ -158,8 +158,8 @@ void dbg_init() VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, - git_str(GIT_COMMIT), - git_str(GIT_BRANCH)); + GIT_COMMIT, + GIT_BRANCH); HKEY hkey; LONG status = From e54d1cd4c30003dba737935da930435924f22625 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 10:46:56 +0200 Subject: [PATCH 1275/1724] fix for last commit --- cnc-ddraw.vcxproj | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index e5c5955..8a3f84d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -238,11 +238,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -282,11 +282,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -326,11 +326,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -370,11 +370,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -414,11 +414,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 From 50da3c6a240d1608d0a9ed7b53e61b35f6607ca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:03:39 +0200 Subject: [PATCH 1276/1724] add preset for glover --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index efe3bd2..f6c2c10 100644 --- a/src/config.c +++ b/src/config.c @@ -877,6 +877,10 @@ static void cfg_create_ini() "[Maze]\n" "renderer=gdi\n" "\n" + "; Glover\n" + "[glover]\n" + "singlecpu=false\n" + "\n" "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" From 6620708f6a7945537b3fcff11e14aefb8157ccc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:15:00 +0200 Subject: [PATCH 1277/1724] update glover preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f6c2c10..6e28963 100644 --- a/src/config.c +++ b/src/config.c @@ -879,7 +879,7 @@ static void cfg_create_ini() "\n" "; Glover\n" "[glover]\n" - "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; G-Police\n" "[GPOLICE]\n" From ca7084725043e8d9bf0e88825b893ec44727daba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:25:46 +0200 Subject: [PATCH 1278/1724] add preset for Jungle Storm --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 6e28963..b920c9a 100644 --- a/src/config.c +++ b/src/config.c @@ -924,6 +924,10 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Jungle Storm\n" + "[Jstorm]\n" + "no_compat_warning=true\n" + "\n" "; Hades Challenge\n" "[HADESCH]\n" "no_compat_warning=true\n" From ca8bb5319581c907b8fd0ab66619ceb55bc34226 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:40:39 +0200 Subject: [PATCH 1279/1724] add fixnotresponding to blt as well --- src/ddsurface.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index ae7be83..352a5d2 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,6 +50,12 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); + if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + { + MSG msg; /* workaround for "Not Responding" window problem */ + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + } + if (g_ddraw.ref && g_ddraw.iskkndx && (dwFlags & DDBLT_COLORFILL) && From 4e8253e873930dade8189ea873a5c2c7eabfa3d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:51:57 +0200 Subject: [PATCH 1280/1724] add preset for The Jungle Book Groove Party --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index b920c9a..ac423db 100644 --- a/src/config.c +++ b/src/config.c @@ -1488,6 +1488,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; The Jungle Book Groove Party\n" + "[Jungle_vr]\n" + "fixnotresponding=true\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From aac405031e17f960f0619717058fefcd84d2b04b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 13:09:47 +0200 Subject: [PATCH 1281/1724] add some more checks to fixnotresponding patch --- inc/dd.h | 1 + src/dd.c | 8 ++++++-- src/ddsurface.c | 20 ++++++++++++++++---- src/winapi_hooks.c | 6 ++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fe8a902..e5904bb 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -153,6 +153,7 @@ typedef struct CNCDDRAW BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ + DWORD last_msg_pull_tick; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; DWORD minfps_tick_len; diff --git a/src/dd.c b/src/dd.c index 7887f07..33e8800 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1021,9 +1021,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (!IsWine()) + if (g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + /* workaround for "Not Responding" window problem in cnc games */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } diff --git a/src/ddsurface.c b/src/ddsurface.c index 352a5d2..056c158 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,9 +50,15 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } @@ -988,9 +994,15 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1228626..9b713cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -710,6 +710,9 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) @@ -745,6 +748,9 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) From 649ba3050a67b35b5599c6d24a7036140617b30c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 14:49:11 +0200 Subject: [PATCH 1282/1724] make sure we always got a cliplist --- src/ddclipper.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ddclipper.c b/src/ddclipper.c index eeec712..d1d6ceb 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -3,6 +3,7 @@ #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" +#include "dd.h" HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) @@ -168,6 +169,12 @@ HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) */ This->hwnd = hWnd; + if (hWnd && !This->region && g_ddraw.width) + { + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + ddc_SetClipRect(This, &rc); + } + LeaveCriticalSection(&This->cs); return DD_OK; } From a221c678425f7af8d32448e3bcca629e98e6f8a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:30:24 +0200 Subject: [PATCH 1283/1724] add preset for Disney Trivia Challenge --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ac423db..d58f30e 100644 --- a/src/config.c +++ b/src/config.c @@ -805,6 +805,10 @@ static void cfg_create_ini() "[hellfire]\n" "devmode=true\n" "\n" + "; Disney Trivia Challenge\n" + "[DisneyTr]\n" + "noactivateapp=true\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" From 66a31e22820d927e9dd857ab1573eb3f2844005a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:45:10 +0200 Subject: [PATCH 1284/1724] update bitblt hook --- src/winapi_hooks.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9b713cf..2c3e874 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1027,7 +1027,22 @@ BOOL WINAPI fake_BitBlt( { HWND hwnd = WindowFromDC(hdc); - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "AVI Window") == 0 || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1036,11 +1051,14 @@ BOOL WINAPI fake_BitBlt( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_BitBlt( primary_dc, - x, - y, + x + pt.x, + y + pt.y, cx, cy, hdcSrc, From 056c0750b22b4ca3299fafe229d2d940b4ff67b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:48:18 +0200 Subject: [PATCH 1285/1724] update SetDIBitsToDevice hook --- src/winapi_hooks.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2c3e874..d66c5ce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1120,7 +1120,22 @@ int WINAPI fake_SetDIBitsToDevice( { HWND hwnd = WindowFromDC(hdc); - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "AVI Window") == 0 || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1129,19 +1144,22 @@ int WINAPI fake_SetDIBitsToDevice( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_SetDIBitsToDevice( - primary_dc, - xDest, - yDest, - w, - h, - xSrc, - ySrc, - StartScan, - cLines, - lpvBits, - lpbmi, + primary_dc, + xDest + pt.x, + yDest + pt.y, + w, + h, + xSrc, + ySrc, + StartScan, + cLines, + lpvBits, + lpbmi, ColorUse); dds_ReleaseDC(g_ddraw.primary, primary_dc); From b14b3e1dd80a858ad20c494cb9236eb6badaf904 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:00:57 +0200 Subject: [PATCH 1286/1724] force redraw in GDI renderer too --- src/render_gdi.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/render_gdi.c b/src/render_gdi.c index f4e5746..5ad3586 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -162,6 +162,12 @@ DWORD WINAPI gdi_render_main(void) LeaveCriticalSection(&g_ddraw.cs); + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + if (!g_ddraw.render.run) break; From de86f913cb0b10c27498e3c1167c8d5fcc707f6e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:01:17 +0200 Subject: [PATCH 1287/1724] make Trivia windows transparent --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d66c5ce..cd93961 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1706,6 +1706,13 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Disney Trivia Challenge */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Disney Trivia Challenge") == 0 && + hWndParent && (dwStyle & WS_CHILD)) + { + dwExStyle = WS_EX_TRANSPARENT; + } + /* Center Lego Loco overlays */ if (lpWindowName && _strcmpi(lpWindowName, "LEGO LOCO") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From ac910cd4e928899194b83afb71192f919c0f3edd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:01:25 +0200 Subject: [PATCH 1288/1724] update trivia preset --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index d58f30e..375a533 100644 --- a/src/config.c +++ b/src/config.c @@ -807,7 +807,10 @@ static void cfg_create_ini() "\n" "; Disney Trivia Challenge\n" "[DisneyTr]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" "noactivateapp=true\n" + "renderer=gdi\n" "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" From 5194543aca271336408aa9965a3f3ce7b94696af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:52:19 +0200 Subject: [PATCH 1289/1724] minimize window on RestoreDisplayMode --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index 33e8800..bb28d7f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -640,6 +640,8 @@ HRESULT dd_RestoreDisplayMode() } } + real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + return DD_OK; } From 5d6b78b23d58a42ee85cd1a015b96a7f12c6aeff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:53:24 +0200 Subject: [PATCH 1290/1724] update Trivia preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 375a533..62c1938 100644 --- a/src/config.c +++ b/src/config.c @@ -809,7 +809,6 @@ static void cfg_create_ini() "[DisneyTr]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" - "noactivateapp=true\n" "renderer=gdi\n" "\n" "; Escape Velocity Nova\n" From a462be533956974e86fe9046f4c1cdf5e90e760a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:48:12 +0200 Subject: [PATCH 1291/1724] remove redundant code --- cnc-ddraw.vcxproj | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 8a3f84d..c9500e9 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -243,8 +243,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -287,8 +285,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -331,8 +327,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -375,8 +369,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -419,8 +411,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 From d6a59407e4ecb4198bb316141358c8443405c243 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:48:51 +0200 Subject: [PATCH 1292/1724] add dummy git.h --- inc/git.h | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 inc/git.h diff --git a/inc/git.h b/inc/git.h new file mode 100644 index 0000000..9ee47b4 --- /dev/null +++ b/inc/git.h @@ -0,0 +1,2 @@ +#define GIT_COMMIT "UNKNOWN" +#define GIT_BRANCH "UNKNOWN" From f4ca7973eb372e083a2ee6bc5e4510d2ca2173dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:55:14 +0200 Subject: [PATCH 1293/1724] Revert "add dummy git.h" This reverts commit d6a59407e4ecb4198bb316141358c8443405c243. --- inc/git.h | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 inc/git.h diff --git a/inc/git.h b/inc/git.h deleted file mode 100644 index 9ee47b4..0000000 --- a/inc/git.h +++ /dev/null @@ -1,2 +0,0 @@ -#define GIT_COMMIT "UNKNOWN" -#define GIT_BRANCH "UNKNOWN" From b88857386e202cff1db5d6000b0d632b8ed9d422 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:07:16 +0200 Subject: [PATCH 1294/1724] add new "win_version" setting to fake the reported windows version --- inc/config.h | 1 + inc/hook.h | 4 ++ inc/winapi_hooks.h | 3 ++ src/config.c | 2 + src/hook.c | 4 ++ src/winapi_hooks.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/inc/config.h b/inc/config.h index 1140fe0..09c7e20 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,6 +57,7 @@ typedef struct CNCDDRAWCONFIG int fixchilds; BOOL hook_peekmessage; BOOL hook_getmessage; + char win_version[32]; /* Undocumented settings */ diff --git a/inc/hook.h b/inc/hook.h index cd1dab8..92301d4 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -70,6 +70,8 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); +typedef DWORD(WINAPI* GETVERSIONPROC)(void); +typedef BOOL(WINAPI* GETVERSIONEXAPROC)(LPOSVERSIONINFOA); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); @@ -120,6 +122,8 @@ extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; +extern GETVERSIONPROC real_GetVersion; +extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6e2965d..fa5c635 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -72,6 +72,9 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); +DWORD WINAPI fake_GetVersion(void); +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); + HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); diff --git a/src/config.c b/src/config.c index 62c1938..9284f1d 100644 --- a/src/config.c +++ b/src/config.c @@ -69,6 +69,7 @@ void cfg_load() GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); + GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -323,6 +324,7 @@ static void cfg_create_ini() "lock_mouse_top_left=false\n" "no_compat_warning=false\n" "remove_menu=false\n" + ";win_version=95\n" "\n" "\n" "\n" diff --git a/src/hook.c b/src/hook.c index 378b4a0..c07f58a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -63,6 +63,8 @@ LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; +GETVERSIONPROC real_GetVersion = GetVersion; +GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; @@ -168,6 +170,8 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, + { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, HOOK_SKIP_2 }, + { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, HOOK_SKIP_2 }, #if defined(_DEBUG) && defined(__GNUC__) { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, #endif diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cd93961..76b4728 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1548,6 +1548,98 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( return result; } +DWORD WINAPI fake_GetVersion() +{ + if (_strcmpi(g_config.win_version, "95") == 0) + return 0xC3B60004; + + if (_strcmpi(g_config.win_version, "98") == 0) + return 0xC0000A04; + + if (_strcmpi(g_config.win_version, "nt4") == 0) + return 0x05650004; + + if (_strcmpi(g_config.win_version, "2000") == 0) + return 0x08930005; + + if (_strcmpi(g_config.win_version, "xp") == 0) + return 0x0A280105; + + return real_GetVersion(); +} + +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) +{ + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) + { + if (_strcmpi(g_config.win_version, "95") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 950, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 10, 67766446, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 1381, 2, "Service Pack 5" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 0, 2195, 2, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 1, 2600, 2, "Service Pack 3" }; + return TRUE; + } + } + + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) + { + LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; + if (_strcmpi(g_config.win_version, "95") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 950, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 10, 67766446, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 1381, 2, "Service Pack 5", 5, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 0, 2195, 2, "", 0, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 1, 2600, 2, "Service Pack 3", 3, 0, 256, 1, 30 }; + return TRUE; + } + } + + return real_GetVersionExA(info); +} + BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); From e3993518c717f67579493f78029e0949d6fd7993 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:20:20 +0200 Subject: [PATCH 1295/1724] sort config.h --- inc/config.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index 09c7e20..5fd03b3 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,7 +57,6 @@ typedef struct CNCDDRAWCONFIG int fixchilds; BOOL hook_peekmessage; BOOL hook_getmessage; - char win_version[32]; /* Undocumented settings */ @@ -82,6 +81,8 @@ typedef struct CNCDDRAWCONFIG BOOL wine_allow_resize; BOOL lock_mouse_top_left; BOOL no_compat_warning; + BOOL remove_menu; + char win_version[32]; /* Hotkeys */ @@ -96,8 +97,6 @@ typedef struct CNCDDRAWCONFIG /* Game specific settings */ - BOOL remove_menu; - BOOL armadahack; BOOL tshack; BOOL infantryhack; From 560a7e6a209a6e52a2adb79ad7f96745aa4b8cc6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:22:38 +0200 Subject: [PATCH 1296/1724] add check to GetVersion functions --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 76b4728..23cd25e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1570,7 +1570,7 @@ DWORD WINAPI fake_GetVersion() BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) { - if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) + if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) { if (_strcmpi(g_config.win_version, "95") == 0) { @@ -1603,7 +1603,7 @@ BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) } } - if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) + if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) { LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; if (_strcmpi(g_config.win_version, "95") == 0) From f3d1ba8cf4b9e9917b31e7b1c092e5be8b4e59e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Sep 2024 09:19:13 +0200 Subject: [PATCH 1297/1724] append filename to log files --- src/debug.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/debug.c b/src/debug.c index 52f81ad..af2f4ef 100644 --- a/src/debug.c +++ b/src/debug.c @@ -124,19 +124,20 @@ void dbg_init() char exe_path[MAX_PATH] = { 0 }; if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) { + char filename[MAX_PATH] = { 0 }; char drive[MAX_PATH] = { 0 }; char dir[MAX_PATH] = { 0 }; - _splitpath(exe_path, drive, dir, NULL, NULL); + _splitpath(exe_path, drive, dir, filename, NULL); char game_path[MAX_PATH] = { 0 }; _makepath(game_path, drive, dir, NULL, NULL); - _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.dmp"); - _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.dmp"); + _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%scnc-ddraw-%s-1.dmp", game_path, filename); + _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%scnc-ddraw-%s-2.dmp", game_path, filename); - _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.log"); - _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.log"); - _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%s%s", game_path, "cnc-ddraw-3.log"); + _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%scnc-ddraw-%s-1.log", game_path, filename); + _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%scnc-ddraw-%s-2.log", game_path, filename); + _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%scnc-ddraw-%s-3.log", game_path, filename); } remove(g_dbg_dmp_path1); From a063e2582510a18cb8f83f1bb52d94f28574c7b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 16:34:52 +0200 Subject: [PATCH 1298/1724] fix last_msg_pull_tick update --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 23cd25e..6768a9b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -710,7 +710,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); @@ -748,7 +748,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { - if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); From 9c18999a1162e956c6baca07e4c7b1993ecbf4bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:10:22 +0200 Subject: [PATCH 1299/1724] fix hotkey for Fallout2, jagged alliance 2, trivia and a probably a few other games --- cnc-ddraw.vcxproj | 2 + cnc-ddraw.vcxproj.filters | 6 +++ inc/keyboard.h | 11 ++++ src/dd.c | 3 ++ src/dllmain.c | 1 + src/keyboard.c | 102 ++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 10 +++- src/wndproc.c | 57 +-------------------- 8 files changed, 135 insertions(+), 57 deletions(-) create mode 100644 inc/keyboard.h create mode 100644 src/keyboard.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index c9500e9..992cb3e 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -51,6 +51,7 @@ + @@ -87,6 +88,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 7de9def..e1e9a15 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -165,6 +165,9 @@ Source Files + + Source Files + @@ -287,6 +290,9 @@ Header Files + + Header Files + diff --git a/inc/keyboard.h b/inc/keyboard.h new file mode 100644 index 0000000..8962198 --- /dev/null +++ b/inc/keyboard.h @@ -0,0 +1,11 @@ +#ifndef KEYBOARD_H +#define KEYBOARD_H + + +void keyboard_hook_init(); +void keyboard_hook_exit(); +LRESULT CALLBACK keyboard_hook_proc(int Code, WPARAM wParam, LPARAM lParam); + +extern HHOOK g_keyboard_hook; + +#endif diff --git a/src/dd.c b/src/dd.c index bb28d7f..bff1ec8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -6,6 +6,7 @@ #include "hook.h" #include "config.h" #include "mouse.h" +#include "keyboard.h" #include "wndproc.h" #include "render_d3d9.h" #include "render_gdi.h" @@ -1362,6 +1363,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); + keyboard_hook_init(); + if (!g_ddraw.render.hdc) { g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); diff --git a/src/dllmain.c b/src/dllmain.c index b75c335..cfb3013 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -138,6 +138,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); + keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..e4145cf --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,102 @@ +#include +#include "debug.h" +#include "hook.h" +#include "dd.h" +#include "utils.h" +#include "config.h" +#include "keyboard.h" +#include "mouse.h" + + +HHOOK g_keyboard_hook; + +void keyboard_hook_init() +{ + if (g_keyboard_hook && UnhookWindowsHookEx(g_keyboard_hook)) + { + g_keyboard_hook = NULL; + } + + if (!g_ddraw.gui_thread_id) + return; + + g_keyboard_hook = + real_SetWindowsHookExA( + WH_KEYBOARD, + keyboard_hook_proc, + NULL, + g_ddraw.gui_thread_id); +} + +void keyboard_hook_exit() +{ + if (g_keyboard_hook) + { + UnhookWindowsHookEx(g_keyboard_hook); + } +} + +LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code < 0 || !wParam) // code != HC_ACTION || + return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); + + BOOL alt_down = (lParam & (1 << 29)); + BOOL key_down = !(lParam & (1 << 30)); + BOOL key_up = !!(lParam & (1 << 31)); + + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + { + if (key_up) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == g_config.hotkeys.toggle_maximize && + g_config.resizable && + g_config.windowed && + !g_config.fullscreen && + alt_down) + { + if (key_up) + util_toggle_maximize(); + + return 1; + } + + if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + { + if (key_up) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) + { + if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && + (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) + { + mouse_unlock(); + return 1; + } + } + + if (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL) + { + if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && + (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)) + { + mouse_unlock(); + return 1; + } + } + + if (key_up && wParam == g_config.hotkeys.screenshot) + { + ss_take_screenshot(g_ddraw.primary); + } + + return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); +} diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6768a9b..68dc9dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -9,6 +9,7 @@ #include "config.h" #include "utils.h" #include "mouse.h" +#include "keyboard.h" #include "wndproc.h" #include "render_gdi.h" #include "render_d3d9.h" @@ -601,7 +602,14 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); } - return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); + HHOOK result = real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); + + if (idHook == WH_KEYBOARD) + { + keyboard_hook_init(); + } + + return result; } BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) diff --git a/src/wndproc.c b/src/wndproc.c index a12c2c5..2da7daf 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -758,29 +758,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { - BOOL context_code = (lParam & (1 << 29)) != 0; - BOOL key_state = (lParam & (1 << 30)) != 0; - - if (g_config.hotkeys.toggle_fullscreen && - wParam == g_config.hotkeys.toggle_fullscreen && - (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) && - context_code && - !key_state) - { - util_toggle_fullscreen(); - return 0; - } - - if (g_config.hotkeys.toggle_maximize && - wParam == g_config.hotkeys.toggle_maximize && - g_config.resizable && - g_config.windowed && - !g_config.fullscreen) - { - util_toggle_maximize(); - return 0; - } - if (wParam == VK_MENU) { g_ddraw.alt_key_down = TRUE; @@ -795,7 +772,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_ddraw.alt_key_down = FALSE; } - if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen)) + if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -804,42 +781,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ - { - util_toggle_fullscreen(); - return 0; - } - - if (g_config.hotkeys.unlock_cursor1 && - (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) - { - if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) - { - mouse_unlock(); - return 0; - } - } - - if (g_config.hotkeys.unlock_cursor2 && - (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) - { - if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) - { - mouse_unlock(); - return 0; - } - } - break; } case WM_KEYUP: { - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ - return 0; - - if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) - ss_take_screenshot(g_ddraw.primary); - break; } /* button up messages reactivate cursor lock */ From fc143416ad0c96708a6ce1409c706801eeb9d976 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:17:19 +0200 Subject: [PATCH 1300/1724] fix crash on exit in fallout2 --- src/dd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index bff1ec8..3f2ea71 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1670,9 +1670,6 @@ ULONG dd_Release() if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); - /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ if (g_ddraw.width) { @@ -1692,6 +1689,9 @@ ULONG dd_Release() (rc.bottom - rc.top), SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); } + + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ + real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } memset(&g_ddraw, 0, sizeof(g_ddraw)); From 8f9534812b7179246ddc52bc87e46ac1b28e38e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:17:48 +0200 Subject: [PATCH 1301/1724] remove moorhuhn preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 9284f1d..5c6b1d1 100644 --- a/src/config.c +++ b/src/config.c @@ -1163,10 +1163,6 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" - "; Moorhuhn\n" - "[Moorhuhn]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "releasealt=true\n" From a87a2d7191d0607356e37502eb37cdecb7208a5f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:46:21 +0200 Subject: [PATCH 1302/1724] use key_down rather than key_up for hotkeys --- src/keyboard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index e4145cf..984695f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { - if (key_up) + if (key_down) util_toggle_fullscreen(); return 1; @@ -59,7 +59,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) !g_config.fullscreen && alt_down) { - if (key_up) + if (key_down) util_toggle_maximize(); return 1; @@ -67,7 +67,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ { - if (key_up) + if (key_down) util_toggle_fullscreen(); return 1; From 4b46c48a361ddeb0c7d2617bd046f8c39eb6bde9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 19:07:01 +0200 Subject: [PATCH 1303/1724] fix warnings --- src/dllmain.c | 1 + src/keyboard.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index cfb3013..76090f9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -12,6 +12,7 @@ #include "indeo.h" #include "utils.h" #include "versionhelpers.h" +#include "keyboard.h" /* export for cncnet cnc games */ diff --git a/src/keyboard.c b/src/keyboard.c index 984695f..5298ce5 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -6,6 +6,7 @@ #include "config.h" #include "keyboard.h" #include "mouse.h" +#include "screenshot.h" HHOOK g_keyboard_hook; From b1e7cfe5b4c77e49cd83343cfa98a7257d991423 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 20:54:42 +0200 Subject: [PATCH 1304/1724] do not minimize on RestoreDisplayMode (needs more testing) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3f2ea71..ae82e47 100644 --- a/src/dd.c +++ b/src/dd.c @@ -641,7 +641,7 @@ HRESULT dd_RestoreDisplayMode() } } - real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + //real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); return DD_OK; } From eb5957008f92e3062bf1a8633ea460a05be74281 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 22:29:25 +0200 Subject: [PATCH 1305/1724] disable workaround for cases where PeekMessage was not hooked --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index ae82e47..c61f1cc 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1024,7 +1024,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + if (g_ddraw.last_msg_pull_tick && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) { From 60a66776a67f42f715997320c78d70809984e158 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 12:52:35 +0200 Subject: [PATCH 1306/1724] port alt-key-stuck fix to new keyboard hook --- src/keyboard.c | 11 +++++++++-- src/wndproc.c | 13 +++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 5298ce5..feab45c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -39,13 +39,20 @@ void keyboard_hook_exit() LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { - if (code < 0 || !wParam) // code != HC_ACTION || + if (code < 0 || !wParam) return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); - BOOL alt_down = (lParam & (1 << 29)); + BOOL alt_down = !!(lParam & (1 << 29)); BOOL key_down = !(lParam & (1 << 30)); BOOL key_up = !!(lParam & (1 << 31)); + //TRACE("VK_MENU - wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + + if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ + { + g_ddraw.alt_key_down = alt_down; + } + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { if (key_down) diff --git a/src/wndproc.c b/src/wndproc.c index 2da7daf..0d65fce 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -707,7 +707,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + { PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); + g_ddraw.alt_key_down = FALSE; + } return 0; } @@ -758,20 +761,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { - if (wParam == VK_MENU) - { - g_ddraw.alt_key_down = TRUE; - } - break; } case WM_SYSKEYUP: { - if (wParam == VK_MENU) - { - g_ddraw.alt_key_down = FALSE; - } - if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); From 2a269f19b6fa828f8593744feae3a043fce2a786 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 14:27:56 +0200 Subject: [PATCH 1307/1724] log direct3d9 errors --- inc/debug.h | 1 + src/debug.c | 34 +++++++++++++++++ src/render_d3d9.c | 96 ++++++++++++++++++++++++++++++----------------- 3 files changed, 97 insertions(+), 34 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 058e27a..329c7cf 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -26,6 +26,7 @@ void dbg_dump_dds_caps(DWORD caps); void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); +char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); __declspec(noreturn) void __cdecl dbg_invoke_watson( diff --git a/src/debug.c b/src/debug.c index af2f4ef..14ffcc9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -1005,6 +1006,39 @@ void dbg_dump_dds_lock_flags(DWORD flags) #endif } +char* dbg_d3d9_hr_to_str(HRESULT hr) +{ +#define HR_TO_STR(x) if (x == hr) return #x + + HR_TO_STR(D3D_OK); + + HR_TO_STR(D3DERR_WRONGTEXTUREFORMAT); + HR_TO_STR(D3DERR_UNSUPPORTEDCOLOROPERATION); + HR_TO_STR(D3DERR_UNSUPPORTEDCOLORARG); + HR_TO_STR(D3DERR_UNSUPPORTEDALPHAOPERATION); + HR_TO_STR(D3DERR_UNSUPPORTEDALPHAARG); + HR_TO_STR(D3DERR_TOOMANYOPERATIONS); + HR_TO_STR(D3DERR_CONFLICTINGTEXTUREFILTER); + HR_TO_STR(D3DERR_UNSUPPORTEDFACTORVALUE); + HR_TO_STR(D3DERR_CONFLICTINGRENDERSTATE); + HR_TO_STR(D3DERR_UNSUPPORTEDTEXTUREFILTER); + HR_TO_STR(D3DERR_CONFLICTINGTEXTUREPALETTE); + HR_TO_STR(D3DERR_DRIVERINTERNALERROR); + + HR_TO_STR(D3DERR_NOTFOUND); + HR_TO_STR(D3DERR_MOREDATA); + HR_TO_STR(D3DERR_DEVICELOST); + HR_TO_STR(D3DERR_DEVICENOTRESET); + HR_TO_STR(D3DERR_NOTAVAILABLE); + HR_TO_STR(D3DERR_OUTOFVIDEOMEMORY); + HR_TO_STR(D3DERR_INVALIDDEVICE); + HR_TO_STR(D3DERR_INVALIDCALL); + HR_TO_STR(D3DERR_DRIVERINVALIDCALL); + HR_TO_STR(D3DERR_WASSTILLDRAWING); + + return "UNKNOWN"; +} + char* dbg_mes_to_str(int id) { switch (id) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5c5bdeb..5178068 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -15,6 +15,11 @@ #include "config.h" +#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) +#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) + +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); static BOOL d3d9_create_resources(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -86,10 +91,10 @@ BOOL d3d9_create() #if _DEBUG D3DADAPTER_IDENTIFIER9 ai = {0}; D3DCAPS9 caps = { 0 }; - HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); - HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); + HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); + HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); - if (SUCCEEDED(hr)) + if (SUCCEEDEDX(adapter_hr)) { TRACE("+--Direct3D9-------------------------------------\n"); TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); @@ -106,7 +111,7 @@ BOOL d3d9_create() TRACE("| Driver: %s\n", ai.Driver); TRACE("| Description: %s\n", ai.Description); - if (SUCCEEDED(hr2)) + if (SUCCEEDEDX(devcaps_hr)) { TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth); TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight); @@ -146,7 +151,7 @@ BOOL d3d9_create() for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) { - if (SUCCEEDED( + if (SUCCEEDEDX( IDirect3D9_CreateDevice( g_d3d9.instance, D3DADAPTER_DEFAULT, @@ -163,6 +168,29 @@ BOOL d3d9_create() return FALSE; } +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt) +{ + if (FAILED(hr)) + { + TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); + return TRUE; + } + + return FALSE; +} + +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt) +{ + if (!SUCCEEDED(hr)) + { + TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); + + return FALSE; + } + + return TRUE; +} + BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) @@ -181,7 +209,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; - if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) + if (g_d3d9.device && SUCCEEDEDX(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { BOOL result = d3d9_set_states(); @@ -278,7 +306,7 @@ static BOOL d3d9_create_resources() g_d3d9.scale_w = (float)width / g_d3d9.tex_width;; g_d3d9.scale_h = (float)height / g_d3d9.tex_height; - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateVertexBuffer( g_d3d9.device, sizeof(CUSTOMVERTEX) * 4, 0, @@ -293,7 +321,7 @@ static BOOL d3d9_create_resources() { if (g_ddraw.bpp == 16 && g_config.rgb555) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -307,7 +335,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -322,7 +350,7 @@ static BOOL d3d9_create_resources() } else if (g_ddraw.bpp == 32) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -336,7 +364,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -351,7 +379,7 @@ static BOOL d3d9_create_resources() } else { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -368,7 +396,7 @@ static BOOL d3d9_create_resources() if (g_ddraw.bpp == 8) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -382,7 +410,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -401,7 +429,7 @@ static BOOL d3d9_create_resources() if (g_ddraw.bpp == 8) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); IDirect3DDevice9_CreatePixelShader( @@ -413,7 +441,7 @@ static BOOL d3d9_create_resources() { if (g_config.d3d9_filter == FILTER_LANCZOS) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreatePixelShader( g_d3d9.device, (DWORD*)D3D9_LANCZOS2_SHADER, @@ -441,20 +469,20 @@ static BOOL d3d9_set_states() { BOOL err = FALSE; - err = err || FAILED(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); - err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); - err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); + err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); + err = err || FAILEDX(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); + err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); if (g_ddraw.bpp == 8) { - err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); + err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = g_config.d3d9_filter && g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack); - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_SetPixelShader( g_d3d9.device, bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader)); @@ -462,7 +490,7 @@ static BOOL d3d9_set_states() if (bilinear) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } } else @@ -473,22 +501,22 @@ static BOOL d3d9_set_states() g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } else if ( - SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && - SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && + SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && + SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && g_config.d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } } } @@ -502,7 +530,7 @@ static BOOL d3d9_set_states() 0.0f, 1.0f }; - err = err || FAILED(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); + err = err || FAILEDX(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); */ return !err; } @@ -527,7 +555,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) }; void* data; - if (g_d3d9.vertex_buf && SUCCEEDED(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) + if (g_d3d9.vertex_buf && SUCCEEDEDX(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) { memcpy(data, vertices, sizeof(vertices)); @@ -594,8 +622,8 @@ DWORD WINAPI d3d9_render_main(void) RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; - if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && - SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && + SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) { blt_clean( lock_rc.pBits, @@ -622,8 +650,8 @@ DWORD WINAPI d3d9_render_main(void) RECT rc = { 0,0,256,1 }; - if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && - SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && + SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) { memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); From 02c8080910141e96a6757354c12f167abda8b6d1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 15:23:46 +0200 Subject: [PATCH 1308/1724] use regular macros with release builds --- src/render_d3d9.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5178068..a1a1815 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -15,8 +15,13 @@ #include "config.h" +#ifdef _DEBUG #define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) #define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) +#else +#define FAILEDX(stmt) FAILED(stmt) +#define SUCCEEDEDX(stmt) SUCCEEDED(stmt) +#endif static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); From 614e340f15dff3424160e0ba58b79ec7eb3978ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 15:32:55 +0200 Subject: [PATCH 1309/1724] fix warnings --- inc/debug.h | 2 +- src/debug.c | 8 +------- src/render_d3d9.c | 6 ++++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 329c7cf..6ac7f7b 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -29,7 +29,7 @@ void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); -__declspec(noreturn) void __cdecl dbg_invoke_watson( +void __cdecl dbg_invoke_watson( _In_opt_z_ wchar_t const*, _In_opt_z_ wchar_t const*, _In_opt_z_ wchar_t const*, diff --git a/src/debug.c b/src/debug.c index 14ffcc9..c590dc6 100644 --- a/src/debug.c +++ b/src/debug.c @@ -91,7 +91,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) return EXCEPTION_EXECUTE_HANDLER; } -__declspec(noreturn) void __cdecl dbg_invoke_watson( +void __cdecl dbg_invoke_watson( wchar_t const* const expression, wchar_t const* const function_name, wchar_t const* const file_name, @@ -99,12 +99,6 @@ __declspec(noreturn) void __cdecl dbg_invoke_watson( uintptr_t const reserved ) { - UNREFERENCED_PARAMETER(expression); - UNREFERENCED_PARAMETER(function_name); - UNREFERENCED_PARAMETER(file_name); - UNREFERENCED_PARAMETER(line_number); - UNREFERENCED_PARAMETER(reserved); - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); /* Force access violation to produce a dmp file for debugging */ diff --git a/src/render_d3d9.c b/src/render_d3d9.c index a1a1815..dde4b2c 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -18,13 +18,13 @@ #ifdef _DEBUG #define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) #define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); #else #define FAILEDX(stmt) FAILED(stmt) #define SUCCEEDEDX(stmt) SUCCEEDED(stmt) #endif -static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); -static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); static BOOL d3d9_create_resources(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -173,6 +173,7 @@ BOOL d3d9_create() return FALSE; } +#ifdef _DEBUG static BOOL d3d9_check_failed(HRESULT hr, const char* stmt) { if (FAILED(hr)) @@ -195,6 +196,7 @@ static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt) return TRUE; } +#endif BOOL d3d9_on_device_lost() { From 0a65317d96e2d872846c7ca4e1cd96690bfa8108 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 16:44:35 +0200 Subject: [PATCH 1310/1724] move checks into function + cleanup --- src/keyboard.c | 21 +++++++++------------ src/utils.c | 3 +++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index feab45c..f6f7993 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -46,7 +46,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_down = !(lParam & (1 << 30)); BOOL key_up = !!(lParam & (1 << 31)); - //TRACE("VK_MENU - wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + //TRACE("kbhook wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ { @@ -61,11 +61,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && - g_config.resizable && - g_config.windowed && - !g_config.fullscreen && - alt_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down) { if (key_down) util_toggle_maximize(); @@ -73,7 +69,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ { if (key_down) util_toggle_fullscreen(); @@ -81,6 +77,12 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } + if (wParam == g_config.hotkeys.screenshot) + { + if (key_up) + ss_take_screenshot(g_ddraw.primary); + } + if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) { if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && @@ -101,10 +103,5 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) } } - if (key_up && wParam == g_config.hotkeys.screenshot) - { - ss_take_screenshot(g_ddraw.primary); - } - return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); } diff --git a/src/utils.c b/src/utils.c index 110e55a..a68b659 100644 --- a/src/utils.c +++ b/src/utils.c @@ -573,6 +573,9 @@ BOOL util_get_lowest_resolution( void util_toggle_maximize() { + if (!g_config.resizable || !g_config.windowed || g_config.fullscreen) + return; + RECT client_rc; RECT dst_rc; From d0de68bf4250b84b13cd48b5dec07891b0d16afc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 16:50:51 +0200 Subject: [PATCH 1311/1724] some more cosmetic changes --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index f6f7993..7bf9263 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -83,7 +83,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) ss_take_screenshot(g_ddraw.primary); } - if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) + if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) { if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) From 3b4fcb09e2634533a62f60e96952bf5a3536e825 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 17:22:30 +0200 Subject: [PATCH 1312/1724] make sure we always get the key_up message so keys don't get stuck --- src/keyboard.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 7bf9263..8d45db6 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -53,20 +53,20 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) { - if (key_down) - util_toggle_fullscreen(); + util_toggle_fullscreen(); - return 1; + if (!key_up) + return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && alt_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { - if (key_down) - util_toggle_maximize(); + util_toggle_maximize(); - return 1; + if (!key_up) + return 1; } if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ @@ -89,7 +89,9 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) { mouse_unlock(); - return 1; + + if (!key_up) + return 1; } } @@ -99,7 +101,9 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)) { mouse_unlock(); - return 1; + + if (!key_up) + return 1; } } From d3139c67fb9fe7c07cc1316ce638291dd6ef5c95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 17:37:16 +0200 Subject: [PATCH 1313/1724] keep the mingw debug build win2000 compatible --- src/debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/debug.c b/src/debug.c index c590dc6..c5f0507 100644 --- a/src/debug.c +++ b/src/debug.c @@ -68,6 +68,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; +#if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ if (GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, @@ -75,6 +76,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { GetModuleFileNameA(mod, filename, sizeof(filename) - 1); } +#endif TRACE( "Exception at %p (%p+%p), Code=%08X - %s\n", From b92b2deafaf2744704418cdcf5d8b4195105b42f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 20:43:58 +0200 Subject: [PATCH 1314/1724] ignore all key down messages --- src/keyboard.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 8d45db6..e1583d1 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -53,17 +53,19 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { - util_toggle_fullscreen(); + if (key_down) + util_toggle_fullscreen(); if (!key_up) return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down) { - util_toggle_maximize(); + if (key_down) + util_toggle_maximize(); if (!key_up) return 1; From 1bcdf92d10d673b77734a081f73a0fb5af96f16a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:08:18 +0200 Subject: [PATCH 1315/1724] add some more error checks --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index a68b659..ee7b8cd 100644 --- a/src/utils.c +++ b/src/utils.c @@ -573,7 +573,7 @@ BOOL util_get_lowest_resolution( void util_toggle_maximize() { - if (!g_config.resizable || !g_config.windowed || g_config.fullscreen) + if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; RECT client_rc; @@ -677,7 +677,7 @@ void util_toggle_maximize() void util_toggle_fullscreen() { /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ - if (g_ddraw.bnet_active || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) + if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From 1bc96a658f085202877e881aa7d9e5f2e08fd5c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:21:05 +0200 Subject: [PATCH 1316/1724] add preset for Barney - Secret of the Rainbow --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index 5c6b1d1..d1f01df 100644 --- a/src/config.c +++ b/src/config.c @@ -484,6 +484,15 @@ static void cfg_create_ini() "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" + "; Barney - Secret of the Rainbow\n" + "[Barney]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" From 7165d27d71d6154dc732e2bbd1b412954b974c8b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:53:11 +0200 Subject: [PATCH 1317/1724] don't hook SH33W32 --- src/hook.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hook.c b/src/hook.c index c07f58a..d71bf72 100644 --- a/src/hook.c +++ b/src/hook.c @@ -547,6 +547,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || _strcmpi(mod_filename, "mdraw") == 0 || + _strcmpi(mod_filename, "SH33W32") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From 563473b83571b909266aeb19bbf743a77e1d892d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 09:38:16 +0200 Subject: [PATCH 1318/1724] fix naming of key bools --- src/keyboard.c | 56 ++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index e1583d1..7bc5369 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -43,46 +43,44 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); BOOL alt_down = !!(lParam & (1 << 29)); - BOOL key_down = !(lParam & (1 << 30)); - BOOL key_up = !!(lParam & (1 << 31)); + BOOL key_down = !(lParam & (1 << 31)); + BOOL key_released = !!(lParam & (1 << 31)); + BOOL key_triggered = !(lParam & (1 << 30)); - //TRACE("kbhook wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); - if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ + if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) { - if (key_down) - util_toggle_fullscreen(); - - if (!key_up) - return 1; - } - - if (wParam == g_config.hotkeys.toggle_maximize && alt_down) - { - if (key_down) - util_toggle_maximize(); - - if (!key_up) - return 1; - } - - if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ - { - if (key_down) + if (key_triggered) util_toggle_fullscreen(); return 1; } - if (wParam == g_config.hotkeys.screenshot) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { - if (key_up) - ss_take_screenshot(g_ddraw.primary); + if (key_triggered) + util_toggle_maximize(); + + return 1; + } + + if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ + { + if (key_triggered) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == g_config.hotkeys.screenshot && key_released) + { + ss_take_screenshot(g_ddraw.primary); } if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) @@ -92,7 +90,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { mouse_unlock(); - if (!key_up) + if (key_down) return 1; } } @@ -104,7 +102,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { mouse_unlock(); - if (!key_up) + if (key_down) return 1; } } From 426490043fc1fbc2139f9dac7778fc7dc5f068bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 09:38:51 +0200 Subject: [PATCH 1319/1724] comment out testng code --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index 7bc5369..ca5109e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_released = !!(lParam & (1 << 31)); BOOL key_triggered = !(lParam & (1 << 30)); - TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); + //TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { From dcc76a154dec7dd35e4299c0e77a58efdfbf3d8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 19:14:58 +0200 Subject: [PATCH 1320/1724] add experimental WH_GETMESSAGE hook --- inc/mouse.h | 5 +- src/dd.c | 3 + src/dllmain.c | 2 + src/mouse.c | 171 +++++++++++++++++++++++++++++++++++++++++++-- src/winapi_hooks.c | 168 +------------------------------------------- src/wndproc.c | 94 +------------------------ 6 files changed, 179 insertions(+), 264 deletions(-) diff --git a/inc/mouse.h b/inc/mouse.h index 1181ac2..65ef0da 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -1,9 +1,12 @@ #ifndef MOUSE_H #define MOUSE_H +void mouse_hook_init(); +void mouse_hook_exit(); void mouse_lock(); void mouse_unlock(); -LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam); extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; diff --git a/src/dd.c b/src/dd.c index c61f1cc..b7d535b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -988,6 +988,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } + TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; @@ -1365,6 +1367,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); keyboard_hook_init(); + mouse_hook_init(); if (!g_ddraw.render.hdc) { diff --git a/src/dllmain.c b/src/dllmain.c index 76090f9..fa8e2d1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -13,6 +13,7 @@ #include "utils.h" #include "versionhelpers.h" #include "keyboard.h" +#include "mouse.h" /* export for cncnet cnc games */ @@ -140,6 +141,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); keyboard_hook_exit(); + mouse_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/mouse.c b/src/mouse.c index 46aca13..cbb976b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -1,15 +1,45 @@ #include +#include +#include #include "debug.h" #include "winapi_hooks.h" #include "dd.h" #include "hook.h" #include "utils.h" #include "config.h" +#include "mouse.h" BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; +static HHOOK g_mouse_gm_hook; + +void mouse_hook_init() +{ + if (g_mouse_gm_hook && UnhookWindowsHookEx(g_mouse_gm_hook)) + { + g_mouse_gm_hook = NULL; + } + + if (!g_ddraw.gui_thread_id) + return; + + g_mouse_gm_hook = + real_SetWindowsHookExA( + WH_GETMESSAGE, + mouse_gm_hook_proc, + NULL, + g_ddraw.gui_thread_id); +} + +void mouse_hook_exit() +{ + if (g_mouse_gm_hook) + { + UnhookWindowsHookEx(g_mouse_gm_hook); + } +} void mouse_lock() { @@ -83,15 +113,146 @@ void mouse_unlock() } } -LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code < 0 || !lParam || !g_ddraw.width) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + + MSG* msg = (MSG*)lParam; + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) + { + int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + msg->pt.x = min(x, g_ddraw.width - 1); + msg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (msg->hwnd != g_ddraw.hwnd) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + + switch (LOWORD(msg->message)) + { + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(msg->lParam); + int y = GET_Y_LPARAM(msg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + + if (LOWORD(msg->message) == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + msg->lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(msg->lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(msg->lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + msg->lParam = MAKELPARAM(x, y); + + break; + } + } + + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); +} + +LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam) { if (!g_ddraw.ref) - return g_mouse_proc(Code, wParam, lParam); + return g_mouse_proc(code, wParam, lParam); - if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) - return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); + if (code < 0 || (!g_config.devmode && !g_mouse_locked)) + return CallNextHookEx(g_mouse_hook, code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); - return g_mouse_proc(Code, wParam, lParam); + return g_mouse_proc(code, wParam, lParam); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 68dc9dd..b51731b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,146 +612,12 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) -{ - if (g_ddraw.ref && g_ddraw.width) - { - switch (lpMsg->message) - { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(lpMsg->lParam); - int y = GET_Y_LPARAM(lpMsg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - //return FALSE; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - // Does not work with 'New Robinson' - //return FALSE; - } - - if (lpMsg->message == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lpMsg->lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - lpMsg->lParam = MAKELPARAM(x, y); - - lpMsg->pt.x = x; - lpMsg->pt.y = y; - - break; - } - - } - } - - return TRUE; -} - BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - } - - return result; + return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -759,37 +625,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - } - - return result; + return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 0d65fce..030751e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST) + uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,6 +42,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { + case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -780,97 +781,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - return 0; - } - - if (uMsg == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - lParam = MAKELPARAM(x, y); - - break; - } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 04d7f2060e900c66c3c8a5e285a078c1d8d20509 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:12:25 +0200 Subject: [PATCH 1321/1724] fix window resize/move issues --- src/mouse.c | 66 +------------------------------- src/winapi_hooks.c | 94 +++++++++++++++++++++++++++++++++++++++++++++- src/wndproc.c | 37 ++++++++++++++++++ 3 files changed, 130 insertions(+), 67 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index cbb976b..df05989 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -115,74 +115,16 @@ void mouse_unlock() LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) { - if (code < 0 || !lParam || !g_ddraw.width) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - MSG* msg = (MSG*)lParam; - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) - { - int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - msg->pt.x = min(x, g_ddraw.width - 1); - msg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (msg->hwnd != g_ddraw.hwnd) + if (code < 0 || !g_ddraw.width || !msg || msg->hwnd != g_ddraw.hwnd) return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); switch (LOWORD(msg->message)) { - /* button up messages reactivate cursor lock */ case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(msg->lParam); - int y = GET_Y_LPARAM(msg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ case WM_XBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: @@ -196,12 +138,6 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_config.devmode && !g_mouse_locked) - { - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - if (LOWORD(msg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b51731b..33ee191 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,12 +612,96 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) +{ + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (lpMsg->hwnd != g_ddraw.hwnd) + return TRUE; + + switch (LOWORD(lpMsg->message)) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + + mouse_lock(); + + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; + } + + break; + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + // Does not work with 'New Robinson' + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; + } + + break; + } + + } + } + + return TRUE; +} + BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result) + { + HandleMessage(lpMsg, hWnd); + } + + return result; } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -625,7 +709,13 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + if (result) + { + return HandleMessage(lpMsg, hWnd); + } + + return result; } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 030751e..cc87bd2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -781,6 +781,43 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); + + mouse_lock(); + return 0; + } + + break; + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + return 0; + } + + break; + } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 75ed1595c6288a55e0d7ba4410c169a7e1c3b445 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:21:09 +0200 Subject: [PATCH 1322/1724] remove debug code --- src/dd.c | 2 -- src/winapi_hooks.c | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index b7d535b..e98983d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -988,8 +988,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33ee191..2dc5fe4 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,8 +647,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (!g_config.devmode && !g_mouse_locked) { - TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -683,7 +681,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) break; } - } } From 97718b9a19be15990cdad4d0d9e8f94eb34e08b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:37:20 +0200 Subject: [PATCH 1323/1724] remove obsolete settings --- inc/config.h | 2 -- src/config.c | 25 ------------------------- 2 files changed, 27 deletions(-) diff --git a/inc/config.h b/inc/config.h index 5fd03b3..c725c36 100644 --- a/inc/config.h +++ b/inc/config.h @@ -55,8 +55,6 @@ typedef struct CNCDDRAWCONFIG BOOL singlecpu; int resolutions; int fixchilds; - BOOL hook_peekmessage; - BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index d1f01df..4e425f2 100644 --- a/src/config.c +++ b/src/config.c @@ -67,8 +67,6 @@ void cfg_load() GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); - GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -295,10 +293,6 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" - "hook_peekmessage=false\n" - "hook_getmessage=false\n" - "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" "releasealt=false\n" @@ -481,7 +475,6 @@ static void cfg_create_ini() "\n" "; Axis & Allies\n" "[AxisAllies]\n" - "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" "; Barney - Secret of the Rainbow\n" @@ -825,7 +818,6 @@ static void cfg_create_ini() "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" - "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" "adjmouse=true\n" @@ -840,18 +832,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; Enemy Infestation\n" - "[EI]\n" - "hook_getmessage=true\n" - "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" "\n" - "; Final Liberation: Warhammer Epic 40000\n" - "[Epic40k]\n" - "hook_peekmessage=true\n" - "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "nonexclusive=true\n" @@ -1119,10 +1103,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Lionheart\n" - "[Lionheart]\n" - "hook_peekmessage=true\n" - "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1179,7 +1159,6 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" - "hook_peekmessage=true\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" @@ -1400,10 +1379,6 @@ static void cfg_create_ini() "[StarCraft]\n" "game_handles_close=true\n" "\n" - "; Space Rangers\n" - "[Rangers]\n" - "hook_peekmessage=true\n" - "\n" "; SPYFox: Hold the Mustard\n" "[mustard]\n" "renderer=gdi\n" From 48151e4d78489cd947c689bb6a2838bad48f03b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:05:28 +0200 Subject: [PATCH 1324/1724] fix ja2 cursor lock --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2dc5fe4..8d8d8b5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { From 89d38454733b115f743c98a94922bb5f2527830f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:15:08 +0200 Subject: [PATCH 1325/1724] never return FALSE from peekmessage to avoid issues --- src/winapi_hooks.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8d8d8b5..a7e22cc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) +void HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { @@ -637,7 +637,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) } if (lpMsg->hwnd != g_ddraw.hwnd) - return TRUE; + return; switch (LOWORD(lpMsg->message)) { @@ -653,7 +653,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; } break; @@ -676,15 +675,12 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; } break; } } } - - return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -709,7 +705,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - return HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd); } return result; From c1a5a3895b53462bb5fa8feac57a1b240538e780 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:23:31 +0200 Subject: [PATCH 1326/1724] don't update cursor pos in mouse hook --- src/mouse.c | 3 --- src/winapi_hooks.c | 4 ++++ src/wndproc.c | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index df05989..3e0d0ac 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -168,9 +168,6 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) x = min(x, g_ddraw.width - 1); y = min(y, g_ddraw.height - 1); - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - msg->lParam = MAKELPARAM(x, y); break; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a7e22cc..f931f96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -675,8 +675,12 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + break; } + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + break; } } diff --git a/src/wndproc.c b/src/wndproc.c index cc87bd2..c0993b1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -816,6 +816,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); + break; } case WM_PARENTNOTIFY: From a42bdae84d2129a0d91eaa225b3e2b46f419b392 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:31:18 +0200 Subject: [PATCH 1327/1724] do not return WM_NULL for now (needs more testing) --- src/winapi_hooks.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f931f96..1083f4a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { @@ -652,7 +652,8 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + break; } break; @@ -674,13 +675,12 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - break; } } From df91a4308f380b45938dfd2e190fe17b55823c9d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 16:01:45 +0200 Subject: [PATCH 1328/1724] remove old diablo 2 hack --- src/winapi_hooks.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1083f4a..45076a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -414,20 +414,6 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); - if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) - { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); - - if (g_config.adjmouse) - { - x = (int)(roundf(x * g_ddraw.mouse.scale_x)); - y = (int)(roundf(y * g_ddraw.mouse.scale_y)); - } - - lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); - } - if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; From e4eafef6526426f99c185b0d138fc8f031a8426c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 16:58:22 +0200 Subject: [PATCH 1329/1724] return WM_NULL if there are no filters --- src/winapi_hooks.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 45076a3..7bb85c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,7 +598,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd) +void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { @@ -638,7 +638,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + } + break; } @@ -661,7 +667,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + } + break; } @@ -681,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); } return result; @@ -695,7 +707,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } return result; From f83baafcf664a4153bf398de7d22acc07f0a44ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:09:40 +0200 Subject: [PATCH 1330/1724] move font settings to the top --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 4e425f2..7416ad7 100644 --- a/src/config.c +++ b/src/config.c @@ -243,6 +243,12 @@ static void cfg_create_ini() "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)\n" "d3d9_filter=2\n" "\n" + "; Disable font smoothing for fonts that are smaller than size X\n" + "anti_aliased_fonts_min_size=13\n" + "\n" + "; Raise the size of small fonts to X\n" + "min_font_size=0\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" @@ -307,10 +313,8 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" - "anti_aliased_fonts_min_size=13\n" "custom_width=0\n" "custom_height=0\n" - "min_font_size=0\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" From e435bf65e13ed723f94051dadb5e66546d98693a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:17:00 +0200 Subject: [PATCH 1331/1724] rename custom_width/height setting to inject_resolution --- inc/config.h | 3 +-- src/config.c | 15 +++++---------- src/dd.c | 15 ++++++++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/inc/config.h b/inc/config.h index c725c36..15afbe5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -70,8 +70,7 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; int refresh_rate; int anti_aliased_fonts_min_size; - int custom_width; - int custom_height; + char inject_resolution[128]; int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; diff --git a/src/config.c b/src/config.c index 7416ad7..a5e5d3a 100644 --- a/src/config.c +++ b/src/config.c @@ -84,8 +84,7 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); - GET_INT(g_config.custom_width, "custom_width", 0); - GET_INT(g_config.custom_height, "custom_height", 0); + GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); @@ -313,8 +312,7 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" - "custom_width=0\n" - "custom_height=0\n" + ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" @@ -920,14 +918,12 @@ static void cfg_create_ini() "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" - "custom_width=800\n" - "custom_height=450\n" + "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" "keytogglefullscreen=0x08\n" - "custom_width=800\n" - "custom_height=450\n" + "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" "[Jstorm]\n" @@ -974,8 +970,7 @@ static void cfg_create_ini() "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" "[iwd2]\n" "resolutions=2\n" - "custom_width=1070\n" - "custom_height=602\n" + "inject_resolution=1070x602\n" "\n" "; Invictus\n" "[Invictus]\n" diff --git a/src/dd.c b/src/dd.c index e98983d..1ec2bef 100644 --- a/src/dd.c +++ b/src/dd.c @@ -113,6 +113,11 @@ HRESULT dd_EnumDisplayModes( while (--max_w % 8); } + char* ires = &g_config.inject_resolution[0]; + + unsigned long custom_width = strtoul(ires, &ires, 0); + unsigned long custom_height = strtoul(ires + 1, &ires, 0); + BOOL rlf = g_config.resolutions == RESLIST_FULL; BOOL rlm = g_config.resolutions == RESLIST_MINI; @@ -149,7 +154,7 @@ HRESULT dd_EnumDisplayModes( { rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 }, /* Inject custom resolution */ - { g_config.custom_width, g_config.custom_height }, + { custom_width, custom_height }, { max_w, max_h }, }; @@ -228,10 +233,10 @@ HRESULT dd_EnumDisplayModes( while (--m.dmPelsWidth % 8); } - if (!custom_res_injected && g_config.custom_width && g_config.custom_height) + if (!custom_res_injected && custom_width && custom_height) { - m.dmPelsWidth = g_config.custom_width; - m.dmPelsHeight = g_config.custom_height; + m.dmPelsWidth = custom_width; + m.dmPelsHeight = custom_height; custom_res_injected = TRUE; } @@ -347,7 +352,7 @@ HRESULT dd_EnumDisplayModes( if (!resolutions[i].cx || !resolutions[i].cy) continue; - if (!(resolutions[i].cx == g_config.custom_width && resolutions[i].cy == g_config.custom_height) && + if (!(resolutions[i].cx == custom_width && resolutions[i].cy == custom_height) && ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) { DEVMODE m; From 43ccc87e82d05d69e117a582b621d16dbf5e1af5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:41:46 +0200 Subject: [PATCH 1332/1724] sort header --- inc/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 15afbe5..7dd8a23 100644 --- a/inc/config.h +++ b/inc/config.h @@ -40,6 +40,8 @@ typedef struct CNCDDRAWCONFIG int save_settings; BOOL resizable; int d3d9_filter; + int anti_aliased_fonts_min_size; + int min_font_size; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; @@ -69,9 +71,7 @@ typedef struct CNCDDRAWCONFIG BOOL rgb555; BOOL no_dinput_hook; int refresh_rate; - int anti_aliased_fonts_min_size; char inject_resolution[128]; - int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; From 8a6f94ae95b2b91d8b3b249bca32beaabb5d5719 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 20:31:49 +0200 Subject: [PATCH 1333/1724] only lock cursor if message was removed --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7bb85c0..019f2da 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -631,7 +631,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) { InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -693,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } return result; From 9d5d71c9993916251f0224d4a056274cc1a3303a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:14:37 +0200 Subject: [PATCH 1334/1724] use PM_QS_INPUT for not responding patch --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 056c158..121f8fb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -59,7 +59,7 @@ HRESULT dds_Blt( /* workaround for "Not Responding" window problem */ g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } if (g_ddraw.ref && @@ -1003,7 +1003,7 @@ HRESULT dds_Lock( /* workaround for "Not Responding" window problem */ g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); From ac9d183a596dde6fb478251427c7ca667eab3b62 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:32:53 +0200 Subject: [PATCH 1335/1724] adjust logs --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index ca5109e..109269b 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_released = !!(lParam & (1 << 31)); BOOL key_triggered = !(lParam & (1 << 30)); - //TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); + //TRACE("kbhook code=%u, wParam=%u, triggered=%u, released=%u, alt_down=%u\n", code, wParam, key_triggered, key_released, alt_down); if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { From ed0b829bc6ea4ff959c93418684238b6c884beb1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:33:04 +0200 Subject: [PATCH 1336/1724] only create screenshot if file doesn't exist --- src/screenshot.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/screenshot.c b/src/screenshot.c index d76105e..063955b 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -153,6 +153,9 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time); + if (FILE_EXISTS(filename)) + return FALSE; + if (src->bpp == 8 && src->palette) { if (!ss_screenshot_8bit(filename, src)) From d2db12f2af1347be19e8d38318f523d7512615ea Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:39:53 +0200 Subject: [PATCH 1337/1724] Revert "only lock cursor if message was removed" This reverts commit 8a6f94ae95b2b91d8b3b249bca32beaabb5d5719. --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 019f2da..7bb85c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -631,7 +631,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) + if (!g_config.devmode && !g_mouse_locked) { InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -693,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); } return result; From 691b5196d564ec007d9a08495e446883ca5420ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:05 +0200 Subject: [PATCH 1338/1724] Revert "return WM_NULL if there are no filters" This reverts commit e4eafef6526426f99c185b0d138fc8f031a8426c. --- src/winapi_hooks.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7bb85c0..45076a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,7 +598,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +void HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { @@ -638,13 +638,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa mouse_lock(); - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - } - + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } @@ -667,13 +661,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - } - + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } @@ -693,7 +681,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); + HandleMessage(lpMsg, hWnd); } return result; @@ -707,7 +695,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + HandleMessage(lpMsg, hWnd); } return result; From 4df4766736411417b58acdd218d6a29e28b28380 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:13 +0200 Subject: [PATCH 1339/1724] Revert "remove old diablo 2 hack" This reverts commit df91a4308f380b45938dfd2e190fe17b55823c9d. --- src/winapi_hooks.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 45076a3..1083f4a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -414,6 +414,20 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); + if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) + { + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + if (g_config.adjmouse) + { + x = (int)(roundf(x * g_ddraw.mouse.scale_x)); + y = (int)(roundf(y * g_ddraw.mouse.scale_y)); + } + + lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); + } + if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; From cdb68e9dd1ee641750cb60d3dc553ca67c526aa3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:27 +0200 Subject: [PATCH 1340/1724] Revert "do not return WM_NULL for now (needs more testing)" This reverts commit a42bdae84d2129a0d91eaa225b3e2b46f419b392. --- src/winapi_hooks.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1083f4a..f931f96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { @@ -652,8 +652,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - break; + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); } break; @@ -675,12 +674,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + break; } } From 801d31f68e3e618fa2a4845fd53e554134a77fa8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:35 +0200 Subject: [PATCH 1341/1724] Revert "don't update cursor pos in mouse hook" This reverts commit c1a5a3895b53462bb5fa8feac57a1b240538e780. --- src/mouse.c | 3 +++ src/winapi_hooks.c | 4 ---- src/wndproc.c | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index 3e0d0ac..df05989 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -168,6 +168,9 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) x = min(x, g_ddraw.width - 1); y = min(y, g_ddraw.height - 1); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + msg->lParam = MAKELPARAM(x, y); break; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f931f96..a7e22cc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -675,12 +675,8 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - break; } - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - break; } } diff --git a/src/wndproc.c b/src/wndproc.c index c0993b1..cc87bd2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -816,9 +816,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); - break; } case WM_PARENTNOTIFY: From 7de3efd050310e802a1a676474d6b18ff1c84652 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:44 +0200 Subject: [PATCH 1342/1724] Revert "never return FALSE from peekmessage to avoid issues" This reverts commit 89d38454733b115f743c98a94922bb5f2527830f. --- src/winapi_hooks.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a7e22cc..8d8d8b5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd) +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { @@ -637,7 +637,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) } if (lpMsg->hwnd != g_ddraw.hwnd) - return; + return TRUE; switch (LOWORD(lpMsg->message)) { @@ -653,6 +653,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; } break; @@ -675,12 +676,15 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; } break; } } } + + return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -705,7 +709,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd); + return HandleMessage(lpMsg, hWnd); } return result; From 8b96d0d34b2b57df996c01ee80be14dc75af65d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:52 +0200 Subject: [PATCH 1343/1724] Revert "fix ja2 cursor lock" This reverts commit 48151e4d78489cd947c689bb6a2838bad48f03b4. --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8d8d8b5..2dc5fe4 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { From 8425f81597b6ec480bf4a041f9152f71e0fb0060 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:41:04 +0200 Subject: [PATCH 1344/1724] Revert "remove obsolete settings" This reverts commit 97718b9a19be15990cdad4d0d9e8f94eb34e08b1. --- inc/config.h | 2 ++ src/config.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/inc/config.h b/inc/config.h index 7dd8a23..593130a 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,6 +57,8 @@ typedef struct CNCDDRAWCONFIG BOOL singlecpu; int resolutions; int fixchilds; + BOOL hook_peekmessage; + BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index a5e5d3a..ad395fa 100644 --- a/src/config.c +++ b/src/config.c @@ -67,6 +67,8 @@ void cfg_load() GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); + GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); + GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -298,6 +300,10 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" + "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" + "hook_peekmessage=false\n" + "hook_getmessage=false\n" + "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" "releasealt=false\n" @@ -477,6 +483,7 @@ static void cfg_create_ini() "\n" "; Axis & Allies\n" "[AxisAllies]\n" + "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" "; Barney - Secret of the Rainbow\n" @@ -820,6 +827,7 @@ static void cfg_create_ini() "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" + "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" "adjmouse=true\n" @@ -834,10 +842,18 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Enemy Infestation\n" + "[EI]\n" + "hook_getmessage=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" "\n" + "; Final Liberation: Warhammer Epic 40000\n" + "[Epic40k]\n" + "hook_peekmessage=true\n" + "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "nonexclusive=true\n" @@ -1102,6 +1118,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Lionheart\n" + "[Lionheart]\n" + "hook_peekmessage=true\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1158,6 +1178,7 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" + "hook_peekmessage=true\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" @@ -1378,6 +1399,10 @@ static void cfg_create_ini() "[StarCraft]\n" "game_handles_close=true\n" "\n" + "; Space Rangers\n" + "[Rangers]\n" + "hook_peekmessage=true\n" + "\n" "; SPYFox: Hold the Mustard\n" "[mustard]\n" "renderer=gdi\n" From efbf7e7b30794d74bd6606dc6dd49a193b87a951 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:41:29 +0200 Subject: [PATCH 1345/1724] Revert "remove debug code" This reverts commit 75ed1595c6288a55e0d7ba4410c169a7e1c3b445. --- src/dd.c | 2 ++ src/winapi_hooks.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 1ec2bef..fee3a21 100644 --- a/src/dd.c +++ b/src/dd.c @@ -993,6 +993,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } + TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2dc5fe4..33ee191 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,6 +647,8 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (!g_config.devmode && !g_mouse_locked) { + TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -681,6 +683,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) break; } + } } From c13aece3f6b00a7d83d2a2c88d0c2e83f0c5e7ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:42:00 +0200 Subject: [PATCH 1346/1724] Revert "fix window resize/move issues" This reverts commit 04d7f2060e900c66c3c8a5e285a078c1d8d20509. --- src/mouse.c | 66 +++++++++++++++++++++++++++++++- src/winapi_hooks.c | 94 +--------------------------------------------- src/wndproc.c | 37 ------------------ 3 files changed, 67 insertions(+), 130 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index df05989..cbb976b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -115,16 +115,74 @@ void mouse_unlock() LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) { + if (code < 0 || !lParam || !g_ddraw.width) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + MSG* msg = (MSG*)lParam; - if (code < 0 || !g_ddraw.width || !msg || msg->hwnd != g_ddraw.hwnd) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) + { + int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + msg->pt.x = min(x, g_ddraw.width - 1); + msg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (msg->hwnd != g_ddraw.hwnd) return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); switch (LOWORD(msg->message)) { + /* button up messages reactivate cursor lock */ case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(msg->lParam); + int y = GET_Y_LPARAM(msg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ case WM_XBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: @@ -138,6 +196,12 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { + if (!g_config.devmode && !g_mouse_locked) + { + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + if (LOWORD(msg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33ee191..b51731b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,96 +612,12 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) -{ - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (lpMsg->hwnd != g_ddraw.hwnd) - return TRUE; - - switch (LOWORD(lpMsg->message)) - { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - - mouse_lock(); - - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; - } - - break; - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - // Does not work with 'New Robinson' - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; - } - - break; - } - - } - } - - return TRUE; -} - BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result) - { - HandleMessage(lpMsg, hWnd); - } - - return result; + return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -709,13 +625,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result) - { - return HandleMessage(lpMsg, hWnd); - } - - return result; + return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index cc87bd2..030751e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -781,43 +781,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); - - mouse_lock(); - return 0; - } - - break; - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - return 0; - } - - break; - } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 5af1d683d8d4becb3e5cdc7bd3a43ad0af8cf0ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:42:14 +0200 Subject: [PATCH 1347/1724] Revert "add experimental WH_GETMESSAGE hook" This reverts commit dcc76a154dec7dd35e4299c0e77a58efdfbf3d8a. --- inc/mouse.h | 5 +- src/dd.c | 3 - src/dllmain.c | 2 - src/mouse.c | 171 ++------------------------------------------- src/winapi_hooks.c | 168 +++++++++++++++++++++++++++++++++++++++++++- src/wndproc.c | 94 ++++++++++++++++++++++++- 6 files changed, 264 insertions(+), 179 deletions(-) diff --git a/inc/mouse.h b/inc/mouse.h index 65ef0da..1181ac2 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -1,12 +1,9 @@ #ifndef MOUSE_H #define MOUSE_H -void mouse_hook_init(); -void mouse_hook_exit(); void mouse_lock(); void mouse_unlock(); -LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; diff --git a/src/dd.c b/src/dd.c index fee3a21..e9ae3d7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -993,8 +993,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; @@ -1372,7 +1370,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); keyboard_hook_init(); - mouse_hook_init(); if (!g_ddraw.render.hdc) { diff --git a/src/dllmain.c b/src/dllmain.c index fa8e2d1..76090f9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -13,7 +13,6 @@ #include "utils.h" #include "versionhelpers.h" #include "keyboard.h" -#include "mouse.h" /* export for cncnet cnc games */ @@ -141,7 +140,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); keyboard_hook_exit(); - mouse_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/mouse.c b/src/mouse.c index cbb976b..46aca13 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -1,45 +1,15 @@ #include -#include -#include #include "debug.h" #include "winapi_hooks.h" #include "dd.h" #include "hook.h" #include "utils.h" #include "config.h" -#include "mouse.h" BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; -static HHOOK g_mouse_gm_hook; - -void mouse_hook_init() -{ - if (g_mouse_gm_hook && UnhookWindowsHookEx(g_mouse_gm_hook)) - { - g_mouse_gm_hook = NULL; - } - - if (!g_ddraw.gui_thread_id) - return; - - g_mouse_gm_hook = - real_SetWindowsHookExA( - WH_GETMESSAGE, - mouse_gm_hook_proc, - NULL, - g_ddraw.gui_thread_id); -} - -void mouse_hook_exit() -{ - if (g_mouse_gm_hook) - { - UnhookWindowsHookEx(g_mouse_gm_hook); - } -} void mouse_lock() { @@ -113,146 +83,15 @@ void mouse_unlock() } } -LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) -{ - if (code < 0 || !lParam || !g_ddraw.width) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - - MSG* msg = (MSG*)lParam; - - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) - { - int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - msg->pt.x = min(x, g_ddraw.width - 1); - msg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (msg->hwnd != g_ddraw.hwnd) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - - switch (LOWORD(msg->message)) - { - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(msg->lParam); - int y = GET_Y_LPARAM(msg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - - if (LOWORD(msg->message) == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - msg->lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(msg->lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(msg->lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - msg->lParam = MAKELPARAM(x, y); - - break; - } - } - - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); -} - -LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) { if (!g_ddraw.ref) - return g_mouse_proc(code, wParam, lParam); + return g_mouse_proc(Code, wParam, lParam); - if (code < 0 || (!g_config.devmode && !g_mouse_locked)) - return CallNextHookEx(g_mouse_hook, code, wParam, lParam); + if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) + return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); - return g_mouse_proc(code, wParam, lParam); + return g_mouse_proc(Code, wParam, lParam); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b51731b..68dc9dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,12 +612,146 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +{ + if (g_ddraw.ref && g_ddraw.width) + { + switch (lpMsg->message) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(lpMsg->lParam); + int y = GET_Y_LPARAM(lpMsg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + //return FALSE; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + // Does not work with 'New Robinson' + //return FALSE; + } + + if (lpMsg->message == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + lpMsg->lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + lpMsg->lParam = MAKELPARAM(x, y); + + lpMsg->pt.x = x; + lpMsg->pt.y = y; + + break; + } + + } + } + + return TRUE; +} + BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (g_config.hook_getmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + } + + return result; } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -625,7 +759,37 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (g_config.hook_peekmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + } + + return result; } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 030751e..0d65fce 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) + uMsg != WM_D3D9DEVICELOST) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,7 +42,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { - case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -781,6 +780,97 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + return 0; + } + + if (uMsg == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + lParam = MAKELPARAM(x, y); + + break; + } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From ae66bebb318137137042b837c1ae871e52a3a950 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 17:15:02 +0200 Subject: [PATCH 1348/1724] enable a few more hooks for hook=2 --- src/hook.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index d71bf72..c10430d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -156,8 +156,8 @@ HOOKLIST g_hook_hooklist[] = { "WING32.DLL", { - { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, HOOK_SKIP_2 }, - { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, HOOK_SKIP_2 }, + { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, 0 }, + { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, 0 }, { "", NULL, NULL, 0 } } }, @@ -169,9 +169,9 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, - { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, HOOK_SKIP_2 }, - { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, HOOK_SKIP_2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 0 }, + { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, 0 }, + { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, 0 }, #if defined(_DEBUG) && defined(__GNUC__) { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, #endif From 7d3a07b2e7d3bc0142d8c441006f8d130266cc5b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 17:54:26 +0200 Subject: [PATCH 1349/1724] update compat warning text --- src/dllmain.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 76090f9..ba25edc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -66,13 +66,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) { - char mes[128] = { 0 }; + char mes[280] = { 0 }; _snprintf( mes, sizeof(mes) - 1, - "Please disable the '%s' compatibility mode for all game executables and " - "then try to start the game again.", + "Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " + "disable the '%s' compatibility mode for all game executables and then start the game again.\n\n" + "Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'", s); if (!g_config.no_compat_warning) From 2353363e6d7ae201d08f85d5daf15aa64575a429 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 14:38:56 +0200 Subject: [PATCH 1350/1724] update madeline presets --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index ad395fa..f20e8cb 100644 --- a/src/config.c +++ b/src/config.c @@ -1132,6 +1132,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Madeline 1st Grade Math: Progress Report\n" "[madpr]\n" @@ -1143,6 +1146,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Madeline 2nd Grade Math\n" "[madmath2]\n" @@ -1154,6 +1160,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Majesty Gold\n" "[Majesty]\n" From a9f0b8f8f53530136e62dc9c868138129752eeb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 15:47:31 +0200 Subject: [PATCH 1351/1724] don't let messages pass through with peek/getmessage hooks --- src/winapi_hooks.c | 26 ++++++++++++++++++-------- src/wndproc.c | 3 ++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 68dc9dd..c6efbf5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { if (g_ddraw.ref && g_ddraw.width) { @@ -645,7 +645,14 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); - //return FALSE; + + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = WM_NULL; + break; + } } /* fall through for lParam */ } @@ -666,7 +673,13 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //return FALSE; + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = WM_NULL; + break; + } } if (lpMsg->message == WM_MOUSEWHEEL) @@ -709,11 +722,8 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa break; } - } } - - return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -747,7 +757,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (g_config.hook_getmessage) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } } @@ -785,7 +795,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_config.hook_peekmessage) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } } diff --git a/src/wndproc.c b/src/wndproc.c index 0d65fce..811bef3 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST) + uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,6 +42,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { + case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: From cd021dc090380effcd0fd5a82fff570a101b59e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 16:16:59 +0200 Subject: [PATCH 1352/1724] merge PeekMessage and GetMessage hooks --- inc/config.h | 1 - src/config.c | 6 ++-- src/winapi_hooks.c | 88 ++++++++++++++++------------------------------ 3 files changed, 33 insertions(+), 62 deletions(-) diff --git a/inc/config.h b/inc/config.h index 593130a..8660c49 100644 --- a/inc/config.h +++ b/inc/config.h @@ -58,7 +58,6 @@ typedef struct CNCDDRAWCONFIG int resolutions; int fixchilds; BOOL hook_peekmessage; - BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index f20e8cb..950d18f 100644 --- a/src/config.c +++ b/src/config.c @@ -68,7 +68,6 @@ void cfg_load() GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -300,9 +299,8 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" + "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" "hook_peekmessage=false\n" - "hook_getmessage=false\n" "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" @@ -844,7 +842,7 @@ static void cfg_create_ini() "\n" "; Enemy Infestation\n" "[EI]\n" - "hook_getmessage=true\n" + "hook_peekmessage=true\n" "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c6efbf5..ed4648c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,15 +614,38 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { - if (g_ddraw.ref && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - switch (lpMsg->message) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (lpMsg->hwnd != g_ddraw.hwnd || !g_config.hook_peekmessage) + return; + + switch (LOWORD(lpMsg->message)) { case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) { int x = GET_X_LPARAM(lpMsg->lParam); int y = GET_Y_LPARAM(lpMsg->lParam); @@ -672,7 +695,6 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa { if (!g_config.devmode && !g_mouse_locked) { - // Does not work with 'New Robinson' if (!wMsgFilterMin && !wMsgFilterMax && !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) @@ -682,7 +704,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa } } - if (lpMsg->message == WM_MOUSEWHEEL) + if (LOWORD(lpMsg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; real_ScreenToClient(g_ddraw.hwnd, &pt); @@ -732,33 +754,9 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (result) { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); - } + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } return result; @@ -770,33 +768,9 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (result) { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - } + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } return result; From cbecc7e2cf61e080bcb352fec8b8fec725059abc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 16:59:21 +0200 Subject: [PATCH 1353/1724] improve "fixnotresponding" patch --- src/ddsurface.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 121f8fb..38a5d48 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -57,9 +57,13 @@ HRESULT dds_Blt( !IsWine()) { /* workaround for "Not Responding" window problem */ - g_ddraw.last_msg_pull_tick = timeGetTime(); + //g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } } if (g_ddraw.ref && @@ -1001,9 +1005,13 @@ HRESULT dds_Lock( !IsWine()) { /* workaround for "Not Responding" window problem */ - g_ddraw.last_msg_pull_tick = timeGetTime(); + //g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); From e0292792c0ef0701165bc85be0d9c7d8888b7390 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 17:05:00 +0200 Subject: [PATCH 1354/1724] update robin hood presets --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index 950d18f..c0d0a05 100644 --- a/src/config.c +++ b/src/config.c @@ -1361,14 +1361,17 @@ static void cfg_create_ini() "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" From 8ff40f986cf5fa0ee31129949627be7125e467d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 18:01:21 +0200 Subject: [PATCH 1355/1724] remove duplicate code --- inc/utils.h | 1 + src/ddsurface.c | 33 +++------------------------------ src/utils.c | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index beb1c57..7f7b670 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,6 +6,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +void util_pull_messages(); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_is_bad_read_ptr(void* p); diff --git a/src/ddsurface.c b/src/ddsurface.c index 38a5d48..2f87cf0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -12,6 +12,7 @@ #include "blt.h" #include "config.h" #include "ddclipper.h" +#include "utils.h" #include "versionhelpers.h" @@ -50,21 +51,7 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_config.fixnotresponding && - g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && - GetCurrentThreadId() == g_ddraw.gui_thread_id && - !IsWine()) - { - /* workaround for "Not Responding" window problem */ - //g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } - } + util_pull_messages(); if (g_ddraw.ref && g_ddraw.iskkndx && @@ -998,21 +985,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_config.fixnotresponding && - g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && - GetCurrentThreadId() == g_ddraw.gui_thread_id && - !IsWine()) - { - /* workaround for "Not Responding" window problem */ - //g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } - } + util_pull_messages(); HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); diff --git a/src/utils.c b/src/utils.c index ee7b8cd..6856ee0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -10,6 +10,7 @@ #include "render_d3d9.h" #include "utils.h" #include "config.h" +#include "versionhelpers.h" /* @@ -69,6 +70,26 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +void util_pull_messages() +{ + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) + { + /* workaround for "Not Responding" window problem */ + //g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + } +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From 52c536d5c37ddd96a29602741f3e9c404704eacf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 19:49:04 +0200 Subject: [PATCH 1356/1724] log lpbIsInVB bool --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index e9ae3d7..fb2fa5b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -612,6 +612,8 @@ HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) *lpbIsInVB = TRUE; } + TRACE(" lpbIsInVB = %s\n", *lpbIsInVB ? "TRUE" : "FALSE"); + return DD_OK; } From a7df3a86ea31b8f40b91797efd0993ad67b77e6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 20:06:12 +0200 Subject: [PATCH 1357/1724] revert change --- src/utils.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 6856ee0..af90a1c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -74,7 +74,6 @@ void util_pull_messages() { if (g_config.fixnotresponding && g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) From 12c23d494e03765d03dacbd13dc68e18ef5dda12 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 17:02:11 +0200 Subject: [PATCH 1358/1724] sort config.c --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index c0d0a05..0bc89d8 100644 --- a/src/config.c +++ b/src/config.c @@ -52,6 +52,8 @@ void cfg_load() GET_INT(g_config.save_settings, "savesettings", 1); GET_BOOL(g_config.resizable, "resizable", TRUE); GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); + GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); + GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -84,9 +86,7 @@ void cfg_load() GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); - GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); - GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); From 43eadc53b0cf5ae6036d0bf9774010412b97b06f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 17:48:51 +0200 Subject: [PATCH 1359/1724] update comment --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0bc89d8..a352afa 100644 --- a/src/config.c +++ b/src/config.c @@ -299,7 +299,7 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" + "; Enable the following setting if your cursor doesn't lock to the window or it doesn't work properly when upscaling is enabled\n" "hook_peekmessage=false\n" "\n" "\n" From f690749ca917887d0561bac0e61e879b499802a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 18:11:08 +0200 Subject: [PATCH 1360/1724] cleanup settings names/order --- inc/config.h | 16 +++++------ src/config.c | 71 +++++++++++++++++++++++----------------------- src/utils.c | 2 +- src/winapi_hooks.c | 2 +- src/wndproc.c | 4 +-- 5 files changed, 47 insertions(+), 48 deletions(-) diff --git a/inc/config.h b/inc/config.h index 8660c49..ecb96aa 100644 --- a/inc/config.h +++ b/inc/config.h @@ -61,26 +61,25 @@ typedef struct CNCDDRAWCONFIG /* Undocumented settings */ - BOOL releasealt; - BOOL fixnotresponding; - int hook; + BOOL fix_alt_key_stuck; + BOOL fix_not_responding; + BOOL no_compat_warning; + BOOL wine_allow_resize; int guard_lines; int max_resolutions; BOOL lock_surfaces; BOOL flipclear; - BOOL fixmousehook; BOOL rgb555; BOOL no_dinput_hook; - int refresh_rate; char inject_resolution[128]; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; - BOOL wine_allow_resize; BOOL lock_mouse_top_left; - BOOL no_compat_warning; - BOOL remove_menu; char win_version[32]; + int hook; + BOOL remove_menu; + int refresh_rate; /* Hotkeys */ @@ -103,6 +102,7 @@ typedef struct CNCDDRAWCONFIG BOOL tlc_hack; BOOL homm_hack; BOOL carma95_hack; + BOOL sirtech_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a352afa..10dd700 100644 --- a/src/config.c +++ b/src/config.c @@ -70,30 +70,29 @@ void cfg_load() GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ - GET_BOOL(g_config.releasealt, "releasealt", FALSE); + GET_BOOL(g_config.fix_alt_key_stuck, "fix_alt_key_stuck", FALSE); GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); - GET_BOOL(g_config.fixnotresponding, "fixnotresponding", FALSE); - GET_INT(g_config.hook, "hook", 4); + GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); + GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.flipclear, "flipclear", FALSE); - GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_INT(g_config.refresh_rate, "refresh_rate", 0); GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); - GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); - GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); + GET_INT(g_config.hook, "hook", 4); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); + GET_INT(g_config.refresh_rate, "refresh_rate", 0); /* Hotkeys */ @@ -113,6 +112,7 @@ void cfg_load() GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); + GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -303,28 +303,27 @@ static void cfg_create_ini() "hook_peekmessage=false\n" "\n" "\n" - "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" - "releasealt=false\n" + "; Undocumented compatibility settings - These will probably not solve your problem, you should rather focus on the settings above\n" + "fix_alt_key_stuck=false\n" "game_handles_close=false\n" - "fixnotresponding=false\n" - "hook=4\n" + "fix_not_responding=false\n" + "no_compat_warning=false\n" + "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" "flipclear=false\n" - "fixmousehook=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - "refresh_rate=0\n" ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" - "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" - "no_compat_warning=false\n" - "remove_menu=false\n" ";win_version=95\n" + "hook=4\n" + "remove_menu=false\n" + "refresh_rate=0\n" "\n" "\n" "\n" @@ -833,7 +832,7 @@ static void cfg_create_ini() "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Emperor: Rise of the Middle Kingdom\n" "[Emperor]\n" @@ -896,7 +895,7 @@ static void cfg_create_ini() "\n" "; Glover\n" "[glover]\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; G-Police\n" "[GPOLICE]\n" @@ -1010,32 +1009,32 @@ static void cfg_create_ini() "; Jagged Alliance 2\n" "[ja2]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2: Unfinished Business\n" "[JA2UB]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jedi Knight Dark Forces 2\n" "[JK]\n" @@ -1180,7 +1179,7 @@ static void cfg_create_ini() "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" - "releasealt=true\n" + "fix_alt_key_stuck=true\n" "\n" "; New Robinson\n" "[ROBY]\n" @@ -1361,17 +1360,17 @@ static void cfg_create_ini() "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" @@ -1512,7 +1511,7 @@ static void cfg_create_ini() "\n" "; The Jungle Book Groove Party\n" "[Jungle_vr]\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" @@ -1574,8 +1573,8 @@ static void cfg_create_ini() "\n" "; Wizardry 8\n" "[Wiz8]\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Worms 2\n" "[worms2]\n" diff --git a/src/utils.c b/src/utils.c index af90a1c..e363c72 100644 --- a/src/utils.c +++ b/src/utils.c @@ -72,7 +72,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) void util_pull_messages() { - if (g_config.fixnotresponding && + if (g_config.fix_not_responding && g_ddraw.hwnd && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ed4648c..75e6e73 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -596,7 +596,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return NULL; } - if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.fixmousehook) + if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.sirtech_hack) { g_mouse_proc = lpfn; return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); diff --git a/src/wndproc.c b/src/wndproc.c index 811bef3..eecba37 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -675,7 +675,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam && g_config.releasealt) + if (wParam && g_config.fix_alt_key_stuck) { INPUT ip; memset(&ip, 0, sizeof(ip)); @@ -707,7 +707,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; } - if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + if (wParam && g_ddraw.alt_key_down && !g_config.fix_alt_key_stuck) { PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); g_ddraw.alt_key_down = FALSE; From 9dbafc1660db770473e208cb06fc4ac67d49ae84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 19:45:25 +0200 Subject: [PATCH 1361/1724] adjust warning message --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index ba25edc..90f408b 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -72,7 +72,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) mes, sizeof(mes) - 1, "Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " - "disable the '%s' compatibility mode for all game executables and then start the game again.\n\n" + "disable the '%s' compatibility mode for all game executables.\n\n" "Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'", s); From a690a9233ed1f39291a236ca7d23a3a9f07884e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 20:08:53 +0200 Subject: [PATCH 1362/1724] update Jungle Storm preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 10dd700..1656c95 100644 --- a/src/config.c +++ b/src/config.c @@ -941,6 +941,7 @@ static void cfg_create_ini() "; Jungle Storm\n" "[Jstorm]\n" "no_compat_warning=true\n" + "win_version=98\n" "\n" "; Hades Challenge\n" "[HADESCH]\n" From da2672e231f2319d9bceded04d767741908de3e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 12:34:22 +0200 Subject: [PATCH 1363/1724] fix build on windows --- Makefile | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 52c5804..2ac97d8 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,18 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") -BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) -EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) +COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) +BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) + +CMDTEST := $(shell echo \"\") +ifeq ($(CMDTEST),\"\") +# Windows +ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) +EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) +else +ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) +EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) +endif CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres @@ -30,4 +38,4 @@ $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) clean: - $(RM) $(TARGET) $(OBJS) + $(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS)) From 128a4b95f119e724bdbf821a79fca1ac3a8740d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:01:14 +0200 Subject: [PATCH 1364/1724] add comment --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2ac97d8..38ab41c 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ ifeq ($(CMDTEST),\"\") ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else +# Either *nix or Windows with sh.exe (e.g. w64devkit) ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) endif From 01b1ff62e5ac225ddda08e100834014ea34b96ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:54:45 +0200 Subject: [PATCH 1365/1724] fix build with gmake and old win-builds --- Makefile | 21 ++++++++++++++------- inc/debug.h | 8 +------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 38ab41c..3abf9f9 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ TARGET = ddraw.dll LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared -CFLAGS = -Iinc -O2 -march=i486 -Wall +CFLAGS = -Iinc -O2 -march=i486 -Wall -std=c99 LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) @@ -10,13 +10,20 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) CMDTEST := $(shell echo \"\") ifeq ($(CMDTEST),\"\") -# Windows -ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) -EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + # Windows + CMDTEST := $(shell echo "\#") + ifeq ($(CMDTEST),"\#") + # gmake + ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + else + ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + endif else -# Either *nix or Windows with sh.exe (e.g. w64devkit) -ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) -EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) + # Either *nix or Windows with BusyBox (e.g. w64devkit) + ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) endif CC = i686-w64-mingw32-gcc diff --git a/inc/debug.h b/inc/debug.h index 6ac7f7b..be19a05 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,13 +28,7 @@ void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); - -void __cdecl dbg_invoke_watson( - _In_opt_z_ wchar_t const*, - _In_opt_z_ wchar_t const*, - _In_opt_z_ wchar_t const*, - _In_ unsigned int, - _In_ uintptr_t); +void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; From a157e1210fd9345718bbe98240d73dc32c352205 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:55:24 +0200 Subject: [PATCH 1366/1724] align with tab --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3abf9f9..8a4e566 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ ifeq ($(CMDTEST),\"\") # gmake ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - else + else ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) endif From 1b017c05178fbf36a711da893a2ff0598727782d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:56:00 +0200 Subject: [PATCH 1367/1724] align with tab --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8a4e566..1531e3a 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ ifeq ($(CMDTEST),\"\") # Windows CMDTEST := $(shell echo "\#") ifeq ($(CMDTEST),"\#") - # gmake + # gmake ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else From 0a4f8a7c7c9908679638225f69c212a3d3174288 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 15:35:27 +0200 Subject: [PATCH 1368/1724] use quotes --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1531e3a..92c2d0e 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ ifeq ($(CMDTEST),\"\") endif else # Either *nix or Windows with BusyBox (e.g. w64devkit) - ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) - EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) + ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif CC = i686-w64-mingw32-gcc From 19ad4bb2353ba473e887426e0c096c309940e6eb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 15:42:29 +0200 Subject: [PATCH 1369/1724] simplify makefile --- Makefile | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 92c2d0e..f485e13 100644 --- a/Makefile +++ b/Makefile @@ -11,15 +11,9 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) CMDTEST := $(shell echo \"\") ifeq ($(CMDTEST),\"\") # Windows - CMDTEST := $(shell echo "\#") - ifeq ($(CMDTEST),"\#") - # gmake - ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) - EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - else - ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) - EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - endif + HASH := \# + ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else # Either *nix or Windows with BusyBox (e.g. w64devkit) ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) From 5901d125977d979f650e67b16d1ae0d9a3666408 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Sep 2024 19:30:42 +0200 Subject: [PATCH 1370/1724] log DI GUID --- src/directinput.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 358374b..d3f08f6 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -133,9 +133,14 @@ static HRESULT WINAPI fake_di_CreateDevice( if (SUCCEEDED(result)) { - if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) + if (rguid) { - g_mouse_device = *lplpDIDevice; + TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); + + if (IsEqualGUID(&GUID_SysMouse, rguid)) + { + g_mouse_device = *lplpDIDevice; + } } if (!real_did_SetCooperativeLevel) @@ -173,9 +178,14 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (SUCCEEDED(result)) { - if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) + if (rguid) { - g_mouse_device = *lplpDIDevice; + TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); + + if (IsEqualGUID(&GUID_SysMouse, rguid)) + { + g_mouse_device = *lplpDIDevice; + } } if (!real_did_SetCooperativeLevel) From e142d0694662ef0aa176466015eb1a1b3ff6faf9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 17:59:34 +0200 Subject: [PATCH 1371/1724] remove invalid ExStyle --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 75e6e73..96f6d0f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1826,6 +1826,13 @@ HWND WINAPI fake_CreateWindowExA( hWndParent = g_ddraw.hwnd; } + /* A Bug's Life Action Game */ + //HIWORD(lpClassName) && _strcmpi(lpClassName, "Bugs") == 0 && + if (dwExStyle == 0x01000008) + { + dwExStyle = WS_EX_TOPMOST; + } + /* Fix for SMACKW32.DLL creating another window that steals the focus */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) { From 3a3f11afc86e5661adfcdd97043d963f74c9cd1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 18:02:15 +0200 Subject: [PATCH 1372/1724] return S_OK in IDirect3DX__EnumDevices --- src/IDirect3D/IDirect3D.c | 2 +- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/IDirect3D/IDirect3D7.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 0aaa1e8..f6b075e 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -54,7 +54,7 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 50ae5ec..c387d2a 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 9cc65bd..72429c8 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 5d64fc6..35aa353 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From a8aeee1bc3b66fbac9b7006ee4d6500a904cc30f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 18:06:53 +0200 Subject: [PATCH 1373/1724] add preset for A Bug's Life Action Game --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 1656c95..7aebc2d 100644 --- a/src/config.c +++ b/src/config.c @@ -483,6 +483,10 @@ static void cfg_create_ini() "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" + "; A Bug's Life Action Game\n" + "[bugs]\n" + "fix_not_responding=true\n" + "\n" "; Barney - Secret of the Rainbow\n" "[Barney]\n" "adjmouse=false\n" From 5d527ca8e060e8c23b0c318119b0f9fd1f3bb7de Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:33:01 +0200 Subject: [PATCH 1374/1724] make sure the close button is enabled --- src/dd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index fb2fa5b..3d160e6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1025,7 +1025,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } - //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) @@ -1057,6 +1057,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.hwnd, GWL_STYLE, (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); + + DWORD class_sytle = GetClassLongA(g_ddraw.hwnd, GCL_STYLE); + if (class_sytle & CS_NOCLOSE) + { + SetClassLongA(g_ddraw.hwnd, GCL_STYLE, class_sytle & ~CS_NOCLOSE); + } } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From 7fe9f3f2fa5807108b2a6b2c0c4d5f0f33355810 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:37:24 +0200 Subject: [PATCH 1375/1724] disable debug code --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3d160e6..9aa286f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1025,7 +1025,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } - dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) From 66e8d1676ffa7a2e274b81db677b4a852b157c9f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:52:06 +0200 Subject: [PATCH 1376/1724] make sure we don't reset last_msg_pull_tick --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 9aa286f..b6d94a6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1031,7 +1031,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (g_ddraw.last_msg_pull_tick && + if (!g_config.fix_not_responding && + g_ddraw.last_msg_pull_tick && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) From 6977fccdbef94c1942015f88fd446b1c6c9b6a56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 17:58:35 +0200 Subject: [PATCH 1377/1724] add hack for Flight Simulator 98 --- inc/config.h | 1 + src/config.c | 11 ++++++++++- src/dllmain.c | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index ecb96aa..bdb7d9b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -103,6 +103,7 @@ typedef struct CNCDDRAWCONFIG BOOL homm_hack; BOOL carma95_hack; BOOL sirtech_hack; + BOOL flightsim98_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 7aebc2d..b8eaa73 100644 --- a/src/config.c +++ b/src/config.c @@ -113,7 +113,8 @@ void cfg_load() GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); - + GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GameHandlesClose = GameHandlesClose || g_config.infantryhack; if (g_config.lock_mouse_top_left) @@ -847,6 +848,14 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; Flight Simulator 98\n" + "[FLTSIM95]\n" + "flightsim98_hack=true\n" + "\n" + "; Flight Simulator 98\n" + "[FLTSIM98]\n" + "flightsim98_hack=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" diff --git a/src/dllmain.c b/src/dllmain.c index 90f408b..d025eaf 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -177,7 +177,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk HRESULT ret; - if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) { if (lplpDD) *lplpDD = NULL; @@ -222,7 +222,7 @@ HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnk HRESULT ret; - if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) { if (lplpDD) *lplpDD = NULL; From 892494718a83abdfcd6f3a89ba7c887d5d10fbc7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 19:16:37 +0200 Subject: [PATCH 1378/1724] log BuildLabEx if available --- src/debug.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index c5f0507..5ee790e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -175,7 +175,11 @@ void dbg_init() char build[256] = { 0 }; DWORD build_size = sizeof(build); - RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) + { + build_size = sizeof(build); + RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + } TRACE("%s %s (%s)\n", name, dversion, build); From 9a308dcf1b89653c865f0c7fbce8d52acc046035 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 19:42:27 +0200 Subject: [PATCH 1379/1724] add timestamp to logs --- inc/utils.h | 1 + src/debug.c | 11 +++++++++++ src/dllmain.c | 1 - src/utils.c | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/inc/utils.h b/inc/utils.h index 7f7b670..c710966 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -7,6 +7,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); void util_pull_messages(); +DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_is_bad_read_ptr(void* p); diff --git a/src/debug.c b/src/debug.c index 5ee790e..a2f2213 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -11,6 +12,8 @@ #include "version.h" #include "git.h" #include "versionhelpers.h" +#include "utils.h" +#include "dllmain.h" double g_dbg_frame_time = 0; @@ -159,6 +162,8 @@ void dbg_init() GIT_COMMIT, GIT_BRANCH); + TRACE("cnc-ddraw = %p\n", g_ddraw_module); + HKEY hkey; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); @@ -196,6 +201,12 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } + + DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); + if (timestamp) + { + TRACE("timestamp = %s", _ctime32((const long*)×tamp)); + } } } diff --git a/src/dllmain.c b/src/dllmain.c index d025eaf..3956081 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -42,7 +42,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); - TRACE("cnc-ddraw = %p\n", hDll); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif diff --git a/src/utils.c b/src/utils.c index e363c72..3f22bb7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -89,6 +89,22 @@ void util_pull_messages() } } +DWORD util_get_timestamp(HMODULE mod) +{ + if (!mod || mod == INVALID_HANDLE_VALUE) + return 0; + + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + return 0; + + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + if (nt_headers->Signature != IMAGE_NT_SIGNATURE) + return 0; + + return nt_headers->FileHeader.TimeDateStamp; +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From ee013edd32230e7d7255df131a717751c0213de4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 20:11:22 +0200 Subject: [PATCH 1380/1724] upate GirlTalk preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index b8eaa73..deabcf0 100644 --- a/src/config.c +++ b/src/config.c @@ -940,6 +940,7 @@ static void cfg_create_ini() "; Girl Talk\n" "[GirlTalk]\n" "resolutions=2\n" + "game_handles_close=true\n" "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" From a902db06e9830a9feafda69da05c766a81722b9b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 20:45:21 +0200 Subject: [PATCH 1381/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 9fef507..9fc7cbf 100644 --- a/inc/version.h +++ b/inc/version.h @@ -6,9 +6,9 @@ #define git_str(a) str(a) #define VERSION_MAJOR 6 -#define VERSION_MINOR 8 +#define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 3c27c903ebdaa934d6b1ed625c6c8efe26892fcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 22:16:23 +0200 Subject: [PATCH 1382/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 9fc7cbf..8168d91 100644 --- a/inc/version.h +++ b/inc/version.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From c0eee0938bf51af6bc555983e903e103560db7fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 22:22:22 +0200 Subject: [PATCH 1383/1724] Update build.yml --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed50b00..34c8dce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ on: push: branches: - 'master' - - 'develop' - 'github-action' jobs: @@ -152,4 +151,4 @@ jobs: tag_name: experimental files: cnc-ddraw-experimental/* fail_on_unmatched_files: true - draft: true \ No newline at end of file + draft: true From 631e64f17af94ee3b71184c82a824a2be080ab01 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 12:45:50 +0200 Subject: [PATCH 1384/1724] remove obsolete code --- src/dd.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/dd.c b/src/dd.c index b6d94a6..0a89649 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1685,26 +1685,6 @@ ULONG dd_Release() if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { - /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ - if (g_ddraw.width) - { - RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; - - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - AdjustWindowRectEx(&rc, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); - - real_SetWindowPos( - g_ddraw.hwnd, - 0, - 0, - 0, - (rc.right - rc.left), - (rc.bottom - rc.top), - SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); - } - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } From dc5b1c7304dbd229a4e0e4d8b89584ed0c5d57db Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 13:34:43 +0200 Subject: [PATCH 1385/1724] Update action.yml --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index ca39872..f2a0b38 100644 --- a/action.yml +++ b/action.yml @@ -11,7 +11,7 @@ # uses: phobos2077/sfall@develop # with: # release-xp: true -# +# # - name: Copy sfall to mod directory # run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll" # From 4d11fc38c6d95605411e73c5b31fc86c31e38c75 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 23:31:24 +0200 Subject: [PATCH 1386/1724] log timestamp in UTC --- src/debug.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index a2f2213..23afadd 100644 --- a/src/debug.c +++ b/src/debug.c @@ -205,7 +205,8 @@ void dbg_init() DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { - TRACE("timestamp = %s", _ctime32((const long*)×tamp)); + struct tm* timeinfo = _gmtime32((const long*)×tamp); + TRACE("timestamp = %s", asctime(timeinfo)); } } } From 4d0b1734dc65e8f6ec10a40c0d910d838ab55d47 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 13:27:49 +0200 Subject: [PATCH 1387/1724] add fallback for wndres --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f485e13..3406068 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ OBJS := $(addsuffix .o, $(basename $(SRCS))) all: $(TARGET) %.o: %.rc - $(WINDRES) -J rc $< $@ + $(WINDRES) -J rc $< $@ || windres -J rc $< $@ $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) From 9fb97bf1ca6aee1028801c4033bc7fc01a34b4ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 13:28:46 +0200 Subject: [PATCH 1388/1724] fix warning --- src/debug.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/debug.c b/src/debug.c index 23afadd..f89b924 100644 --- a/src/debug.c +++ b/src/debug.c @@ -205,8 +205,7 @@ void dbg_init() DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { - struct tm* timeinfo = _gmtime32((const long*)×tamp); - TRACE("timestamp = %s", asctime(timeinfo)); + TRACE("timestamp = %s", asctime(_gmtime32((const long*)×tamp))); } } } From db9cfb8e29e56b5e3f8cab687b228597e17d8460 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 15:21:32 +0200 Subject: [PATCH 1389/1724] add crc32 to logs --- inc/utils.h | 1 + src/debug.c | 2 ++ src/utils.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/inc/utils.h b/inc/utils.h index c710966..9f7f0ee 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -7,6 +7,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); void util_pull_messages(); +unsigned long util_get_crc32(char* filename); DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); diff --git a/src/debug.c b/src/debug.c index f89b924..96b1b25 100644 --- a/src/debug.c +++ b/src/debug.c @@ -202,6 +202,8 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } + TRACE("crc32 = %08X\n", util_get_crc32(exe_path)); + DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { diff --git a/src/utils.c b/src/utils.c index 3f22bb7..fd8a524 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "ddraw.h" #include "debug.h" @@ -11,6 +12,7 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" +#include "crc32.h" /* @@ -105,6 +107,34 @@ DWORD util_get_timestamp(HMODULE mod) return nt_headers->FileHeader.TimeDateStamp; } +unsigned long util_get_crc32(char* filename) +{ + if (!filename) + return 0; + + unsigned long crc32 = 0; + + FILE* fp = fopen(filename, "rb"); + if (fp) + { + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp));) + { + if (ferror(fp)) + { + crc32 = 0; + break; + } + + crc32 = Crc32_ComputeBuf(crc32, buf, s); + } + + fclose(fp); + } + + return crc32; +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From 7febf01343b17507c815f78aa5f33d3725a09c42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 15:35:13 +0200 Subject: [PATCH 1390/1724] tweak get_crc32 function --- src/utils.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index fd8a524..f057a4e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -118,17 +118,14 @@ unsigned long util_get_crc32(char* filename) if (fp) { char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp));) + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) { - if (ferror(fp)) - { - crc32 = 0; - break; - } - crc32 = Crc32_ComputeBuf(crc32, buf, s); } + if (ferror(fp)) + crc32 = 0; + fclose(fp); } From e0e59cd9fa90d59ea1308d2eae321b394750ec0d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Sep 2024 20:17:53 +0200 Subject: [PATCH 1391/1724] add testing code for privileged instructions --- inc/config.h | 1 + src/config.c | 2 + src/debug.c | 169 +++++++++++++++++++++++++++++++++++++------------- src/dllmain.c | 9 ++- 4 files changed, 135 insertions(+), 46 deletions(-) diff --git a/inc/config.h b/inc/config.h index bdb7d9b..966d4fd 100644 --- a/inc/config.h +++ b/inc/config.h @@ -64,6 +64,7 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; + BOOL ignore_exceptions; BOOL wine_allow_resize; int guard_lines; int max_resolutions; diff --git a/src/config.c b/src/config.c index deabcf0..05b19ef 100644 --- a/src/config.c +++ b/src/config.c @@ -77,6 +77,7 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.ignore_exceptions, "ignore_exceptions", FALSE); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); @@ -309,6 +310,7 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" + "ignore_exceptions=false\n" "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" diff --git a/src/debug.c b/src/debug.c index 96b1b25..47229cd 100644 --- a/src/debug.c +++ b/src/debug.c @@ -14,6 +14,8 @@ #include "versionhelpers.h" #include "utils.h" #include "dllmain.h" +#include "config.h" +#include "patch.h" double g_dbg_frame_time = 0; @@ -35,59 +37,98 @@ static int g_dbg_crash_count = 0; LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { - g_dbg_crash_count++; - - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); - - if (dmp != INVALID_HANDLE_VALUE) + if (!exception || !exception->ExceptionRecord) { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + if (g_dbg_exception_filter) + return g_dbg_exception_filter(exception); - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); - - CloseHandle(dmp); + return EXCEPTION_EXECUTE_HANDLER; } - if (exception && exception->ExceptionRecord) + if (exception->ExceptionRecord->ExceptionCode != STATUS_PRIVILEGED_INSTRUCTION || !g_config.ignore_exceptions) { - HMODULE mod = NULL; - char filename[MAX_PATH] = { 0 }; + g_dbg_crash_count++; + + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); + + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); + } + } + + HMODULE mod = NULL; + char filename[MAX_PATH] = { 0 }; #if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ - if (GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - exception->ExceptionRecord->ExceptionAddress, - &mod)) - { - GetModuleFileNameA(mod, filename, sizeof(filename) - 1); - } + if (GetModuleHandleExA( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + exception->ExceptionRecord->ExceptionAddress, + &mod)) + { + GetModuleFileNameA(mod, filename, sizeof(filename) - 1); + } #endif - TRACE( - "Exception at %p (%p+%p), Code=%08X - %s\n", - exception->ExceptionRecord->ExceptionAddress, - mod, - (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, - exception->ExceptionRecord->ExceptionCode, - filename); + TRACE( + "Exception at %p (%p+%p), Code=%08X - %s\n", + exception->ExceptionRecord->ExceptionAddress, + mod, + (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, + exception->ExceptionRecord->ExceptionCode, + filename); + + if (g_config.ignore_exceptions && + exception->ContextRecord && + exception->ExceptionRecord->ExceptionAddress && + exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) + { + size_t size = 0; + BYTE* addr = exception->ExceptionRecord->ExceptionAddress; + switch (*addr) + { + case 0xE4: // IN ib + case 0xE5: // IN id + case 0xE6: // OUT ib + case 0xE7: // OUT ib + size = 2; + break; + case 0xEC: // IN ib + case 0xED: // IN id + case 0xEE: // OUT + case 0xEF: // OUT + size = 1; + break; + } + + if (size) + { + exception->ContextRecord->Eip += size; + patch_clear((void*)addr, 0x90, (char*)addr + size); + return EXCEPTION_CONTINUE_EXECUTION; + } } if (g_dbg_exception_filter) @@ -111,6 +152,46 @@ void __cdecl dbg_invoke_watson( TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); } +#else +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) +{ + if (exception && + exception->ContextRecord && + exception->ExceptionRecord && + exception->ExceptionRecord->ExceptionAddress && + exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) + { + size_t size = 0; + BYTE* addr = exception->ExceptionRecord->ExceptionAddress; + switch (*addr) + { + case 0xE4: // IN ib + case 0xE5: // IN id + case 0xE6: // OUT ib + case 0xE7: // OUT ib + size = 2; + break; + case 0xEC: // IN ib + case 0xED: // IN id + case 0xEE: // OUT + case 0xEF: // OUT + size = 1; + break; + } + + if (size) + { + exception->ContextRecord->Eip += size; + patch_clear((void*)addr, 0x90, (char*)addr + size); + return EXCEPTION_CONTINUE_EXECUTION; + } + } + + if (g_dbg_exception_filter) + return g_dbg_exception_filter(exception); + + return EXCEPTION_EXECUTE_HANDLER; +} #endif void dbg_init() diff --git a/src/dllmain.c b/src/dllmain.c index 3956081..691db28 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -43,9 +43,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); -#endif - cfg_load(); +#else + cfg_load(); + if (g_config.ignore_exceptions) + { + g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + } +#endif char buf[1024]; From 80b8a996a74b61c4fc82f0e519ae0cbeb3218761 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Sep 2024 23:36:11 +0200 Subject: [PATCH 1392/1724] tweak exception handler --- inc/debug.h | 2 + src/debug.c | 143 ++++++++++++++++++-------------------------------- src/dllmain.c | 13 +++-- 3 files changed, 61 insertions(+), 97 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index be19a05..c0372f1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -6,6 +6,7 @@ #include LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); +LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); @@ -33,6 +34,7 @@ void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, u extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +extern PVOID g_dbg_exception_handle; #if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ #undef _ReturnAddress diff --git a/src/debug.c b/src/debug.c index 47229cd..cff87d3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -15,12 +15,12 @@ #include "utils.h" #include "dllmain.h" #include "config.h" -#include "patch.h" double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +PVOID g_dbg_exception_handle; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; @@ -37,98 +37,59 @@ static int g_dbg_crash_count = 0; LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { - if (!exception || !exception->ExceptionRecord) - { - if (g_dbg_exception_filter) - return g_dbg_exception_filter(exception); + g_dbg_crash_count++; - return EXCEPTION_EXECUTE_HANDLER; + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); + + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); } - if (exception->ExceptionRecord->ExceptionCode != STATUS_PRIVILEGED_INSTRUCTION || !g_config.ignore_exceptions) + if (exception && exception->ExceptionRecord) { - g_dbg_crash_count++; - - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); - - if (dmp != INVALID_HANDLE_VALUE) - { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; - - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); - - CloseHandle(dmp); - } - } - - HMODULE mod = NULL; - char filename[MAX_PATH] = { 0 }; + HMODULE mod = NULL; + char filename[MAX_PATH] = { 0 }; #if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ - if (GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - exception->ExceptionRecord->ExceptionAddress, - &mod)) - { - GetModuleFileNameA(mod, filename, sizeof(filename) - 1); - } + if (GetModuleHandleExA( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + exception->ExceptionRecord->ExceptionAddress, + &mod)) + { + GetModuleFileNameA(mod, filename, sizeof(filename) - 1); + } #endif - TRACE( - "Exception at %p (%p+%p), Code=%08X - %s\n", - exception->ExceptionRecord->ExceptionAddress, - mod, - (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, - exception->ExceptionRecord->ExceptionCode, - filename); - - if (g_config.ignore_exceptions && - exception->ContextRecord && - exception->ExceptionRecord->ExceptionAddress && - exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) - { - size_t size = 0; - BYTE* addr = exception->ExceptionRecord->ExceptionAddress; - switch (*addr) - { - case 0xE4: // IN ib - case 0xE5: // IN id - case 0xE6: // OUT ib - case 0xE7: // OUT ib - size = 2; - break; - case 0xEC: // IN ib - case 0xED: // IN id - case 0xEE: // OUT - case 0xEF: // OUT - size = 1; - break; - } - - if (size) - { - exception->ContextRecord->Eip += size; - patch_clear((void*)addr, 0x90, (char*)addr + size); - return EXCEPTION_CONTINUE_EXECUTION; - } + TRACE( + "Exception at %p (%p+%p), Code=%08X - %s\n", + exception->ExceptionRecord->ExceptionAddress, + mod, + (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, + exception->ExceptionRecord->ExceptionCode, + filename); } if (g_dbg_exception_filter) @@ -152,8 +113,9 @@ void __cdecl dbg_invoke_watson( TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); } -#else -LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) +#endif + +LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception) { if (exception && exception->ContextRecord && @@ -182,17 +144,12 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) if (size) { exception->ContextRecord->Eip += size; - patch_clear((void*)addr, 0x90, (char*)addr + size); return EXCEPTION_CONTINUE_EXECUTION; } } - if (g_dbg_exception_filter) - return g_dbg_exception_filter(exception); - - return EXCEPTION_EXECUTE_HANDLER; + return EXCEPTION_CONTINUE_SEARCH; } -#endif void dbg_init() { diff --git a/src/dllmain.c b/src/dllmain.c index 691db28..6898e6c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -43,14 +43,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); +#endif + cfg_load(); -#else - cfg_load(); + if (g_config.ignore_exceptions) { - g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + g_dbg_exception_handle = + AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } -#endif char buf[1024]; @@ -147,6 +148,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); + + if (g_dbg_exception_handle) + RemoveVectoredExceptionHandler(g_dbg_exception_handle); + break; } } From 577f47332788e30e16a02fba2f3db02ef939ff3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:47:12 +0200 Subject: [PATCH 1393/1724] remove ignore_exceptions setting --- inc/config.h | 1 - src/config.c | 2 -- src/dllmain.c | 7 +------ 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/inc/config.h b/inc/config.h index 966d4fd..bdb7d9b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -64,7 +64,6 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; - BOOL ignore_exceptions; BOOL wine_allow_resize; int guard_lines; int max_resolutions; diff --git a/src/config.c b/src/config.c index 05b19ef..deabcf0 100644 --- a/src/config.c +++ b/src/config.c @@ -77,7 +77,6 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); - GET_BOOL(g_config.ignore_exceptions, "ignore_exceptions", FALSE); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); @@ -310,7 +309,6 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" - "ignore_exceptions=false\n" "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" diff --git a/src/dllmain.c b/src/dllmain.c index 6898e6c..429fbf3 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,12 +46,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); - - if (g_config.ignore_exceptions) - { - g_dbg_exception_handle = - AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); - } + g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); char buf[1024]; From 8d3baea228e935ca24055a46054c4009b0c22738 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:48:53 +0200 Subject: [PATCH 1394/1724] fix long line --- src/dllmain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 429fbf3..fd1846c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,7 +46,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); - g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + g_dbg_exception_handle = + AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); char buf[1024]; From 6eeef95998777ab3c8727ac44ae252e9dc9aa71b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:49:06 +0200 Subject: [PATCH 1395/1724] add space --- src/dllmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dllmain.c b/src/dllmain.c index fd1846c..ed3e705 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,6 +46,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); + g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); From f6b92bb80feff2173992fcabb3a041d127c993e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:55:34 +0200 Subject: [PATCH 1396/1724] add preset for Balls of Steel v1.2 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index cc6f69c..679daad 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Atlantis: The Lost Tales - Atomic Bomberman - Atrox +- Balls of Steel v1.2 - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 diff --git a/src/config.c b/src/config.c index deabcf0..8ec4c85 100644 --- a/src/config.c +++ b/src/config.c @@ -502,6 +502,10 @@ static void cfg_create_ini() "[BGMain]\n" "resolutions=2\n" "\n" + "; Balls of Steel v1.2\n" + "[bos]\n" + "win_version=95\n" + "\n" "; BALDR FORCE EXE\n" "[BaldrForce]\n" "noactivateapp=true\n" From 57287686dbf782c431a5da309d4d70be7a5428ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Sep 2024 19:55:06 +0200 Subject: [PATCH 1397/1724] add new "center_window" setting --- inc/config.h | 1 + inc/dd.h | 4 ++++ src/config.c | 5 +++++ src/dd.c | 9 +++++++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index bdb7d9b..168c54d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -42,6 +42,7 @@ typedef struct CNCDDRAWCONFIG int d3d9_filter; int anti_aliased_fonts_min_size; int min_font_size; + int center_window; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; diff --git a/inc/dd.h b/inc/dd.h index e5904bb..36f1ca6 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -52,6 +52,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_BLTFAST 2 #define LIMIT_UNLOCK 3 +#define CENTER_WINDOW_NEVER 0 +#define CENTER_WINDOW_AUTO 1 +#define CENTER_WINDOW_ALWAYS 2 + #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 #endif diff --git a/src/config.c b/src/config.c index 8ec4c85..0ea4a2f 100644 --- a/src/config.c +++ b/src/config.c @@ -54,6 +54,7 @@ void cfg_load() GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_INT(g_config.min_font_size, "min_font_size", 0); + GET_INT(g_config.center_window, "center_window", CENTER_WINDOW_AUTO); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -250,6 +251,10 @@ static void cfg_create_ini() "; Raise the size of small fonts to X\n" "min_font_size=0\n" "\n" + "; Center window to screen when game changes the display resolution\n" + "; Possible values: 0 = never center, 1 = automatic, 2 = always center\n" + "center_window=1\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" diff --git a/src/dd.c b/src/dd.c index 0a89649..4ff0789 100644 --- a/src/dd.c +++ b/src/dd.c @@ -710,9 +710,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if ((g_ddraw.width || g_config.infantryhack) && + if (g_config.center_window && + (g_ddraw.width || g_config.infantryhack || g_config.center_window == CENTER_WINDOW_ALWAYS) && (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && - (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) + ( + dwWidth > g_config.window_rect.right || + dwHeight > g_config.window_rect.bottom || + g_config.center_window == CENTER_WINDOW_ALWAYS) + ) { g_config.window_rect.left = -32000; g_config.window_rect.top = -32000; From b57ec635fcb93f6ac2eef9d920da093b1f9c39a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Sep 2024 18:11:07 +0200 Subject: [PATCH 1398/1724] fix opengl renderer on older hardware --- src/opengl_utils.c | 18 +++++++++++++----- src/render_ogl.c | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 8222f10..8062fdd 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -231,20 +231,28 @@ void oglu_init() BOOL oglu_ext_exists(char* ext, HDC hdc) { + BOOL got_num_extensions = FALSE; + if (glGetIntegerv && glGetStringi) { GLint n = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &n); - for (GLint i = 0; i < n; i++) + if (glGetError() == GL_NO_ERROR) { - char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + got_num_extensions = TRUE; - if (glext && strcmp(glext, ext) == 0) - return TRUE; + for (GLint i = 0; i < n; i++) + { + char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + + if (glext && strcmp(glext, ext) == 0) + return TRUE; + } } } - else + + if (!got_num_extensions) { char* glext = (char*)glGetString(GL_EXTENSIONS); diff --git a/src/render_ogl.c b/src/render_ogl.c index be0793e..efde47f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -111,6 +111,8 @@ DWORD WINAPI ogl_render_main(void) { GL_CHECK(oglu_init()); + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + BOOL got_swap_ctrl; GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); From 40464b18fc0df0a47cf2fb3eab3d6e68d38a296f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 17:04:54 +0200 Subject: [PATCH 1399/1724] remove outdated presets --- src/config.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/config.c b/src/config.c index 0ea4a2f..6b25434 100644 --- a/src/config.c +++ b/src/config.c @@ -1260,10 +1260,6 @@ static void cfg_create_ini() "[Pajama3]\n" "renderer=gdi\n" "\n" - "; Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm)\n" - "[PajamaLRS]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Pajama Sam's One-Stop Fun Shop\n" "[SamsFunShop]\n" "renderer=gdi\n" @@ -1317,10 +1313,6 @@ static void cfg_create_ini() "[puttputtjtc]\n" "renderer=gdi\n" "\n" - "; Putt-Putt: Pep's Birthday Surprise\n" - "[PuttsFunShop]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Pizza Syndicate\n" "[Pizza2]\n" "renderer=opengl\n" From 7175939854e1d84030d7d7efb004b784aaa2b9d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 18:22:08 +0200 Subject: [PATCH 1400/1724] don't use W functions --- src/dllmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ed3e705..6ab24f4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -34,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) verhelp_init(); - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { cfg_load(); return TRUE; @@ -133,7 +133,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_PROCESS_DETACH: { - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) return TRUE; TRACE("cnc-ddraw DLL_PROCESS_DETACH\n"); From beae3c5fb796f50164cd83082cb27fff899bf43b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 19:20:50 +0200 Subject: [PATCH 1401/1724] properly target windows 2000 in mingw build + allows to build for windows ME now as well --- Makefile | 23 ++++++++++++++--------- build.cmd | 2 +- build_debug.cmd | 2 +- inc/dd.h | 12 ++++++++++++ inc/versionhelpers.h | 5 +++++ src/debug.c | 2 +- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 3406068..6ce2b4c 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,16 @@ -include config.mk -TARGET = ddraw.dll -LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared -CFLAGS = -Iinc -O2 -march=i486 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 +TARGET ?= ddraw.dll + +LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared +CFLAGS ?= -Iinc -O2 -Wall -std=c99 +LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -lMsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) -CMDTEST := $(shell echo \"\") -ifeq ($(CMDTEST),\"\") +ECHOTEST := $(shell echo \"\") +ifeq ($(ECHOTEST),\"\") # Windows HASH := \# ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) @@ -20,13 +21,17 @@ else EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif -CC = i686-w64-mingw32-gcc -WINDRES ?= i686-w64-mingw32-windres - ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif +ifdef _WIN32_WINNT + CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT) +endif + +CC = i686-w64-mingw32-gcc +WINDRES ?= i686-w64-mingw32-windres + SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc OBJS := $(addsuffix .o, $(basename $(SRCS))) diff --git a/build.cmd b/build.cmd index 34bb56c..0348c73 100644 --- a/build.cmd +++ b/build.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make +make _WIN32_WINNT=0x0500 pause diff --git a/build_debug.cmd b/build_debug.cmd index 755ec1f..154ceb2 100644 --- a/build_debug.cmd +++ b/build_debug.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make DEBUG=1 +make DEBUG=1 _WIN32_WINNT=0x0500 pause diff --git a/inc/dd.h b/inc/dd.h index 36f1ca6..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -64,6 +64,18 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 #endif +#ifndef GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT +#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 0x00000002 +#endif + +#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS +#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004 +#endif + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) +#define GdiTransparentBlt TransparentBlt +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 8a59f74..bf622e6 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -28,6 +28,11 @@ #define _WIN32_WINNT_WIN11 0x0A00 #endif +#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) +#define RtlVerifyVersionInfo(a,b,c) 1 +#define VerifyVersionInfoW(a,b,c) 0 +#define VerSetConditionMask(a,b,c) 0 +#endif void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); diff --git a/src/debug.c b/src/debug.c index cff87d3..8d4ba5b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -73,7 +73,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; -#if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) if (GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, From 8b211a73d77a0bcf34241101fac90f0525ab407c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 19:57:11 +0200 Subject: [PATCH 1402/1724] add checks for windows ME build --- src/dllmain.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index 6ab24f4..04b4ea9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,8 +47,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); +#endif char buf[1024]; @@ -146,8 +148,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) if (g_dbg_exception_handle) RemoveVectoredExceptionHandler(g_dbg_exception_handle); +#endif break; } From 9bea18d0387e05914f603c3bb51ce7f52a7abcf0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:04:36 +0200 Subject: [PATCH 1403/1724] fix debug build for win2000 --- inc/wndproc.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 43a1e8e..4d36cb3 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -16,6 +16,10 @@ #define CNC_DDRAW_SET_FULLSCREEN 1 #define CNC_DDRAW_SET_WINDOWED 2 +#ifndef WM_UNICHAR +#define WM_UNICHAR 0x0109 +#endif + LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif From 14020a3d319450a216a15e37b212211b7be1d7cd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:28:33 +0200 Subject: [PATCH 1404/1724] don't create dmp file on windows ME builds --- src/debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/debug.c b/src/debug.c index 8d4ba5b..5c0c9f4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,6 +39,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) HANDLE dmp = CreateFile( g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, @@ -67,6 +68,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) CloseHandle(dmp); } +#endif if (exception && exception->ExceptionRecord) { From 401c9f0e378de6ed74164ef307bd7485562ed29e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:29:09 +0200 Subject: [PATCH 1405/1724] fix CreateThread bug on windows ME --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 4ff0789..981f986 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1338,7 +1338,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, NULL); + DWORD tid; + g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, &tid); SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } From 1821c3a15dc74289037d3260a4566262a41d9c47 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:30:27 +0200 Subject: [PATCH 1406/1724] use AddVectoredExceptionHandler only on XP and above --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 04b4ea9..111fae4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,7 +47,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); #endif From 9d43cc31f23011bf05a875afc2cb657cae9b3337 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:30:50 +0200 Subject: [PATCH 1407/1724] fix for last commit --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 111fae4..f9784b2 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -148,7 +148,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) if (g_dbg_exception_handle) RemoveVectoredExceptionHandler(g_dbg_exception_handle); #endif From 561f2ba614204a224cf36c3cdcd370bffe1e71d0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 21:22:45 +0200 Subject: [PATCH 1408/1724] improve legacy build --- src/dllmain.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index f9784b2..49595b8 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,10 +47,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - g_dbg_exception_handle = - AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); -#endif + PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) = + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler"); + + if (add_handler) + { + g_dbg_exception_handle = + add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + } char buf[1024]; @@ -148,10 +152,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - if (g_dbg_exception_handle) - RemoveVectoredExceptionHandler(g_dbg_exception_handle); -#endif + ULONG(WINAPI* remove_handler)(PVOID) = + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); + + if (g_dbg_exception_handle && remove_handler) + remove_handler(g_dbg_exception_handle); break; } From 1017b235a41b843fef4a936c966babe9812f1c8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 21:29:12 +0200 Subject: [PATCH 1409/1724] align --- src/dllmain.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 49595b8..701a79e 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -52,8 +52,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (add_handler) { - g_dbg_exception_handle = - add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } char buf[1024]; From 6f4339f16aff49bb327ad6d8ba49da1db704f938 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 22:07:33 +0200 Subject: [PATCH 1410/1724] fix versionhelpers for legacy build --- inc/versionhelpers.h | 11 +++++------ src/versionhelpers.c | 13 +++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index bf622e6..7191349 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -29,13 +29,12 @@ #endif #if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) -#define RtlVerifyVersionInfo(a,b,c) 1 #define VerifyVersionInfoW(a,b,c) 0 -#define VerSetConditionMask(a,b,c) 0 #endif void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); +ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); const char* verhelp_wine_get_version(); void verhelp_wine_get_host_version(const char** sysname, const char** release); @@ -43,7 +42,7 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -54,7 +53,7 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -65,7 +64,7 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -134,7 +133,7 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } VERSIONHELPERAPI IsWindowsXP(void) { diff --git a/src/versionhelpers.c b/src/versionhelpers.c index e422e90..7c19528 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -2,10 +2,12 @@ #include "versionhelpers.h" typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +static VERSETCONDITIONMASKPROC VerSetConditionMaskProc; static WINE_GET_VERSIONPROC wine_get_version; static WINE_GET_HOST_VERSIONPROC wine_get_host_version; @@ -19,6 +21,12 @@ void verhelp_init() wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); } + + mod = GetModuleHandleA("Kernel32.dll"); + if (mod) + { + VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + } } BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) @@ -28,6 +36,11 @@ BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, U VerifyVersionInfoW(versionInfo, typeMask, conditionMask); } +ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition) +{ + return VerSetConditionMaskProc ? VerSetConditionMaskProc(ConditionMask, TypeMask, Condition) : 0; +} + const char* verhelp_wine_get_version() { return wine_get_version ? wine_get_version() : NULL; From da99931f8cb82cb19e33aac184f2aaa2a896eca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 22:14:27 +0200 Subject: [PATCH 1411/1724] target windows 9X by default --- build.cmd | 2 +- build_debug.cmd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 0348c73..801abe4 100644 --- a/build.cmd +++ b/build.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make _WIN32_WINNT=0x0500 +make _WIN32_WINNT=0x0400 pause diff --git a/build_debug.cmd b/build_debug.cmd index 154ceb2..4e43145 100644 --- a/build_debug.cmd +++ b/build_debug.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make DEBUG=1 _WIN32_WINNT=0x0500 +make DEBUG=1 _WIN32_WINNT=0x0400 pause From 5336f7d1ece2b4e3685272bc83ddb3ab8ef80593 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 02:27:14 +0200 Subject: [PATCH 1412/1724] make sure we don't get a blackscreen if device doesn't support StretchDIBits --- src/render_gdi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 5ad3586..c7292ed 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -99,14 +99,17 @@ DWORD WINAPI gdi_render_main(void) FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } + int lines_copied = 0; + if (g_ddraw.bnet_active) { RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + lines_copied = 1; } else if (upscale_hack) { - real_StretchDIBits( + lines_copied = real_StretchDIBits( g_ddraw.render.hdc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y, @@ -124,7 +127,7 @@ DWORD WINAPI gdi_render_main(void) else if (!g_ddraw.child_window_exists && (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) { - real_StretchDIBits( + lines_copied = real_StretchDIBits( g_ddraw.render.hdc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y, @@ -139,7 +142,8 @@ DWORD WINAPI gdi_render_main(void) DIB_RGB_COLORS, SRCCOPY); } - else + + if (lines_copied == 0 || lines_copied == GDI_ERROR) { real_SetDIBitsToDevice( g_ddraw.render.hdc, From d680af0a4a36aab511acf35db5b217a7dbf67d4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 17:09:24 +0200 Subject: [PATCH 1413/1724] dynamically load Dbghelp.dll --- Makefile | 2 +- cnc-ddraw.vcxproj | 6 ++--- src/debug.c | 69 ++++++++++++++++++++++++++++------------------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 6ce2b4c..08d74da 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -lMsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 992cb3e..70bd817 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -222,7 +222,7 @@ Windows - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -348,7 +348,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -390,7 +390,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def diff --git a/src/debug.c b/src/debug.c index 5c0c9f4..a8202f8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,51 +39,64 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); + BOOL(WINAPI * MiniDumpWriteDumpProc)( + HANDLE, + DWORD, + HANDLE, + MINIDUMP_TYPE, + PMINIDUMP_EXCEPTION_INFORMATION, + PMINIDUMP_USER_STREAM_INFORMATION, + PMINIDUMP_CALLBACK_INFORMATION + ); - if (dmp != INVALID_HANDLE_VALUE) + MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump"); + if (MiniDumpWriteDumpProc) { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; - CloseHandle(dmp); + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); + } } -#endif if (exception && exception->ExceptionRecord) { HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - if (GetModuleHandleExA( + BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = + (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); + + if (getModuleHandleExA && getModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, &mod)) { GetModuleFileNameA(mod, filename, sizeof(filename) - 1); } -#endif TRACE( "Exception at %p (%p+%p), Code=%08X - %s\n", From d3dbab102f9278f29be86abddc6a2424ce1a2f74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 17:28:34 +0200 Subject: [PATCH 1414/1724] fix for last commit --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index a8202f8..5f972c5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -69,7 +69,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) info.ExceptionPointers = exception; info.ClientPointers = TRUE; - MiniDumpWriteDump( + MiniDumpWriteDumpProc( GetCurrentProcess(), GetCurrentProcessId(), dmp, From cd3a52363b683f6d5824a23e92f8745c306e9554 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 21:03:12 +0200 Subject: [PATCH 1415/1724] improve win version logging --- src/debug.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/debug.c b/src/debug.c index 5f972c5..4b31a9b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -217,33 +217,45 @@ void dbg_init() TRACE("cnc-ddraw = %p\n", g_ddraw_module); - HKEY hkey; + HKEY hkey = NULL; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); + HKEY hkey9x = NULL; + LONG status9x = + RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x); + if (status == ERROR_SUCCESS) { char name[256] = { 0 }; DWORD name_size = sizeof(name); - RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size); + if (RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS && hkey9x) + { + RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size); + } - char dversion[256] = { 0 }; - DWORD dversion_size = sizeof(dversion); - RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&dversion, &dversion_size); + char vers[256] = { 0 }; + DWORD vers_size = sizeof(vers); + if (RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS && hkey9x) + { + RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); + } char build[256] = { 0 }; DWORD build_size = sizeof(build); if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) { - build_size = sizeof(build); RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); } - TRACE("%s %s (%s)\n", name, dversion, build); + TRACE("%s %s (%s)\n", name, vers, build); RegCloseKey(hkey); } + if (status9x == ERROR_SUCCESS) + RegCloseKey(hkey9x); + if (IsWine()) { TRACE("Wine version = %s\n", verhelp_wine_get_version()); From c479cc20a5f66b862e2088826e8c90baa004a855 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 21:27:55 +0200 Subject: [PATCH 1416/1724] some more tweaks to logs --- src/debug.c | 59 +++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/debug.c b/src/debug.c index 4b31a9b..67ef352 100644 --- a/src/debug.c +++ b/src/debug.c @@ -207,11 +207,11 @@ void dbg_init() } TRACE( - "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", - VERSION_MAJOR, - VERSION_MINOR, - VERSION_BUILD, - VERSION_REVISION, + "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", + VERSION_MAJOR, + VERSION_MINOR, + VERSION_BUILD, + VERSION_REVISION, GIT_COMMIT, GIT_BRANCH); @@ -225,34 +225,35 @@ void dbg_init() LONG status9x = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x); - if (status == ERROR_SUCCESS) + char name[256] = { 0 }; + DWORD name_size = sizeof(name); + if (status || RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS) { - char name[256] = { 0 }; - DWORD name_size = sizeof(name); - if (RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS && hkey9x) - { + if (status9x == ERROR_SUCCESS) RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size); - } - - char vers[256] = { 0 }; - DWORD vers_size = sizeof(vers); - if (RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS && hkey9x) - { - RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); - } - - char build[256] = { 0 }; - DWORD build_size = sizeof(build); - if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) - { - RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - } - - TRACE("%s %s (%s)\n", name, vers, build); - - RegCloseKey(hkey); } + char vers[256] = { 0 }; + DWORD vers_size = sizeof(vers); + if (status || RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS) + { + if (status9x == ERROR_SUCCESS) + RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); + } + + char build[256] = { 0 }; + DWORD build_size = sizeof(build); + if (status || RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) + { + if (status == ERROR_SUCCESS) + RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + } + + TRACE("%s %s (%s)\n", name, vers, build); + + if (status == ERROR_SUCCESS) + RegCloseKey(hkey); + if (status9x == ERROR_SUCCESS) RegCloseKey(hkey9x); From 158b49e460ded007b3aa674a45f47d097b3727ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 22:53:38 +0200 Subject: [PATCH 1417/1724] add IsWindows2000OrGreater function --- inc/versionhelpers.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 7191349..e564c95 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -71,6 +71,10 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } +VERSIONHELPERAPI IsWindows2000OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0, 0); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -136,6 +140,10 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWindows2000(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0); +} + VERSIONHELPERAPI IsWindowsXP(void) { return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); } From cee28b7abf0fd87ca259c5f812aea52467c94239 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 16:43:01 +0200 Subject: [PATCH 1418/1724] Update README.md --- README.md | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 679daad..9f6b7c9 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # cnc-ddraw -cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. +cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. It does also add new features such as borderless mode, windowed mode and upscaling via shaders.   ### Features - - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines + - Supports Windows ME, 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode @@ -24,27 +24,17 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, 1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game -Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once. +Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run `cnc-ddraw config.exe` once.   -If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. You can enable windowed mode via cnc-ddraw config.exe instead. +**Important** -  - -**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**. - -  - -**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/FunkyFr3sh/cnc-ddraw/issues/44 - -  - -Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. - -  - -**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44) +- **Game must be set to fullscreen** for cnc-ddraw to work. To enable windowed mode, use `cnc-ddraw config.exe` instead +- If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` +- **cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer +- Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. +- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From df73d585c0703bb18ea5ad9e03ee5c504a2642f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 16:50:48 +0200 Subject: [PATCH 1419/1724] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9f6b7c9..481a60c 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine **Important** -- **Game must be set to fullscreen** for cnc-ddraw to work. To enable windowed mode, use `cnc-ddraw config.exe` instead +- **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead - If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` -- **cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer -- Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. +- **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer +- Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details - **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From e80499a30e63f110afcda178b009beba6a679036 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 21:54:25 +0200 Subject: [PATCH 1420/1724] add dummy functions to avoid Wtsapi32.dll imports (Keeps it win2000 compatible) --- config/cnc-ddraw config.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index a69e541..cef38b4 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -67,4 +67,15 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) } return 0; } + +// dummy functions to avoid Wtsapi32.dll imports +EXTERN_C BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags) +{ + return TRUE; +} + +EXTERN_C BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd) +{ + return TRUE; +} //--------------------------------------------------------------------------- From 107897a29f3e02f57d92248ece686948d9a98da0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 22:14:49 +0200 Subject: [PATCH 1421/1724] fix default settings --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4a0f97d..02723d7 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1187,7 +1187,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; - NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; + NonexclusiveChk->State = GetBool(ini, "nonexclusive", true) ? tssOn : tssOff; CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); From a7b8e2e80fdd42a4f24f4543608eff02deb99b04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 23:46:04 +0200 Subject: [PATCH 1422/1724] move crc32 function --- inc/crc32.h | 1 + src/crc32.c | 25 +++++++++++++++++++++++++ src/debug.c | 3 ++- src/utils.c | 26 -------------------------- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/inc/crc32.h b/inc/crc32.h index d842810..f2ddf4b 100644 --- a/inc/crc32.h +++ b/inc/crc32.h @@ -6,5 +6,6 @@ unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); +unsigned long Crc32_FromFile(char* filename); #endif diff --git a/src/crc32.c b/src/crc32.c index 826842f..0befe8e 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -77,6 +77,31 @@ unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, return( crc32 ^ 0xFFFFFFFF ); } +unsigned long Crc32_FromFile(char* filename) +{ + if (!filename) + return 0; + + unsigned long crc32 = 0; + + FILE* fp = fopen(filename, "rb"); + if (fp) + { + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) + { + crc32 = Crc32_ComputeBuf(crc32, buf, s); + } + + if (ferror(fp)) + crc32 = 0; + + fclose(fp); + } + + return crc32; +} + /*----------------------------------------------------------------------------*\ * END OF MODULE: crc32.c \*----------------------------------------------------------------------------*/ diff --git a/src/debug.c b/src/debug.c index 67ef352..ce8fe85 100644 --- a/src/debug.c +++ b/src/debug.c @@ -13,6 +13,7 @@ #include "git.h" #include "versionhelpers.h" #include "utils.h" +#include "crc32.h" #include "dllmain.h" #include "config.h" @@ -268,7 +269,7 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } - TRACE("crc32 = %08X\n", util_get_crc32(exe_path)); + TRACE("crc32 = %08X\n", Crc32_FromFile(exe_path)); DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) diff --git a/src/utils.c b/src/utils.c index f057a4e..5db8159 100644 --- a/src/utils.c +++ b/src/utils.c @@ -12,7 +12,6 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" -#include "crc32.h" /* @@ -107,31 +106,6 @@ DWORD util_get_timestamp(HMODULE mod) return nt_headers->FileHeader.TimeDateStamp; } -unsigned long util_get_crc32(char* filename) -{ - if (!filename) - return 0; - - unsigned long crc32 = 0; - - FILE* fp = fopen(filename, "rb"); - if (fp) - { - char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) - { - crc32 = Crc32_ComputeBuf(crc32, buf, s); - } - - if (ferror(fp)) - crc32 = 0; - - fclose(fp); - } - - return crc32; -} - FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From f9fa3b0fa2482f94eb8cc1deb259b8d1104e4f1d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 23:53:41 +0200 Subject: [PATCH 1423/1724] add missing arg to Crc32_FromFile function --- inc/crc32.h | 2 +- src/crc32.c | 26 ++++++++++++-------------- src/debug.c | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/inc/crc32.h b/inc/crc32.h index f2ddf4b..9b0728d 100644 --- a/inc/crc32.h +++ b/inc/crc32.h @@ -6,6 +6,6 @@ unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); -unsigned long Crc32_FromFile(char* filename); +unsigned long Crc32_FromFile(unsigned long crc32, char* filename); #endif diff --git a/src/crc32.c b/src/crc32.c index 0befe8e..e7ff75d 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -77,28 +77,26 @@ unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, return( crc32 ^ 0xFFFFFFFF ); } -unsigned long Crc32_FromFile(char* filename) +unsigned long Crc32_FromFile(unsigned long crc32, char* filename) { if (!filename) return 0; - unsigned long crc32 = 0; - FILE* fp = fopen(filename, "rb"); - if (fp) + if (!fp) + return 0; + + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) { - char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) - { - crc32 = Crc32_ComputeBuf(crc32, buf, s); - } - - if (ferror(fp)) - crc32 = 0; - - fclose(fp); + crc32 = Crc32_ComputeBuf(crc32, buf, s); } + if (ferror(fp)) + crc32 = 0; + + fclose(fp); + return crc32; } diff --git a/src/debug.c b/src/debug.c index ce8fe85..52382c1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -269,7 +269,7 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } - TRACE("crc32 = %08X\n", Crc32_FromFile(exe_path)); + TRACE("crc32 = %08X\n", Crc32_FromFile(0, exe_path)); DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) From 95a5f7231e8298d73302a02982631fe3a9401e84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Oct 2024 16:47:17 +0200 Subject: [PATCH 1424/1724] don't emulate 60hz vblank on 60hz monitor --- inc/dd.h | 1 + src/dd.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..cb82a6e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,6 +176,7 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; + BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index 981f986..b6c3382 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,6 +701,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } + else if (g_config.maxgameticks == 0) + { + // no need to emulate 60hz vblank if we got a 60hz monitor + if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) + { + g_ddraw.wait_for_real_vblank = TRUE; + } + } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1544,7 +1552,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2) + if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From ca6c447ae615ca1d7168af836b5e84c152e4977e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 03:57:10 +0200 Subject: [PATCH 1425/1724] fix window resize and maximize for macOS + fix resize on linux --- inc/config.h | 1 - src/config.c | 2 -- src/dd.c | 4 ++-- src/wndproc.c | 13 ++++++++++++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/inc/config.h b/inc/config.h index 168c54d..fef71bb 100644 --- a/inc/config.h +++ b/inc/config.h @@ -65,7 +65,6 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; - BOOL wine_allow_resize; int guard_lines; int max_resolutions; BOOL lock_surfaces; diff --git a/src/config.c b/src/config.c index 6b25434..9472523 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); - GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); @@ -314,7 +313,6 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" - "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" diff --git a/src/dd.c b/src/dd.c index b6c3382..94b7adf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,12 +1093,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (!g_config.wine_allow_resize && IsWine()) + if (IsLinux()) { real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX)); } /* center the window with correct dimensions */ diff --git a/src/wndproc.c b/src/wndproc.c index eecba37..a76e126 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -443,12 +443,23 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { + if (in_size_move && g_ddraw.render.thread && IsMacOS()) + { + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } + if (in_size_move && !g_ddraw.render.thread) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) + else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); From 116297d2b4662dcfce52b389b66a9a18d2ec824c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:13:40 +0200 Subject: [PATCH 1426/1724] do not save settings after maxmize on macOS --- src/wndproc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index a76e126..ed17114 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -443,6 +443,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { + /* macOS maximize hack */ if (in_size_move && g_ddraw.render.thread && IsMacOS()) { EnterCriticalSection(&g_ddraw.cs); @@ -452,6 +453,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam WaitForSingleObject(g_ddraw.render.thread, INFINITE); g_ddraw.render.thread = NULL; + + g_config.save_settings = 0; } if (in_size_move && !g_ddraw.render.thread) From 07e088faaabe1a247b78a37611e4a03472d8e351 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:27:04 +0200 Subject: [PATCH 1427/1724] Do not save settings while window is maxmized in macOS --- src/config.c | 4 ++++ src/wndproc.c | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 9472523..36bdee6 100644 --- a/src/config.c +++ b/src/config.c @@ -131,6 +131,10 @@ void cfg_save() if (!g_config.save_settings) return; + /* Do not save settings while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + char buf[16]; char* section = g_config.save_settings == 1 ? "ddraw" : g_config.process_file_name; diff --git a/src/wndproc.c b/src/wndproc.c index ed17114..a2ffa7e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -453,8 +453,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam WaitForSingleObject(g_ddraw.render.thread, INFINITE); g_ddraw.render.thread = NULL; - - g_config.save_settings = 0; } if (in_size_move && !g_ddraw.render.thread) From dce598afcf889ef512d0b079d66533d31ad819fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:50:49 +0200 Subject: [PATCH 1428/1724] disable maximize and windowed toggle while maximized on macOS --- src/config.c | 2 +- src/utils.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 36bdee6..99a23f0 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while window is maxmized */ + /* Do not save settings while window is maximized */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 5db8159..68f314e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,6 +613,10 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; + /* Do not allow maximize while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + RECT client_rc; RECT dst_rc; @@ -717,6 +721,10 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; + /* Do not allow ALT+ENTER while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + if (g_config.toggle_borderless && g_config.windowed) { if (!g_config.fullscreen) From bb43a486d96d2a33deb73e827bb74f2a411f113f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:51:51 +0200 Subject: [PATCH 1429/1724] fix comments --- src/config.c | 2 +- src/utils.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 99a23f0..cd48c17 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while window is maximized */ + /* Do not save settings while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 68f314e..68454bb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,7 +613,7 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; - /* Do not allow maximize while window is maxmized */ + /* Do not allow cnc-ddraw maximize while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; @@ -721,7 +721,7 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; - /* Do not allow ALT+ENTER while window is maxmized */ + /* Do not allow ALT+ENTER while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; From 5c853ca48783bb8ad7bb1d6e0cc08498ef88c547 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:52:23 +0200 Subject: [PATCH 1430/1724] fix typo --- src/config.c | 2 +- src/utils.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index cd48c17..02426ff 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while macOS maxmize is active */ + /* Do not save settings while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 68454bb..15a52ea 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,7 +613,7 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; - /* Do not allow cnc-ddraw maximize while macOS maxmize is active */ + /* Do not allow cnc-ddraw maximize while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; @@ -721,7 +721,7 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; - /* Do not allow ALT+ENTER while macOS maxmize is active */ + /* Do not allow ALT+ENTER while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; From f1316407d1f6312044534bedcd26ed9dbc4d72bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 13:49:57 +0200 Subject: [PATCH 1431/1724] fix maximize button on linux --- src/dd.c | 8 -------- src/wndproc.c | 30 ++++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/dd.c b/src/dd.c index 94b7adf..30fa884 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,14 +1093,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (IsLinux()) - { - real_SetWindowLongA( - g_ddraw.hwnd, - GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX)); - } - /* center the window with correct dimensions */ int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; diff --git a/src/wndproc.c b/src/wndproc.c index a2ffa7e..890bc01 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -441,6 +441,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_config.windowed) { + WORD width = LOWORD(lParam); + WORD height = HIWORD(lParam); + if (wParam == SIZE_RESTORED) { /* macOS maximize hack */ @@ -457,16 +460,31 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (in_size_move && !g_ddraw.render.thread) { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; } else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + if (width != g_ddraw.render.width || height != g_ddraw.render.height) + { + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; - if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) dd_SetDisplayMode(0, 0, 0, 0); + } + } + } + else if (wParam == SIZE_MAXIMIZED) + { + if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) + { + if (width != g_ddraw.render.width || height != g_ddraw.render.height) + { + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; + + dd_SetDisplayMode(0, 0, 0, 0); + } } } } @@ -532,7 +550,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam == SC_MAXIMIZE) + if (wParam == SC_MAXIMIZE && !IsWine()) { if (g_config.resizable) { From a93d004f1b7dee00b364a6ea42370c5551ebb85f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 14:13:59 +0200 Subject: [PATCH 1432/1724] move inject_resolution up and add notes --- inc/config.h | 2 +- src/config.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index fef71bb..ad6ce54 100644 --- a/inc/config.h +++ b/inc/config.h @@ -43,6 +43,7 @@ typedef struct CNCDDRAWCONFIG int anti_aliased_fonts_min_size; int min_font_size; int center_window; + char inject_resolution[128]; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; @@ -71,7 +72,6 @@ typedef struct CNCDDRAWCONFIG BOOL flipclear; BOOL rgb555; BOOL no_dinput_hook; - char inject_resolution[128]; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; diff --git a/src/config.c b/src/config.c index 02426ff..c2ba7ca 100644 --- a/src/config.c +++ b/src/config.c @@ -55,6 +55,7 @@ void cfg_load() GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_INT(g_config.min_font_size, "min_font_size", 0); GET_INT(g_config.center_window, "center_window", CENTER_WINDOW_AUTO); + GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -84,7 +85,6 @@ void cfg_load() GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); @@ -258,6 +258,10 @@ static void cfg_create_ini() "; Possible values: 0 = never center, 1 = automatic, 2 = always center\n" "center_window=1\n" "\n" + "; Inject a custom display resolution into the in-game resolution list - Example values: 960x540, 3840x2160\n" + "; Note: This setting can used for downscaling as well, you can insert resolutions higher than your monitor supports\n" + "inject_resolution=\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" @@ -299,7 +303,7 @@ static void cfg_create_ini() "; Note: Disable this if the game is not running smooth or there are sound issues\n" "singlecpu=true\n" "\n" - "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" + "; Available display resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" "; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list\n" "; Note: Set this to 1 if the game is crashing on startup\n" "resolutions=0\n" @@ -323,7 +327,6 @@ static void cfg_create_ini() "flipclear=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" From 747f1df81cf051bd5e5f0680d4a8420b98eaf8a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:39:49 +0200 Subject: [PATCH 1433/1724] add hack for linux to enforce minimum window size --- inc/wndproc.h | 1 + src/wndproc.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 4d36cb3..4af4f7e 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -12,6 +12,7 @@ #define WM_RESTORE_STYLE WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 +#define IDT_TIMER_LINUX_FIX_WINDOW_SIZE 345267753 #define CNC_DDRAW_SET_FULLSCREEN 1 #define CNC_DDRAW_SET_WINDOWED 2 diff --git a/src/wndproc.c b/src/wndproc.c index 890bc01..cba872e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -216,6 +216,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + case IDT_TIMER_LINUX_FIX_WINDOW_SIZE: + { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + return 0; + } } break; } @@ -471,6 +477,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = height; dd_SetDisplayMode(0, 0, 0, 0); + + if (width < g_ddraw.width || height < g_ddraw.height) + { + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); + } } } } From c8980c5e349a559486afb88adb9b0768811c7d7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:43:04 +0200 Subject: [PATCH 1434/1724] kill timer on maximize (just to be sure...) --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index cba872e..7fc59fa 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -491,6 +491,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (width != g_ddraw.render.width || height != g_ddraw.render.height) { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + g_config.window_rect.right = width; g_config.window_rect.bottom = height; From 552c5809e01ce75637875e9609b2d6694f68f78e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:47:08 +0200 Subject: [PATCH 1435/1724] add comment --- src/wndproc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 7fc59fa..56283f6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -480,6 +480,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (width < g_ddraw.width || height < g_ddraw.height) { + /* Can't enforce minimum window size in linux because there is no WM_SIZING and + WM_GETMINMAXINFO is ignored for whatever reasons */ + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); } } From 4af2daed14edcca078681886ad097183b383e783 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 23:00:13 +0200 Subject: [PATCH 1436/1724] enforce minimum window size on restore after maximize --- src/wndproc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 56283f6..52d4dbc 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -500,6 +500,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = height; dd_SetDisplayMode(0, 0, 0, 0); + + if (width < g_ddraw.width || height < g_ddraw.height) + { + /* Can't enforce minimum window size in linux because there is no WM_SIZING and + WM_GETMINMAXINFO is ignored for whatever reasons */ + + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); + } } } } From 4fdc98ef28ec10673b6482dc5138dad7c541159f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 23:03:00 +0200 Subject: [PATCH 1437/1724] add missing KillTimer call --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 52d4dbc..fd8fc6b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -473,6 +473,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (width != g_ddraw.render.width || height != g_ddraw.render.height) { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + g_config.window_rect.right = width; g_config.window_rect.bottom = height; From 92df1257bd31181b0a0ad12cc3d3fac40248a8d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 21:33:37 +0200 Subject: [PATCH 1438/1724] do not never forward SC_MAXIMIZE to the game in wine --- src/wndproc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index fd8fc6b..2d50d58 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -576,8 +576,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam == SC_MAXIMIZE && !IsWine()) + if (wParam == SC_MAXIMIZE) { + if (IsWine()) + return DefWindowProc(hWnd, uMsg, wParam, lParam); + if (g_config.resizable) { util_toggle_maximize(); From fc9bb11e755b8e0436b138c250f6ae695b0c4945 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 21:38:07 +0200 Subject: [PATCH 1439/1724] fix resizable .ini setting in wine --- src/dd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dd.c b/src/dd.c index 30fa884..053e030 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,6 +1093,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } + if (!g_config.resizable && IsWine()) + { + real_SetWindowLongA( + g_ddraw.hwnd, + GWL_STYLE, + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + } + /* center the window with correct dimensions */ int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; From 6d61a423ee4c66d32afc9b3e78f06d78f255c556 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 23:43:43 +0200 Subject: [PATCH 1440/1724] only use workaround for linux and not for macOS --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 2d50d58..3d8823f 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -535,7 +535,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (IsWine() && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (IsLinux() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ From fc9243d71b416050e1b7dd712e79326fe2cb38f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 23:55:16 +0200 Subject: [PATCH 1441/1724] keep old WS_MINIMIZEBOX hack --- src/dd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 053e030..5c205c7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,12 +1093,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (!g_config.resizable && IsWine()) + if (IsWine()) { + LONG remove_flags = !g_config.resizable ? (WS_MAXIMIZEBOX | WS_THICKFRAME) : 0; + real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(remove_flags)); } /* center the window with correct dimensions */ From a2c0dee5065e10c19ecb1f062f983517a45e8b34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Oct 2024 16:58:21 +0200 Subject: [PATCH 1442/1724] improve logs --- src/dd.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dd.c b/src/dd.c index 5c205c7..280ce03 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1359,6 +1359,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } + TRACE( + " render res=%ux%u (viewport res=%ux%u, x=%d, y=%d)\n", + g_ddraw.render.width, + g_ddraw.render.height, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + TRACE( + " windowed=%s, fullscreen=%s, adjmouse=%s\n", + g_config.windowed ? "true" : "false", + g_config.fullscreen ? "true" : "false", + g_config.adjmouse ? "true" : "false"); + return DD_OK; } From 01fe4f2f0faa7254f5beeee250dfa49ffd501209 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Oct 2024 22:17:55 +0200 Subject: [PATCH 1443/1724] update worms armageddon preset --- src/config.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index c2ba7ca..f5a83c5 100644 --- a/src/config.c +++ b/src/config.c @@ -1606,10 +1606,7 @@ static void cfg_create_ini() "\n" "; Worms Armageddon\n" "[WA]\n" - "adjmouse=true\n" - "width=0\n" - "height=0\n" - "resizable=false\n" + "lock_mouse_top_left=true\n" "\n" "; War Wind\n" "[WW]\n" From 362d05367cf17c240aa876630287c42b09c45abc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:24:07 +0200 Subject: [PATCH 1444/1724] allow to toggle windowed/maximize with a single key press --- inc/config.h | 3 ++- src/config.c | 17 ++++++++++++----- src/keyboard.c | 12 ++++++++++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index ad6ce54..a736411 100644 --- a/inc/config.h +++ b/inc/config.h @@ -86,7 +86,9 @@ typedef struct CNCDDRAWCONFIG struct { int toggle_fullscreen; + int toggle_fullscreen2; int toggle_maximize; + int toggle_maximize2; int unlock_cursor1; int unlock_cursor2; int screenshot; @@ -100,7 +102,6 @@ typedef struct CNCDDRAWCONFIG BOOL stronghold_hack; BOOL mgs_hack; BOOL tlc_hack; - BOOL homm_hack; BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; diff --git a/src/config.c b/src/config.c index f5a83c5..2d052f5 100644 --- a/src/config.c +++ b/src/config.c @@ -97,7 +97,9 @@ void cfg_load() /* Hotkeys */ GET_INT(g_config.hotkeys.toggle_fullscreen, "keytogglefullscreen", VK_RETURN); + GET_INT(g_config.hotkeys.toggle_fullscreen2, "keytogglefullscreen2", 0); GET_INT(g_config.hotkeys.toggle_maximize, "keytogglemaximize", VK_NEXT); + GET_INT(g_config.hotkeys.toggle_maximize2, "keytogglemaximize2", 0); GET_INT(g_config.hotkeys.unlock_cursor1, "keyunlockcursor1", VK_TAB); GET_INT(g_config.hotkeys.unlock_cursor2, "keyunlockcursor2", VK_RCONTROL); GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); @@ -110,7 +112,6 @@ void cfg_load() GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); - GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); @@ -346,9 +347,15 @@ static void cfg_create_ini() "; Switch between windowed and fullscreen mode = [Alt] + ???\n" "keytogglefullscreen=0x0D\n" "\n" + "; Switch between windowed and fullscreen mode (single key) = ???\n" + "keytogglefullscreen2=0x00\n" + "\n" "; Maximize window = [Alt] + ???\n" "keytogglemaximize=0x22\n" "\n" + "; Maximize window (single key) = ???\n" + "keytogglemaximize2=0x00\n" + "\n" "; Unlock cursor 1 = [Ctrl] + ???\n" "keyunlockcursor1=0x09\n" "\n" @@ -983,23 +990,23 @@ static void cfg_create_ini() "[Heroes3]\n" "renderer=opengl\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III HD Mod\n" "[Heroes3 HD]\n" "renderer=opengl\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III - Master of Puppets mod\n" "[MoP]\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" "remove_menu=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" diff --git a/src/keyboard.c b/src/keyboard.c index 109269b..2ca9fbb 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -62,6 +62,14 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } + if (wParam == g_config.hotkeys.toggle_fullscreen2) + { + if (key_triggered) + util_toggle_fullscreen(); + + return 1; + } + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { if (key_triggered) @@ -70,10 +78,10 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ + if (wParam == g_config.hotkeys.toggle_maximize2) { if (key_triggered) - util_toggle_fullscreen(); + util_toggle_maximize(); return 1; } From a6ef1bbfe714d71fd6cd93583176ae9e8de47b11 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:43:21 +0200 Subject: [PATCH 1445/1724] update Jazz Jackrabbit 2 presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 2d052f5..52f37a2 100644 --- a/src/config.c +++ b/src/config.c @@ -965,12 +965,12 @@ static void cfg_create_ini() "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" - "keytogglefullscreen=0x08\n" + "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" - "keytogglefullscreen=0x08\n" + "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" From 03d82b86a46a04940fcc60241534d8ef1722cbce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:44:26 +0200 Subject: [PATCH 1446/1724] remoe devmode setting --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index 52f37a2..51cfdc7 100644 --- a/src/config.c +++ b/src/config.c @@ -965,12 +965,10 @@ static void cfg_create_ini() "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" - "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" - "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" From 9671d810af69ff11fde4a9e04a20a2e611e4e03d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Oct 2024 16:48:19 +0200 Subject: [PATCH 1447/1724] #352 add preset for Age Of Wonders 1 --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index 51cfdc7..f323d29 100644 --- a/src/config.c +++ b/src/config.c @@ -436,6 +436,22 @@ static void cfg_create_ini() "fake_mode=640x480x32\n" "nonexclusive=true\n" "\n" + "; Age of Wonders\n" + "[AoW]\n" + "resolutions=2\n" + "nonexclusive=false\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders\n" + "[AoWCompat]\n" + "resolutions=2\n" + "nonexclusive=false\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders Config Tool\n" + "[AoWSetup]\n" + "resolutions=2\n" + "\n" "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" From 02aa3bc0d9302e27fb3c51bda8c594c28318f9ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 31 Jul 2023 07:33:57 +0200 Subject: [PATCH 1448/1724] remove fixwndprochook setting --- inc/dd.h | 1 - src/config.c | 5 ----- src/winapi_hooks.c | 24 ++++++------------------ 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 5fc29c0..c164705 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -140,7 +140,6 @@ typedef struct CNCDDRAW BOOL nonexclusive; BOOL fixpitch; int fixchilds; - BOOL fixwndprochook; BOOL fixnotresponding; BOOL locktopleft; BOOL d3d9linear; diff --git a/src/config.c b/src/config.c index 5d48d41..206cf8b 100644 --- a/src/config.c +++ b/src/config.c @@ -43,7 +43,6 @@ void cfg_load() g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); - g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); @@ -719,17 +718,14 @@ static void cfg_create_ini() "\n" "; Grand Theft Auto\n" "[Grand Theft Auto]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Grand Theft Auto: London 1969\n" "[gta_uk]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Grand Theft Auto: London 1961\n" "[Gta_61]\n" - "fixwndprochook=true\n" "singlecpu=false\n" "\n" "; Heroes of Might and Magic II: The Succession Wars\n" @@ -745,7 +741,6 @@ static void cfg_create_ini() "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" - "fixwndprochook=true\n" "renderer=opengl\n" "\n" "; Interstate 76\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index faf6514..c6ffd2d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -428,24 +428,12 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) if (nIndex == GWL_STYLE) return 0; - if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + if (nIndex == GWL_WNDPROC) { - if (dwNewLong == (LONG)compat_WndProc) - { - WNDPROC old = g_ddraw->wndproc = g_compat_wndproc; - //g_compat_wndproc = NULL; - return (LONG)old; - } - else - { - if (dwNewLong != (LONG)g_ddraw->wndproc) - { - g_compat_wndproc = g_ddraw->wndproc; - g_ddraw->wndproc = (WNDPROC)dwNewLong; - } + WNDPROC old = g_ddraw->wndproc; + g_ddraw->wndproc = (WNDPROC)dwNewLong; - return (LONG)compat_WndProc; - } + return (LONG)old; } } @@ -456,9 +444,9 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { if (g_ddraw && g_ddraw->hwnd == hWnd) { - if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + if (nIndex == GWL_WNDPROC) { - return (LONG)compat_WndProc; + return (LONG)g_ddraw->wndproc; } } From a4f927b09510407c6e3a1ce0f2e36b73fcadc162 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Oct 2024 18:02:30 +0200 Subject: [PATCH 1449/1724] add a check for DDSCAPS_OWNDC --- src/ddsurface.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f87cf0..20ddd4f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -917,7 +917,8 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; - InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); + if (!(This->caps & DDSCAPS_OWNDC)) + InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); return DD_OK; } @@ -1025,7 +1026,8 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) } } - RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); + if (!(This->caps & DDSCAPS_OWNDC)) + RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); return DD_OK; } From 856ce8a3af14a11c77ee49f6450ecfde8b1381af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Oct 2024 18:42:46 +0200 Subject: [PATCH 1450/1724] add preset for Hooligans: Storm over Europe --- inc/config.h | 1 + src/config.c | 6 ++++++ src/ddsurface.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index a736411..60c6eea 100644 --- a/inc/config.h +++ b/inc/config.h @@ -78,6 +78,7 @@ typedef struct CNCDDRAWCONFIG BOOL lock_mouse_top_left; char win_version[32]; int hook; + BOOL limit_gdi_handles; BOOL remove_menu; int refresh_rate; diff --git a/src/config.c b/src/config.c index f323d29..63d04cf 100644 --- a/src/config.c +++ b/src/config.c @@ -91,6 +91,7 @@ void cfg_load() GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); GET_INT(g_config.hook, "hook", 4); + GET_BOOL(g_config.limit_gdi_handles, "limit_gdi_handles", FALSE); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); @@ -334,6 +335,7 @@ static void cfg_create_ini() "lock_mouse_top_left=false\n" ";win_version=95\n" "hook=4\n" + "limit_gdi_handles=false\n" "remove_menu=false\n" "refresh_rate=0\n" "\n" @@ -1028,6 +1030,10 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" + "; Hooligans: Storm over Europe\n" + "[hooligans]\n" + "limit_gdi_handles=true\n" + "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 20ddd4f..b073f6d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1500,7 +1500,7 @@ HRESULT dd_CreateSurface( } /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ - if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || + if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) || (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || (dst_surface->width == 128 && dst_surface->height == 128)) { From 9545a58f0522e8437c0599fab4ac214514e12e8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Oct 2024 00:10:54 +0200 Subject: [PATCH 1451/1724] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 481a60c..dbc1304 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine **Important** - **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead -- If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` - **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer +- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44) - Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details -- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From a851f93c0a65d9738ab54e0efdab3473f39ca863 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Oct 2024 02:49:41 +0200 Subject: [PATCH 1452/1724] add Final Liberation: Warhammer Epic 40000 (GOG) to supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 481a60c..e4198a9 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 +- Final Liberation: Warhammer Epic 40000 (GOG) - Final fantasy VII - Final fantasy VIII - Freddi Fish From ce4860dc05aa4ab5b50cb05099a9edf81a240ce4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Oct 2024 16:28:39 +0200 Subject: [PATCH 1453/1724] fix downscaling with boxing=true --- src/dd.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 280ce03..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -934,15 +934,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.boxing) { - g_ddraw.render.viewport.width = g_ddraw.width; - g_ddraw.render.viewport.height = g_ddraw.height; - for (int i = 20; i-- > 1;) { if (g_ddraw.width * i <= g_ddraw.render.width && g_ddraw.height * i <= g_ddraw.render.height) { - g_ddraw.render.viewport.width *= i; - g_ddraw.render.viewport.height *= i; + g_ddraw.render.viewport.width = i * g_ddraw.width; + g_ddraw.render.viewport.height = i * g_ddraw.height; break; } } From 79cfe0f466d43ce0a5b766b70a9bde5235ee5598 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Oct 2024 17:31:28 +0200 Subject: [PATCH 1454/1724] tweak legacy build --- inc/versionhelpers.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index e564c95..fa542ac 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -30,6 +30,7 @@ #if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) #define VerifyVersionInfoW(a,b,c) 0 +#define VerSetConditionMask verhelp_set_mask #endif void verhelp_init(); @@ -42,7 +43,7 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -53,7 +54,7 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -64,7 +65,7 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -137,7 +138,7 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } VERSIONHELPERAPI IsWindows2000(void) { From e3e7dc22e1d268f8d6a0f9e0412f848a0a732d1e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Oct 2024 21:40:28 +0200 Subject: [PATCH 1455/1724] improve debug logs --- inc/debug.h | 1 + src/debug.c | 22 ++++++++++++++++++++++ src/directinput.c | 2 ++ 3 files changed, 25 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index c0372f1..4eb5310 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -27,6 +27,7 @@ void dbg_dump_dds_caps(DWORD caps); void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); +void dbg_dump_di_scm_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); diff --git a/src/debug.c b/src/debug.c index 52382c1..650c2b4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3,6 +3,7 @@ #include #include #include +#include "directinput.h" #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -1086,6 +1087,27 @@ void dbg_dump_dds_lock_flags(DWORD flags) #endif } +void dbg_dump_di_scm_flags(DWORD flags) +{ +#ifdef _DEBUG + if (flags & DISCL_EXCLUSIVE) { + TRACE(" DISCL_EXCLUSIVE\n"); + } + if (flags & DISCL_NONEXCLUSIVE) { + TRACE(" DISCL_NONEXCLUSIVE\n"); + } + if (flags & DISCL_FOREGROUND) { + TRACE(" DISCL_FOREGROUND\n"); + } + if (flags & DISCL_BACKGROUND) { + TRACE(" DISCL_BACKGROUND\n"); + } + if (flags & DISCL_NOWINKEY) { + TRACE(" DISCL_NOWINKEY\n"); + } +#endif +} + char* dbg_d3d9_hr_to_str(HRESULT hr) { #define HR_TO_STR(x) if (x == hr) return #x diff --git a/src/directinput.c b/src/directinput.c index d3f08f6..80d58c6 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -54,6 +54,8 @@ static PROC hook_func(PROC* org_func, PROC new_func) static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress()); + TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE"); + dbg_dump_di_scm_flags(dwFlags); if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { From a1864d612a5e2d742206103ad1b70448509ce854 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 27 Oct 2024 03:35:12 +0100 Subject: [PATCH 1456/1724] ignore dinput keypresses if window not in foreground --- src/directinput.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 80d58c6..7db6d2d 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -6,6 +6,7 @@ #include "dd.h" #include "mouse.h" #include "config.h" +#include "utils.h" #ifdef _MSC_VER #include "detours.h" @@ -86,13 +87,16 @@ static HRESULT WINAPI fake_did_GetDeviceData( pdwInOut, dwFlags, _ReturnAddress()); - */ + */ + + BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; + BOOL in_background = FALSE;//g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) + if (SUCCEEDED(result)) { - if (pdwInOut) + if ((block_mouse || in_background) && pdwInOut) { if (rgdod && *pdwInOut > 0 && cbObjectData > 0) { @@ -110,11 +114,14 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c { //TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress()); + BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; + BOOL in_background = g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); + HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) + if (SUCCEEDED(result)) { - if (cbData > 0 && lpvData) + if ((block_mouse || in_background) && cbData > 0 && lpvData) { memset(lpvData, 0, cbData); } From db43b5c65587a3c918dff6a4971de3722223f427 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 01:35:26 +0100 Subject: [PATCH 1457/1724] bump version --- inc/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/version.h b/inc/version.h index 8168d91..5c0c6b9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,10 +5,10 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define git_str(a) str(a) -#define VERSION_MAJOR 6 -#define VERSION_MINOR 9 +#define VERSION_MAJOR 7 +#define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From d3f78bad950b97110d43f5cd1934958b4dd28529 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 16:57:26 +0100 Subject: [PATCH 1458/1724] Revert "don't emulate 60hz vblank on 60hz monitor" This reverts commit 95a5f7231e8298d73302a02982631fe3a9401e84. --- inc/dd.h | 1 - src/dd.c | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index cb82a6e..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,7 +176,6 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; - BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index d7018e0..09e22bf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,14 +701,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } - else if (g_config.maxgameticks == 0) - { - // no need to emulate 60hz vblank if we got a 60hz monitor - if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) - { - g_ddraw.wait_for_real_vblank = TRUE; - } - } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1566,7 +1558,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) + if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 498e2f45e2f766e35357a9e185fd01e672f1de94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 16:59:39 +0100 Subject: [PATCH 1459/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 5c0c6b9..a7ac8d9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b23700a9b7343bb3e0ddde94882116964ac788d9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 17:44:02 +0100 Subject: [PATCH 1460/1724] Reapply "don't emulate 60hz vblank on 60hz monitor" This reverts commit d3f78bad950b97110d43f5cd1934958b4dd28529. --- inc/dd.h | 1 + src/dd.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..cb82a6e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,6 +176,7 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; + BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index 09e22bf..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,6 +701,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } + else if (g_config.maxgameticks == 0) + { + // no need to emulate 60hz vblank if we got a 60hz monitor + if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) + { + g_ddraw.wait_for_real_vblank = TRUE; + } + } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1558,7 +1566,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2) + if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 27dbd0792582f060616f1c74e55678f9ed863484 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 17:53:01 +0100 Subject: [PATCH 1461/1724] Don't use DwmFlush --- inc/fps_limiter.h | 7 ------ src/dd.c | 13 ++--------- src/fps_limiter.c | 57 ++--------------------------------------------- 3 files changed, 4 insertions(+), 73 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index ec0f7bc..dcc413c 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -22,8 +22,6 @@ typedef struct _D3DKMT_CLOSEADAPTER { UINT hAdapter; } D3DKMT_CLOSEADAPTER; -typedef HRESULT(WINAPI* DWMFLUSHPROC)(VOID); -typedef HRESULT(WINAPI* DWMISCOMPOSITIONENABLEDPROC)(BOOL*); typedef NTSTATUS(WINAPI* D3DKMTWAITFORVERTICALBLANKEVENTPROC)(const D3DKMT_WAITFORVERTICALBLANKEVENT* Arg1); typedef NTSTATUS(WINAPI* D3DKMTOPENADAPTERFROMHDCPROC)(D3DKMT_OPENADAPTERFROMHDC* Arg1); typedef NTSTATUS(WINAPI* D3DKMTCLOSEADAPTERPROC)(D3DKMT_CLOSEADAPTER* Arg1); @@ -40,9 +38,6 @@ typedef struct FPSLIMITER D3DKMT_OPENADAPTERFROMHDC adapter; D3DKMT_CLOSEADAPTER close_adapter; HMODULE gdi32_dll; - HMODULE dwmapi_dll; - DWMFLUSHPROC DwmFlush; - DWMISCOMPOSITIONENABLEDPROC DwmIsCompositionEnabled; D3DKMTWAITFORVERTICALBLANKEVENTPROC D3DKMTWaitForVerticalBlankEvent; D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc; D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; @@ -56,8 +51,6 @@ extern FPSLIMITER g_fpsl; void fpsl_init(); BOOL fpsl_wait_for_vblank(); -BOOL fpsl_dwm_flush(); -BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); void fpsl_frame_end(); diff --git a/src/dd.c b/src/dd.c index d7018e0..65eed9b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1568,17 +1568,8 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return DD_OK; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return DD_OK; - } + if (fpsl_wait_for_vblank()) + return DD_OK; } if (!g_ddraw.flip_limiter.tick_length) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 14c4394..1300f8d 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -49,23 +49,6 @@ void fpsl_init() g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); } - if (!g_fpsl.dwmapi_dll) - { - g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); - } - - if (!g_fpsl.DwmFlush) - { - g_fpsl.DwmFlush = - (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); - } - - if (!g_fpsl.DwmIsCompositionEnabled) - { - g_fpsl.DwmIsCompositionEnabled = - (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); - } - if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = @@ -118,33 +101,6 @@ BOOL fpsl_wait_for_vblank() return FALSE; } -BOOL fpsl_dwm_flush() -{ - if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) - { - HRESULT x = g_fpsl.DwmFlush(); - - if (!SUCCEEDED(x)) - { - //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); - } - - return SUCCEEDED(x); - } - - return FALSE; -} - -BOOL fpsl_dwm_is_enabled() -{ - BOOL dwm_enabled = FALSE; - - if (g_fpsl.DwmIsCompositionEnabled) - g_fpsl.DwmIsCompositionEnabled(&dwm_enabled); - - return dwm_enabled; -} - void fpsl_frame_start() { if (g_fpsl.tick_length > 0) @@ -156,17 +112,8 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return; - } + if (fpsl_wait_for_vblank()) + return; } if (g_fpsl.tick_length > 0) From 9313a997dd95c4891ac8064eb3922f88b1cc0e90 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:11:29 +0100 Subject: [PATCH 1462/1724] Revert "Don't use DwmFlush" This reverts commit 27dbd0792582f060616f1c74e55678f9ed863484. --- inc/fps_limiter.h | 7 ++++++ src/dd.c | 13 +++++++++-- src/fps_limiter.c | 57 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index dcc413c..ec0f7bc 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -22,6 +22,8 @@ typedef struct _D3DKMT_CLOSEADAPTER { UINT hAdapter; } D3DKMT_CLOSEADAPTER; +typedef HRESULT(WINAPI* DWMFLUSHPROC)(VOID); +typedef HRESULT(WINAPI* DWMISCOMPOSITIONENABLEDPROC)(BOOL*); typedef NTSTATUS(WINAPI* D3DKMTWAITFORVERTICALBLANKEVENTPROC)(const D3DKMT_WAITFORVERTICALBLANKEVENT* Arg1); typedef NTSTATUS(WINAPI* D3DKMTOPENADAPTERFROMHDCPROC)(D3DKMT_OPENADAPTERFROMHDC* Arg1); typedef NTSTATUS(WINAPI* D3DKMTCLOSEADAPTERPROC)(D3DKMT_CLOSEADAPTER* Arg1); @@ -38,6 +40,9 @@ typedef struct FPSLIMITER D3DKMT_OPENADAPTERFROMHDC adapter; D3DKMT_CLOSEADAPTER close_adapter; HMODULE gdi32_dll; + HMODULE dwmapi_dll; + DWMFLUSHPROC DwmFlush; + DWMISCOMPOSITIONENABLEDPROC DwmIsCompositionEnabled; D3DKMTWAITFORVERTICALBLANKEVENTPROC D3DKMTWaitForVerticalBlankEvent; D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc; D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; @@ -51,6 +56,8 @@ extern FPSLIMITER g_fpsl; void fpsl_init(); BOOL fpsl_wait_for_vblank(); +BOOL fpsl_dwm_flush(); +BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); void fpsl_frame_end(); diff --git a/src/dd.c b/src/dd.c index 65eed9b..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1568,8 +1568,17 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { - if (fpsl_wait_for_vblank()) - return DD_OK; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return DD_OK; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return DD_OK; + } } if (!g_ddraw.flip_limiter.tick_length) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 1300f8d..14c4394 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -49,6 +49,23 @@ void fpsl_init() g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); } + if (!g_fpsl.dwmapi_dll) + { + g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); + } + + if (!g_fpsl.DwmFlush) + { + g_fpsl.DwmFlush = + (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); + } + + if (!g_fpsl.DwmIsCompositionEnabled) + { + g_fpsl.DwmIsCompositionEnabled = + (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); + } + if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = @@ -101,6 +118,33 @@ BOOL fpsl_wait_for_vblank() return FALSE; } +BOOL fpsl_dwm_flush() +{ + if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) + { + HRESULT x = g_fpsl.DwmFlush(); + + if (!SUCCEEDED(x)) + { + //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); + } + + return SUCCEEDED(x); + } + + return FALSE; +} + +BOOL fpsl_dwm_is_enabled() +{ + BOOL dwm_enabled = FALSE; + + if (g_fpsl.DwmIsCompositionEnabled) + g_fpsl.DwmIsCompositionEnabled(&dwm_enabled); + + return dwm_enabled; +} + void fpsl_frame_start() { if (g_fpsl.tick_length > 0) @@ -112,8 +156,17 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { - if (fpsl_wait_for_vblank()) - return; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return; + } } if (g_fpsl.tick_length > 0) From ca08dd6006bb4a4e5d025c4215d5639b5a7c7fba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:11:42 +0100 Subject: [PATCH 1463/1724] Revert "don't emulate 60hz vblank on 60hz monitor" This reverts commit 95a5f7231e8298d73302a02982631fe3a9401e84. --- inc/dd.h | 1 - src/dd.c | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index cb82a6e..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,7 +176,6 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; - BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index d7018e0..09e22bf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,14 +701,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } - else if (g_config.maxgameticks == 0) - { - // no need to emulate 60hz vblank if we got a 60hz monitor - if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) - { - g_ddraw.wait_for_real_vblank = TRUE; - } - } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1566,7 +1558,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) + if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 2c69e41b18cd7e426cf23c100a7af9e8f3bbef6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:16:22 +0100 Subject: [PATCH 1464/1724] don't use DwmFlush WaitForVerticalBlank --- src/dd.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 09e22bf..61eeb38 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1560,17 +1560,8 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return DD_OK; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return DD_OK; - } + if (fpsl_wait_for_vblank()) + return DD_OK; } if (!g_ddraw.flip_limiter.tick_length) From 4db1628431c7c244385ee2f4a4680aa5cd4393a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Nov 2024 02:32:00 +0100 Subject: [PATCH 1465/1724] only use windowed hack if window is smaller than screen size --- src/dd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 61eeb38..781a1ad 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1540,12 +1540,14 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (!g_ddraw.width) { - g_ddraw.windowed_hack = TRUE; - RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); - dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + if (rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) + { + g_ddraw.windowed_hack = TRUE; + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + } } } else From e3af5739165ea5adbdde82af4fc636e5e25b1c69 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Nov 2024 05:07:09 +0100 Subject: [PATCH 1466/1724] enable windowed hack for non-popup windows --- src/dd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 781a1ad..0752a3f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1543,7 +1543,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); - if (rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) + BOOL popup = real_GetWindowLongA(hwnd, GWL_STYLE) & WS_POPUP; + + if ((rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) || !popup) { g_ddraw.windowed_hack = TRUE; dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); From d4c329f8bda6ad1ca65930e46d2380d90c5cf472 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 4 Nov 2024 02:27:34 +0100 Subject: [PATCH 1467/1724] add some debug code --- src/ddsurface.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index b073f6d..eee23ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -74,10 +74,16 @@ HRESULT dds_Blt( RECT dst_rect = { 0, 0, This->width, This->height }; if (lpSrcRect && src_surface) - memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); + { + //dbg_print_rect("lpSrcRect", lpSrcRect); + src_rect = *lpSrcRect; + } if (lpDestRect) - memcpy(&dst_rect, lpDestRect, sizeof(dst_rect)); + { + //dbg_print_rect("lpDestRect", lpDestRect); + dst_rect = *lpDestRect; + } int src_w = src_rect.right - src_rect.left; int src_h = src_rect.bottom - src_rect.top; @@ -456,7 +462,10 @@ HRESULT dds_BltFast( RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 }; if (lpSrcRect && src_surface) - memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); + { + //dbg_print_rect("lpSrcRect", lpSrcRect); + src_rect = *lpSrcRect; + } int dst_x = dwX; int dst_y = dwY; From 3c1f7ea838a092789d8adafc0eeebb6563949546 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Nov 2024 18:31:04 +0100 Subject: [PATCH 1468/1724] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 960c634..a57f5c6 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Stronghold Crusader HD - Stronghold HD - Sudden Strike 2 +- Superbike 2000 - The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone @@ -330,6 +331,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness +- TianLong BaBu - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From 72a5982f48abfe2ed2b2777791205ce1b6e96297 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Nov 2024 21:25:37 +0100 Subject: [PATCH 1469/1724] add some more privileged instructions to the list --- src/debug.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/debug.c b/src/debug.c index 650c2b4..bc27843 100644 --- a/src/debug.c +++ b/src/debug.c @@ -150,6 +150,12 @@ LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception) case 0xE7: // OUT ib size = 2; break; + case 0xF8: // CLC + case 0xF9: // STC + case 0xFA: // CLI + case 0xFB: // STI + case 0xFC: // CLD + case 0xFD: // STD case 0xEC: // IN ib case 0xED: // IN id case 0xEE: // OUT From e79654e620012b6c228e65f6611fe9be73999a53 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:06:44 +0100 Subject: [PATCH 1470/1724] add preset for Populous - The Beginning --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 63d04cf..9d12e9a 100644 --- a/src/config.c +++ b/src/config.c @@ -1361,6 +1361,10 @@ static void cfg_create_ini() "[PlayWTT]\n" "hook=3\n" "\n" + "; Populous - The Beginning\n" + "[popTB]\n" + "singlecpu=false\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From 957fe0bb028fe7c39121024801678ff69e8da18d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:10:58 +0100 Subject: [PATCH 1471/1724] add some presets --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index 9d12e9a..97e8808 100644 --- a/src/config.c +++ b/src/config.c @@ -499,6 +499,10 @@ static void cfg_create_ini() "[AN]\n" "adjmouse=true\n" "\n" + "; Another War\n" + "[AnotherWar]\n" + "singlecpu=false\n" + "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" @@ -616,6 +620,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Championship Manager 99-00\n" + "[cm9900]\n" + "singlecpu=false\n" + "\n" "; Command & Conquer: Sole Survivor\n" "[SOLE]\n" "maxgameticks=120\n" @@ -1623,6 +1631,10 @@ static void cfg_create_ini() "guard_lines=600\n" "minfps=-2\n" "\n" + "; Weird War\n" + "[WeirdWar]\n" + "singlecpu=false\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "sirtech_hack=true\n" From 2a0b4d58b26eafbfa24a0dc6165252079e64f69d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:15:27 +0100 Subject: [PATCH 1472/1724] sort readme --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a57f5c6..410f212 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - American Girls Dress Designer - Amerzone - Anno 1602: Creation of a New World +- Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura - Arthur's Pet Chase @@ -74,12 +75,12 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Balls of Steel v1.2 - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 -- Barbie(tm) Beach Vacation(tm) +- Balls of Steel v1.2 - Barbie(R) Photo Designer +- Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill - Blade & Sword @@ -87,14 +88,15 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Blue's 123 Time Activities - Blue's Treasure Hunt - Caesar III (Sierra - 1998) -- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Call To Power 2 +- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Capitalism II - Capitalism Lab - Captain Claw - Carmageddon - Carmageddon 2 - Casino Empire (AKA Hoyle Casino) +- Championship Manager 99-00 - Chaos Gate - Close Combat 2: A Bridge Too Far - Close Combat 3: The Russian Front @@ -153,9 +155,9 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 -- Final Liberation: Warhammer Epic 40000 (GOG) - Final fantasy VII - Final fantasy VIII +- Final Liberation: Warhammer Epic 40000 (GOG) - Freddi Fish - Freddi Fish 4 - Freddi Fish's One-Stop Fun Shop @@ -166,11 +168,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Freddi Water Worries - Future Cop L.A.P.D - G-Police +- Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz -- Gorasul: The Legacy of the Dragon - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 @@ -206,11 +208,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 +- M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD -- ​M.A.X. 2 Mechanized Assault & Exploration - Mech Warrior 3 - Megaman X4 - Metal Gear Solid @@ -239,11 +241,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Pacific General - Pajama Sam - Pajama Sam 3 +- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet - Pajama Sam's Games to Play on Any Day - Pajama Sam's One-Stop Fun Shop - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside -- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -277,12 +279,12 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D -- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) -- Reksio and the UFO (Reksio i Ufo) -- Reksio and the Wizards (Reksio i Czarodzieje) -- Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) +- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) +- Reksio and the Time Machine (Reksio i Wehikuł Czasu) +- Reksio and the UFO (Reksio i Ufo) +- Reksio and the Wizards (Reksio i Czarodzieje) - Road Rash - Robin Hood - The Legend of Sherwood - RollerCoaster Tycoon @@ -344,8 +346,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Virtua Fighter PC - War Wind - War Wind II - Human Onslaught -- WarCraft 2000: Nuclear Epidemic - Warcraft 2 +- WarCraft 2000: Nuclear Epidemic - Warlords 3: Darklords Rising - Warlords Battlecry - Warlords Battlecry 2 @@ -359,7 +361,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Zoombinis Logical Journey - Zoombinis Mountain Rescue - Zuma Deluxe - - ... +- ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From b7c46047fb42f26b6f1c3c95048798f8d3d5b2a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 03:36:38 +0100 Subject: [PATCH 1473/1724] add preset for Lost Vikings 2 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 410f212..f1f38e6 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 +- Lost Vikings 2 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math diff --git a/src/config.c b/src/config.c index 97e8808..e5f9f1c 100644 --- a/src/config.c +++ b/src/config.c @@ -1183,6 +1183,10 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Lost Vikings 2\n" + "[LOSTV95]\n" + "fake_mode=320x240x16\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" From ead0f2306e7608b1fd367508d55e7b6f89528bef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 04:13:50 +0100 Subject: [PATCH 1474/1724] add preset for Discoworld Noir --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index f1f38e6..1e99deb 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Disciples - Disciples 2 - Rise of the Elves - Divine Divinity +- Discoworld Noir - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice diff --git a/src/config.c b/src/config.c index e5f9f1c..9ff092f 100644 --- a/src/config.c +++ b/src/config.c @@ -873,6 +873,10 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "renderer=gdi\n" "\n" + "; Discoworld Noir\n" + "[dn]\n" + "fake_mode=640x480x16\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" From b4352232c8cfd99dd6cdf5e08aaea5ec5863e66b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 17:07:51 +0100 Subject: [PATCH 1475/1724] improve logging --- src/IDirect3D/IDirect3D.c | 5 +++++ src/IDirect3D/IDirect3D2.c | 5 +++++ src/IDirect3D/IDirect3D3.c | 5 +++++ src/IDirect3D/IDirect3D7.c | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index f6b075e..8c7c1c5 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, vo HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index c387d2a..2a83d47 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 72429c8..edc776b 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 35aa353..c058874 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 6a22fcf142e83105d172cfc4832623f6ebefb3f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 19:29:50 +0100 Subject: [PATCH 1476/1724] improve logging --- src/dd.c | 2 ++ src/hook.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/dd.c b/src/dd.c index 0752a3f..f5df432 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1547,6 +1547,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if ((rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) || !popup) { + TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); + g_ddraw.windowed_hack = TRUE; dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } diff --git a/src/hook.c b/src/hook.c index c10430d..d03f9ba 100644 --- a/src/hook.c +++ b/src/hook.c @@ -649,6 +649,8 @@ void hook_init() { /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; + + TRACE("g_config.hook = 3\n"); } } From e6c9eea47349344c212be6fabd59e4818ee34aa4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 21:20:29 +0100 Subject: [PATCH 1477/1724] log SetWindowsHookExA hook types --- inc/debug.h | 1 + src/debug.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 2 ++ 3 files changed, 54 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index 4eb5310..fa70c85 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,6 +28,7 @@ void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); void dbg_dump_di_scm_flags(DWORD flags); +void dbg_dump_hook_type(int idHook); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); diff --git a/src/debug.c b/src/debug.c index bc27843..9d615b5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1114,6 +1114,57 @@ void dbg_dump_di_scm_flags(DWORD flags) #endif } +void dbg_dump_hook_type(int idHook) +{ +#ifdef _DEBUG + if (idHook == 0) { + TRACE(" WH_JOURNALRECORD\n"); + } + if (idHook == 1) { + TRACE(" WH_JOURNALPLAYBACK\n"); + } + if (idHook == 2) { + TRACE(" WH_KEYBOARD\n"); + } + if (idHook == 3) { + TRACE(" WH_GETMESSAGE\n"); + } + if (idHook == 4) { + TRACE(" WH_CALLWNDPROC\n"); + } + if (idHook == 5) { + TRACE(" WH_CBT\n"); + } + if (idHook == 6) { + TRACE(" WH_SYSMSGFILTER\n"); + } + if (idHook == 7) { + TRACE(" WH_MOUSE\n"); + } + if (idHook == 9) { + TRACE(" WH_DEBUG\n"); + } + if (idHook == 10) { + TRACE(" WH_SHELL\n"); + } + if (idHook == 11) { + TRACE(" WH_FOREGROUNDIDLE\n"); + } + if (idHook == 12) { + TRACE(" WH_CALLWNDPROCRET\n"); + } + if (idHook == 13) { + TRACE(" WH_KEYBOARD_LL\n"); + } + if (idHook == 14) { + TRACE(" WH_MOUSE_LL\n"); + } + if (idHook == -1) { + TRACE(" WH_MSGFILTER\n"); + } +#endif +} + char* dbg_d3d9_hr_to_str(HRESULT hr) { #define HR_TO_STR(x) if (x == hr) return #x diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 96f6d0f..eebc181 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -591,6 +591,8 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D dwThreadId, _ReturnAddress()); + dbg_dump_hook_type(idHook); + if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { return NULL; From 3332b8c90727b5b9c975f77fec9baa58ea438243 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 23:48:00 +0100 Subject: [PATCH 1478/1724] add preset for Pandora's Box Puzzle Game --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 1e99deb..2889333 100644 --- a/README.md +++ b/README.md @@ -241,6 +241,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Outlaws - Outlive - Pacific General +- Pandora's Box Puzzle Game - Pajama Sam - Pajama Sam 3 - Pajama Sam 3: You Are What You Eat From Your Head To Your Feet diff --git a/src/config.c b/src/config.c index 9ff092f..e0c07fd 100644 --- a/src/config.c +++ b/src/config.c @@ -1288,6 +1288,10 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Pandora's Box Puzzle Game\n" + "[Pandora's Box]\n" + "fixchilds=0\n" + "\n" "; Paddle Bash Hotshot\n" "[SPAGHSPaddle]\n" "no_compat_warning=true\n" From e0c00d3a362a43ba66a2bcfd4d6e00ab8a19a8be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 00:36:30 +0100 Subject: [PATCH 1479/1724] fix exe name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index e0c07fd..d0f9bda 100644 --- a/src/config.c +++ b/src/config.c @@ -1289,7 +1289,7 @@ static void cfg_create_ini() "renderer=gdi\n" "\n" "; Pandora's Box Puzzle Game\n" - "[Pandora's Box]\n" + "[Pandora]\n" "fixchilds=0\n" "\n" "; Paddle Bash Hotshot\n" From 7dc702800297cb476572d3c79ba3bf868cab0f8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 02:06:38 +0100 Subject: [PATCH 1480/1724] improve logging --- src/IDirectDraw/IDirectDraw.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 7bff5f0..443a592 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -328,8 +328,18 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", + __FUNCTION__, + This, + dwFlags, + lpDDSurfaceDesc, + lpContext, + lpEnumSurfacesCallback, + _ReturnAddress()); + HRESULT ret = DD_OK; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From a77c3c21dc75ad181f762c9528e61b0246ba6102 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 03:05:16 +0100 Subject: [PATCH 1481/1724] add preset for Star Wars Rebellion --- README.md | 1 + src/config.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 2889333..4a72a19 100644 --- a/README.md +++ b/README.md @@ -313,6 +313,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Star Wars Rebellion - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns diff --git a/src/config.c b/src/config.c index d0f9bda..eac85be 100644 --- a/src/config.c +++ b/src/config.c @@ -1466,6 +1466,16 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Star Wars Rebellion\n" + "[REBEXE]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "hook=2\n" + "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" "nonexclusive=true\n" From 3738213ab5c7f19eed4b9deefa4824f948a3a7a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 03:12:35 +0100 Subject: [PATCH 1482/1724] change debug string --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index d03f9ba..04ec2d3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -650,7 +650,7 @@ void hook_init() /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; - TRACE("g_config.hook = 3\n"); + TRACE("Switched to hook 3\n"); } } From f5ff8a19a90818565a21ef425e4498ce2c71aa76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 04:47:41 +0100 Subject: [PATCH 1483/1724] update supported games in readme --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4a72a19..8ee7f2f 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Army Men Air Tactics - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue @@ -83,6 +84,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill +- Birthright: The Gorgons Alliance - Blade & Sword - Blood II - The Chosen - Blue's 123 Time Activities @@ -128,6 +130,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Cultures 2 - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Dark Earth - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 @@ -138,8 +141,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Diablo: Hellfire - Disciples - Disciples 2 - Rise of the Elves -- Divine Divinity - Discoworld Noir +- Divine Divinity - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice @@ -221,6 +224,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 +- Moorhuhn Adventure: Fluch des Goldes +- Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 @@ -241,7 +246,6 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Outlaws - Outlive - Pacific General -- Pandora's Box Puzzle Game - Pajama Sam - Pajama Sam 3 - Pajama Sam 3: You Are What You Eat From Your Head To Your Feet @@ -249,6 +253,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Pajama Sam's One-Stop Fun Shop - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside +- Pandora's Box Puzzle Game - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -313,8 +318,9 @@ Need help and don't have a github account? Ask your questions on [Discord](https - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone -- Star Wars Rebellion +- Star Trek Generations - Star Wars Jedi Knight: Dark Forces II +- Star Wars Rebellion - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft From 48081e3f248b47e35a52bdc89a0a539a1cce48bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 17:04:12 +0100 Subject: [PATCH 1484/1724] disable screensaver --- inc/config.h | 2 +- src/dllmain.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index 60c6eea..4e9731d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -22,7 +22,7 @@ typedef struct CNCDDRAWCONFIG INIFILE ini; BOOL d3d9on12; BOOL opengl_core; - + /* Optional settings */ BOOL fullscreen; diff --git a/src/dllmain.c b/src/dllmain.c index 701a79e..39d7dbb 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,6 +23,7 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; +static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -131,6 +132,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + BOOL screensaver_enabled = FALSE; + SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); + + if (screensaver_enabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); + g_screensaver_disabled = TRUE; + } + indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -151,6 +161,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); + if (g_screensaver_disabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); + } + ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From eafcdaf95dddc90febb94ee99fe2ebd0da56f103 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 19:33:23 +0100 Subject: [PATCH 1485/1724] use SetThreadExecutionState with ES_DISPLAY_REQUIRED --- src/dllmain.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 39d7dbb..37936a1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,7 +23,6 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; -static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -132,15 +131,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } - BOOL screensaver_enabled = FALSE; - SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); - - if (screensaver_enabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); - g_screensaver_disabled = TRUE; - } - + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -160,11 +151,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); - - if (g_screensaver_disabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); - } + SetThreadExecutionState(ES_CONTINUOUS); ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From 7505295e33e7a1932fe898be1e8c37c861e15227 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 20:12:46 +0100 Subject: [PATCH 1486/1724] Revert "use SetThreadExecutionState with ES_DISPLAY_REQUIRED" This reverts commit eafcdaf95dddc90febb94ee99fe2ebd0da56f103. --- src/dllmain.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 37936a1..39d7dbb 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,6 +23,7 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; +static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -131,7 +132,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } - SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); + BOOL screensaver_enabled = FALSE; + SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); + + if (screensaver_enabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); + g_screensaver_disabled = TRUE; + } + indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -151,7 +160,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); - SetThreadExecutionState(ES_CONTINUOUS); + + if (g_screensaver_disabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); + } ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From 895db5bf93afc6b50116dd86803261ad96888770 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 30 Nov 2024 23:39:11 +0100 Subject: [PATCH 1487/1724] SetThreadExecutionState for windows and SPI_SETSCREENSAVEACTIVE for WINE --- src/dllmain.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index 39d7dbb..97d675f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -132,6 +132,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + /* Make sure screensaver will stay off and monitors will stay on */ + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); + + /* WINE does not support SetThreadExecutionState so we'll have to use SPI_SETSCREENSAVEACTIVE instead */ BOOL screensaver_enabled = FALSE; SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); @@ -161,6 +165,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); + SetThreadExecutionState(ES_CONTINUOUS); + if (g_screensaver_disabled) { SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); From f0816d26a6d059d860d93f1f1bb3c4fc5a3d53de Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 00:42:45 +0200 Subject: [PATCH 1488/1724] use english key names for now --- config/ConfigFormUnit.cpp | 51 +++++++++++++++++++++++++++++++++++---- config/ConfigFormUnit.h | 1 + 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 790336a..acd2b4b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1235,11 +1235,11 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_PAUSE; } - if (key == L"R " + ShortCutToText(VK_CONTROL)) { + if (key == L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL))) { return VK_RCONTROL; } - return TextToShortCut(key); + return TextToShortCut(TranslateShortCut(key)); } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1253,14 +1253,55 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) } if (key == VK_RCONTROL) { - return L"R " + ShortCutToText(VK_CONTROL); + return L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL)); } if (key == VK_RSHIFT) { - return ShortCutToText(VK_SHIFT); + return TranslateShortCut(ShortCutToText(VK_SHIFT)); } - return ShortCutToText(key); + return TranslateShortCut(ShortCutToText(key)); +} + +System::UnicodeString TConfigForm::TranslateShortCut(System::UnicodeString text) +{ + /* Hack: Allows building the config tool on a german OS */ + if (text == "Eingabe") return "Enter"; + if (text == "Enter") return "Eingabe"; + if (text == "Leer") return "Space"; + if (text == "Space") return "Leer"; + if (text == "BildAuf") return "PgUp"; + if (text == "PgUp") return "BildAuf"; + if (text == "BildAb") return "PgDn"; + if (text == "PgDn") return "BildAb"; + if (text == "Ende") return "End"; + if (text == "End") return "Ende"; + if (text == "Pos1") return "Home"; + if (text == "Home") return "Pos1"; + if (text == "Links") return "Left"; + if (text == "Left") return "Links"; + if (text == "Auf") return "Up"; + if (text == "Up") return "Auf"; + if (text == "Rechts") return "Right"; + if (text == "Right") return "Rechts"; + if (text == "Ab") return "Down"; + if (text == "Down") return "Ab"; + if (text == "Einfg") return "Ins"; + if (text == "Ins") return "Einfg"; + if (text == "UMSCHALT") return "Shift"; + if (text == "Shift") return "UMSCHALT"; + if (text == "STRG") return "Ctrl"; + if (text == "Ctrl") return "STRG"; + if (text == "ALT") return "Alt"; + if (text == "Alt") return "ALT"; + if (text == "CTRL") return "Ctrl"; + if (text == "Ctrl") return "CTRL"; + if (text == "ROLLEN-FESTSTELL") return "Scroll Lock"; + if (text == "Scroll Lock") return "ROLLEN-FESTSTELL"; + if (text == "FESTSTELL") return "Caps Lock"; + if (text == "Caps Lock") return "FESTSTELL"; + + return text; } bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index cb81a60..f521d0f 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -124,6 +124,7 @@ private: // Benutzer-Deklarationen void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); + System::UnicodeString TranslateShortCut(System::UnicodeString text); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; From da0ccd99e830bbe77f97096df72d5a78f6459d5f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 02:30:35 +0200 Subject: [PATCH 1489/1724] try to use translated key names --- config/ConfigFormUnit.cpp | 87 ++++++++++++++++++++------------------- config/ConfigFormUnit.h | 3 +- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index acd2b4b..1a9e4f7 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -16,6 +16,7 @@ TConfigForm *ConfigForm; bool Initialized; bool IsEnglish; +System::UnicodeString KeyNames[256]; /* Save previous settings so we don't override custom settings */ int Maxfps; @@ -1235,11 +1236,11 @@ WORD TConfigForm::GetKeyCode(System::UnicodeString key) return VK_PAUSE; } - if (key == L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL))) { + if (key == L"R " + KeyToText(VK_CONTROL)) { return VK_RCONTROL; } - return TextToShortCut(TranslateShortCut(key)); + return TextToKey(key); } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1253,55 +1254,57 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) } if (key == VK_RCONTROL) { - return L"R " + TranslateShortCut(ShortCutToText(VK_CONTROL)); + return L"R " + KeyToText(VK_CONTROL); } if (key == VK_RSHIFT) { - return TranslateShortCut(ShortCutToText(VK_SHIFT)); + return KeyToText(VK_SHIFT); } - return TranslateShortCut(ShortCutToText(key)); + return KeyToText(key); } -System::UnicodeString TConfigForm::TranslateShortCut(System::UnicodeString text) +WORD TConfigForm::TextToKey(System::UnicodeString Text) { - /* Hack: Allows building the config tool on a german OS */ - if (text == "Eingabe") return "Enter"; - if (text == "Enter") return "Eingabe"; - if (text == "Leer") return "Space"; - if (text == "Space") return "Leer"; - if (text == "BildAuf") return "PgUp"; - if (text == "PgUp") return "BildAuf"; - if (text == "BildAb") return "PgDn"; - if (text == "PgDn") return "BildAb"; - if (text == "Ende") return "End"; - if (text == "End") return "Ende"; - if (text == "Pos1") return "Home"; - if (text == "Home") return "Pos1"; - if (text == "Links") return "Left"; - if (text == "Left") return "Links"; - if (text == "Auf") return "Up"; - if (text == "Up") return "Auf"; - if (text == "Rechts") return "Right"; - if (text == "Right") return "Rechts"; - if (text == "Ab") return "Down"; - if (text == "Down") return "Ab"; - if (text == "Einfg") return "Ins"; - if (text == "Ins") return "Einfg"; - if (text == "UMSCHALT") return "Shift"; - if (text == "Shift") return "UMSCHALT"; - if (text == "STRG") return "Ctrl"; - if (text == "Ctrl") return "STRG"; - if (text == "ALT") return "Alt"; - if (text == "Alt") return "ALT"; - if (text == "CTRL") return "Ctrl"; - if (text == "Ctrl") return "CTRL"; - if (text == "ROLLEN-FESTSTELL") return "Scroll Lock"; - if (text == "Scroll Lock") return "ROLLEN-FESTSTELL"; - if (text == "FESTSTELL") return "Caps Lock"; - if (text == "Caps Lock") return "FESTSTELL"; + for (WORD i = 0; i < 256; i++) { + if (KeyNames[i] == Text) { + return i; + } + } - return text; + return 0; +} + +System::UnicodeString TConfigForm::KeyToText(WORD key) +{ + WCHAR keyName[256] = {}; + + UINT scanCode = MapVirtualKeyW(key, MAPVK_VK_TO_VSC); + + switch (key) { + case VK_LEFT: + case VK_UP: + case VK_RIGHT: + case VK_DOWN: + case VK_PRIOR: + case VK_NEXT: + case VK_END: + case VK_HOME: + case VK_INSERT: + case VK_DELETE: + case VK_DIVIDE: + case VK_NUMLOCK: + { + scanCode |= 0x100; + break; + } + } + + GetKeyNameTextW(scanCode << 16, keyName, sizeof(keyName) / sizeof(WCHAR)); + + KeyNames[(BYTE)key] = keyName; + + return KeyNames[(BYTE)key]; } bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValue) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index f521d0f..83ed66a 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -124,7 +124,8 @@ private: // Benutzer-Deklarationen void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString key); - System::UnicodeString TranslateShortCut(System::UnicodeString text); + WORD TextToKey(System::UnicodeString Text); + System::UnicodeString KeyToText(WORD key); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; From 6987d1a773181b5ae981389a91db5d32303e4461 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Sep 2023 02:57:59 +0200 Subject: [PATCH 1490/1724] remove unneeded function --- config/ConfigFormUnit.cpp | 30 ++++++++++++------------------ config/ConfigFormUnit.h | 3 +-- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1a9e4f7..66d8be5 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1226,21 +1226,27 @@ void __fastcall TConfigForm::HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftSt SaveSettings(); } -WORD TConfigForm::GetKeyCode(System::UnicodeString key) +WORD TConfigForm::GetKeyCode(System::UnicodeString text) { - if (key == L"PrtScn") { + if (text == L"PrtScn") { return VK_SNAPSHOT; } - if (key == L"Pause_") { + if (text == L"Pause_") { return VK_PAUSE; } - if (key == L"R " + KeyToText(VK_CONTROL)) { + if (text == L"R " + KeyToText(VK_CONTROL)) { return VK_RCONTROL; } - return TextToKey(key); + for (WORD i = 0; i < 256; i++) { + if (KeyNames[i] == text) { + return i; + } + } + + return 0; } System::UnicodeString TConfigForm::GetKeyText(WORD key) @@ -1264,21 +1270,8 @@ System::UnicodeString TConfigForm::GetKeyText(WORD key) return KeyToText(key); } -WORD TConfigForm::TextToKey(System::UnicodeString Text) -{ - for (WORD i = 0; i < 256; i++) { - if (KeyNames[i] == Text) { - return i; - } - } - - return 0; -} - System::UnicodeString TConfigForm::KeyToText(WORD key) { - WCHAR keyName[256] = {}; - UINT scanCode = MapVirtualKeyW(key, MAPVK_VK_TO_VSC); switch (key) { @@ -1300,6 +1293,7 @@ System::UnicodeString TConfigForm::KeyToText(WORD key) } } + WCHAR keyName[256] = {}; GetKeyNameTextW(scanCode << 16, keyName, sizeof(keyName) / sizeof(WCHAR)); KeyNames[(BYTE)key] = keyName; diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 83ed66a..3a77681 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -123,8 +123,7 @@ private: // Benutzer-Deklarationen bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); - WORD GetKeyCode(System::UnicodeString key); - WORD TextToKey(System::UnicodeString Text); + WORD GetKeyCode(System::UnicodeString text); System::UnicodeString KeyToText(WORD key); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); From a4e95ac6a0714bd6d02930f8e392b9acf3781287 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 02:59:04 +0200 Subject: [PATCH 1491/1724] force pos 0,0 in borderless mode --- src/config.c | 5 ----- src/dd.c | 11 ++++++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index 206cf8b..483843f 100644 --- a/src/config.c +++ b/src/config.c @@ -112,11 +112,6 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } - if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE))) - { - g_config.window_rect.left = g_config.window_rect.top = -32000; - } - if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); diff --git a/src/dd.c b/src/dd.c index 73773f3..c3cc184 100644 --- a/src/dd.c +++ b/src/dd.c @@ -450,9 +450,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { border = FALSE; - g_config.window_rect.left = -32000; - g_config.window_rect.top = -32000; - /* prevent OpenGL from going automatically into fullscreen exclusive mode */ if (g_ddraw->renderer == ogl_render_main) nonexclusive = TRUE; @@ -672,6 +669,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); + if (nonexclusive) + { + x = y = 0; + } + + if (IsIconic(g_ddraw->hwnd)) + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE); From f2a613ff2aadbd09cefe71769031d5731c17df76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 05:13:47 +0200 Subject: [PATCH 1492/1724] new .ini setting #toggle_borderless --- inc/config.h | 1 + inc/dd.h | 1 + src/config.c | 13 +++++++++- src/utils.c | 71 +++++++++++++++++++++++++++++++-------------------- src/wndproc.c | 2 +- 5 files changed, 59 insertions(+), 29 deletions(-) diff --git a/inc/config.h b/inc/config.h index f70523c..89598eb 100644 --- a/inc/config.h +++ b/inc/config.h @@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; + int borderless_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; diff --git a/inc/dd.h b/inc/dd.h index c164705..a60f8bf 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -137,6 +137,7 @@ typedef struct CNCDDRAW int show_cursor_count; BOOL accurate_timers; BOOL resizable; + BOOL toggle_borderless; BOOL nonexclusive; BOOL fixpitch; int fixchilds; diff --git a/src/config.c b/src/config.c index 483843f..8c2c82d 100644 --- a/src/config.c +++ b/src/config.c @@ -16,7 +16,7 @@ static void cfg_init(); static void cfg_create_ini(); CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; void cfg_load() { @@ -40,6 +40,7 @@ void cfg_load() g_ddraw->vhack = cfg_get_bool("vhack", FALSE); g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); + g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); @@ -112,6 +113,8 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } + g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); + if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); @@ -227,6 +230,11 @@ void cfg_save() { WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } + + if (g_config.borderless_state != -1) + { + WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + } } static void cfg_create_ini() @@ -304,6 +312,9 @@ static void cfg_create_ini() "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n" "configlang=auto\n" "\n" + "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_borderless=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 8958fb1..9d528ee 100644 --- a/src/utils.c +++ b/src/utils.c @@ -281,39 +281,56 @@ void util_toggle_fullscreen() memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height); - if (g_ddraw->windowed) + if (g_ddraw->toggle_borderless) { - mouse_unlock(); - - g_config.window_state = g_ddraw->windowed = FALSE; - LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); - - real_SetWindowLongA( - g_ddraw->hwnd, - GWL_STYLE, - style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); - util_update_bnet_pos(0, 0); - - mouse_lock(); - } - else - { - mouse_unlock(); - g_config.window_state = g_ddraw->windowed = TRUE; - - if (g_ddraw->renderer == d3d9_render_main) + if (!g_ddraw->fullscreen) { - d3d9_reset(); + mouse_unlock(); + + g_config.borderless_state = g_ddraw->fullscreen = TRUE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + mouse_lock(); } else { - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); - } + mouse_unlock(); - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); - //mouse_lock(); + g_config.borderless_state = g_ddraw->fullscreen = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + //mouse_lock(); + } + } + else + { + if (g_ddraw->windowed) + { + mouse_unlock(); + + g_config.window_state = g_ddraw->windowed = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); + util_update_bnet_pos(0, 0); + + mouse_lock(); + } + else + { + mouse_unlock(); + g_config.window_state = g_ddraw->windowed = TRUE; + + if (g_ddraw->renderer == d3d9_render_main) + { + d3d9_reset(); + } + else + { + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + } + + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); + //mouse_lock(); + } } } diff --git a/src/wndproc.c b/src/wndproc.c index 736c626..3ac0677 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -586,7 +586,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen && - !g_ddraw->fullscreen && + (!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) && context_code && !key_state && g_ddraw->renderer != d3d9_render_main) From eeefbb9b717e80fdf77de1a306752aa1132b778b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:16:23 +0100 Subject: [PATCH 1493/1724] add support for alt+enter in fullscreen upscaled mode --- src/utils.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/utils.c b/src/utils.c index 9d528ee..1ff93a7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -287,7 +287,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_ddraw->fullscreen = TRUE; + g_config.upscaled_state = g_config.fullscreen = TRUE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); @@ -296,7 +296,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_ddraw->fullscreen = FALSE; + g_config.upscaled_state = g_config.fullscreen = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); @@ -308,7 +308,12 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.window_state = g_ddraw->windowed = FALSE; + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = TRUE; + } + + g_config.window_state = g_config.windowed = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); @@ -317,7 +322,13 @@ void util_toggle_fullscreen() else { mouse_unlock(); - g_config.window_state = g_ddraw->windowed = TRUE; + + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = FALSE; + } + + g_config.window_state = g_config.windowed = TRUE; if (g_ddraw->renderer == d3d9_render_main) { From 952fe4fe1a005505852befea2a6903de05e569be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Dec 2024 21:57:52 +0100 Subject: [PATCH 1494/1724] add support for alt+enter in fullscreen upscaled mode --- inc/config.h | 2 +- inc/dd.h | 1 + src/config.c | 10 +++++++--- src/utils.c | 16 ++++++++-------- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/inc/config.h b/inc/config.h index 89598eb..2937e26 100644 --- a/inc/config.h +++ b/inc/config.h @@ -9,7 +9,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; - int borderless_state; + int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; diff --git a/inc/dd.h b/inc/dd.h index a60f8bf..fb4af12 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -138,6 +138,7 @@ typedef struct CNCDDRAW BOOL accurate_timers; BOOL resizable; BOOL toggle_borderless; + BOOL toggle_upscaled; BOOL nonexclusive; BOOL fixpitch; int fixchilds; diff --git a/src/config.c b/src/config.c index 8c2c82d..2bbfa04 100644 --- a/src/config.c +++ b/src/config.c @@ -16,7 +16,7 @@ static void cfg_init(); static void cfg_create_ini(); CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 }; void cfg_load() { @@ -41,6 +41,7 @@ void cfg_load() g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); + g_ddraw->toggle_upscaled = cfg_get_bool("toggle_upscaled", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); @@ -231,9 +232,9 @@ void cfg_save() WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } - if (g_config.borderless_state != -1) + if (g_config.upscaled_state != -1) { - WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + WritePrivateProfileString(section, "fullscreen", g_config.upscaled_state ? "true" : "false", g_config.ini_path); } } @@ -315,6 +316,9 @@ static void cfg_create_ini() "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" "toggle_borderless=false\n" "\n" + "; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_upscaled=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 1ff93a7..3b18210 100644 --- a/src/utils.c +++ b/src/utils.c @@ -287,7 +287,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.upscaled_state = g_config.fullscreen = TRUE; + g_config.upscaled_state = g_ddraw->fullscreen = TRUE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); @@ -296,7 +296,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.upscaled_state = g_config.fullscreen = FALSE; + g_config.upscaled_state = g_ddraw->fullscreen = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); @@ -308,12 +308,12 @@ void util_toggle_fullscreen() { mouse_unlock(); - if (g_config.toggle_upscaled) + if (g_ddraw->toggle_upscaled) { - g_config.upscaled_state = g_config.fullscreen = TRUE; + g_config.upscaled_state = g_ddraw->fullscreen = TRUE; } - g_config.window_state = g_config.windowed = FALSE; + g_config.window_state = g_ddraw->windowed = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); @@ -323,12 +323,12 @@ void util_toggle_fullscreen() { mouse_unlock(); - if (g_config.toggle_upscaled) + if (g_ddraw->toggle_upscaled) { - g_config.upscaled_state = g_config.fullscreen = FALSE; + g_config.upscaled_state = g_ddraw->fullscreen = FALSE; } - g_config.window_state = g_config.windowed = TRUE; + g_config.window_state = g_ddraw->windowed = TRUE; if (g_ddraw->renderer == d3d9_render_main) { From 292af455b67a90c86f713cc716fcd845b6035e43 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:24:41 +0100 Subject: [PATCH 1495/1724] set new toggle_fullscreen bool --- config/ConfigFormUnit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 66d8be5..35c99f4 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -941,15 +941,19 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "false"); ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 1: ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "true"); + ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "true"); break; case 2: ini->WriteString("ddraw", "windowed", "true"); ini->WriteString("ddraw", "fullscreen", "true"); ini->WriteString("ddraw", "toggle_borderless", "true"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 3: ini->WriteString("ddraw", "windowed", "true"); From 2ec028e87a1353f7cc8cf45cad9e1c0be1967bdd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Dec 2024 22:05:38 +0100 Subject: [PATCH 1496/1724] allow alt+enter with fullscreen upscaled mode --- src/wndproc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3ac0677..ef88b6b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -586,7 +586,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen && - (!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) && context_code && !key_state && g_ddraw->renderer != d3d9_render_main) From fd1bac4a38f8b152ce63e2837d614955df201f5a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 04:31:22 +0100 Subject: [PATCH 1497/1724] use SetThreadExecutionState only on XP and above --- inc/dllmain.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/dllmain.h b/inc/dllmain.h index 176d72a..f7e028b 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -29,4 +29,8 @@ typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS); typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT); +#if (_WIN32_WINNT < _WIN32_WINNT_WINXP) +#define SetThreadExecutionState(a) +#endif + #endif From 14ff0a0d9ebce9bf7bd643a89e99d8d28fb8279c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Dec 2024 02:24:22 +0100 Subject: [PATCH 1498/1724] use ExitProcess instead of _exit to avoid issues --- src/wndproc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3d8823f..203f200 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -591,7 +591,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { - _exit(0); + ExitProcess(0); + //_exit(0); } if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) From 6d44a0b122a2e5df4945d30d9ac11d2a2fc6d21d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Dec 2024 05:01:22 +0100 Subject: [PATCH 1499/1724] fix issue where game is shifted towards the bottom right after joining the lobby twice --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index c3cc184..eed4a76 100644 --- a/src/dd.c +++ b/src/dd.c @@ -669,7 +669,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); - if (nonexclusive) + if (g_ddraw->fullscreen) { x = y = 0; } From 666a3ad0e32e5d6690d6072b694e52529b473ddc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Dec 2024 05:29:10 +0100 Subject: [PATCH 1500/1724] only use shader if upscaling is enabled --- src/render_ogl.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 60d87cd..80f34b7 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -150,7 +150,21 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader); } - g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); + BOOL is_upscaler = + strstr(g_ddraw->shader, "fsr.glsl") != NULL || + strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || + strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || + strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale-multipass.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; + + if (!is_upscaler || + g_ddraw->render.viewport.width != g_ddraw->width || + g_ddraw->render.viewport.height != g_ddraw->height || + g_ddraw->vhack) + { + g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); + } } else { From a5aaf8cc9762c3e935f6a5f3cbea812415771a4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 01:12:09 +0100 Subject: [PATCH 1501/1724] fix build on macOS --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 08d74da..7c0dd2b 100644 --- a/Makefile +++ b/Makefile @@ -4,21 +4,21 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) +HASH := \# ECHOTEST := $(shell echo \"\") ifeq ($(ECHOTEST),\"\") # Windows - HASH := \# ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else # Either *nix or Windows with BusyBox (e.g. w64devkit) - ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) - EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) + ECOMMIT := $(shell echo "$(HASH)define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo "$(HASH)define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif ifdef DEBUG From 7e46fab834ad2bd08251576f65cac390820745ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 06:14:06 +0100 Subject: [PATCH 1502/1724] update supported games list --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ee7f2f..ef9d57c 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   -Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/afWXJNDDF5) (No registration required) - -  - ### Hotkeys * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor @@ -51,6 +47,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https ### Supported Games - Addiction Pinball +- Agharta the Hollow Earth - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors @@ -134,6 +131,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 +- Deadly Tide - Desperados: Wanted Dead or Alive - Diablo - Diablo 2 @@ -177,6 +175,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Hexen 95 - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 @@ -204,6 +203,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures From 31b8d0aff84c89b3da6d9a1b07204bab14a13b75 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:43:06 +0100 Subject: [PATCH 1503/1724] #364 add hack for Intel HD 4000 driver Build 10.18.10.4252 bug - disable multipass shader --- inc/opengl_utils.h | 1 + src/opengl_utils.c | 2 ++ src/render_ogl.c | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index 4449951..d84dd20 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -115,5 +115,6 @@ extern HMODULE g_oglu_hmodule; extern BOOL g_oglu_got_version2; extern BOOL g_oglu_got_version3; extern char g_oglu_version[]; +extern char g_oglu_version_long[]; #endif diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 8062fdd..e315b15 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -95,6 +95,7 @@ HMODULE g_oglu_hmodule; BOOL g_oglu_got_version2; BOOL g_oglu_got_version3; char g_oglu_version[128]; +char g_oglu_version_long[128]; BOOL oglu_load_dll() { @@ -201,6 +202,7 @@ void oglu_init() if (glversion) { strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); + strncpy(g_oglu_version_long, glversion, sizeof(g_oglu_version_long) - 1); g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */ strtok(g_oglu_version, " "); } diff --git a/src/render_ogl.c b/src/render_ogl.c index efde47f..1630fc5 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,6 +248,26 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } + + /* Hack for Intel HD 4000 driver bug - disable multipass shader */ + + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) + { + char shader_path_tmp[MAX_PATH] = { 0 }; + strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); + + if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) + { + strcat(shader_path_tmp, ".pass1"); + + if (FILE_EXISTS(shader_path_tmp)) + { + shader_path[0] = 0; + g_config.shader[0] = 0; + } + } + } + /* detect common upscaling shaders and disable them if no upscaling is required */ BOOL is_upscaler = From 0843d5b9fcaea99b0e586a7a2b3a58d9e5df4ffe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:52:36 +0100 Subject: [PATCH 1504/1724] add strncpy fix --- src/render_ogl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 1630fc5..7830f02 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,6 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); + shader_path[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From 4ff49faa89cc726688c59d83fab6591c0c91dfc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:52:48 +0100 Subject: [PATCH 1505/1724] fix for last commit --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 7830f02..4d8024a 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,7 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - shader_path[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ + strncpy fix[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From ca35888d877bd4008cd765841a55ddefcb8698f2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:53:01 +0100 Subject: [PATCH 1506/1724] fix for last commit --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4d8024a..7c5fd4c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,7 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - strncpy fix[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ + shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From 1bb1ffd8b814ab0512c74c44fc32e145743cefde Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 22:01:55 +0100 Subject: [PATCH 1507/1724] align --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 7c5fd4c..77e7c95 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,12 +248,12 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } - /* Hack for Intel HD 4000 driver bug - disable multipass shader */ if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) { char shader_path_tmp[MAX_PATH] = { 0 }; + strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ From ebbdf370bed3e789244dd4d89cb74da18d602816 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 06:17:01 +0100 Subject: [PATCH 1508/1724] bump experimental build --- inc/version.h | 1 - 1 file changed, 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index a7ac8d9..c310b4b 100644 --- a/inc/version.h +++ b/inc/version.h @@ -3,7 +3,6 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) -#define git_str(a) str(a) #define VERSION_MAJOR 7 #define VERSION_MINOR 0 From f9f15f65e08d794d0a12f27c082445fff0171e37 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 18:52:35 +0100 Subject: [PATCH 1509/1724] #364 add hack for intel hd 4000 build 10.18.10.5161 --- src/render_ogl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 77e7c95..728a5ea 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -250,7 +250,8 @@ static void ogl_build_programs() /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || + _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { char shader_path_tmp[MAX_PATH] = { 0 }; From 8a770092e1399c1c79753a675f281a2da429a378 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 19:14:54 +0100 Subject: [PATCH 1510/1724] add temp logs --- src/render_ogl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 728a5ea..fd1dd6e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -249,10 +249,11 @@ static void ogl_build_programs() } /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - + TRACE(" OGL Version=%s\n", g_oglu_version_long); if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { + TRACE(" OGL 1\n"); char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); @@ -260,10 +261,12 @@ static void ogl_build_programs() if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { + TRACE(" OGL 2\n"); strcat(shader_path_tmp, ".pass1"); if (FILE_EXISTS(shader_path_tmp)) { + TRACE(" OGL 3\n"); shader_path[0] = 0; g_config.shader[0] = 0; } From 89d7b0f63d79b4176e9b365571d8a908619ff98c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 20:29:04 +0100 Subject: [PATCH 1511/1724] always use default shader for HD 4000 --- src/render_ogl.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index fd1dd6e..4bb0969 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,29 +248,13 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } - /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - TRACE(" OGL Version=%s\n", g_oglu_version_long); + /* Hack for Intel HD 4000 driver bug - force default shader */ + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - TRACE(" OGL 1\n"); - char shader_path_tmp[MAX_PATH] = { 0 }; - - strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ - - if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) - { - TRACE(" OGL 2\n"); - strcat(shader_path_tmp, ".pass1"); - - if (FILE_EXISTS(shader_path_tmp)) - { - TRACE(" OGL 3\n"); - shader_path[0] = 0; - g_config.shader[0] = 0; - } - } + shader_path[0] = 0; + g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From ca8ba0d3bb60fcd2712b04c3de95a57c83a91af2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 06:59:07 +0100 Subject: [PATCH 1512/1724] update supported games list and add presets --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- src/config.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef9d57c..96d4796 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- Abomination - The Nemesis Project - Addiction Pinball -- Agharta the Hollow Earth - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors @@ -55,11 +55,14 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic +- Agharta the Hollow Earth - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) - American Girls Dress Designer - Amerzone +- Ancient Conquest +- Ancient Evil - Anno 1602: Creation of a New World - Another War - Anstoss 3 @@ -83,6 +86,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Batman: Toxic Chill - Birthright: The Gorgons Alliance - Blade & Sword +- Blitzkrieg anthology +- Blitzkrieg anthology: Burning Horizon +- Blitzkrieg anthology: Rolling Thunder - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt @@ -97,6 +103,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Casino Empire (AKA Hoyle Casino) - Championship Manager 99-00 - Chaos Gate +- Clans - Close Combat 2: A Bridge Too Far - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge @@ -129,9 +136,12 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Castleblanca Quest - Dark Earth - Dark Reign: The Future of War +- Day Of The Tentacle +- Daytona - Daytona USA (Sega - 1996) - Deadlock 2 - Deadly Tide +- Delta Force - Desperados: Wanted Dead or Alive - Diablo - Diablo 2 @@ -141,6 +151,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Disciples 2 - Rise of the Elves - Discoworld Noir - Divine Divinity +- Doom 95 - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice @@ -152,9 +163,12 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Emperor: Rise of the Middle Kingdom - Enemy Infestation - Escape Velocity Nova +- Excalibur 2555AD - F-16 Multirole Fighter - F-22 Raptor +- Fable - Fairy Tale About Father Frost, Ivan and Nastya +- Falcon 4.0 (Microprose version) - Fallout - Fallout 2 - Final fantasy VII @@ -168,25 +182,36 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Freddi Fish: The Case of the Haunted Schoolhouse - Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch - Freddi Water Worries +- Full Throttle - Future Cop L.A.P.D - G-Police +- Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz -- Hexen 95 - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory +- Heart of Darkness - Hearts of Iron 2 +- Heroes Chronicles: Clash of the Dragons +- Heroes Chronicles: Conquest of the Underworld +- Heroes Chronicles: Masters of the Elements +- Heroes Chronicles: Warlords of the Wasteland +- Heroes of Might and Magic - Heroes of Might and Magic II - Heroes of Might and Magic III - Heroes of Might and Magic IV +- Hexen 95 - Hooligans: Storm over Europe - Hugo Gold - Hugo Wild River - Icewind Dale - Icewind Dale 2 +- Ignition +- Indiana Jones and the Fate of Atlantis +- Indiana Jones and the Last Crusade - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus @@ -216,6 +241,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math +- Mageslayer - Majesty Gold - Majesty Gold HD - Mech Warrior 3 @@ -236,15 +262,18 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Nancy Drew: Stay Tuned For Danger - Nancy Drew: The Secret of Shadow Ranch - Nancy Drew: Treasure in the Royal Tower +- NBA Action '98 - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson - NexusTk +- Nightmare Creatures - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee - Outlaws - Outlive +- Outwars (software mode) - Pacific General - Pajama Sam - Pajama Sam 3 @@ -254,6 +283,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside - Pandora's Box Puzzle Game +- Panzer Dragoon - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -293,8 +323,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and the UFO (Reksio i Ufo) - Reksio and the Wizards (Reksio i Czarodzieje) +- Resurrection - The Return of the Black Dragon (software mode) +- Rising Lands (patched) - Road Rash - Robin Hood - The Legend of Sherwood +- Roland Garros 98 (software mode) - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon @@ -307,20 +340,29 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division +- Sid Meier's Simgolf - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc +- Simon the Sorcerer 1/2 (windows 95 version) - Sonic 3D Blast - Space Rangers +- Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Star Trek Away Team - Star Trek Generations +- Star Wars - Pit Droids +- Star Wars Anakin's Speedway +- Star Wars Early Learning Activity Center +- Star Wars Episode I: The Gungan Frontier - Star Wars Jedi Knight: Dark Forces II - Star Wars Rebellion +- Star Wars Yoda's Challenge - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft @@ -336,6 +378,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Stronghold HD - Sudden Strike 2 - Superbike 2000 +- The Curse Of Monkey Island +- The Dig - The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone @@ -344,9 +388,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Three Kingdoms: Fate of the Dragon - Throne of Darkness - TianLong BaBu +- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms +- Toy Story - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown @@ -362,6 +408,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Warlords Battlecry - Warlords Battlecry 2 - Warlords Battlecry 3 +- Weird War +- Wing Commander - The Kilrathi Saga - Wizardry 8 - Wizards and Warriors - Worms 2 diff --git a/src/config.c b/src/config.c index eac85be..f5e723e 100644 --- a/src/config.c +++ b/src/config.c @@ -427,6 +427,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Abomination - The Nemesis Project\n" + "[abomb]\n" + "singlecpu=false\n" + "\n" "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" @@ -877,6 +881,10 @@ static void cfg_create_ini() "[dn]\n" "fake_mode=640x480x16\n" "\n" + "; Excalibur 2555AD\n" + "[_FISH]\n" + "singlecpu=false\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" @@ -899,6 +907,14 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; Fable\n" + "[FABLE]\n" + "singlecpu=false\n" + "\n" + "; Falcon 4.0 (Microprose version)\n" + "[falcon4]\n" + "singlecpu=false\n" + "\n" "; Flight Simulator 98\n" "[FLTSIM95]\n" "flightsim98_hack=true\n" @@ -964,6 +980,7 @@ static void cfg_create_ini() "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" + "singlecpu=false\n" "\n" "; Gangsters: Organized Crime\n" "[gangsters]\n" @@ -1191,6 +1208,15 @@ static void cfg_create_ini() "[LOSTV95]\n" "fake_mode=320x240x16\n" "\n" + "; Nightmare Creatures\n" + "[NC]\n" + "maxgameticks=30\n" + "singlecpu=false\n" + "\n" + "; Moto Racer (software mode)\n" + "[moto]\n" + "maxgameticks=59\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1377,6 +1403,10 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" + "; Panzer Dragoon\n" + "[PANZERDG]\n" + "singlecpu=false\n" + "\n" "; Play with the Teletubbies\n" "[PlayWTT]\n" "hook=3\n" @@ -1428,12 +1458,20 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Rising Lands (patched)\n" + "[Rising]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood (GOG)\n" "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "fix_not_responding=true\n" "\n" + "; Roland Garros 98 (software mode)\n" + "[rg98]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" @@ -1450,6 +1488,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "fake_mode=640x480x32\n" "\n" + "; Sid Meier's Simgolf\n" + "[golf]\n" + "fake_mode=640x480x16\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" @@ -1553,6 +1595,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; The Curse Of Monkey Island\n" + "[COMI]\n" + "singlecpu=false\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 40a9ff30360bed64f69d72032d034fb4a3a2905e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 19:10:34 +0100 Subject: [PATCH 1513/1724] #316 fix crash on opengl 1.1 --- src/render_ogl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4bb0969..b9d5028 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -934,6 +934,11 @@ static void ogl_render() { glEnable(GL_TEXTURE_2D); } + else // 8 bpp only works with a shader (opengl 2.0 or above) + { + g_ogl.use_opengl = FALSE; + return; + } DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; @@ -1155,7 +1160,9 @@ static void ogl_render() } } - glActiveTexture(GL_TEXTURE0); + if (glActiveTexture) + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); if (g_ddraw.bpp == 8) From 2dbebf8cef55b479f1cd17036fa25e06d888f8b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 22:31:01 +0100 Subject: [PATCH 1514/1724] update supported games list and add presets --- README.md | 9 +++++++++ src/config.c | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/README.md b/README.md index 96d4796..92987e0 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Gilbert Goodmate And The Mushroom Of Phungoria - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Heart of Darkness @@ -238,6 +239,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Locomotion - Lode Runner 2 - Lost Vikings 2 +- Links Extreme - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math @@ -317,6 +319,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D +- Rent-A-Hero - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) @@ -384,6 +387,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD +- The Last Express +- The Neverhood +- The Rocky Interactive Horror Show +- The Next Worlds +- The Sex Files - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness @@ -419,6 +427,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Zoombinis Logical Journey - Zoombinis Mountain Rescue - Zuma Deluxe +- Zork Nemesis - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. diff --git a/src/config.c b/src/config.c index f5e723e..e6b6738 100644 --- a/src/config.c +++ b/src/config.c @@ -1204,6 +1204,10 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Links Extreme\n" + "[EXTREME]\n" + "singlecpu=false\n" + "\n" "; Lost Vikings 2\n" "[LOSTV95]\n" "fake_mode=320x240x16\n" @@ -1453,6 +1457,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=3\n" "\n" + "; Rent-A-Hero\n" + "[Rent-A-Hero]\n" + "singlecpu=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" @@ -1621,6 +1629,10 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" + "; The Neverhood\n" + "[nhc]\n" + "singlecpu=false\n" + "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" @@ -1727,6 +1739,10 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" + "; Zork Nemesis\n" + "[znemesis]\n" + "singlecpu=false\n" + "\n" , fh); fclose(fh); From 7f8bc1bc560726825bacacac32e3f5fab8362926 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Dec 2024 06:50:12 +0100 Subject: [PATCH 1515/1724] don't set dds_unlock_limiter_disabled on colorfill --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index eee23ed..1acbc0d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -436,7 +436,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && !(dwFlags & DDBLT_COLORFILL)) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); From 02f706e3bb48aa330652f5d4e5879bb53e53483f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Dec 2024 20:23:56 +0100 Subject: [PATCH 1516/1724] Revert "don't set dds_unlock_limiter_disabled on colorfill" This reverts commit 7f8bc1bc560726825bacacac32e3f5fab8362926. --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 1acbc0d..eee23ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -436,7 +436,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0 && !(dwFlags & DDBLT_COLORFILL)) + if (g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); From 6dcfe783985653f926e565fae26373c5c92dab39 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:01:38 +0100 Subject: [PATCH 1517/1724] add support for 7th Legion --- README.md | 1 + inc/config.h | 1 + src/config.c | 6 ++++++ src/wndproc.c | 3 +++ 4 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 92987e0..e8c27d2 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cultures 2 - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle diff --git a/inc/config.h b/inc/config.h index 4e9731d..de782b5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -106,6 +106,7 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; + BOOL seventhlegion_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index e6b6738..09b6ea6 100644 --- a/src/config.c +++ b/src/config.c @@ -116,6 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", TRUE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -391,6 +392,11 @@ static void cfg_create_ini() "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" + "; 7th Legion\n" + "[legion]\n" + "maxgameticks=25\n" + "seventhlegion_hack=true\n" + "\n" "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" diff --git a/src/wndproc.c b/src/wndproc.c index 203f200..774e534 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,6 +101,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { + if (g_config.seventhlegion_hack) + break; + LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); if (!g_config.resizable) From 7c4abe5ef0f7c065c91b1196779e6f8bf8418407 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:02:24 +0100 Subject: [PATCH 1518/1724] do not enable setting by default --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 09b6ea6..6e6a9e6 100644 --- a/src/config.c +++ b/src/config.c @@ -116,7 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); - GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", TRUE); + GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From b0ec4851ae9a50f76816344a5b6be7583d3edd06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:03:24 +0100 Subject: [PATCH 1519/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e8c27d2..a78f357 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- 7th Legion - Abomination - The Nemesis Project - Addiction Pinball - Age of Empires From 3a6075b928166d8d2aef61a86846430b9841d0f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:17:05 +0100 Subject: [PATCH 1520/1724] tweak IAT hooks --- src/hook.c | 38 ++++++++++++++++---------------------- src/utils.c | 16 +++++++--------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/hook.c b/src/hook.c index 04ec2d3..6533a4d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -210,17 +210,15 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); while (import_desc->FirstThunk) { @@ -232,13 +230,13 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); while (first_thunk->u1.Function) { @@ -332,17 +330,15 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); while (import_desc->FirstThunk) { @@ -354,12 +350,12 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)hmod + import_desc->OriginalFirstThunk); while (first_thunk->u1.Function) { @@ -450,27 +446,25 @@ BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return FALSE; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return FALSE; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); while (import_desc->FirstThunk) { if (import_desc->Name) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); if (_stricmp(imp_module_name, "ddraw.dll") == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); if (first_thunk->u1.Function) return TRUE; diff --git a/src/utils.c b/src/utils.c index 15a52ea..91f41d9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -117,17 +117,15 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return NULL; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return NULL; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return NULL; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); while (import_desc->FirstThunk) { @@ -137,12 +135,12 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) continue; } - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); if (_stricmp(imp_module_name, module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)mod + import_desc->OriginalFirstThunk); while (first_thunk->u1.Function) { @@ -153,7 +151,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) continue; } - PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)mod + o_first_thunk->u1.AddressOfData); if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { From 238d2f6ee5d3c806e47e3464ef307e4d51d1a97f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:32:55 +0100 Subject: [PATCH 1521/1724] add preset for F16 Agressor --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index a78f357..3672d86 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Enemy Infestation - Escape Velocity Nova - Excalibur 2555AD +- F-16 Agressor - F-16 Multirole Fighter - F-22 Raptor - Fable diff --git a/src/config.c b/src/config.c index 6e6a9e6..7a5d7ce 100644 --- a/src/config.c +++ b/src/config.c @@ -913,6 +913,10 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; F-16 Agressor\n" + "[f-16]\n" + "resolutions=1\n" + "\n" "; Fable\n" "[FABLE]\n" "singlecpu=false\n" From dab64437f149d87ac010338ebb7f113a0e393a6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 04:37:57 +0100 Subject: [PATCH 1522/1724] add preset for Dreams to Realty --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 3672d86..c765dbf 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Deadly Tide - Delta Force - Desperados: Wanted Dead or Alive +- Dreams to Realty - Diablo - Diablo 2 - Diablo 2: Lord of Destruction diff --git a/src/config.c b/src/config.c index 7a5d7ce..29e1b83 100644 --- a/src/config.c +++ b/src/config.c @@ -862,6 +862,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "noactivateapp=true\n" "\n" + "; Dreams to Realty\n" + "[windream]\n" + "maxgameticks=60\n" + "\n" "; Deadlock 2\n" "[DEADLOCK]\n" "fixchilds=0\n" From 8bae36ca0f1799ffd3111cfbdf0bf378dffeed6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 05:17:17 +0100 Subject: [PATCH 1523/1724] add preset for Return to Krondor --- README.md | 2 ++ src/config.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index c765dbf..1e5bbe8 100644 --- a/README.md +++ b/README.md @@ -324,6 +324,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Real War - Red Baron 3D - Rent-A-Hero +- Return to Krondor - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) @@ -353,6 +354,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) +- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sonic 3D Blast - Space Rangers - Spec Ops - Ranger Assault (software mode) diff --git a/src/config.c b/src/config.c index 29e1b83..6da6906 100644 --- a/src/config.c +++ b/src/config.c @@ -1471,6 +1471,11 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=3\n" "\n" + "; Return to Krondor\n" + "[RtK]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" "singlecpu=false\n" From 665e244ffe7ffb49d98f82b0e14ae8588bc3c29b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 19:11:31 +0100 Subject: [PATCH 1524/1724] update presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 6da6906..4839a05 100644 --- a/src/config.c +++ b/src/config.c @@ -396,6 +396,7 @@ static void cfg_create_ini() "[legion]\n" "maxgameticks=25\n" "seventhlegion_hack=true\n" + "singlecpu=false\n" "\n" "; Atrox\n" "[Atrox]\n" @@ -1475,6 +1476,8 @@ static void cfg_create_ini() "[RtK]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" + "singlecpu=false\n" + "limiter_type=2\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" @@ -1616,6 +1619,7 @@ static void cfg_create_ini() "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" + "maxgameticks=30" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From ac19dec2c49a2d9d69f959b867ad638602062ff6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 21:08:41 +0100 Subject: [PATCH 1525/1724] remove kings quest preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 4839a05..e26e71f 100644 --- a/src/config.c +++ b/src/config.c @@ -1144,10 +1144,6 @@ static void cfg_create_ini() "[jeoppc]\n" "singlecpu=false\n" "\n" - "; Kings Quest 8\n" - "[Mask]\n" - "renderer=opengl\n" - "\n" "; Konung\n" "[konung]\n" "fixchilds=0\n" From 806924f86ebab6d8b36a55244610675904547d6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:05:51 +0100 Subject: [PATCH 1526/1724] assign default palette to primary surface --- inc/ddpalette.h | 261 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ddpalette.c | 2 +- src/ddsurface.c | 17 +++- 3 files changed, 277 insertions(+), 3 deletions(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index 7d264db..ebb4479 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -11,4 +11,265 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); +// Original palette copied from Windows ME +static PALETTEENTRY g_ddp_me_palette[] = +{ + { 0, 0, 0, 0 }, + { 128, 0, 0, 0 }, + { 0, 128, 0, 0 }, + { 128, 128, 0, 0 }, + { 0, 0, 128, 0 }, + { 128, 0, 128, 0 }, + { 0, 128, 128, 0 }, + { 192, 192, 192, 0 }, + { 192, 220, 192, 0 }, + { 166, 202, 240, 0 }, + { 95, 63, 63, 0 }, + { 127, 63, 63, 0 }, + { 159, 63, 63, 0 }, + { 191, 63, 63, 0 }, + { 223, 63, 63, 0 }, + { 255, 63, 63, 0 }, + { 63, 95, 63, 0 }, + { 95, 95, 63, 0 }, + { 127, 95, 63, 0 }, + { 159, 95, 63, 0 }, + { 191, 95, 63, 0 }, + { 223, 95, 63, 0 }, + { 255, 95, 63, 0 }, + { 63, 127, 63, 0 }, + { 95, 127, 63, 0 }, + { 127, 127, 63, 0 }, + { 159, 127, 63, 0 }, + { 191, 127, 63, 0 }, + { 223, 127, 63, 0 }, + { 255, 127, 63, 0 }, + { 63, 159, 63, 0 }, + { 95, 159, 63, 0 }, + { 127, 159, 63, 0 }, + { 159, 159, 63, 0 }, + { 191, 159, 63, 0 }, + { 223, 159, 63, 0 }, + { 255, 159, 63, 0 }, + { 63, 191, 63, 0 }, + { 95, 191, 63, 0 }, + { 127, 191, 63, 0 }, + { 159, 191, 63, 0 }, + { 191, 191, 63, 0 }, + { 223, 191, 63, 0 }, + { 255, 191, 63, 0 }, + { 63, 223, 63, 0 }, + { 95, 223, 63, 0 }, + { 127, 223, 63, 0 }, + { 159, 223, 63, 0 }, + { 191, 223, 63, 0 }, + { 223, 223, 63, 0 }, + { 255, 223, 63, 0 }, + { 63, 255, 63, 0 }, + { 95, 255, 63, 0 }, + { 127, 255, 63, 0 }, + { 159, 255, 63, 0 }, + { 191, 255, 63, 0 }, + { 223, 255, 63, 0 }, + { 255, 255, 63, 0 }, + { 63, 63, 95, 0 }, + { 95, 63, 95, 0 }, + { 127, 63, 95, 0 }, + { 159, 63, 95, 0 }, + { 191, 63, 95, 0 }, + { 223, 63, 95, 0 }, + { 255, 63, 95, 0 }, + { 63, 95, 95, 0 }, + { 95, 95, 95, 0 }, + { 127, 95, 95, 0 }, + { 159, 95, 95, 0 }, + { 191, 95, 95, 0 }, + { 223, 95, 95, 0 }, + { 255, 95, 95, 0 }, + { 63, 127, 95, 0 }, + { 95, 127, 95, 0 }, + { 127, 127, 95, 0 }, + { 159, 127, 95, 0 }, + { 191, 127, 95, 0 }, + { 223, 127, 95, 0 }, + { 255, 127, 95, 0 }, + { 63, 159, 95, 0 }, + { 95, 159, 95, 0 }, + { 127, 159, 95, 0 }, + { 159, 159, 95, 0 }, + { 191, 159, 95, 0 }, + { 223, 159, 95, 0 }, + { 255, 159, 95, 0 }, + { 63, 191, 95, 0 }, + { 95, 191, 95, 0 }, + { 127, 191, 95, 0 }, + { 159, 191, 95, 0 }, + { 191, 191, 95, 0 }, + { 223, 191, 95, 0 }, + { 255, 191, 95, 0 }, + { 63, 223, 95, 0 }, + { 95, 223, 95, 0 }, + { 127, 223, 95, 0 }, + { 159, 223, 95, 0 }, + { 191, 223, 95, 0 }, + { 223, 223, 95, 0 }, + { 255, 223, 95, 0 }, + { 63, 255, 95, 0 }, + { 95, 255, 95, 0 }, + { 127, 255, 95, 0 }, + { 159, 255, 95, 0 }, + { 191, 255, 95, 0 }, + { 223, 255, 95, 0 }, + { 255, 255, 95, 0 }, + { 63, 63, 127, 0 }, + { 95, 63, 127, 0 }, + { 127, 63, 127, 0 }, + { 159, 63, 127, 0 }, + { 191, 63, 127, 0 }, + { 223, 63, 127, 0 }, + { 255, 63, 127, 0 }, + { 63, 95, 127, 0 }, + { 95, 95, 127, 0 }, + { 127, 95, 127, 0 }, + { 159, 95, 127, 0 }, + { 191, 95, 127, 0 }, + { 223, 95, 127, 0 }, + { 255, 95, 127, 0 }, + { 63, 127, 127, 0 }, + { 95, 127, 127, 0 }, + { 127, 127, 127, 0 }, + { 159, 127, 127, 0 }, + { 191, 127, 127, 0 }, + { 223, 127, 127, 0 }, + { 255, 127, 127, 0 }, + { 63, 159, 127, 0 }, + { 95, 159, 127, 0 }, + { 127, 159, 127, 0 }, + { 159, 159, 127, 0 }, + { 191, 159, 127, 0 }, + { 223, 159, 127, 0 }, + { 255, 159, 127, 0 }, + { 63, 191, 127, 0 }, + { 95, 191, 127, 0 }, + { 127, 191, 127, 0 }, + { 159, 191, 127, 0 }, + { 191, 191, 127, 0 }, + { 223, 191, 127, 0 }, + { 255, 191, 127, 0 }, + { 63, 223, 127, 0 }, + { 95, 223, 127, 0 }, + { 127, 223, 127, 0 }, + { 159, 223, 127, 0 }, + { 191, 223, 127, 0 }, + { 223, 223, 127, 0 }, + { 255, 223, 127, 0 }, + { 63, 255, 127, 0 }, + { 95, 255, 127, 0 }, + { 127, 255, 127, 0 }, + { 159, 255, 127, 0 }, + { 191, 255, 127, 0 }, + { 223, 255, 127, 0 }, + { 255, 255, 127, 0 }, + { 63, 63, 159, 0 }, + { 95, 63, 159, 0 }, + { 127, 63, 159, 0 }, + { 159, 63, 159, 0 }, + { 191, 63, 159, 0 }, + { 223, 63, 159, 0 }, + { 255, 63, 159, 0 }, + { 63, 95, 159, 0 }, + { 95, 95, 159, 0 }, + { 127, 95, 159, 0 }, + { 159, 95, 159, 0 }, + { 191, 95, 159, 0 }, + { 223, 95, 159, 0 }, + { 255, 95, 159, 0 }, + { 63, 127, 159, 0 }, + { 95, 127, 159, 0 }, + { 127, 127, 159, 0 }, + { 159, 127, 159, 0 }, + { 191, 127, 159, 0 }, + { 223, 127, 159, 0 }, + { 255, 127, 159, 0 }, + { 63, 159, 159, 0 }, + { 95, 159, 159, 0 }, + { 127, 159, 159, 0 }, + { 159, 159, 159, 0 }, + { 191, 159, 159, 0 }, + { 223, 159, 159, 0 }, + { 255, 159, 159, 0 }, + { 63, 191, 159, 0 }, + { 95, 191, 159, 0 }, + { 127, 191, 159, 0 }, + { 159, 191, 159, 0 }, + { 191, 191, 159, 0 }, + { 223, 191, 159, 0 }, + { 255, 191, 159, 0 }, + { 63, 223, 159, 0 }, + { 95, 223, 159, 0 }, + { 127, 223, 159, 0 }, + { 159, 223, 159, 0 }, + { 191, 223, 159, 0 }, + { 223, 223, 159, 0 }, + { 255, 223, 159, 0 }, + { 63, 255, 159, 0 }, + { 95, 255, 159, 0 }, + { 127, 255, 159, 0 }, + { 159, 255, 159, 0 }, + { 191, 255, 159, 0 }, + { 223, 255, 159, 0 }, + { 255, 255, 159, 0 }, + { 63, 63, 191, 0 }, + { 95, 63, 191, 0 }, + { 127, 63, 191, 0 }, + { 159, 63, 191, 0 }, + { 191, 63, 191, 0 }, + { 223, 63, 191, 0 }, + { 255, 63, 191, 0 }, + { 63, 95, 191, 0 }, + { 95, 95, 191, 0 }, + { 127, 95, 191, 0 }, + { 159, 95, 191, 0 }, + { 191, 95, 191, 0 }, + { 223, 95, 191, 0 }, + { 255, 95, 191, 0 }, + { 63, 127, 191, 0 }, + { 95, 127, 191, 0 }, + { 127, 127, 191, 0 }, + { 159, 127, 191, 0 }, + { 191, 127, 191, 0 }, + { 223, 127, 191, 0 }, + { 255, 127, 191, 0 }, + { 63, 159, 191, 0 }, + { 95, 159, 191, 0 }, + { 127, 159, 191, 0 }, + { 159, 159, 191, 0 }, + { 191, 159, 191, 0 }, + { 223, 159, 191, 0 }, + { 255, 159, 191, 0 }, + { 63, 191, 191, 0 }, + { 95, 191, 191, 0 }, + { 127, 191, 191, 0 }, + { 159, 191, 191, 0 }, + { 191, 191, 191, 0 }, + { 223, 191, 191, 0 }, + { 255, 191, 191, 0 }, + { 63, 223, 191, 0 }, + { 95, 223, 191, 0 }, + { 127, 223, 191, 0 }, + { 159, 223, 191, 0 }, + { 191, 223, 191, 0 }, + { 223, 223, 191, 0 }, + { 255, 251, 240, 0 }, + { 58, 109, 165, 0 }, + { 128, 128, 128, 0 }, + { 255, 0, 0, 0 }, + { 0, 255, 0, 0 }, + { 255, 255, 0, 0 }, + { 0, 0, 255, 0 }, + { 255, 0, 255, 0 }, + { 0, 255, 255, 0 }, + { 255, 255, 255, 0 } +}; + #endif diff --git a/src/ddpalette.c b/src/ddpalette.c index ed2b858..e7bde4b 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -84,7 +84,7 @@ HRESULT dd_CreatePalette( p->lpVtbl = &g_ddp_vtbl; p->flags = dwFlags; - ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); + ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); IDirectDrawPalette_AddRef(p); *lpDDPalette = p; diff --git a/src/ddsurface.c b/src/ddsurface.c index eee23ed..b521eb4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -14,6 +14,7 @@ #include "ddclipper.h" #include "utils.h" #include "versionhelpers.h" +#include "ddpalette.h" LONG g_dds_gdi_handles; @@ -1093,8 +1094,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); - if (This->palette) - IDirectDrawPalette_Release(This->palette); + IDirectDrawPaletteImpl* old_palette = This->palette; if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) { @@ -1113,6 +1113,9 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD This->palette = lpDDPalette; } + if (old_palette) + IDirectDrawPalette_Release(old_palette); + return DD_OK; } @@ -1574,6 +1577,16 @@ HRESULT dd_CreateSurface( { g_ddraw.primary = dst_surface; FakePrimarySurface = dst_surface->surface; + + if (dst_surface->bpp == 8) + { + IDirectDrawPaletteImpl* lpDDPalette; + dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_me_palette, &lpDDPalette, NULL); + dds_SetPalette(dst_surface, lpDDPalette); + + // Make sure temp palette will be released once replaced + IDirectDrawPalette_Release(lpDDPalette); + } } } From 1c263ca573bdaae7c3c81cb1237a8f3868e1ddb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:46:44 +0100 Subject: [PATCH 1527/1724] hook GetSystemPaletteEntries --- inc/hook.h | 3 +++ inc/winapi_hooks.h | 1 + src/ddpalette.c | 11 +++++++++-- src/hook.c | 2 ++ src/winapi_hooks.c | 15 +++++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 92301d4..299ac75 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -64,6 +64,8 @@ typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); +typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); + typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); @@ -116,6 +118,7 @@ extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; +extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index fa5c635..3569abb 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -58,6 +58,7 @@ int WINAPI fake_StretchDIBits( HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); +UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/ddpalette.c b/src/ddpalette.c index e7bde4b..af18231 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -14,11 +14,15 @@ HRESULT ddp_GetEntries( DWORD dwNumEntries, LPPALETTEENTRY lpEntries) { - for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++) + if (!lpEntries) + return DDERR_INVALIDPARAMS; + + for (int i = dwBase, x = 0; i < dwBase + dwNumEntries && i < 256; i++, x++) { lpEntries[x].peRed = This->data_rgb[i].rgbRed; lpEntries[x].peGreen = This->data_rgb[i].rgbGreen; lpEntries[x].peBlue = This->data_rgb[i].rgbBlue; + lpEntries[x].peFlags = 0; } return DD_OK; @@ -31,7 +35,10 @@ HRESULT ddp_SetEntries( DWORD dwCount, LPPALETTEENTRY lpEntries) { - for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++) + if (!lpEntries) + return DDERR_INVALIDPARAMS; + + for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) { This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; diff --git a/src/hook.c b/src/hook.c index 6533a4d..3229a3a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -57,6 +57,7 @@ GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; +GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -149,6 +150,7 @@ HOOKLIST g_hook_hooklist[] = { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, + { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index eebc181..b909e10 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -20,6 +20,7 @@ #include "dllmain.h" #include "hook.h" #include "directinput.h" +#include "ddpalette.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -1348,6 +1349,20 @@ HFONT WINAPI fake_CreateFontA( lpszFace); } +UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) +{ + if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); + return cEntries - iStart; + } + } + + return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From 82d3ec46a38c8905be42ef098f9b113811878634 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:06 +0100 Subject: [PATCH 1528/1724] copy from g_ddp_me_palette if there's no primary yet --- src/winapi_hooks.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b909e10..38cfbd1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,13 +1351,24 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) { + TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); return cEntries - iStart; } + else + { + for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) + { + pPalEntries[x].peRed = g_ddp_me_palette[i].peRed; + pPalEntries[x].peGreen = g_ddp_me_palette[i].peGreen; + pPalEntries[x].peBlue = g_ddp_me_palette[i].peBlue; + pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; + } + } } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 06aadb709f551f6ecfe4ff4be9bba53e1eadb877 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:37 +0100 Subject: [PATCH 1529/1724] fix for last commit --- src/winapi_hooks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 38cfbd1..a805ae5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1357,7 +1357,6 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); - return cEntries - iStart; } else { @@ -1369,6 +1368,8 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; } } + + return cEntries - iStart; } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 58f8f89c66f6cca26376d375188c5005b47d0e67 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:47 +0100 Subject: [PATCH 1530/1724] remove debug code --- src/winapi_hooks.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a805ae5..d1a152e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1355,7 +1355,6 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); } else From 0905cb80595119cfde0d592dedaf79fdab0021f6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:00:09 +0100 Subject: [PATCH 1531/1724] log function call --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d1a152e..5a6820f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,6 +1351,8 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) From 091a8c1d6e95461fd6800a0041f86b34a682620d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:17:53 +0100 Subject: [PATCH 1532/1724] add debug logging --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5a6820f..a35c1dc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1355,6 +1355,8 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { + TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); From 6c67db5db1ce741cba6a5ba81b12a9ef6a6bd2bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:20:12 +0100 Subject: [PATCH 1533/1724] log args as well --- src/winapi_hooks.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a35c1dc..efa2dac 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,7 +1351,14 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE( + "%s(hdc=%p, iStart=%u, cEntries=%u, pPalEntries=%p) [%p]\n", + __FUNCTION__, + hdc, + iStart, + cEntries, + pPalEntries, + _ReturnAddress()); if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { From a5a4204f41d387949008d94fb89414e6637fe882 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:01:08 +0100 Subject: [PATCH 1534/1724] hook SelectPalette --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 299ac75..235d579 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -65,6 +65,7 @@ typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); +typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -119,6 +120,7 @@ extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; +extern SELECTPALETTEPROC real_SelectPalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3569abb..ccbea4b 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -59,6 +59,7 @@ int WINAPI fake_StretchDIBits( HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); +HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index 3229a3a..f73f31c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -58,6 +58,7 @@ GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; +SELECTPALETTEPROC real_SelectPalette = SelectPalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -151,6 +152,7 @@ HOOKLIST g_hook_hooklist[] = { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, + { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index efa2dac..207cabb 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1385,6 +1385,24 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); } +HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) +{ + if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + PALETTEENTRY pal[256]; + GetPaletteEntries(hPal, 0, 256, pal); + + ddp_SetEntries(g_ddraw.primary->palette, 0, 0, 256, pal); + } + } + + return real_SelectPalette(hdc, hPal, bForceBkgd); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From 60735fc0d517731ce1abf4cac834dfea41ce0e3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:26:47 +0100 Subject: [PATCH 1535/1724] use return value from GetPaletteEntries --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 207cabb..ca9cbdc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1394,9 +1394,9 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); PALETTEENTRY pal[256]; - GetPaletteEntries(hPal, 0, 256, pal); + UINT count = GetPaletteEntries(hPal, 0, 256, pal); - ddp_SetEntries(g_ddraw.primary->palette, 0, 0, 256, pal); + ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); } } From b15e579ea4a2f716da98893a7b05b81b9d92cb6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:32:06 +0100 Subject: [PATCH 1536/1724] add some checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ca9cbdc..78f7a23 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,7 +1360,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); @@ -1387,7 +1387,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) { From 308fefb6545a32672594f5915c6dff728337849e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 08:01:23 +0100 Subject: [PATCH 1537/1724] add GetDesktopWindow check --- src/winapi_hooks.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78f7a23..c53dec3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,7 +1360,10 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + pPalEntries && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); @@ -1387,7 +1390,9 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1397,6 +1402,8 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) UINT count = GetPaletteEntries(hPal, 0, 256, pal); ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); + + return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd); } } From 9a015c47cba21f03798e5620e3b3bdd43e4e46c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 08:02:00 +0100 Subject: [PATCH 1538/1724] rename palette --- inc/ddpalette.h | 2 +- src/ddsurface.c | 2 +- src/winapi_hooks.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index ebb4479..5f6d112 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -12,7 +12,7 @@ HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStar HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); // Original palette copied from Windows ME -static PALETTEENTRY g_ddp_me_palette[] = +static PALETTEENTRY g_ddp_default_palette[] = { { 0, 0, 0, 0 }, { 128, 0, 0, 0 }, diff --git a/src/ddsurface.c b/src/ddsurface.c index b521eb4..d8aafda 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1581,7 +1581,7 @@ HRESULT dd_CreateSurface( if (dst_surface->bpp == 8) { IDirectDrawPaletteImpl* lpDDPalette; - dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_me_palette, &lpDDPalette, NULL); + dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_default_palette, &lpDDPalette, NULL); dds_SetPalette(dst_surface, lpDDPalette); // Make sure temp palette will be released once replaced diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c53dec3..9a2366a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1375,10 +1375,10 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) { - pPalEntries[x].peRed = g_ddp_me_palette[i].peRed; - pPalEntries[x].peGreen = g_ddp_me_palette[i].peGreen; - pPalEntries[x].peBlue = g_ddp_me_palette[i].peBlue; - pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; + pPalEntries[x].peRed = g_ddp_default_palette[i].peRed; + pPalEntries[x].peGreen = g_ddp_default_palette[i].peGreen; + pPalEntries[x].peBlue = g_ddp_default_palette[i].peBlue; + pPalEntries[x].peFlags = g_ddp_default_palette[i].peFlags; } } From 8be98755535f01d7d447dc5e97f22a910425e26d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:16:49 +0100 Subject: [PATCH 1539/1724] fix return value for NUMCOLORS on desktop window --- src/winapi_hooks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9a2366a..081bdee 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -893,10 +893,22 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return RC_PALETTE | real_GetDeviceCaps(hdc, index); } - if (index == SIZEPALETTE || index == NUMCOLORS) + if (index == SIZEPALETTE) { return 256; } + + if (index == NUMCOLORS) + { + if (WindowFromDC(hdc) == GetDesktopWindow()) + { + return 20; + } + else + { + return 256; + } + } } return real_GetDeviceCaps(hdc, index); From 75ed1582d2b98552b268f8dd713985a7cfe4cc23 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:17:26 +0100 Subject: [PATCH 1540/1724] hook RealizePalette --- inc/IDirectDrawSurface.h | 2 ++ inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 37 +++++++++++++++++++++++++++++-------- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index f04e03a..e20b506 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -28,6 +28,8 @@ typedef struct IDirectDrawSurfaceImpl CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; + PALETTEENTRY selected_pal[256]; + UINT selected_pal_count; void* surface; HANDLE mapping; diff --git a/inc/hook.h b/inc/hook.h index 235d579..e17e1ec 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -66,6 +66,7 @@ typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); +typedef UINT (WINAPI* REALIZEPALETTEPROC)(HDC); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -121,6 +122,7 @@ extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; extern SELECTPALETTEPROC real_SelectPalette; +extern REALIZEPALETTEPROC real_RealizePalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index ccbea4b..6bb5250 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -60,6 +60,7 @@ HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); +UINT WINAPI fake_RealizePalette(HDC); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index f73f31c..debebbf 100644 --- a/src/hook.c +++ b/src/hook.c @@ -59,6 +59,7 @@ CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; SELECTPALETTEPROC real_SelectPalette = SelectPalette; +REALIZEPALETTEPROC real_RealizePalette = RealizePalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -153,6 +154,7 @@ HOOKLIST g_hook_hooklist[] = { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, + { "RealizePalette", (PROC)fake_RealizePalette, (PROC*)&real_RealizePalette, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 081bdee..9cf2ad3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -905,11 +905,11 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return 20; } else - { - return 256; + { + return 256; + } } } - } return real_GetDeviceCaps(hdc, index); } @@ -1410,18 +1410,39 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - PALETTEENTRY pal[256]; - UINT count = GetPaletteEntries(hPal, 0, 256, pal); - - ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); + g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); - return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd); + return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; } } return real_SelectPalette(hdc, hPal, bForceBkgd); } +UINT WINAPI fake_RealizePalette(HDC hdc) +{ + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + ddp_SetEntries( + g_ddraw.primary->palette, + 0, + 0, + g_ddraw.primary->selected_pal_count, + g_ddraw.primary->selected_pal); + + return g_ddraw.primary->selected_pal_count; + } + } + + return real_RealizePalette(hdc); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From bf62b84cb0b3014860f043e2987f9c3b93cbd8e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:26:21 +0100 Subject: [PATCH 1541/1724] keep logs clean in mini debug build --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9cf2ad3..e88d249 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1408,7 +1408,7 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); @@ -1427,7 +1427,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); ddp_SetEntries( g_ddraw.primary->palette, From 911c3bdfeb133a5393e19d80adc62c8bef0823cf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 23:40:41 +0100 Subject: [PATCH 1542/1724] #367 fix videos in Imperialism 2: The Age of Exploration --- src/winapi_hooks.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e88d249..c6907e3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -982,7 +982,10 @@ BOOL WINAPI fake_StretchBlt( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, @@ -1078,7 +1081,10 @@ BOOL WINAPI fake_BitBlt( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, @@ -1174,7 +1180,10 @@ int WINAPI fake_SetDIBitsToDevice( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchDIBits( @@ -1262,7 +1271,10 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchDIBits( From 79548888d414d658b107c3318215bf322ce5fecd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:43:57 +0100 Subject: [PATCH 1543/1724] #367 hook SetWindowPlacement / Fix windowed mode --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 11 +++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index e17e1ec..dac2704 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[35]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -57,6 +57,7 @@ typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); +typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -114,6 +115,7 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; +extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6bb5250..16a45bb 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); diff --git a/src/hook.c b/src/hook.c index debebbf..2d2b315 100644 --- a/src/hook.c +++ b/src/hook.c @@ -51,6 +51,7 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; +SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; @@ -105,6 +106,7 @@ HOOKLIST g_hook_hooklist[] = { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, + { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c6907e3..748b848 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -806,6 +806,17 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) return result; } +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl) +{ + if (lpwndpl && g_ddraw.ref && g_ddraw.hwnd && hWnd == g_ddraw.hwnd) + { + if (lpwndpl->showCmd == SW_SHOWMAXIMIZED || lpwndpl->showCmd == SW_MAXIMIZE) + return TRUE; + } + + return real_SetWindowPlacement(hWnd, lpwndpl); +} + BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) { BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode); From 67dceb236d2eafb171496f58f52300a78426af17 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:44:30 +0100 Subject: [PATCH 1544/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1e5bbe8..cd0ec33 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Ignition - Indiana Jones and the Fate of Atlantis - Indiana Jones and the Last Crusade +- Imperialism 2: The Age of Exploration - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus From 1b0a839588dd96bbe4fa2e694f14bc583c366652 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:50:50 +0100 Subject: [PATCH 1545/1724] add preset for Imperialism II --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index e26e71f..5fc3c1f 100644 --- a/src/config.c +++ b/src/config.c @@ -1078,6 +1078,15 @@ static void cfg_create_ini() "[hooligans]\n" "limit_gdi_handles=true\n" "\n" + "; Imperialism 2: The Age of Exploration\n" + "[Imperialism II]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" From b38aeb30aeb263da247b2a1d153061b2c057bb34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 01:56:02 +0100 Subject: [PATCH 1546/1724] fix GetWindowPlacement hook for child windows --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 748b848..af977fd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -797,7 +797,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) lpwndpl->rcNormalPosition.right = g_ddraw.width; lpwndpl->rcNormalPosition.top = 0; } - else + else if (!(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); } From 987b489a4c9c4cfac71c6b1e9ca68802ced2c516 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:03:10 +0100 Subject: [PATCH 1547/1724] copy code from SetWindowPos --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index af977fd..7d9bee7 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -797,7 +797,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) lpwndpl->rcNormalPosition.right = g_ddraw.width; lpwndpl->rcNormalPosition.top = 0; } - else if (!(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); } From c35ca6030751f7a6ebca529aabc4b31e9fdd9e3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:24:46 +0100 Subject: [PATCH 1548/1724] do not use DwmFlush in wine (it's only a stub) --- src/fps_limiter.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 14c4394..0996784 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -120,16 +120,9 @@ BOOL fpsl_wait_for_vblank() BOOL fpsl_dwm_flush() { - if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) + if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && !IsWine()) { - HRESULT x = g_fpsl.DwmFlush(); - - if (!SUCCEEDED(x)) - { - //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); - } - - return SUCCEEDED(x); + return SUCCEEDED(g_fpsl.DwmFlush()); } return FALSE; From 82386fbbc462770450651474f69baf743f317a42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 06:43:32 +0100 Subject: [PATCH 1549/1724] add preset for Nightlong - Union City Conspiracy --- inc/config.h | 2 +- src/config.c | 8 ++++++-- src/wndproc.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index de782b5..e03a8fd 100644 --- a/inc/config.h +++ b/inc/config.h @@ -74,6 +74,7 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; BOOL direct3d_passthrough; BOOL center_cursor_fix; + BOOL allow_wm_nchittest; char fake_mode[128]; BOOL lock_mouse_top_left; char win_version[32]; @@ -106,7 +107,6 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; - BOOL seventhlegion_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 5fc3c1f..73d33ea 100644 --- a/src/config.c +++ b/src/config.c @@ -87,6 +87,7 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); + GET_BOOL(g_config.allow_wm_nchittest, "allow_wm_nchittest", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); @@ -116,7 +117,6 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); - GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -395,7 +395,7 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "seventhlegion_hack=true\n" + "allow_wm_nchittest=true\n" "singlecpu=false\n" "\n" "; Atrox\n" @@ -1331,6 +1331,10 @@ static void cfg_create_ini() "checkfile=.\\nox.cfg\n" "maxgameticks=125\n" "\n" + "; Nightlong - Union City Conspiracy\n" + "[NL]\n" + "allow_wm_nchittest=true\n" + "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" diff --git a/src/wndproc.c b/src/wndproc.c index 774e534..54a8831 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,7 +101,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { - if (g_config.seventhlegion_hack) + if (g_config.allow_wm_nchittest) break; LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); From 018d49ce36131b374e4e8d808916701b1d8a9943 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 07:18:10 +0100 Subject: [PATCH 1550/1724] don't allow to set palette to surface that isn't 8bpp --- src/ddsurface.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index d8aafda..18ebb27 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1091,6 +1091,9 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette) { + if (This->bpp != 8) + return DDERR_INVALIDPIXELFORMAT; + if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); From 9fde18eafd29a0a0bbbf3777cd27c0bc51850e02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 18:41:05 +0100 Subject: [PATCH 1551/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cd0ec33..18e4d38 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- 101: The Airborne Invasion of Normandy - 7th Legion - Abomination - The Nemesis Project - Addiction Pinball From 363d54ece07597ff4474bfa941595ac63623d8f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 18:57:27 +0100 Subject: [PATCH 1552/1724] fix WM_NCHITTEST message --- src/wndproc.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 54a8831..ee6c0f6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,8 +101,32 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { - if (g_config.allow_wm_nchittest) - break; + if (g_config.allow_wm_nchittest && (g_mouse_locked || g_config.devmode)) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)) + { + int x = max(pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + pt.x = min(x, g_ddraw.width - 1); + pt.y = min(y, g_ddraw.height - 1); + } + else + { + pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y)); + } LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); From bbe8c4f8570614333baed45cf570ab2471410fd0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 20:45:24 +0100 Subject: [PATCH 1553/1724] log args --- src/winapi_hooks.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7d9bee7..e06e6f1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1400,7 +1400,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); + TRACE(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1431,7 +1431,13 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT( + "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", + __FUNCTION__, + hdc, + hPal, + bForceBkgd, + _ReturnAddress()); g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); @@ -1450,7 +1456,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); ddp_SetEntries( g_ddraw.primary->palette, From 39b2e69540046d669d6f9e72a3e9e72d0c99b36b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 21:33:05 +0100 Subject: [PATCH 1554/1724] make sure we don't update the palette twice --- inc/ddpalette.h | 2 ++ src/ddpalette.c | 14 ++++++++++++++ src/winapi_hooks.c | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index 5f6d112..e780b5a 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -7,6 +7,8 @@ #include "IDirectDrawPalette.h" #include "dd.h" +#define DDPCAPS_REFRESH_CHANGED_ONLY (1 << 31) + HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries); HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); diff --git a/src/ddpalette.c b/src/ddpalette.c index af18231..46af3a1 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -5,6 +5,7 @@ #include "ddsurface.h" #include "IDirectDrawPalette.h" #include "debug.h" +#include "crc32.h" HRESULT ddp_GetEntries( @@ -38,6 +39,13 @@ HRESULT ddp_SetEntries( if (!lpEntries) return DDERR_INVALIDPARAMS; + unsigned long crc32 = 0; + + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) + { + crc32 = Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb)); + } + for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) { This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; @@ -64,6 +72,12 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } + if (crc32 && crc32 == Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb))) + { + // do not set palette_updated BOOL if nothing changed + return DD_OK; + } + if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e06e6f1..4bcfa3c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1460,7 +1460,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) ddp_SetEntries( g_ddraw.primary->palette, - 0, + DDPCAPS_REFRESH_CHANGED_ONLY, 0, g_ddraw.primary->selected_pal_count, g_ddraw.primary->selected_pal); From f58c4a49785e5f794fd9a89025ba09e17c791bcd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 21:48:45 +0100 Subject: [PATCH 1555/1724] log selected_pal_count --- src/winapi_hooks.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4bcfa3c..22be414 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1458,6 +1458,11 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); + if (g_ddraw.primary->selected_pal_count != 256) + { + TRACE_EXT(" selected_pal_count = %u\n", g_ddraw.primary->selected_pal_count); + } + ddp_SetEntries( g_ddraw.primary->palette, DDPCAPS_REFRESH_CHANGED_ONLY, From 4b0f0f2cf53ca712d1641fb05dc1f8a9742e279e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:03:23 +0100 Subject: [PATCH 1556/1724] use faster method to check for palette changes --- src/ddpalette.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 46af3a1..0ab17b1 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -5,7 +5,6 @@ #include "ddsurface.h" #include "IDirectDrawPalette.h" #include "debug.h" -#include "crc32.h" HRESULT ddp_GetEntries( @@ -39,11 +38,11 @@ HRESULT ddp_SetEntries( if (!lpEntries) return DDERR_INVALIDPARAMS; - unsigned long crc32 = 0; + RGBQUAD data_rgb[256]; if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) { - crc32 = Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb)); + memcpy(data_rgb, This->data_rgb, sizeof(This->data_rgb)); } for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) @@ -72,7 +71,7 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if (crc32 && crc32 == Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb))) + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY) && memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) { // do not set palette_updated BOOL if nothing changed return DD_OK; From f9b47a9f0e5fe1256071266b0f6bf8f6c8cd0d1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:13:26 +0100 Subject: [PATCH 1557/1724] log when palette was changed --- src/ddpalette.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 0ab17b1..4288b89 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -71,10 +71,15 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY) && memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) { - // do not set palette_updated BOOL if nothing changed - return DD_OK; + if (memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) + { + // do not set palette_updated BOOL if nothing changed + return DD_OK; + } + + TRACE_EXT(" Palette changed\n"); } if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) From 747e1ec3a7a14ad51a143303f2499d8041700abd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:33:35 +0100 Subject: [PATCH 1558/1724] fix return value of GetSystemPaletteEntries --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 22be414..b05ac85 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1417,7 +1417,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP } } - return cEntries - iStart; + return cEntries; } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 30805c78cc02a21a945dfd27d2b78e5290f8cb93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Dec 2024 01:02:21 +0100 Subject: [PATCH 1559/1724] add support for dosbox staging shaders --- src/render_ogl.c | 121 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 32 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index b9d5028..ecfb2e9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -605,8 +605,10 @@ static void ogl_init_shader1_program() glUseProgram(g_ogl.shader1_program); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); + if (vertex_coord_attr_loc == -1) // dosbox staging + vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "a_position"); + g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); - g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); glGenBuffers(3, g_ogl.shader1_vbos); @@ -663,10 +665,13 @@ static void ogl_init_shader1_program() glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]); static const GLushort indices[] = @@ -688,24 +693,44 @@ static void ogl_init_shader1_program() output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyOutputSize"); + if (loc != -1) glUniform2fv(loc, 1, output_size); + loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTextureSize"); + if (loc != -1) glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyInputSize"); + if (loc != -1) glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTexture"); + + if (loc != -1) + glUniform1i(loc, 0); + + loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); - if (loc != -1) - glUniform1i(loc, 0); + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); + if (g_ogl.shader1_frame_count_uni_loc == -1) + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "rubyFrameCount"); const float mvp_matrix[16] = { 1,0,0,0, @@ -713,7 +738,10 @@ static void ogl_init_shader1_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + + loc = glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"); + if (loc != -1) + glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix); glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); @@ -819,8 +847,10 @@ static void ogl_init_shader2_program() glUseProgram(g_ogl.shader2_program); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); + if (vertex_coord_attr_loc == -1) + vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "a_position"); + g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); - g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount"); glGenBuffers(3, g_ogl.shader2_vbos); @@ -855,10 +885,13 @@ static void ogl_init_shader2_program() glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); - glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader2_tex_coord_attr_loc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); static const GLushort indices[] = @@ -880,32 +913,44 @@ static void ogl_init_shader2_program() output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyOutputSize"); + if (loc != -1) glUniform2fv(loc, 1, output_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTextureSize"); + if (loc != -1) glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyInputSize"); + if (loc != -1) glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTexture"); + + if (loc != -1) + glUniform1i(loc, 0); + + loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); - if (loc != -1) - glUniform1i(loc, 0); - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); - if (loc != -1) - glUniform1i(loc, 1); - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); - if (loc != -1) - glUniform2fv(loc, 1, texture_size); + g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount"); + if (g_ogl.shader2_frame_count_uni_loc == -1) + g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "rubyFrameCount"); const float mvp_matrix[16] = { 1,0,0,0, @@ -913,7 +958,10 @@ static void ogl_init_shader2_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + + loc = glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"); + if (loc != -1) + glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix); } static void ogl_render() @@ -1105,8 +1153,11 @@ static void ogl_render() 0.0f, g_ogl.scale_h, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + if (g_ogl.shader2_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -1121,8 +1172,11 @@ static void ogl_render() g_ogl.scale_w, 0.0f, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -1137,8 +1191,11 @@ static void ogl_render() 0.0f, g_ogl.scale_h, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } From 34250bf2245d1f760d402b1b965dab16131b8e30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Dec 2024 01:11:09 +0100 Subject: [PATCH 1560/1724] fix for last commit --- src/render_ogl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index ecfb2e9..cf85022 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -944,6 +944,14 @@ static void ogl_init_shader2_program() glUniform1i(loc, 0); + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); + if (loc != -1) + glUniform1i(loc, 1); + + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); From f70f67857eb349a4e6fe19bd77a49553a70e4a28 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 03:15:23 +0100 Subject: [PATCH 1561/1724] hook DefWindowProcA --- inc/config.h | 1 - inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/config.c | 6 ------ src/hook.c | 2 ++ src/winapi_hooks.c | 11 +++++++++++ src/wndproc.c | 22 +++++++++++----------- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/inc/config.h b/inc/config.h index e03a8fd..4e9731d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -74,7 +74,6 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; BOOL direct3d_passthrough; BOOL center_cursor_fix; - BOOL allow_wm_nchittest; char fake_mode[128]; BOOL lock_mouse_top_left; char win_version[32]; diff --git a/inc/hook.h b/inc/hook.h index dac2704..a3e632a 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[35]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[36]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -59,6 +59,7 @@ typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); +typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -117,6 +118,7 @@ extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; +extern DEFWINDOWPROCAPROC real_DefWindowProcA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 16a45bb..1170ff0 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -35,6 +35,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); +LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/config.c b/src/config.c index 73d33ea..b21526a 100644 --- a/src/config.c +++ b/src/config.c @@ -87,7 +87,6 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); - GET_BOOL(g_config.allow_wm_nchittest, "allow_wm_nchittest", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); @@ -395,7 +394,6 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "allow_wm_nchittest=true\n" "singlecpu=false\n" "\n" "; Atrox\n" @@ -1331,10 +1329,6 @@ static void cfg_create_ini() "checkfile=.\\nox.cfg\n" "maxgameticks=125\n" "\n" - "; Nightlong - Union City Conspiracy\n" - "[NL]\n" - "allow_wm_nchittest=true\n" - "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" diff --git a/src/hook.c b/src/hook.c index 2d2b315..b6bab0a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -53,6 +53,7 @@ GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; +DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -108,6 +109,7 @@ HOOKLIST g_hook_hooklist[] = { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, + { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b05ac85..a2c5df9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -855,6 +855,17 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV return result; } +LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) + { + if (Msg == WM_NCHITTEST) + return HTCLIENT; + } + + return real_DefWindowProcA(hWnd, Msg, wParam, lParam); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) diff --git a/src/wndproc.c b/src/wndproc.c index ee6c0f6..6043467 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -50,7 +50,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_CANCELMODE: case WM_DISPLAYCHANGE: { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } case WM_GETMINMAXINFO: { @@ -88,20 +88,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } case WM_NCACTIVATE: { if (g_config.noactivateapp) { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } break; } case WM_NCHITTEST: { - if (g_config.allow_wm_nchittest && (g_mouse_locked || g_config.devmode)) + if (g_mouse_locked || g_config.devmode) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; @@ -128,7 +128,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y)); } - LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); + LRESULT result = real_DefWindowProcA(hWnd, uMsg, wParam, lParam); if (!g_config.resizable) { @@ -173,7 +173,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case HTTOP: case HTTOPLEFT: case HTTOPRIGHT: - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); case HTCLIENT: if (!g_mouse_locked && !g_config.devmode) { @@ -548,7 +548,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } case WM_MOVE: { @@ -575,7 +575,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } case WM_RESTORE_STYLE: { @@ -606,7 +606,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_MAXIMIZE) { if (IsWine()) - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); if (g_config.resizable) { @@ -626,7 +626,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; if (!GameHandlesClose) - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); break; } @@ -855,7 +855,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } break; From 02427d606bd309cd662864048db0a7cf223bf907 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 04:20:37 +0100 Subject: [PATCH 1562/1724] add preset for virtual springfield --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 18e4d38..c69c352 100644 --- a/README.md +++ b/README.md @@ -416,6 +416,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Uprising: Join or Die - Vermeer - Virtua Fighter PC +- Virtual Springfield - War Wind - War Wind II - Human Onslaught - Warcraft 2 diff --git a/src/config.c b/src/config.c index b21526a..a73335f 100644 --- a/src/config.c +++ b/src/config.c @@ -1645,6 +1645,11 @@ static void cfg_create_ini() "lock_surfaces=true\n" "singlecpu=false\n" "\n" + "; Virtual Springfield\n" + "[VIRTUAL]\n" + "game_handles_close=true\n" + "singlecpu=false\n" + "\n" "; Total Annihilation: Kingdoms\n" "[Kingdoms]\n" "game_handles_close=true\n" From 7af3be82e379e3a193061577778ef8e52f218345 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 04:20:58 +0100 Subject: [PATCH 1563/1724] update Return to Krondor preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index a73335f..ba89b87 100644 --- a/src/config.c +++ b/src/config.c @@ -1481,6 +1481,7 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "singlecpu=false\n" "limiter_type=2\n" + "game_handles_close=true\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From d1338fd92af511135a1ce4f6964ea6f41219fbd6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 07:34:36 +0100 Subject: [PATCH 1564/1724] add support for Die by the Sword --- src/config.c | 4 ++++ src/dd.c | 4 ++-- src/directinput.c | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index ba89b87..c2b7710 100644 --- a/src/config.c +++ b/src/config.c @@ -846,6 +846,10 @@ static void cfg_create_ini() "resolutions=2\n" "singlecpu=false\n" "\n" + "; Die by the Sword\n" + "[windie]\n" + "maxgameticks=30\n" + "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" "maxgameticks=60\n" diff --git a/src/dd.c b/src/dd.c index f5df432..aa183ea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1549,8 +1549,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); - g_ddraw.windowed_hack = TRUE; - dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + //g_ddraw.windowed_hack = TRUE; + //dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } } diff --git a/src/directinput.c b/src/directinput.c index 7db6d2d..a0d077d 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -58,9 +58,9 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE"); dbg_dump_di_scm_flags(dwFlags); - if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && (dwFlags & DISCL_EXCLUSIVE)) { - if (g_mouse_locked || g_config.devmode) + if (g_mouse_locked || g_config.devmode || !g_ddraw.ref) { while (real_ShowCursor(FALSE) >= 0); } From d563084a0ed19af76e6b6e1cf109e466928c3bbc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 07:34:48 +0100 Subject: [PATCH 1565/1724] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c69c352..50292cf 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Atlantis: The Lost Tales - Atomic Bomberman - Atrox +- Airline 69: Return to Casablanca - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 @@ -147,6 +148,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Delta Force - Desperados: Wanted Dead or Alive - Dreams to Realty +- Die by the Sword - Diablo - Diablo 2 - Diablo 2: Lord of Destruction From dc719ec59b9670a4082a832ee34b8fe55ca190ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:46:27 +0100 Subject: [PATCH 1566/1724] add presets for army men --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index c2b7710..33dcbdd 100644 --- a/src/config.c +++ b/src/config.c @@ -504,6 +504,18 @@ static void cfg_create_ini() "[1602]\n" "adjmouse=true\n" "\n" + "; Army Men: World War / Army Men: Operation Meltdown\n" + "[amww]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" + "; Army Men 2\n" + "[ArmyMen2]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" "; Alien Nations\n" "[AN]\n" "adjmouse=true\n" From 6be3407e67dd3868a46dc35e00692686f11c6784 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:53:08 +0100 Subject: [PATCH 1567/1724] add some more army men presets --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index 33dcbdd..cb5edce 100644 --- a/src/config.c +++ b/src/config.c @@ -510,6 +510,18 @@ static void cfg_create_ini() "maxgameticks=120\n" "minfps=-1\n" "\n" + "; Army Men: Air Tactics\n" + "[Amat]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" + "; Army Men: Toys in Space\n" + "[ARMYMENTIS]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" "; Army Men 2\n" "[ArmyMen2]\n" "maxfps=60\n" From 7ac70bd8780f08b3d3d753dd0b24593ee1abeda1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:53:33 +0100 Subject: [PATCH 1568/1724] update supported games list --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 50292cf..280812d 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue +- Army Men: World War / Army Men: Operation Meltdown +- Army Men: Air Tactics +- Army Men: Toys in Space +- Army Men 2 - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -199,6 +203,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Grand Theft Auto: London 1969 - Gruntz - Gilbert Goodmate And The Mushroom Of Phungoria +- Handkerchief - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Heart of Darkness From 9cefca463a25ebed7a0eb8c60e7245201f8b69e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 06:58:42 +0100 Subject: [PATCH 1569/1724] add support for Seven Kingdoms II --- README.md | 1 + inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/config.c | 4 ++++ src/hook.c | 2 ++ src/winapi_hooks.c | 13 ++++++++++++- 6 files changed, 23 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 280812d..195d80d 100644 --- a/README.md +++ b/README.md @@ -354,6 +354,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sega Touring Car - Septerra Core - Settlers 3 +- Seven Kingdoms II - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division diff --git a/inc/hook.h b/inc/hook.h index a3e632a..f362562 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[36]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[37]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -35,6 +35,7 @@ typedef BOOL(WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT); typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL); typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM); typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG); +typedef LONG(WINAPI* SETWINDOWLONGWPROC)(HWND, int, LONG); typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int); typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); @@ -99,6 +100,7 @@ extern SETWINDOWPOSPROC real_SetWindowPos; extern MOVEWINDOWPROC real_MoveWindow; extern SENDMESSAGEAPROC real_SendMessageA; extern SETWINDOWLONGAPROC real_SetWindowLongA; +extern SETWINDOWLONGWPROC real_SetWindowLongW; extern GETWINDOWLONGAPROC real_GetWindowLongA; extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 1170ff0..d9426fa 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -21,6 +21,7 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); +LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong); LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); diff --git a/src/config.c b/src/config.c index cb5edce..591f2ec 100644 --- a/src/config.c +++ b/src/config.c @@ -1550,6 +1550,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "fake_mode=640x480x32\n" "\n" + "; Seven Kingdoms II\n" + "[7k2]\n" + "fake_mode=352x240x32\n" + "\n" "; Sid Meier's Simgolf\n" "[golf]\n" "fake_mode=640x480x16\n" diff --git a/src/hook.c b/src/hook.c index b6bab0a..a7a9f56 100644 --- a/src/hook.c +++ b/src/hook.c @@ -34,6 +34,7 @@ SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos; MOVEWINDOWPROC real_MoveWindow = MoveWindow; SENDMESSAGEAPROC real_SendMessageA = SendMessageA; SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA; +SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; GETWINDOWLONGAPROC real_GetWindowLongA = GetWindowLongA; ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; @@ -96,6 +97,7 @@ HOOKLIST g_hook_hooklist[] = { "MoveWindow", (PROC)fake_MoveWindow, (PROC*)&real_MoveWindow, 0 }, { "SendMessageA", (PROC)fake_SendMessageA, (PROC*)&real_SendMessageA, 0 }, { "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC*)&real_SetWindowLongA, 0 }, + { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, { "GetWindowLongA", (PROC)fake_GetWindowLongA, (PROC*)&real_GetWindowLongA, 0 }, { "EnableWindow", (PROC)fake_EnableWindow, (PROC*)&real_EnableWindow, 0 }, { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a2c5df9..64b4e94 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -448,7 +448,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (g_ddraw.ref && g_ddraw.hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_STYLE) return 0; @@ -465,6 +465,17 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) return real_SetWindowLongA(hWnd, nIndex, dwNewLong); } +LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) + { + if (nIndex == GWL_STYLE) + return 0; + } + + return real_SetWindowLongW(hWnd, nIndex, dwNewLong); +} + LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { if (g_ddraw.ref && g_ddraw.hwnd == hWnd) From 067dab35e24d749f549919f7f985a45bbc5b7ca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 07:14:37 +0100 Subject: [PATCH 1570/1724] update Seven Kingdoms II preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 591f2ec..9dc50ae 100644 --- a/src/config.c +++ b/src/config.c @@ -1553,6 +1553,7 @@ static void cfg_create_ini() "; Seven Kingdoms II\n" "[7k2]\n" "fake_mode=352x240x32\n" + "fix_not_responding=true\n" "\n" "; Sid Meier's Simgolf\n" "[golf]\n" From 39ba7259b8bdce6b4c17bd6c9acf0be5da37ccfa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:33:55 +0100 Subject: [PATCH 1571/1724] #369 add support for Fallout Tactics --- src/config.c | 4 ++++ src/winapi_hooks.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/config.c b/src/config.c index 9dc50ae..1c542e4 100644 --- a/src/config.c +++ b/src/config.c @@ -952,6 +952,10 @@ static void cfg_create_ini() "[FABLE]\n" "singlecpu=false\n" "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[BOS]\n" + "hook_peekmessage=true\n" + "\n" "; Falcon 4.0 (Microprose version)\n" "[falcon4]\n" "singlecpu=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 64b4e94..d982b2a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1922,6 +1922,13 @@ HWND WINAPI fake_CreateWindowExA( dwExStyle |= WS_EX_APPWINDOW; } + /* Fallout Tactics */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "bosWin32Class") == 0 && + lpWindowName && _strcmpi(lpWindowName, "Fallout: Tactics (TM)") == 0) + { + dwStyle |= WS_VISIBLE; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From cafbe8f6e1f9cf27bb3ed2df184dd2316e7b7edb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:41:01 +0100 Subject: [PATCH 1572/1724] fix conflicting presets --- src/config.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 1c542e4..2b7998d 100644 --- a/src/config.c +++ b/src/config.c @@ -576,6 +576,7 @@ static void cfg_create_ini() "\n" "; Balls of Steel v1.2\n" "[bos]\n" + "checkfile=.\\barbarin.ddp\n" "win_version=95\n" "\n" "; BALDR FORCE EXE\n" @@ -953,7 +954,12 @@ static void cfg_create_ini() "singlecpu=false\n" "\n" "; Fallout Tactics: Brotherhood of Steel\n" - "[BOS]\n" + "[BOS/2]\n" + "checkfile=.\\binkw32.dll\n" + "hook_peekmessage=true\n" + "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[BOS_HR]\n" "hook_peekmessage=true\n" "\n" "; Falcon 4.0 (Microprose version)\n" From 63d5d7edd95a6693e52ac0c7f3c5ece762f6c3c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:41:50 +0100 Subject: [PATCH 1573/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 195d80d..41ed4e1 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Falcon 4.0 (Microprose version) - Fallout - Fallout 2 +- Fallout Tactics: Brotherhood of Steel - Final fantasy VII - Final fantasy VIII - Final Liberation: Warhammer Epic 40000 (GOG) From 27738b9baf85fcbd8e2292476ef4701515b0cd96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:00:46 +0100 Subject: [PATCH 1574/1724] add preset for FT Tools.exe --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 2b7998d..23474a2 100644 --- a/src/config.c +++ b/src/config.c @@ -962,6 +962,10 @@ static void cfg_create_ini() "[BOS_HR]\n" "hook_peekmessage=true\n" "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[FT Tools]\n" + "hook_peekmessage=true\n" + "\n" "; Falcon 4.0 (Microprose version)\n" "[falcon4]\n" "singlecpu=false\n" From ffb940b5614703887206dfdbad6050db2fdcc9db Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:28:43 +0100 Subject: [PATCH 1575/1724] fix warnings --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 + inc/ddpalette.h | 261 ------------------------------------- inc/palette.h | 265 ++++++++++++++++++++++++++++++++++++++ src/ddsurface.c | 1 + src/winapi_hooks.c | 1 + 6 files changed, 271 insertions(+), 261 deletions(-) create mode 100644 inc/palette.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 70bd817..85475c2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -89,6 +89,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index e1e9a15..f673285 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -293,6 +293,9 @@ Header Files + + Header Files + diff --git a/inc/ddpalette.h b/inc/ddpalette.h index e780b5a..cfd46ff 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -13,265 +13,4 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); -// Original palette copied from Windows ME -static PALETTEENTRY g_ddp_default_palette[] = -{ - { 0, 0, 0, 0 }, - { 128, 0, 0, 0 }, - { 0, 128, 0, 0 }, - { 128, 128, 0, 0 }, - { 0, 0, 128, 0 }, - { 128, 0, 128, 0 }, - { 0, 128, 128, 0 }, - { 192, 192, 192, 0 }, - { 192, 220, 192, 0 }, - { 166, 202, 240, 0 }, - { 95, 63, 63, 0 }, - { 127, 63, 63, 0 }, - { 159, 63, 63, 0 }, - { 191, 63, 63, 0 }, - { 223, 63, 63, 0 }, - { 255, 63, 63, 0 }, - { 63, 95, 63, 0 }, - { 95, 95, 63, 0 }, - { 127, 95, 63, 0 }, - { 159, 95, 63, 0 }, - { 191, 95, 63, 0 }, - { 223, 95, 63, 0 }, - { 255, 95, 63, 0 }, - { 63, 127, 63, 0 }, - { 95, 127, 63, 0 }, - { 127, 127, 63, 0 }, - { 159, 127, 63, 0 }, - { 191, 127, 63, 0 }, - { 223, 127, 63, 0 }, - { 255, 127, 63, 0 }, - { 63, 159, 63, 0 }, - { 95, 159, 63, 0 }, - { 127, 159, 63, 0 }, - { 159, 159, 63, 0 }, - { 191, 159, 63, 0 }, - { 223, 159, 63, 0 }, - { 255, 159, 63, 0 }, - { 63, 191, 63, 0 }, - { 95, 191, 63, 0 }, - { 127, 191, 63, 0 }, - { 159, 191, 63, 0 }, - { 191, 191, 63, 0 }, - { 223, 191, 63, 0 }, - { 255, 191, 63, 0 }, - { 63, 223, 63, 0 }, - { 95, 223, 63, 0 }, - { 127, 223, 63, 0 }, - { 159, 223, 63, 0 }, - { 191, 223, 63, 0 }, - { 223, 223, 63, 0 }, - { 255, 223, 63, 0 }, - { 63, 255, 63, 0 }, - { 95, 255, 63, 0 }, - { 127, 255, 63, 0 }, - { 159, 255, 63, 0 }, - { 191, 255, 63, 0 }, - { 223, 255, 63, 0 }, - { 255, 255, 63, 0 }, - { 63, 63, 95, 0 }, - { 95, 63, 95, 0 }, - { 127, 63, 95, 0 }, - { 159, 63, 95, 0 }, - { 191, 63, 95, 0 }, - { 223, 63, 95, 0 }, - { 255, 63, 95, 0 }, - { 63, 95, 95, 0 }, - { 95, 95, 95, 0 }, - { 127, 95, 95, 0 }, - { 159, 95, 95, 0 }, - { 191, 95, 95, 0 }, - { 223, 95, 95, 0 }, - { 255, 95, 95, 0 }, - { 63, 127, 95, 0 }, - { 95, 127, 95, 0 }, - { 127, 127, 95, 0 }, - { 159, 127, 95, 0 }, - { 191, 127, 95, 0 }, - { 223, 127, 95, 0 }, - { 255, 127, 95, 0 }, - { 63, 159, 95, 0 }, - { 95, 159, 95, 0 }, - { 127, 159, 95, 0 }, - { 159, 159, 95, 0 }, - { 191, 159, 95, 0 }, - { 223, 159, 95, 0 }, - { 255, 159, 95, 0 }, - { 63, 191, 95, 0 }, - { 95, 191, 95, 0 }, - { 127, 191, 95, 0 }, - { 159, 191, 95, 0 }, - { 191, 191, 95, 0 }, - { 223, 191, 95, 0 }, - { 255, 191, 95, 0 }, - { 63, 223, 95, 0 }, - { 95, 223, 95, 0 }, - { 127, 223, 95, 0 }, - { 159, 223, 95, 0 }, - { 191, 223, 95, 0 }, - { 223, 223, 95, 0 }, - { 255, 223, 95, 0 }, - { 63, 255, 95, 0 }, - { 95, 255, 95, 0 }, - { 127, 255, 95, 0 }, - { 159, 255, 95, 0 }, - { 191, 255, 95, 0 }, - { 223, 255, 95, 0 }, - { 255, 255, 95, 0 }, - { 63, 63, 127, 0 }, - { 95, 63, 127, 0 }, - { 127, 63, 127, 0 }, - { 159, 63, 127, 0 }, - { 191, 63, 127, 0 }, - { 223, 63, 127, 0 }, - { 255, 63, 127, 0 }, - { 63, 95, 127, 0 }, - { 95, 95, 127, 0 }, - { 127, 95, 127, 0 }, - { 159, 95, 127, 0 }, - { 191, 95, 127, 0 }, - { 223, 95, 127, 0 }, - { 255, 95, 127, 0 }, - { 63, 127, 127, 0 }, - { 95, 127, 127, 0 }, - { 127, 127, 127, 0 }, - { 159, 127, 127, 0 }, - { 191, 127, 127, 0 }, - { 223, 127, 127, 0 }, - { 255, 127, 127, 0 }, - { 63, 159, 127, 0 }, - { 95, 159, 127, 0 }, - { 127, 159, 127, 0 }, - { 159, 159, 127, 0 }, - { 191, 159, 127, 0 }, - { 223, 159, 127, 0 }, - { 255, 159, 127, 0 }, - { 63, 191, 127, 0 }, - { 95, 191, 127, 0 }, - { 127, 191, 127, 0 }, - { 159, 191, 127, 0 }, - { 191, 191, 127, 0 }, - { 223, 191, 127, 0 }, - { 255, 191, 127, 0 }, - { 63, 223, 127, 0 }, - { 95, 223, 127, 0 }, - { 127, 223, 127, 0 }, - { 159, 223, 127, 0 }, - { 191, 223, 127, 0 }, - { 223, 223, 127, 0 }, - { 255, 223, 127, 0 }, - { 63, 255, 127, 0 }, - { 95, 255, 127, 0 }, - { 127, 255, 127, 0 }, - { 159, 255, 127, 0 }, - { 191, 255, 127, 0 }, - { 223, 255, 127, 0 }, - { 255, 255, 127, 0 }, - { 63, 63, 159, 0 }, - { 95, 63, 159, 0 }, - { 127, 63, 159, 0 }, - { 159, 63, 159, 0 }, - { 191, 63, 159, 0 }, - { 223, 63, 159, 0 }, - { 255, 63, 159, 0 }, - { 63, 95, 159, 0 }, - { 95, 95, 159, 0 }, - { 127, 95, 159, 0 }, - { 159, 95, 159, 0 }, - { 191, 95, 159, 0 }, - { 223, 95, 159, 0 }, - { 255, 95, 159, 0 }, - { 63, 127, 159, 0 }, - { 95, 127, 159, 0 }, - { 127, 127, 159, 0 }, - { 159, 127, 159, 0 }, - { 191, 127, 159, 0 }, - { 223, 127, 159, 0 }, - { 255, 127, 159, 0 }, - { 63, 159, 159, 0 }, - { 95, 159, 159, 0 }, - { 127, 159, 159, 0 }, - { 159, 159, 159, 0 }, - { 191, 159, 159, 0 }, - { 223, 159, 159, 0 }, - { 255, 159, 159, 0 }, - { 63, 191, 159, 0 }, - { 95, 191, 159, 0 }, - { 127, 191, 159, 0 }, - { 159, 191, 159, 0 }, - { 191, 191, 159, 0 }, - { 223, 191, 159, 0 }, - { 255, 191, 159, 0 }, - { 63, 223, 159, 0 }, - { 95, 223, 159, 0 }, - { 127, 223, 159, 0 }, - { 159, 223, 159, 0 }, - { 191, 223, 159, 0 }, - { 223, 223, 159, 0 }, - { 255, 223, 159, 0 }, - { 63, 255, 159, 0 }, - { 95, 255, 159, 0 }, - { 127, 255, 159, 0 }, - { 159, 255, 159, 0 }, - { 191, 255, 159, 0 }, - { 223, 255, 159, 0 }, - { 255, 255, 159, 0 }, - { 63, 63, 191, 0 }, - { 95, 63, 191, 0 }, - { 127, 63, 191, 0 }, - { 159, 63, 191, 0 }, - { 191, 63, 191, 0 }, - { 223, 63, 191, 0 }, - { 255, 63, 191, 0 }, - { 63, 95, 191, 0 }, - { 95, 95, 191, 0 }, - { 127, 95, 191, 0 }, - { 159, 95, 191, 0 }, - { 191, 95, 191, 0 }, - { 223, 95, 191, 0 }, - { 255, 95, 191, 0 }, - { 63, 127, 191, 0 }, - { 95, 127, 191, 0 }, - { 127, 127, 191, 0 }, - { 159, 127, 191, 0 }, - { 191, 127, 191, 0 }, - { 223, 127, 191, 0 }, - { 255, 127, 191, 0 }, - { 63, 159, 191, 0 }, - { 95, 159, 191, 0 }, - { 127, 159, 191, 0 }, - { 159, 159, 191, 0 }, - { 191, 159, 191, 0 }, - { 223, 159, 191, 0 }, - { 255, 159, 191, 0 }, - { 63, 191, 191, 0 }, - { 95, 191, 191, 0 }, - { 127, 191, 191, 0 }, - { 159, 191, 191, 0 }, - { 191, 191, 191, 0 }, - { 223, 191, 191, 0 }, - { 255, 191, 191, 0 }, - { 63, 223, 191, 0 }, - { 95, 223, 191, 0 }, - { 127, 223, 191, 0 }, - { 159, 223, 191, 0 }, - { 191, 223, 191, 0 }, - { 223, 223, 191, 0 }, - { 255, 251, 240, 0 }, - { 58, 109, 165, 0 }, - { 128, 128, 128, 0 }, - { 255, 0, 0, 0 }, - { 0, 255, 0, 0 }, - { 255, 255, 0, 0 }, - { 0, 0, 255, 0 }, - { 255, 0, 255, 0 }, - { 0, 255, 255, 0 }, - { 255, 255, 255, 0 } -}; - #endif diff --git a/inc/palette.h b/inc/palette.h new file mode 100644 index 0000000..8e38ec4 --- /dev/null +++ b/inc/palette.h @@ -0,0 +1,265 @@ +#ifndef PALETTE_H +#define PALETTE_H + +// Original palette copied from Windows ME +static PALETTEENTRY g_ddp_default_palette[] = +{ + { 0, 0, 0, 0 }, + { 128, 0, 0, 0 }, + { 0, 128, 0, 0 }, + { 128, 128, 0, 0 }, + { 0, 0, 128, 0 }, + { 128, 0, 128, 0 }, + { 0, 128, 128, 0 }, + { 192, 192, 192, 0 }, + { 192, 220, 192, 0 }, + { 166, 202, 240, 0 }, + { 95, 63, 63, 0 }, + { 127, 63, 63, 0 }, + { 159, 63, 63, 0 }, + { 191, 63, 63, 0 }, + { 223, 63, 63, 0 }, + { 255, 63, 63, 0 }, + { 63, 95, 63, 0 }, + { 95, 95, 63, 0 }, + { 127, 95, 63, 0 }, + { 159, 95, 63, 0 }, + { 191, 95, 63, 0 }, + { 223, 95, 63, 0 }, + { 255, 95, 63, 0 }, + { 63, 127, 63, 0 }, + { 95, 127, 63, 0 }, + { 127, 127, 63, 0 }, + { 159, 127, 63, 0 }, + { 191, 127, 63, 0 }, + { 223, 127, 63, 0 }, + { 255, 127, 63, 0 }, + { 63, 159, 63, 0 }, + { 95, 159, 63, 0 }, + { 127, 159, 63, 0 }, + { 159, 159, 63, 0 }, + { 191, 159, 63, 0 }, + { 223, 159, 63, 0 }, + { 255, 159, 63, 0 }, + { 63, 191, 63, 0 }, + { 95, 191, 63, 0 }, + { 127, 191, 63, 0 }, + { 159, 191, 63, 0 }, + { 191, 191, 63, 0 }, + { 223, 191, 63, 0 }, + { 255, 191, 63, 0 }, + { 63, 223, 63, 0 }, + { 95, 223, 63, 0 }, + { 127, 223, 63, 0 }, + { 159, 223, 63, 0 }, + { 191, 223, 63, 0 }, + { 223, 223, 63, 0 }, + { 255, 223, 63, 0 }, + { 63, 255, 63, 0 }, + { 95, 255, 63, 0 }, + { 127, 255, 63, 0 }, + { 159, 255, 63, 0 }, + { 191, 255, 63, 0 }, + { 223, 255, 63, 0 }, + { 255, 255, 63, 0 }, + { 63, 63, 95, 0 }, + { 95, 63, 95, 0 }, + { 127, 63, 95, 0 }, + { 159, 63, 95, 0 }, + { 191, 63, 95, 0 }, + { 223, 63, 95, 0 }, + { 255, 63, 95, 0 }, + { 63, 95, 95, 0 }, + { 95, 95, 95, 0 }, + { 127, 95, 95, 0 }, + { 159, 95, 95, 0 }, + { 191, 95, 95, 0 }, + { 223, 95, 95, 0 }, + { 255, 95, 95, 0 }, + { 63, 127, 95, 0 }, + { 95, 127, 95, 0 }, + { 127, 127, 95, 0 }, + { 159, 127, 95, 0 }, + { 191, 127, 95, 0 }, + { 223, 127, 95, 0 }, + { 255, 127, 95, 0 }, + { 63, 159, 95, 0 }, + { 95, 159, 95, 0 }, + { 127, 159, 95, 0 }, + { 159, 159, 95, 0 }, + { 191, 159, 95, 0 }, + { 223, 159, 95, 0 }, + { 255, 159, 95, 0 }, + { 63, 191, 95, 0 }, + { 95, 191, 95, 0 }, + { 127, 191, 95, 0 }, + { 159, 191, 95, 0 }, + { 191, 191, 95, 0 }, + { 223, 191, 95, 0 }, + { 255, 191, 95, 0 }, + { 63, 223, 95, 0 }, + { 95, 223, 95, 0 }, + { 127, 223, 95, 0 }, + { 159, 223, 95, 0 }, + { 191, 223, 95, 0 }, + { 223, 223, 95, 0 }, + { 255, 223, 95, 0 }, + { 63, 255, 95, 0 }, + { 95, 255, 95, 0 }, + { 127, 255, 95, 0 }, + { 159, 255, 95, 0 }, + { 191, 255, 95, 0 }, + { 223, 255, 95, 0 }, + { 255, 255, 95, 0 }, + { 63, 63, 127, 0 }, + { 95, 63, 127, 0 }, + { 127, 63, 127, 0 }, + { 159, 63, 127, 0 }, + { 191, 63, 127, 0 }, + { 223, 63, 127, 0 }, + { 255, 63, 127, 0 }, + { 63, 95, 127, 0 }, + { 95, 95, 127, 0 }, + { 127, 95, 127, 0 }, + { 159, 95, 127, 0 }, + { 191, 95, 127, 0 }, + { 223, 95, 127, 0 }, + { 255, 95, 127, 0 }, + { 63, 127, 127, 0 }, + { 95, 127, 127, 0 }, + { 127, 127, 127, 0 }, + { 159, 127, 127, 0 }, + { 191, 127, 127, 0 }, + { 223, 127, 127, 0 }, + { 255, 127, 127, 0 }, + { 63, 159, 127, 0 }, + { 95, 159, 127, 0 }, + { 127, 159, 127, 0 }, + { 159, 159, 127, 0 }, + { 191, 159, 127, 0 }, + { 223, 159, 127, 0 }, + { 255, 159, 127, 0 }, + { 63, 191, 127, 0 }, + { 95, 191, 127, 0 }, + { 127, 191, 127, 0 }, + { 159, 191, 127, 0 }, + { 191, 191, 127, 0 }, + { 223, 191, 127, 0 }, + { 255, 191, 127, 0 }, + { 63, 223, 127, 0 }, + { 95, 223, 127, 0 }, + { 127, 223, 127, 0 }, + { 159, 223, 127, 0 }, + { 191, 223, 127, 0 }, + { 223, 223, 127, 0 }, + { 255, 223, 127, 0 }, + { 63, 255, 127, 0 }, + { 95, 255, 127, 0 }, + { 127, 255, 127, 0 }, + { 159, 255, 127, 0 }, + { 191, 255, 127, 0 }, + { 223, 255, 127, 0 }, + { 255, 255, 127, 0 }, + { 63, 63, 159, 0 }, + { 95, 63, 159, 0 }, + { 127, 63, 159, 0 }, + { 159, 63, 159, 0 }, + { 191, 63, 159, 0 }, + { 223, 63, 159, 0 }, + { 255, 63, 159, 0 }, + { 63, 95, 159, 0 }, + { 95, 95, 159, 0 }, + { 127, 95, 159, 0 }, + { 159, 95, 159, 0 }, + { 191, 95, 159, 0 }, + { 223, 95, 159, 0 }, + { 255, 95, 159, 0 }, + { 63, 127, 159, 0 }, + { 95, 127, 159, 0 }, + { 127, 127, 159, 0 }, + { 159, 127, 159, 0 }, + { 191, 127, 159, 0 }, + { 223, 127, 159, 0 }, + { 255, 127, 159, 0 }, + { 63, 159, 159, 0 }, + { 95, 159, 159, 0 }, + { 127, 159, 159, 0 }, + { 159, 159, 159, 0 }, + { 191, 159, 159, 0 }, + { 223, 159, 159, 0 }, + { 255, 159, 159, 0 }, + { 63, 191, 159, 0 }, + { 95, 191, 159, 0 }, + { 127, 191, 159, 0 }, + { 159, 191, 159, 0 }, + { 191, 191, 159, 0 }, + { 223, 191, 159, 0 }, + { 255, 191, 159, 0 }, + { 63, 223, 159, 0 }, + { 95, 223, 159, 0 }, + { 127, 223, 159, 0 }, + { 159, 223, 159, 0 }, + { 191, 223, 159, 0 }, + { 223, 223, 159, 0 }, + { 255, 223, 159, 0 }, + { 63, 255, 159, 0 }, + { 95, 255, 159, 0 }, + { 127, 255, 159, 0 }, + { 159, 255, 159, 0 }, + { 191, 255, 159, 0 }, + { 223, 255, 159, 0 }, + { 255, 255, 159, 0 }, + { 63, 63, 191, 0 }, + { 95, 63, 191, 0 }, + { 127, 63, 191, 0 }, + { 159, 63, 191, 0 }, + { 191, 63, 191, 0 }, + { 223, 63, 191, 0 }, + { 255, 63, 191, 0 }, + { 63, 95, 191, 0 }, + { 95, 95, 191, 0 }, + { 127, 95, 191, 0 }, + { 159, 95, 191, 0 }, + { 191, 95, 191, 0 }, + { 223, 95, 191, 0 }, + { 255, 95, 191, 0 }, + { 63, 127, 191, 0 }, + { 95, 127, 191, 0 }, + { 127, 127, 191, 0 }, + { 159, 127, 191, 0 }, + { 191, 127, 191, 0 }, + { 223, 127, 191, 0 }, + { 255, 127, 191, 0 }, + { 63, 159, 191, 0 }, + { 95, 159, 191, 0 }, + { 127, 159, 191, 0 }, + { 159, 159, 191, 0 }, + { 191, 159, 191, 0 }, + { 223, 159, 191, 0 }, + { 255, 159, 191, 0 }, + { 63, 191, 191, 0 }, + { 95, 191, 191, 0 }, + { 127, 191, 191, 0 }, + { 159, 191, 191, 0 }, + { 191, 191, 191, 0 }, + { 223, 191, 191, 0 }, + { 255, 191, 191, 0 }, + { 63, 223, 191, 0 }, + { 95, 223, 191, 0 }, + { 127, 223, 191, 0 }, + { 159, 223, 191, 0 }, + { 191, 223, 191, 0 }, + { 223, 223, 191, 0 }, + { 255, 251, 240, 0 }, + { 58, 109, 165, 0 }, + { 128, 128, 128, 0 }, + { 255, 0, 0, 0 }, + { 0, 255, 0, 0 }, + { 255, 255, 0, 0 }, + { 0, 0, 255, 0 }, + { 255, 0, 255, 0 }, + { 0, 255, 255, 0 }, + { 255, 255, 255, 0 } +}; + +#endif diff --git a/src/ddsurface.c b/src/ddsurface.c index 18ebb27..c13480a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -15,6 +15,7 @@ #include "utils.h" #include "versionhelpers.h" #include "ddpalette.h" +#include "palette.h" LONG g_dds_gdi_handles; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d982b2a..7dff04d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -21,6 +21,7 @@ #include "hook.h" #include "directinput.h" #include "ddpalette.h" +#include "palette.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) From dcec176e15cd0e5747febadd9b4033168b51c37e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:58:41 +0100 Subject: [PATCH 1576/1724] make sure we don't break older version of windows --- src/hook.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index a7a9f56..3b7745f 100644 --- a/src/hook.c +++ b/src/hook.c @@ -34,7 +34,6 @@ SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos; MOVEWINDOWPROC real_MoveWindow = MoveWindow; SENDMESSAGEAPROC real_SendMessageA = SendMessageA; SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA; -SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; GETWINDOWLONGAPROC real_GetWindowLongA = GetWindowLongA; ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; @@ -75,6 +74,12 @@ COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; +#else +SETWINDOWLONGWPROC real_SetWindowLongW; +#endif + HOOKLIST g_hook_hooklist[] = { { @@ -97,7 +102,6 @@ HOOKLIST g_hook_hooklist[] = { "MoveWindow", (PROC)fake_MoveWindow, (PROC*)&real_MoveWindow, 0 }, { "SendMessageA", (PROC)fake_SendMessageA, (PROC*)&real_SendMessageA, 0 }, { "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC*)&real_SetWindowLongA, 0 }, - { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, { "GetWindowLongA", (PROC)fake_GetWindowLongA, (PROC*)&real_GetWindowLongA, 0 }, { "EnableWindow", (PROC)fake_EnableWindow, (PROC*)&real_EnableWindow, 0 }, { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA, 0 }, @@ -116,6 +120,11 @@ HOOKLIST g_hook_hooklist[] = { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) + { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, +#endif + { "", NULL, NULL, 0 } } }, From b4cb93d32b63bbbf9c8024201809d2b685903d3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 22:29:01 +0100 Subject: [PATCH 1577/1724] re-enable windowed hack --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index aa183ea..f5df432 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1549,8 +1549,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); - //g_ddraw.windowed_hack = TRUE; - //dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + g_ddraw.windowed_hack = TRUE; + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } } From e44ade5d72bce9ddec868f32f14b0fb649245aba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 05:44:20 +0100 Subject: [PATCH 1578/1724] add preset for Swarog --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 23474a2..2fea835 100644 --- a/src/config.c +++ b/src/config.c @@ -1573,6 +1573,10 @@ static void cfg_create_ini() "[golf]\n" "fake_mode=640x480x16\n" "\n" + "; Swarog\n" + "[Swarog]\n" + "singlecpu=false\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" From 7025517c2fea1896588a2793fcbad4a1a52254b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 05:44:28 +0100 Subject: [PATCH 1579/1724] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 41ed4e1..5b9b24a 100644 --- a/README.md +++ b/README.md @@ -398,6 +398,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Stronghold HD - Sudden Strike 2 - Superbike 2000 +- Swarog - The Curse Of Monkey Island - The Dig - The Missing on Lost Island @@ -418,6 +419,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms - Toy Story +- Tone Rebellion - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown From d83e9e44018344de918a28b3c1ffe23b344ee742 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 08:45:51 +0100 Subject: [PATCH 1580/1724] hook AVIStreamGetFrameOpen --- Makefile | 2 +- cnc-ddraw.vcxproj | 10 +++++----- inc/IDirectDrawSurface.h | 5 +++++ inc/hook.h | 4 ++++ inc/winapi_hooks.h | 3 +++ src/ddsurface.c | 3 +-- src/hook.c | 8 ++++++++ src/winapi_hooks.c | 25 +++++++++++++++++++++++++ 8 files changed, 52 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 7c0dd2b..812f29e 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 85475c2..94df66d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -223,7 +223,7 @@ Windows - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -265,7 +265,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -307,7 +307,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -349,7 +349,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -391,7 +391,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index e20b506..d8eb99f 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -9,6 +9,11 @@ #include "IDirectDraw.h" +typedef struct DDBITMAPINFO{ + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[256]; +} DDBITMAPINFO; + struct IDirectDrawSurfaceImpl; struct IDirectDrawSurfaceImplVtbl; diff --git a/inc/hook.h b/inc/hook.h index f362562..219361c 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -2,6 +2,7 @@ #define HOOK_H #include +#include #define HOOK_SKIP_2 0x00000001l @@ -83,6 +84,8 @@ typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); +typedef PGETFRAME (WINAPI* AVISTREAMGETFRAMEOPENPROC)(PAVISTREAM, LPBITMAPINFOHEADER); + extern GETCURSORPOSPROC real_GetCursorPos; extern CLIPCURSORPROC real_ClipCursor; extern SHOWCURSORPROC real_ShowCursor; @@ -140,6 +143,7 @@ extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; +extern AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen; extern BOOL g_hook_active; extern HOOKLIST g_hook_hooklist[]; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index d9426fa..3d2cbae 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -2,6 +2,7 @@ #define WINAPI_HOOKS_H #include +#include BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint); @@ -93,4 +94,6 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted); + #endif diff --git a/src/ddsurface.c b/src/ddsurface.c index c13480a..ae4fcfd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1467,10 +1467,9 @@ HRESULT dd_CreateSurface( DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; - DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_config.guard_lines); - dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); + dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDBITMAPINFO)); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); diff --git a/src/hook.c b/src/hook.c index 3b7745f..7d90641 100644 --- a/src/hook.c +++ b/src/hook.c @@ -73,6 +73,7 @@ GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; +AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen = AVIStreamGetFrameOpen; #if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; @@ -142,6 +143,13 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + { + "Avifil32.dll", + { + { "AVIStreamGetFrameOpen", (PROC)fake_AVIStreamGetFrameOpen, (PROC*)&real_AVIStreamGetFrameOpen, 0 }, + { "", NULL, NULL, 0 } + } + }, { "dinput.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7dff04d..78cce33 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "debug.h" #include "config.h" #include "dd.h" @@ -2174,3 +2175,27 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( return old; //return real_SetUnhandledExceptionFilter(lpTopLevelExceptionFilter); } + +PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) +{ + if (g_ddraw.ref && g_ddraw.primary && (!lpbiWanted || (DWORD)lpbiWanted == 1)) + { + DDBITMAPINFO bmi; + memcpy(&bmi, g_ddraw.primary->bmi, sizeof(DDBITMAPINFO)); + + bmi.bmiHeader.biHeight = 0; + bmi.bmiHeader.biWidth = 0; + + if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) + { + memcpy(&bmi.bmiColors[0], g_ddraw.primary->palette->data_rgb, sizeof(bmi.bmiColors)); + } + + PGETFRAME result = real_AVIStreamGetFrameOpen(pavi, (LPBITMAPINFOHEADER)&bmi); + + if (result) + return result; + } + + return real_AVIStreamGetFrameOpen(pavi, lpbiWanted); +} From 9e50a4ba938405e361ed3e6a856bc48db9fc1501 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 08:48:20 +0100 Subject: [PATCH 1581/1724] use constant for AVIGETFRAMEF_BESTDISPLAYFMT --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78cce33..a1c9787 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2178,7 +2178,7 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) { - if (g_ddraw.ref && g_ddraw.primary && (!lpbiWanted || (DWORD)lpbiWanted == 1)) + if (g_ddraw.ref && g_ddraw.primary && (DWORD)lpbiWanted == AVIGETFRAMEF_BESTDISPLAYFMT) { DDBITMAPINFO bmi; memcpy(&bmi, g_ddraw.primary->bmi, sizeof(DDBITMAPINFO)); From d311248fc98b41cf0636304b61ae63519d359be9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:17:59 +0100 Subject: [PATCH 1582/1724] update Swarog preset --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index 2fea835..82ec402 100644 --- a/src/config.c +++ b/src/config.c @@ -1576,6 +1576,9 @@ static void cfg_create_ini() "; Swarog\n" "[Swarog]\n" "singlecpu=false\n" + "maxfps=60\n" + "maxgameticks=60\n" + "minfps=-1\n" "\n" "; Sim Copter\n" "[SimCopter]\n" From 3a8baa4f379e225c37ef1fd0bc595f5abd6b3598 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:34:20 +0100 Subject: [PATCH 1583/1724] add preset for Wheel Of Fortune --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 82ec402..9ffd51f 100644 --- a/src/config.c +++ b/src/config.c @@ -1817,6 +1817,10 @@ static void cfg_create_ini() "[WA]\n" "lock_mouse_top_left=true\n" "\n" + "; Wheel Of Fortune\n" + "[WHEEL]\n" + "singlecpu=false\n" + "\n" "; War Wind\n" "[WW]\n" "minfps=-1\n" From 29079da6834ca8a40272976df60b87c31da57b94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:34:42 +0100 Subject: [PATCH 1584/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5b9b24a..07c604d 100644 --- a/README.md +++ b/README.md @@ -442,6 +442,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Wizards and Warriors - Worms 2 - Worms Armageddon +- Wheel Of Fortune - Zeus: Master of Olympus - Zoombinis Island Odyssey - Zoombinis Logical Journey From 95c72d0b932bc4cf9dcb14d8a542a8f05e4e1ba9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 06:44:53 +0100 Subject: [PATCH 1585/1724] update supported games list --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 07c604d..002dac2 100644 --- a/README.md +++ b/README.md @@ -93,9 +93,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Batman: Toxic Chill - Birthright: The Gorgons Alliance - Blade & Sword -- Blitzkrieg anthology -- Blitzkrieg anthology: Burning Horizon -- Blitzkrieg anthology: Rolling Thunder - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt From ef3459d1fa2e29b2933e8dcb739fd52abe05b4da Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 07:15:12 +0100 Subject: [PATCH 1586/1724] add preset for Wall Street Trader 2000 --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 9ffd51f..a363cc8 100644 --- a/src/config.c +++ b/src/config.c @@ -1791,6 +1791,11 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; Wall Street Trader 2000 - NOT WORKING YET\n" + "[WSTrader]\n" + "nonexclusive=false\n" + "windowed=false\n" + "\n" "; WarCraft 2000: Nuclear Epidemic\n" "[war2000]\n" "resolutions=2\n" From e0aaba5e42e3bb167a503d7fede18592925ad1ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 08:01:29 +0100 Subject: [PATCH 1587/1724] add preset for NBA Full Court Press --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a363cc8..dee87c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1354,6 +1354,10 @@ static void cfg_create_ini() "limiter_type=1\n" "maxgameticks=120\n" "\n" + "; NBA Full Court Press\n" + "[NBA_FCP]\n" + "fake_mode=640x480x8\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From fb85d6ea03f6f6d180746af608776b481f53ec10 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 08:06:50 +0100 Subject: [PATCH 1588/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 002dac2..0858f9a 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Nancy Drew: The Secret of Shadow Ranch - Nancy Drew: Treasure in the Royal Tower - NBA Action '98 +- NBA Full Court Press - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From 76743284105ffefe7e5528f4fc0eac5be5c5bb52 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:21:23 +0100 Subject: [PATCH 1589/1724] add new limiter_type type (PeekMessage) --- inc/dd.h | 2 ++ src/config.c | 2 +- src/ddsurface.c | 10 ++++++++-- src/winapi_hooks.c | 7 +++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..fe175f7 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -51,6 +51,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 #define LIMIT_UNLOCK 3 +#define LIMIT_PEEKMESSAGE 4 #define CENTER_WINDOW_NEVER 0 #define CENTER_WINDOW_AUTO 1 @@ -126,6 +127,7 @@ typedef struct CNCDDRAW LONG palette_updated; LONG surface_updated; LONG clear_screen; + LONG screen_updated; float scale_w; float scale_h; diff --git a/src/config.c b/src/config.c index dee87c7..87e34a7 100644 --- a/src/config.c +++ b/src/config.c @@ -290,7 +290,7 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock\n" + "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock, 4 = PeekMessage\n" "limiter_type=0\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index ae4fcfd..454ca24 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -430,6 +430,7 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { @@ -438,7 +439,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); @@ -666,6 +667,7 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -824,6 +826,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa This->last_flip_tick = timeGetTime(); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); @@ -832,7 +835,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); @@ -1027,6 +1030,7 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -1212,6 +1216,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -1221,6 +1226,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (g_ddraw.ticks_limiter.tick_length > 0 && + g_config.limiter_type != LIMIT_PEEKMESSAGE && (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK)) { util_limit_game_ticks(); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a1c9787..fa45f89 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -780,6 +780,13 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_config.limiter_type == LIMIT_PEEKMESSAGE && + g_ddraw.ticks_limiter.tick_length > 0 && + InterlockedExchange(&g_ddraw.render.screen_updated, FALSE)) + { + util_limit_game_ticks(); + } + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); From eaded705722ab93551f2786ffcf717287569ae53 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:22:47 +0100 Subject: [PATCH 1590/1724] add preset for Rage of Mages --- README.md | 1 + src/config.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 0858f9a..075ca41 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time - Quest for Glory 5 +- Rage of Mages - Rage of Mages 2 - Railroad Tycoon II - Reader Rabbit 1st Grade diff --git a/src/config.c b/src/config.c index 87e34a7..a4de90d 100644 --- a/src/config.c +++ b/src/config.c @@ -1483,6 +1483,12 @@ static void cfg_create_ini() "[popTB]\n" "singlecpu=false\n" "\n" + "; Rage of Mages\n" + "[rom]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "singlecpu=true\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From 8a209659e4a60b0440fe4a7c2632dfcddd02af00 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:42:07 +0100 Subject: [PATCH 1591/1724] add preset for Squad Leader --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 075ca41..ccf9352 100644 --- a/README.md +++ b/README.md @@ -369,6 +369,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing +- Squad Leader - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard diff --git a/src/config.c b/src/config.c index a4de90d..22a6acc 100644 --- a/src/config.c +++ b/src/config.c @@ -1694,6 +1694,11 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Squad Leader\n" + "[SquadLeader]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; The Curse Of Monkey Island\n" "[COMI]\n" "singlecpu=false\n" From b986c04a0bcf9866583197c6786386efa6235ace Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 03:53:41 +0100 Subject: [PATCH 1592/1724] update Zork Nemesis preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 22a6acc..cdfe4c0 100644 --- a/src/config.c +++ b/src/config.c @@ -1852,6 +1852,8 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "singlecpu=false\n" + "maxgameticks=30\n" + "limiter_type=4\n" "\n" , fh); From 0f5cc8a46dacd78637d61c7a838ded48cb58bbb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 04:00:48 +0100 Subject: [PATCH 1593/1724] update preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index cdfe4c0..cc74048 100644 --- a/src/config.c +++ b/src/config.c @@ -1852,7 +1852,7 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "singlecpu=false\n" - "maxgameticks=30\n" + "maxgameticks=60\n" "limiter_type=4\n" "\n" From 27a1b4fc8d190f3dbac4c8c24e5691fefb030884 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 08:05:54 +0100 Subject: [PATCH 1594/1724] add preset for Karma Immortal Wrath --- README.md | 2 ++ src/config.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index ccf9352..d4c609d 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) +- Cydonia Mars - The First Manned Mission - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle @@ -231,6 +232,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 +- Karma Immortal Wrath - Killing Time - Kings Quest 8: Mask of Eternity - KKND Xtreme diff --git a/src/config.c b/src/config.c index cc74048..13ec82b 100644 --- a/src/config.c +++ b/src/config.c @@ -1193,6 +1193,11 @@ static void cfg_create_ini() "[jeoppc]\n" "singlecpu=false\n" "\n" + "; Karma Immortal Wrath\n" + "[karma]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "\n" "; Konung\n" "[konung]\n" "fixchilds=0\n" From 02a97cf9f7209a025deb827c6e9007cb8c04a3d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 21:20:58 +0100 Subject: [PATCH 1595/1724] add some more presets --- README.md | 4 ++++ src/config.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index d4c609d..c483e9b 100644 --- a/README.md +++ b/README.md @@ -242,6 +242,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Last Bronx - Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader @@ -429,6 +430,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Uprising: Join or Die - Vermeer - Virtua Fighter PC +- Virtua Cop +- Virtua Cop 2 +- Virtua Fighter 2 - Virtual Springfield - War Wind - War Wind II - Human Onslaught diff --git a/src/config.c b/src/config.c index 13ec82b..b04d40c 100644 --- a/src/config.c +++ b/src/config.c @@ -1224,6 +1224,10 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Last Bronx\n" + "[LB]\n" + "maxgameticks=30\n" + "\n" "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" "fixchilds=3\n" @@ -1811,6 +1815,10 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; Virtua Fighter 2\n" + "[VF2]\n" + "fake_mode=640x480x8\n" + "\n" "; Wall Street Trader 2000 - NOT WORKING YET\n" "[WSTrader]\n" "nonexclusive=false\n" From d6a80273fc0e58f1af88055d57ddd1dfb14b15f7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 22:49:05 +0100 Subject: [PATCH 1596/1724] use GetSystemPaletteEntries hook for any display DC --- src/winapi_hooks.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fa45f89..4cc8399 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1426,10 +1426,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - pPalEntries && - ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && GetObjectType(hdc) == OBJ_DC) { TRACE(" Display DC\n"); @@ -1441,10 +1438,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) { - pPalEntries[x].peRed = g_ddp_default_palette[i].peRed; - pPalEntries[x].peGreen = g_ddp_default_palette[i].peGreen; - pPalEntries[x].peBlue = g_ddp_default_palette[i].peBlue; - pPalEntries[x].peFlags = g_ddp_default_palette[i].peFlags; + pPalEntries[x] = g_ddp_default_palette[i]; } } From 348a90b54535ea13120f9c4489b3ed6d96addc89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 22:52:03 +0100 Subject: [PATCH 1597/1724] adjust logging --- src/winapi_hooks.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4cc8399..5ad4afe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1450,20 +1450,22 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { + TRACE_EXT( + "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", + __FUNCTION__, + hdc, + hPal, + bForceBkgd, + _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { + TRACE(" Display DC\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT( - "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", - __FUNCTION__, - hdc, - hPal, - bForceBkgd, - _ReturnAddress()); - g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; @@ -1475,14 +1477,16 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) UINT WINAPI fake_RealizePalette(HDC hdc) { + TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { + TRACE(" Display DC\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); - if (g_ddraw.primary->selected_pal_count != 256) { TRACE_EXT(" selected_pal_count = %u\n", g_ddraw.primary->selected_pal_count); From c5058f837188ab71f6c9c10474d25901dc7bc3b9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:00:05 +0100 Subject: [PATCH 1598/1724] use TRACE_EXT --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5ad4afe..fb27c02 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1462,7 +1462,7 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" Display DC\n"); + TRACE_EXT(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1483,7 +1483,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" Display DC\n"); + TRACE_EXT(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { From 07aab3b8d2e09147666b3c0060e09d239bdba59d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:41:09 +0100 Subject: [PATCH 1599/1724] add separate GetDeviceCaps hook for system dlls --- inc/hook.h | 1 + inc/winapi_hooks.h | 1 + src/hook.c | 7 +++++++ src/winapi_hooks.c | 15 +++++++++++++++ 4 files changed, 24 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 219361c..bbab6da 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -7,6 +7,7 @@ #define HOOK_SKIP_2 0x00000001l #define HOOK_LOCAL_ONLY 0x00000002l +#define HOOK_SYSTEM_ONLY 0x00000004l typedef struct HOOKLISTDATA { char function_name[32]; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3d2cbae..6c6cbb1 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -41,6 +41,7 @@ LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lP SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); +int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); diff --git a/src/hook.c b/src/hook.c index 7d90641..1e4bf14 100644 --- a/src/hook.c +++ b/src/hook.c @@ -174,6 +174,7 @@ HOOKLIST g_hook_hooklist[] = { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps_system, NULL, HOOK_SYSTEM_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, @@ -289,6 +290,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; + if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) + continue; + if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -407,6 +411,9 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; + if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) + continue; + #if defined(__GNUC__) if (util_is_bad_read_ptr((void*)import->Name)) continue; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fb27c02..50551a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -956,6 +956,21 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return real_GetDeviceCaps(hdc, index); } +int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index) +{ + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + { + if (index == RASTERCAPS) + { + return RC_PALETTE | real_GetDeviceCaps(hdc, index); + } + } + + return real_GetDeviceCaps(hdc, index); +} + BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, From 25bf452eb2699a60109190cfb00206b68580df80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:52:45 +0100 Subject: [PATCH 1600/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c483e9b..d709fa2 100644 --- a/README.md +++ b/README.md @@ -455,6 +455,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Zoombinis Mountain Rescue - Zuma Deluxe - Zork Nemesis +- Z & Z Expansion Kit - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From a74af22970b8917375a552f53faf048d75cac102 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 02:47:43 +0100 Subject: [PATCH 1601/1724] remove simgold preset --- README.md | 1 - src/config.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/README.md b/README.md index d709fa2..f27ca15 100644 --- a/README.md +++ b/README.md @@ -361,7 +361,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division -- Sid Meier's Simgolf - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) diff --git a/src/config.c b/src/config.c index b04d40c..d5801ea 100644 --- a/src/config.c +++ b/src/config.c @@ -1588,10 +1588,6 @@ static void cfg_create_ini() "fake_mode=352x240x32\n" "fix_not_responding=true\n" "\n" - "; Sid Meier's Simgolf\n" - "[golf]\n" - "fake_mode=640x480x16\n" - "\n" "; Swarog\n" "[Swarog]\n" "singlecpu=false\n" From 4d3af7358310492e9ed89cf6f47a1447cff2262a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 02:57:05 +0100 Subject: [PATCH 1602/1724] update Star Wars Rebellion preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index d5801ea..b9d0a24 100644 --- a/src/config.c +++ b/src/config.c @@ -1619,7 +1619,6 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" - "hook=2\n" "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" From 85a0cbcf449f976e38d9cabad27f56fc181781d0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 04:55:15 +0100 Subject: [PATCH 1603/1724] add partial support for 24bit surfaces --- src/blt.c | 2 +- src/dd.c | 2 +- src/ddsurface.c | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/blt.c b/src/blt.c index 0c212aa..166e3dd 100644 --- a/src/blt.c +++ b/src/blt.c @@ -518,7 +518,7 @@ void blt_colorfill( if (bpp == 8 || (bpp == 16 && (color & 0xFF) == ((color >> 8) & 0xFF)) || - (bpp == 32 && + ((bpp == 32 || bpp == 24) && (color & 0xFF) == ((color >> 8) & 0xFF) && (color & 0xFF) == ((color >> 16) & 0xFF) && (color & 0xFF) == ((color >> 24) & 0xFF))) diff --git a/src/dd.c b/src/dd.c index f5df432..e69063a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -559,7 +559,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwWidth = width; lpDDSurfaceDesc->dwHeight = height; - if (bpp == 32) + if (bpp == 32 || bpp == 24) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; diff --git a/src/ddsurface.c b/src/ddsurface.c index 454ca24..efdb660 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -227,6 +227,11 @@ HRESULT dds_Blt( if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) { + if (This->bpp == 24) + { + TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%u\n", This->bpp, lpDDBltFx->dwFillColor); + } + blt_colorfill( dst_buf, dst_x, @@ -250,7 +255,10 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - if (This->bpp != src_surface->bpp || (is_stretch_blt && This == src_surface)) + if (This->bpp != src_surface->bpp || + This->bpp == 24 || + src_surface->bpp == 24 || + (is_stretch_blt && This == src_surface)) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -266,7 +274,7 @@ HRESULT dds_Blt( (dwFlags & DDBLT_KEYSRCOVERRIDE) ? lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; - if (src_surface->bpp == 32) + if (src_surface->bpp == 32 || src_surface->bpp == 24) { color = color & 0xFFFFFF; } @@ -552,7 +560,9 @@ HRESULT dds_BltFast( if (src_surface && dst_w > 0 && dst_h > 0) { - if (This->bpp != src_surface->bpp) + if (This->bpp != src_surface->bpp || + This->bpp == 24 || + src_surface->bpp == 24) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -566,7 +576,7 @@ HRESULT dds_BltFast( { UINT color = src_surface->color_key.dwColorSpaceLowValue; - if (src_surface->bpp == 32) + if (src_surface->bpp == 32 || src_surface->bpp == 24) { color = color & 0xFFFFFF; } @@ -749,7 +759,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; } - else if (This->bpp == 32) + else if (This->bpp == 32 || This->bpp == 24) { lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; @@ -975,7 +985,7 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix ddpfPixelFormat->dwGBitMask = 0x07E0; ddpfPixelFormat->dwBBitMask = 0x001F; } - else if (This->bpp == 32) + else if (This->bpp == 32 || This->bpp == 24) { ddpfPixelFormat->dwRBitMask = 0xFF0000; ddpfPixelFormat->dwGBitMask = 0x00FF00; @@ -1306,7 +1316,9 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->bpp = 16; break; case 24: + This->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + break; case 32: This->bpp = 32; break; @@ -1419,7 +1431,9 @@ HRESULT dd_CreateSurface( dst_surface->bpp = 16; break; case 24: + dst_surface->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); + break; case 32: dst_surface->bpp = 32; break; @@ -1481,12 +1495,16 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; - dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; + dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 16 ? BI_BITFIELDS : BI_RGB; WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - dst_surface->bmi->bmiHeader.biClrUsed = - dst_surface->bmi->bmiHeader.biCompression == BI_BITFIELDS ? 3 : (1 << clr_bits); + dst_surface->bmi->bmiHeader.biClrUsed = + dst_surface->bpp == 8 ? 256 : + dst_surface->bpp == 16 ? 3 : + dst_surface->bpp == 24 ? 0 : + dst_surface->bpp == 32 ? 0 : + 0; dst_surface->bmi->bmiHeader.biSizeImage = ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; @@ -1513,12 +1531,6 @@ HRESULT dd_CreateSurface( ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0; ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; } - else if (dst_surface->bpp == 32) - { - ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xFF0000; - ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x00FF00; - ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; - } /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) || From 658089cbf27deb3eade6382143937244e981608f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 05:32:02 +0100 Subject: [PATCH 1604/1724] tweak logging --- src/ddsurface.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index efdb660..f1b75f5 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -229,7 +229,7 @@ HRESULT dds_Blt( { if (This->bpp == 24) { - TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%u\n", This->bpp, lpDDBltFx->dwFillColor); + TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%08X\n", This->bpp, lpDDBltFx->dwFillColor); } blt_colorfill( @@ -1317,7 +1317,6 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD break; case 24: This->bpp = 24; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); break; case 32: This->bpp = 32; @@ -1432,7 +1431,6 @@ HRESULT dd_CreateSurface( break; case 24: dst_surface->bpp = 24; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); break; case 32: dst_surface->bpp = 32; From 48f1200e4af5bc8b84f8994a875a0fe86106e356 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:25:12 +0100 Subject: [PATCH 1605/1724] update Gangsters preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index b9d0a24..91ea60f 100644 --- a/src/config.c +++ b/src/config.c @@ -1041,6 +1041,8 @@ static void cfg_create_ini() "[gangsters]\n" "adjmouse=true\n" "nonexclusive=true\n" + "fixchilds=0\n" + "fake_mode=640x480x8\n" "\n" "; Grand Theft Auto\n" "[Grand Theft Auto]\n" From 8ea2c1db69dd63b59259dc199d0763965ac42d54 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:32:48 +0100 Subject: [PATCH 1606/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f27ca15..4ac833c 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police +- Gangsters - Organized Crime - Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto From a1bee06eb8326dc49874ad2e656fecf3acd6e32e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:41:21 +0100 Subject: [PATCH 1607/1724] remove gangsters from the list, it still got too many issues --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4ac833c..f27ca15 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police -- Gangsters - Organized Crime - Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto From 873f4e6bb8313a88b429a8d608db04097c8bb970 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:06:39 +0100 Subject: [PATCH 1608/1724] add preset for Neo Sonic Universe --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index f27ca15..f2aedeb 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Need For Speed: High Stakes - New Robinson - NexusTk +- Neo Sonic Universe - Nightmare Creatures - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus diff --git a/src/config.c b/src/config.c index 91ea60f..e8441a2 100644 --- a/src/config.c +++ b/src/config.c @@ -1359,6 +1359,11 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" + "; Neo Sonic Universe\n" + "[nsu]\n" + "fixchilds=3\n" + "fake_mode=320x240x8\n" + "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" "checkfile=.\\Nancy.cid\n" From 1a3b6f1aab182e45e26dc780a9d325246e99d492 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:13:57 +0100 Subject: [PATCH 1609/1724] add preset for Neo Sonic Universe - battle mode --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index e8441a2..15defed 100644 --- a/src/config.c +++ b/src/config.c @@ -1364,6 +1364,11 @@ static void cfg_create_ini() "fixchilds=3\n" "fake_mode=320x240x8\n" "\n" + "; Neo Sonic Universe - battle mode\n" + "[nsu_battle]\n" + "fixchilds=3\n" + "fake_mode=320x240x8\n" + "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" "checkfile=.\\Nancy.cid\n" From ea51c3834f3db65e2ecdb790d1068b76c43133d7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:15:06 +0100 Subject: [PATCH 1610/1724] use 32bit fake mode --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 15defed..ca40c97 100644 --- a/src/config.c +++ b/src/config.c @@ -1362,12 +1362,12 @@ static void cfg_create_ini() "; Neo Sonic Universe\n" "[nsu]\n" "fixchilds=3\n" - "fake_mode=320x240x8\n" + "fake_mode=320x240x32\n" "\n" "; Neo Sonic Universe - battle mode\n" "[nsu_battle]\n" "fixchilds=3\n" - "fake_mode=320x240x8\n" + "fake_mode=320x240x32\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" From c315ec70cfefb519b955b3f6d66ad48dcf84ec25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 21:18:07 +0100 Subject: [PATCH 1611/1724] fix scroll speed issues in warhammer 40k games --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index ca40c97..f24a934 100644 --- a/src/config.c +++ b/src/config.c @@ -985,6 +985,7 @@ static void cfg_create_ini() "; Final Liberation: Warhammer Epic 40000\n" "[Epic40k]\n" "hook_peekmessage=true\n" + "maxgameticks=125\n" "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" @@ -1837,6 +1838,10 @@ static void cfg_create_ini() "guard_lines=600\n" "minfps=-2\n" "\n" + "; Warhammer 40000: Chaos Gate\n" + "[WH40K]\n" + "maxgameticks=250\n" + "\n" "; Weird War\n" "[WeirdWar]\n" "singlecpu=false\n" From daa283350991c23a2f280d071d5652ffaef9d76d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 03:02:23 +0100 Subject: [PATCH 1612/1724] improve logging --- src/IDirectDraw/IDirectDrawSurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 3eec3e6..7916405 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -340,7 +340,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwFlags, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; From cd60c29a9270a2b3c5dae1caefa984deeccd07dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 03:43:31 +0100 Subject: [PATCH 1613/1724] return fake value for HORZRES and VERTRES --- src/winapi_hooks.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 50551a3..bbb680b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -909,17 +909,21 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { DWORD bpp = 0; + DWORD width = 0; + DWORD height = 0; if (g_ddraw.ref && g_ddraw.bpp) { bpp = g_ddraw.bpp; + width = g_ddraw.width; + height = g_ddraw.height; } else if (g_config.fake_mode[0]) { char* e = &g_config.fake_mode[0]; - strtoul(e, &e, 0); - strtoul(e + 1, &e, 0); + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); bpp = strtoul(e + 1, &e, 0); } @@ -953,6 +957,19 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) } } + if (width && WindowFromDC(hdc) == GetDesktopWindow()) + { + if (index == HORZRES) + { + return width; + } + + if (index == VERTRES) + { + return height; + } + } + return real_GetDeviceCaps(hdc, index); } From 5a6f3430cd4a62393f86d7bcc229fb3d77d082be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 06:30:15 +0100 Subject: [PATCH 1614/1724] add preset for lode runner 2 --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index f24a934..47698e4 100644 --- a/src/config.c +++ b/src/config.c @@ -1227,6 +1227,11 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Lode Runner 2\n" + "[LR2]\n" + "no_dinput_hook=true\n" + "fake_mode=640x480x16\n" + "\n" "; Last Bronx\n" "[LB]\n" "maxgameticks=30\n" From 78b912b09c985532665f889a896f0dbaa65955f0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 07:48:15 +0100 Subject: [PATCH 1615/1724] hook SetParent --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index bbab6da..089f668 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -18,7 +18,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[37]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -63,6 +63,7 @@ typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); +typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -125,6 +126,7 @@ extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern DEFWINDOWPROCAPROC real_DefWindowProcA; +extern SETPARENTPROC real_SetParent; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6c6cbb1..cab3ab6 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -38,6 +38,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 1e4bf14..1e536fb 100644 --- a/src/hook.c +++ b/src/hook.c @@ -54,6 +54,7 @@ GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; +SETPARENTPROC real_SetParent = SetParent; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -117,6 +118,7 @@ HOOKLIST g_hook_hooklist[] = { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, + { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index bbb680b..0d2f981 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -886,6 +886,35 @@ LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lP return real_DefWindowProcA(hWnd, Msg, wParam, lParam); } +HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWndNewParent) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hWndChild, class_name, sizeof(class_name) - 1); + + if (strcmp(class_name, "VideoRenderer") == 0) + { + RECT rc_org; + fake_GetWindowRect(hWndChild, &rc_org); + + HWND result = real_SetParent(hWndChild, hWndNewParent); + + real_MoveWindow( + hWndChild, + rc_org.left, + rc_org.top, + (rc_org.right - rc_org.left), + (rc_org.bottom - rc_org.top), + FALSE); + + return result; + } + } + + return real_SetParent(hWndChild, hWndNewParent); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 429ce2a3dfcac203e801b708d2b5cc92ac46f50d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:21:22 +0100 Subject: [PATCH 1616/1724] always hide Cc2EditClassTh class windows --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index 91f41d9..d96920b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -908,6 +908,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE || + strcmp(class_name, "Cc2EditClassTh") == 0 || strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || From e6c5e1f9ba0368e3c04fab37c5a09a1389a0e1a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:43:03 +0100 Subject: [PATCH 1617/1724] update neo sonic preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index 47698e4..8fe2e41 100644 --- a/src/config.c +++ b/src/config.c @@ -1367,12 +1367,10 @@ static void cfg_create_ini() "\n" "; Neo Sonic Universe\n" "[nsu]\n" - "fixchilds=3\n" "fake_mode=320x240x32\n" "\n" "; Neo Sonic Universe - battle mode\n" "[nsu_battle]\n" - "fixchilds=3\n" "fake_mode=320x240x32\n" "\n" "; Nancy Drew (All games)\n" From 98ace77501b5d99c1b76c15a4a1af7076c98024c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:43:17 +0100 Subject: [PATCH 1618/1724] update supported games list --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f2aedeb..713e388 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill +- Bejeweled 2 Deluxe - Birthright: The Gorgons Alliance - Blade & Sword - Blood II - The Chosen @@ -254,6 +255,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Lode Runner 2 - Lost Vikings 2 - Links Extreme +- Mario Sorb 3 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math @@ -286,6 +288,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - NexusTk - Neo Sonic Universe - Nightmare Creatures +- Ninja Jonder Deluxe - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee @@ -317,6 +320,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time +- Platypus - Quest for Glory 5 - Rage of Mages - Rage of Mages 2 From 4590ad0872813aa9a806b2cdccbd6ccf0614d192 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 02:19:33 +0100 Subject: [PATCH 1619/1724] add preset for Dominion - Storm Over Gift 3 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 713e388..10ff9fa 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 +- Dominion - Storm Over Gift 3 - Economic War - Eggsucker - Emperor: Rise of the Middle Kingdom diff --git a/src/config.c b/src/config.c index 8fe2e41..76dd487 100644 --- a/src/config.c +++ b/src/config.c @@ -919,6 +919,10 @@ static void cfg_create_ini() "[dn]\n" "fake_mode=640x480x16\n" "\n" + "; Dominion - Storm Over Gift 3\n" + "[dominion]\n" + "flipclear=true\n" + "\n" "; Excalibur 2555AD\n" "[_FISH]\n" "singlecpu=false\n" From f80fcb1e07d118685b49d1cf907c5b85915ad12d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:08:36 +0100 Subject: [PATCH 1620/1724] add Direct3D EnumDevices testing code --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 + inc/IDirect3D.h | 15 +- inc/d3dcaps.h | 607 +++++++++++++++++++++++++++++++++++++ src/IDirect3D/IDirect3D.c | 12 +- src/IDirect3D/IDirect3D2.c | 12 +- src/IDirect3D/IDirect3D3.c | 12 +- src/IDirect3D/IDirect3D7.c | 12 +- 8 files changed, 666 insertions(+), 8 deletions(-) create mode 100644 inc/d3dcaps.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 94df66d..a4d025d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -77,6 +77,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index f673285..0f07cb0 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -296,6 +296,9 @@ Header Files + + Header Files + diff --git a/inc/IDirect3D.h b/inc/IDirect3D.h index dd03465..b545a5c 100644 --- a/inc/IDirect3D.h +++ b/inc/IDirect3D.h @@ -3,6 +3,7 @@ #define WIN32_LEAN_AND_MEAN #include +#include "d3dcaps.h" DEFINE_GUID(IID_IDirect3D, 0x3BBA0080, 0x2421, 0x11CF, 0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56); @@ -10,6 +11,12 @@ DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1, 0x662a, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, DEFINE_GUID(IID_IDirect3D3, 0xbb223240, 0xe72b, 0x11d0, 0xa9, 0xb4, 0x00, 0xaa, 0x00, 0xc0, 0x99, 0x3e); DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); +DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); + +typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK)(GUID FAR* lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); +typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); + + #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \ struct iface##Vtbl FAR* lpVtbl; \ ULONG ref; \ @@ -27,7 +34,7 @@ DECLARE_D3D_INTERFACE(IDirect3DImpl) ULONG(__stdcall * Release) (IDirect3DImpl*); HRESULT(__stdcall * Initialize)(IDirect3DImpl*, int); - HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int); @@ -44,7 +51,7 @@ DECLARE_D3D_INTERFACE(IDirect3D2Impl) ULONG(__stdcall * AddRef) (IDirect3D2Impl*); ULONG(__stdcall * Release) (IDirect3D2Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int); @@ -62,7 +69,7 @@ DECLARE_D3D_INTERFACE(IDirect3D3Impl) ULONG(__stdcall * AddRef) (IDirect3D3Impl*); ULONG(__stdcall * Release) (IDirect3D3Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int); @@ -83,7 +90,7 @@ DECLARE_D3D_INTERFACE(IDirect3D7Impl) ULONG(__stdcall * AddRef) (IDirect3D7Impl*); ULONG(__stdcall * Release) (IDirect3D7Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, LPD3DENUMDEVICESCALLBACK7, LPVOID); HRESULT(__stdcall * CreateDevice)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int); diff --git a/inc/d3dcaps.h b/inc/d3dcaps.h new file mode 100644 index 0000000..ddf7226 --- /dev/null +++ b/inc/d3dcaps.h @@ -0,0 +1,607 @@ +/*==========================================================================; + * + * Copyright (C) Microsoft Corporation. All Rights Reserved. + * + * File: d3dcaps.h + * Content: Direct3D capabilities include file + * + ***************************************************************************/ + + + +#ifndef _D3DCAPS_H +#define _D3DCAPS_H + +/* + * Pull in DirectDraw include file automatically: + */ +#include "ddraw.h" + +#ifndef DIRECT3D_VERSION +#define DIRECT3D_VERSION 0x0700 +#endif + +#if defined(_X86_) || defined(_IA64_) +#pragma pack(4) +#endif + +/* Description of capabilities of transform */ + +typedef struct _D3DTRANSFORMCAPS { + DWORD dwSize; + DWORD dwCaps; +} D3DTRANSFORMCAPS, *LPD3DTRANSFORMCAPS; + +#define D3DTRANSFORMCAPS_CLIP 0x00000001L /* Will clip whilst transforming */ + +/* Description of capabilities of lighting */ + +typedef struct _D3DLIGHTINGCAPS { + DWORD dwSize; + DWORD dwCaps; /* Lighting caps */ + DWORD dwLightingModel; /* Lighting model - RGB or mono */ + DWORD dwNumLights; /* Number of lights that can be handled */ +} D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS; + +#define D3DLIGHTINGMODEL_RGB 0x00000001L +#define D3DLIGHTINGMODEL_MONO 0x00000002L + +#define D3DLIGHTCAPS_POINT 0x00000001L /* Point lights supported */ +#define D3DLIGHTCAPS_SPOT 0x00000002L /* Spot lights supported */ +#define D3DLIGHTCAPS_DIRECTIONAL 0x00000004L /* Directional lights supported */ +#if(DIRECT3D_VERSION < 0x700) +#define D3DLIGHTCAPS_PARALLELPOINT 0x00000008L /* Parallel point lights supported */ +#endif +#if(DIRECT3D_VERSION < 0x500) +#define D3DLIGHTCAPS_GLSPOT 0x00000010L /* GL syle spot lights supported */ +#endif + +/* Description of capabilities for each primitive type */ + +typedef struct _D3DPrimCaps { + DWORD dwSize; + DWORD dwMiscCaps; /* Capability flags */ + DWORD dwRasterCaps; + DWORD dwZCmpCaps; + DWORD dwSrcBlendCaps; + DWORD dwDestBlendCaps; + DWORD dwAlphaCmpCaps; + DWORD dwShadeCaps; + DWORD dwTextureCaps; + DWORD dwTextureFilterCaps; + DWORD dwTextureBlendCaps; + DWORD dwTextureAddressCaps; + DWORD dwStippleWidth; /* maximum width and height of */ + DWORD dwStippleHeight; /* of supported stipple (up to 32x32) */ +} D3DPRIMCAPS, *LPD3DPRIMCAPS; + +/* D3DPRIMCAPS dwMiscCaps */ + +#define D3DPMISCCAPS_MASKPLANES 0x00000001L +#define D3DPMISCCAPS_MASKZ 0x00000002L +#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L +#define D3DPMISCCAPS_CONFORMANT 0x00000008L +#define D3DPMISCCAPS_CULLNONE 0x00000010L +#define D3DPMISCCAPS_CULLCW 0x00000020L +#define D3DPMISCCAPS_CULLCCW 0x00000040L + +/* D3DPRIMCAPS dwRasterCaps */ + +#define D3DPRASTERCAPS_DITHER 0x00000001L +#define D3DPRASTERCAPS_ROP2 0x00000002L +#define D3DPRASTERCAPS_XOR 0x00000004L +#define D3DPRASTERCAPS_PAT 0x00000008L +#define D3DPRASTERCAPS_ZTEST 0x00000010L +#define D3DPRASTERCAPS_SUBPIXEL 0x00000020L +#define D3DPRASTERCAPS_SUBPIXELX 0x00000040L +#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L +#define D3DPRASTERCAPS_FOGTABLE 0x00000100L +#define D3DPRASTERCAPS_STIPPLE 0x00000200L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT 0x00000400L +#define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT 0x00000800L +#define D3DPRASTERCAPS_ANTIALIASEDGES 0x00001000L +#define D3DPRASTERCAPS_MIPMAPLODBIAS 0x00002000L +#define D3DPRASTERCAPS_ZBIAS 0x00004000L +#define D3DPRASTERCAPS_ZBUFFERLESSHSR 0x00008000L +#define D3DPRASTERCAPS_FOGRANGE 0x00010000L +#define D3DPRASTERCAPS_ANISOTROPY 0x00020000L +#endif /* DIRECT3D_VERSION >= 0x0500 */ +#if(DIRECT3D_VERSION >= 0x0600) +#define D3DPRASTERCAPS_WBUFFER 0x00040000L +#define D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT 0x00080000L +#define D3DPRASTERCAPS_WFOG 0x00100000L +#define D3DPRASTERCAPS_ZFOG 0x00200000L +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +/* D3DPRIMCAPS dwZCmpCaps, dwAlphaCmpCaps */ + +#define D3DPCMPCAPS_NEVER 0x00000001L +#define D3DPCMPCAPS_LESS 0x00000002L +#define D3DPCMPCAPS_EQUAL 0x00000004L +#define D3DPCMPCAPS_LESSEQUAL 0x00000008L +#define D3DPCMPCAPS_GREATER 0x00000010L +#define D3DPCMPCAPS_NOTEQUAL 0x00000020L +#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L +#define D3DPCMPCAPS_ALWAYS 0x00000080L + +/* D3DPRIMCAPS dwSourceBlendCaps, dwDestBlendCaps */ + +#define D3DPBLENDCAPS_ZERO 0x00000001L +#define D3DPBLENDCAPS_ONE 0x00000002L +#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L +#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L +#define D3DPBLENDCAPS_SRCALPHA 0x00000010L +#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L +#define D3DPBLENDCAPS_DESTALPHA 0x00000040L +#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L +#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L +#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L +#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L +#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L +#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L + +/* D3DPRIMCAPS dwShadeCaps */ + +#define D3DPSHADECAPS_COLORFLATMONO 0x00000001L +#define D3DPSHADECAPS_COLORFLATRGB 0x00000002L +#define D3DPSHADECAPS_COLORGOURAUDMONO 0x00000004L +#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L +#define D3DPSHADECAPS_COLORPHONGMONO 0x00000010L +#define D3DPSHADECAPS_COLORPHONGRGB 0x00000020L + +#define D3DPSHADECAPS_SPECULARFLATMONO 0x00000040L +#define D3DPSHADECAPS_SPECULARFLATRGB 0x00000080L +#define D3DPSHADECAPS_SPECULARGOURAUDMONO 0x00000100L +#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L +#define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400L +#define D3DPSHADECAPS_SPECULARPHONGRGB 0x00000800L + +#define D3DPSHADECAPS_ALPHAFLATBLEND 0x00001000L +#define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000L +#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L +#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED 0x00008000L +#define D3DPSHADECAPS_ALPHAPHONGBLEND 0x00010000L +#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED 0x00020000L + +#define D3DPSHADECAPS_FOGFLAT 0x00040000L +#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L +#define D3DPSHADECAPS_FOGPHONG 0x00100000L + +/* D3DPRIMCAPS dwTextureCaps */ + +/* + * Perspective-correct texturing is supported + */ +#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L + +/* + * Power-of-2 texture dimensions are required + */ +#define D3DPTEXTURECAPS_POW2 0x00000002L + +/* + * Alpha in texture pixels is supported + */ +#define D3DPTEXTURECAPS_ALPHA 0x00000004L + +/* + * Color-keyed textures are supported + */ +#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008L + +/* + * obsolete, see D3DPTADDRESSCAPS_BORDER + */ +#define D3DPTEXTURECAPS_BORDER 0x00000010L + +/* + * Only square textures are supported + */ +#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L + +#if(DIRECT3D_VERSION >= 0x0600) +/* + * Texture indices are not scaled by the texture size prior + * to interpolation. + */ +#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L + +/* + * Device can draw alpha from texture palettes + */ +#define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L + +/* + * Device can use non-POW2 textures if: + * 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage + * 2) D3DRS_WRAP(N) is zero for this texture's coordinates + * 3) mip mapping is not enabled (use magnification filter only) + */ +#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L + +#endif /* DIRECT3D_VERSION >= 0x0600 */ +#if(DIRECT3D_VERSION >= 0x0700) + +// 0x00000200L unused + +/* + * Device can divide transformed texture coordinates by the + * COUNTth texture coordinate (can do D3DTTFF_PROJECTED) + */ +#define D3DPTEXTURECAPS_PROJECTED 0x00000400L + +/* + * Device can do cubemap textures + */ +#define D3DPTEXTURECAPS_CUBEMAP 0x00000800L + +#define D3DPTEXTURECAPS_COLORKEYBLEND 0x00001000L +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +/* D3DPRIMCAPS dwTextureFilterCaps */ + +#define D3DPTFILTERCAPS_NEAREST 0x00000001L +#define D3DPTFILTERCAPS_LINEAR 0x00000002L +#define D3DPTFILTERCAPS_MIPNEAREST 0x00000004L +#define D3DPTFILTERCAPS_MIPLINEAR 0x00000008L +#define D3DPTFILTERCAPS_LINEARMIPNEAREST 0x00000010L +#define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020L + +#if(DIRECT3D_VERSION >= 0x0600) +/* Device3 Min Filter */ +#define D3DPTFILTERCAPS_MINFPOINT 0x00000100L +#define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L +#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L + +/* Device3 Mip Filter */ +#define D3DPTFILTERCAPS_MIPFPOINT 0x00010000L +#define D3DPTFILTERCAPS_MIPFLINEAR 0x00020000L + +/* Device3 Mag Filter */ +#define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L +#define D3DPTFILTERCAPS_MAGFLINEAR 0x02000000L +#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L +#define D3DPTFILTERCAPS_MAGFAFLATCUBIC 0x08000000L +#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC 0x10000000L +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +/* D3DPRIMCAPS dwTextureBlendCaps */ + +#define D3DPTBLENDCAPS_DECAL 0x00000001L +#define D3DPTBLENDCAPS_MODULATE 0x00000002L +#define D3DPTBLENDCAPS_DECALALPHA 0x00000004L +#define D3DPTBLENDCAPS_MODULATEALPHA 0x00000008L +#define D3DPTBLENDCAPS_DECALMASK 0x00000010L +#define D3DPTBLENDCAPS_MODULATEMASK 0x00000020L +#define D3DPTBLENDCAPS_COPY 0x00000040L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPTBLENDCAPS_ADD 0x00000080L +#endif /* DIRECT3D_VERSION >= 0x0500 */ + +/* D3DPRIMCAPS dwTextureAddressCaps */ +#define D3DPTADDRESSCAPS_WRAP 0x00000001L +#define D3DPTADDRESSCAPS_MIRROR 0x00000002L +#define D3DPTADDRESSCAPS_CLAMP 0x00000004L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPTADDRESSCAPS_BORDER 0x00000008L +#define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L +#endif /* DIRECT3D_VERSION >= 0x0500 */ + +#if(DIRECT3D_VERSION >= 0x0600) + +/* D3DDEVICEDESC dwStencilCaps */ + +#define D3DSTENCILCAPS_KEEP 0x00000001L +#define D3DSTENCILCAPS_ZERO 0x00000002L +#define D3DSTENCILCAPS_REPLACE 0x00000004L +#define D3DSTENCILCAPS_INCRSAT 0x00000008L +#define D3DSTENCILCAPS_DECRSAT 0x00000010L +#define D3DSTENCILCAPS_INVERT 0x00000020L +#define D3DSTENCILCAPS_INCR 0x00000040L +#define D3DSTENCILCAPS_DECR 0x00000080L + +/* D3DDEVICEDESC dwTextureOpCaps */ + +#define D3DTEXOPCAPS_DISABLE 0x00000001L +#define D3DTEXOPCAPS_SELECTARG1 0x00000002L +#define D3DTEXOPCAPS_SELECTARG2 0x00000004L +#define D3DTEXOPCAPS_MODULATE 0x00000008L +#define D3DTEXOPCAPS_MODULATE2X 0x00000010L +#define D3DTEXOPCAPS_MODULATE4X 0x00000020L +#define D3DTEXOPCAPS_ADD 0x00000040L +#define D3DTEXOPCAPS_ADDSIGNED 0x00000080L +#define D3DTEXOPCAPS_ADDSIGNED2X 0x00000100L +#define D3DTEXOPCAPS_SUBTRACT 0x00000200L +#define D3DTEXOPCAPS_ADDSMOOTH 0x00000400L +#define D3DTEXOPCAPS_BLENDDIFFUSEALPHA 0x00000800L +#define D3DTEXOPCAPS_BLENDTEXTUREALPHA 0x00001000L +#define D3DTEXOPCAPS_BLENDFACTORALPHA 0x00002000L +#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM 0x00004000L +#define D3DTEXOPCAPS_BLENDCURRENTALPHA 0x00008000L +#define D3DTEXOPCAPS_PREMODULATE 0x00010000L +#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR 0x00020000L +#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA 0x00040000L +#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR 0x00080000L +#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA 0x00100000L +#define D3DTEXOPCAPS_BUMPENVMAP 0x00200000L +#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE 0x00400000L +#define D3DTEXOPCAPS_DOTPRODUCT3 0x00800000L + +/* D3DDEVICEDESC dwFVFCaps flags */ + +#define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */ +#define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */ + +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +typedef float D3DVALUE, *LPD3DVALUE; +typedef DWORD D3DCOLORMODEL; + +/* + * Description for a device. + * This is used to describe a device that is to be created or to query + * the current device. + */ +typedef struct _D3DDeviceDesc { + DWORD dwSize; /* Size of D3DDEVICEDESC structure */ + DWORD dwFlags; /* Indicates which fields have valid data */ + D3DCOLORMODEL dcmColorModel; /* Color model of device */ + DWORD dwDevCaps; /* Capabilities of device */ + D3DTRANSFORMCAPS dtcTransformCaps; /* Capabilities of transform */ + BOOL bClipping; /* Device can do 3D clipping */ + D3DLIGHTINGCAPS dlcLightingCaps; /* Capabilities of lighting */ + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ + DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ + DWORD dwMaxBufferSize; /* Maximum execute buffer size */ + DWORD dwMaxVertexCount; /* Maximum vertex count */ +//#if(DIRECT3D_VERSION >= 0x0500) + // *** New fields for DX5 *** // + + // Width and height caps are 0 for legacy HALs. + DWORD dwMinTextureWidth, dwMinTextureHeight; + DWORD dwMaxTextureWidth, dwMaxTextureHeight; + DWORD dwMinStippleWidth, dwMaxStippleWidth; + DWORD dwMinStippleHeight, dwMaxStippleHeight; +//#endif /* DIRECT3D_VERSION >= 0x0500 */ + +//#if(DIRECT3D_VERSION >= 0x0600) + // New fields for DX6 + DWORD dwMaxTextureRepeat; + DWORD dwMaxTextureAspectRatio; + DWORD dwMaxAnisotropy; + + // Guard band that the rasterizer can accommodate + // Screen-space vertices inside this space but outside the viewport + // will get clipped properly. + D3DVALUE dvGuardBandLeft; + D3DVALUE dvGuardBandTop; + D3DVALUE dvGuardBandRight; + D3DVALUE dvGuardBandBottom; + + D3DVALUE dvExtentsAdjust; + DWORD dwStencilCaps; + + DWORD dwFVFCaps; + DWORD dwTextureOpCaps; + WORD wMaxTextureBlendStages; + WORD wMaxSimultaneousTextures; +//#endif /* DIRECT3D_VERSION >= 0x0600 */ +} D3DDEVICEDESC, *LPD3DDEVICEDESC; + +#if(DIRECT3D_VERSION >= 0x0700) +typedef struct _D3DDeviceDesc7 { + DWORD dwDevCaps; /* Capabilities of device */ + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ + DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ + + DWORD dwMinTextureWidth, dwMinTextureHeight; + DWORD dwMaxTextureWidth, dwMaxTextureHeight; + + DWORD dwMaxTextureRepeat; + DWORD dwMaxTextureAspectRatio; + DWORD dwMaxAnisotropy; + + D3DVALUE dvGuardBandLeft; + D3DVALUE dvGuardBandTop; + D3DVALUE dvGuardBandRight; + D3DVALUE dvGuardBandBottom; + + D3DVALUE dvExtentsAdjust; + DWORD dwStencilCaps; + + DWORD dwFVFCaps; + DWORD dwTextureOpCaps; + WORD wMaxTextureBlendStages; + WORD wMaxSimultaneousTextures; + + DWORD dwMaxActiveLights; + D3DVALUE dvMaxVertexW; + GUID deviceGUID; + + WORD wMaxUserClipPlanes; + WORD wMaxVertexBlendMatrices; + + DWORD dwVertexProcessingCaps; + + DWORD dwReserved1; + DWORD dwReserved2; + DWORD dwReserved3; + DWORD dwReserved4; +} D3DDEVICEDESC7, *LPD3DDEVICEDESC7; +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#define D3DDEVICEDESCSIZE (sizeof(D3DDEVICEDESC)) +#define D3DDEVICEDESC7SIZE (sizeof(D3DDEVICEDESC7)) + +typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); + +#if(DIRECT3D_VERSION >= 0x0700) +typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +/* D3DDEVICEDESC dwFlags indicating valid fields */ + +#define D3DDD_COLORMODEL 0x00000001L /* dcmColorModel is valid */ +#define D3DDD_DEVCAPS 0x00000002L /* dwDevCaps is valid */ +#define D3DDD_TRANSFORMCAPS 0x00000004L /* dtcTransformCaps is valid */ +#define D3DDD_LIGHTINGCAPS 0x00000008L /* dlcLightingCaps is valid */ +#define D3DDD_BCLIPPING 0x00000010L /* bClipping is valid */ +#define D3DDD_LINECAPS 0x00000020L /* dpcLineCaps is valid */ +#define D3DDD_TRICAPS 0x00000040L /* dpcTriCaps is valid */ +#define D3DDD_DEVICERENDERBITDEPTH 0x00000080L /* dwDeviceRenderBitDepth is valid */ +#define D3DDD_DEVICEZBUFFERBITDEPTH 0x00000100L /* dwDeviceZBufferBitDepth is valid */ +#define D3DDD_MAXBUFFERSIZE 0x00000200L /* dwMaxBufferSize is valid */ +#define D3DDD_MAXVERTEXCOUNT 0x00000400L /* dwMaxVertexCount is valid */ + +/* D3DDEVICEDESC dwDevCaps flags */ + +#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001L /* Device accepts floating point */ + /* for post-transform vertex data */ +#define D3DDEVCAPS_SORTINCREASINGZ 0x00000002L /* Device needs data sorted for increasing Z */ +#define D3DDEVCAPS_SORTDECREASINGZ 0X00000004L /* Device needs data sorted for decreasing Z */ +#define D3DDEVCAPS_SORTEXACT 0x00000008L /* Device needs data sorted exactly */ + +#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */ +#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */ +#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */ +#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */ +#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */ +#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */ +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DDEVCAPS_DRAWPRIMTLVERTEX 0x00000400L /* Device can draw TLVERTEX primitives */ +#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x00000800L /* Device can render without waiting for flip to complete */ +#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */ +#endif /* DIRECT3D_VERSION >= 0x0500 */ +#if(DIRECT3D_VERSION >= 0x0600) +#define D3DDEVCAPS_DRAWPRIMITIVES2 0x00002000L /* Device can support DrawPrimitives2 */ +#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */ +#define D3DDEVCAPS_DRAWPRIMITIVES2EX 0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/ +#endif /* DIRECT3D_VERSION >= 0x0600 */ +#if(DIRECT3D_VERSION >= 0x0700) +#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */ +#define D3DDEVCAPS_CANBLTSYSTONONLOCAL 0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */ +#define D3DDEVCAPS_HWRASTERIZATION 0x00080000L /* Device has HW acceleration for rasterization */ + +/* + * These are the flags in the D3DDEVICEDESC7.dwVertexProcessingCaps field + */ + +/* device can do texgen */ +#define D3DVTXPCAPS_TEXGEN 0x00000001L +/* device can do IDirect3DDevice7 colormaterialsource ops */ +#define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L +/* device can do vertex fog */ +#define D3DVTXPCAPS_VERTEXFOG 0x00000004L +/* device can do directional lights */ +#define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L +/* device can do positional lights (includes point and spot) */ +#define D3DVTXPCAPS_POSITIONALLIGHTS 0x00000010L +/* device can do local viewer */ +#define D3DVTXPCAPS_LOCALVIEWER 0x00000020L + +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#define D3DFDS_COLORMODEL 0x00000001L /* Match color model */ +#define D3DFDS_GUID 0x00000002L /* Match guid */ +#define D3DFDS_HARDWARE 0x00000004L /* Match hardware/software */ +#define D3DFDS_TRIANGLES 0x00000008L /* Match in triCaps */ +#define D3DFDS_LINES 0x00000010L /* Match in lineCaps */ +#define D3DFDS_MISCCAPS 0x00000020L /* Match primCaps.dwMiscCaps */ +#define D3DFDS_RASTERCAPS 0x00000040L /* Match primCaps.dwRasterCaps */ +#define D3DFDS_ZCMPCAPS 0x00000080L /* Match primCaps.dwZCmpCaps */ +#define D3DFDS_ALPHACMPCAPS 0x00000100L /* Match primCaps.dwAlphaCmpCaps */ +#define D3DFDS_SRCBLENDCAPS 0x00000200L /* Match primCaps.dwSourceBlendCaps */ +#define D3DFDS_DSTBLENDCAPS 0x00000400L /* Match primCaps.dwDestBlendCaps */ +#define D3DFDS_SHADECAPS 0x00000800L /* Match primCaps.dwShadeCaps */ +#define D3DFDS_TEXTURECAPS 0x00001000L /* Match primCaps.dwTextureCaps */ +#define D3DFDS_TEXTUREFILTERCAPS 0x00002000L /* Match primCaps.dwTextureFilterCaps */ +#define D3DFDS_TEXTUREBLENDCAPS 0x00004000L /* Match primCaps.dwTextureBlendCaps */ +#define D3DFDS_TEXTUREADDRESSCAPS 0x00008000L /* Match primCaps.dwTextureBlendCaps */ + +/* + * FindDevice arguments + */ +typedef struct _D3DFINDDEVICESEARCH { + DWORD dwSize; + DWORD dwFlags; + BOOL bHardware; + D3DCOLORMODEL dcmColorModel; + GUID guid; + DWORD dwCaps; + D3DPRIMCAPS dpcPrimCaps; +} D3DFINDDEVICESEARCH, *LPD3DFINDDEVICESEARCH; + +typedef struct _D3DFINDDEVICERESULT { + DWORD dwSize; + GUID guid; /* guid which matched */ + D3DDEVICEDESC ddHwDesc; /* hardware D3DDEVICEDESC */ + D3DDEVICEDESC ddSwDesc; /* software D3DDEVICEDESC */ +} D3DFINDDEVICERESULT, *LPD3DFINDDEVICERESULT; + +/* + * Description of execute buffer. + */ +typedef struct _D3DExecuteBufferDesc { + DWORD dwSize; /* size of this structure */ + DWORD dwFlags; /* flags indicating which fields are valid */ + DWORD dwCaps; /* capabilities of execute buffer */ + DWORD dwBufferSize; /* size of execute buffer data */ + LPVOID lpData; /* pointer to actual data */ +} D3DEXECUTEBUFFERDESC, *LPD3DEXECUTEBUFFERDESC; + +/* D3DEXECUTEBUFFER dwFlags indicating valid fields */ + +#define D3DDEB_BUFSIZE 0x00000001l /* buffer size valid */ +#define D3DDEB_CAPS 0x00000002l /* caps valid */ +#define D3DDEB_LPDATA 0x00000004l /* lpData valid */ + +/* D3DEXECUTEBUFFER dwCaps */ + +#define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l /* buffer in system memory */ +#define D3DDEBCAPS_VIDEOMEMORY 0x00000002l /* buffer in device memory */ +#define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY) + +#if(DIRECT3D_VERSION < 0x0800) + +#if(DIRECT3D_VERSION >= 0x0700) +typedef struct _D3DDEVINFO_TEXTUREMANAGER { + BOOL bThrashing; /* indicates if thrashing */ + DWORD dwApproxBytesDownloaded; /* Approximate number of bytes downloaded by texture manager */ + DWORD dwNumEvicts; /* number of textures evicted */ + DWORD dwNumVidCreates; /* number of textures created in video memory */ + DWORD dwNumTexturesUsed; /* number of textures used */ + DWORD dwNumUsedTexInVid; /* number of used textures present in video memory */ + DWORD dwWorkingSet; /* number of textures in video memory */ + DWORD dwWorkingSetBytes; /* number of bytes in video memory */ + DWORD dwTotalManaged; /* total number of managed textures */ + DWORD dwTotalBytes; /* total number of bytes of managed textures */ + DWORD dwLastPri; /* priority of last texture evicted */ +} D3DDEVINFO_TEXTUREMANAGER, *LPD3DDEVINFO_TEXTUREMANAGER; + +typedef struct _D3DDEVINFO_TEXTURING { + DWORD dwNumLoads; /* counts Load() API calls */ + DWORD dwApproxBytesLoaded; /* Approximate number bytes loaded via Load() */ + DWORD dwNumPreLoads; /* counts PreLoad() API calls */ + DWORD dwNumSet; /* counts SetTexture() API calls */ + DWORD dwNumCreates; /* counts texture creates */ + DWORD dwNumDestroys; /* counts texture destroys */ + DWORD dwNumSetPriorities; /* counts SetPriority() API calls */ + DWORD dwNumSetLODs; /* counts SetLOD() API calls */ + DWORD dwNumLocks; /* counts number of texture locks */ + DWORD dwNumGetDCs; /* counts number of GetDCs to textures */ +} D3DDEVINFO_TEXTURING, *LPD3DDEVINFO_TEXTURING; +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#endif //(DIRECT3D_VERSION < 0x0800) + +#pragma pack() + + +#endif /* _D3DCAPS_H_ */ + + diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 8c7c1c5..02ba607 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -56,10 +56,20 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) return ret; } -HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) +HRESULT __stdcall IDirect3D__EnumDevices( + IDirect3DImpl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 2a83d47..9e20a93 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) return ret; } -HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) +HRESULT __stdcall IDirect3D2__EnumDevices( + IDirect3D2Impl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index edc776b..0820630 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) return ret; } -HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) +HRESULT __stdcall IDirect3D3__EnumDevices( + IDirect3D3Impl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index c058874..6652e0f 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) return ret; } -HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) +HRESULT __stdcall IDirect3D7__EnumDevices( + IDirect3D7Impl* This, + LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC7 desc = { 0 }; + //lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 94b66b521a8f5b8adee918e09ffb15518cedf38f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:15:24 +0100 Subject: [PATCH 1621/1724] remove duplicate typdefs --- inc/IDirect3D.h | 4 ---- inc/d3dcaps.h | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/inc/IDirect3D.h b/inc/IDirect3D.h index b545a5c..aed4b3d 100644 --- a/inc/IDirect3D.h +++ b/inc/IDirect3D.h @@ -13,9 +13,6 @@ DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0x DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK)(GUID FAR* lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); -typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); - #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \ struct iface##Vtbl FAR* lpVtbl; \ @@ -24,7 +21,6 @@ typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, typedef struct iface##Vtbl iface##Vtbl; \ struct iface##Vtbl - /* IID_IDirect3D */ DECLARE_D3D_INTERFACE(IDirect3DImpl) diff --git a/inc/d3dcaps.h b/inc/d3dcaps.h index ddf7226..4f86f61 100644 --- a/inc/d3dcaps.h +++ b/inc/d3dcaps.h @@ -440,9 +440,9 @@ typedef struct _D3DDeviceDesc7 { typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); -#if(DIRECT3D_VERSION >= 0x0700) +//#if(DIRECT3D_VERSION >= 0x0700) typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); -#endif /* DIRECT3D_VERSION >= 0x0700 */ +//#endif /* DIRECT3D_VERSION >= 0x0700 */ /* D3DDEVICEDESC dwFlags indicating valid fields */ From 2bec555fe8540f836fcd1efbac1cdb68bd0b69f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:29:22 +0100 Subject: [PATCH 1622/1724] remove direct3d_passthrough setting --- inc/config.h | 1 - src/IDirect3D/IDirect3D.c | 2 +- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/config.c | 6 ------ 5 files changed, 3 insertions(+), 10 deletions(-) diff --git a/inc/config.h b/inc/config.h index 4e9731d..d1600d5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -72,7 +72,6 @@ typedef struct CNCDDRAWCONFIG BOOL flipclear; BOOL rgb555; BOOL no_dinput_hook; - BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; BOOL lock_mouse_top_left; diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 02ba607..e4b0ee5 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -67,7 +67,7 @@ HRESULT __stdcall IDirect3D__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 9e20a93..3a9d493 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -59,7 +59,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 0820630..6302bf6 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -59,7 +59,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/config.c b/src/config.c index 76dd487..48a967e 100644 --- a/src/config.c +++ b/src/config.c @@ -85,7 +85,6 @@ void cfg_load() GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); @@ -329,7 +328,6 @@ static void cfg_create_ini() "flipclear=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" "lock_mouse_top_left=false\n" @@ -1192,10 +1190,6 @@ static void cfg_create_ini() "sirtech_hack=true\n" "fix_alt_key_stuck=true\n" "\n" - "; Jedi Knight Dark Forces 2\n" - "[JK]\n" - "direct3d_passthrough=true\n" - "\n" "; Jeopardy! - NOT WORKING YET\n" "[jeoppc]\n" "singlecpu=false\n" From fceb26de0eddc893279c4e9fd9a9865ef1257165 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:33:52 +0100 Subject: [PATCH 1623/1724] fix for last commit --- src/IDirectDraw/IDirectDraw.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 443a592..9384714 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -56,7 +56,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D, riid)) { IDirect3DImpl* d3d = (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl)); @@ -70,7 +70,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D2, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D2, riid)) { IDirect3D2Impl* d3d = (IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl)); @@ -84,7 +84,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D3, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D3, riid)) { IDirect3D3Impl* d3d = (IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl)); @@ -98,7 +98,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D7, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D7, riid)) { IDirect3D7Impl* d3d = (IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl)); From 35831124677b203e43dbfdd210861c39e2486935 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 05:47:39 +0100 Subject: [PATCH 1624/1724] update supported games list --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10ff9fa..91b0a59 100644 --- a/README.md +++ b/README.md @@ -384,7 +384,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - SPY Fox: Operation Ozone - Star Trek Away Team - Star Trek Generations -- Star Wars - Pit Droids +- Star Wars: Pit Droids - Star Wars Anakin's Speedway - Star Wars Early Learning Activity Center - Star Wars Episode I: The Gungan Frontier @@ -393,6 +393,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Star Wars Yoda's Challenge - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns +- Star Wars: Droid Works - StarCraft - StarCraft: Broodwars - StarFlyers Alien Space Chase From 1fc0062de161bbcb4b3eebf985da9a775dda777d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 06:06:55 +0100 Subject: [PATCH 1625/1724] update Return to Krondor preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 48a967e..bab83d7 100644 --- a/src/config.c +++ b/src/config.c @@ -1557,6 +1557,7 @@ static void cfg_create_ini() "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" + "maxgameticks=30\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From 6855e39464b7225f49a33034c3ba5f19da8e6d59 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 19:45:35 +0100 Subject: [PATCH 1626/1724] update Return to Krondor preset --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index bab83d7..8db872a 100644 --- a/src/config.c +++ b/src/config.c @@ -1557,7 +1557,8 @@ static void cfg_create_ini() "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" - "maxgameticks=30\n" + "maxgameticks=59\n" + "anti_aliased_fonts_min_size=99\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From 3e02398e995852f1878a6de77d67fe4eb30929a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 01:34:52 +0100 Subject: [PATCH 1627/1724] add missing checks --- src/ddsurface.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index f1b75f5..be1af88 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -77,13 +77,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - //dbg_print_rect("lpSrcRect", lpSrcRect); + dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - //dbg_print_rect("lpDestRect", lpDestRect); + dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } @@ -268,7 +268,7 @@ HRESULT dds_Blt( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) + if (((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) { UINT color = (dwFlags & DDBLT_KEYSRCOVERRIDE) ? @@ -326,7 +326,7 @@ HRESULT dds_Blt( */ } else if ( - (dwFlags & DDBLT_KEYSRC) || + ((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE) || mirror_left_right || mirror_up_down) @@ -572,7 +572,7 @@ HRESULT dds_BltFast( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if (dwFlags & DDBLTFAST_SRCCOLORKEY) + if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) { UINT color = src_surface->color_key.dwColorSpaceLowValue; @@ -625,7 +625,7 @@ HRESULT dds_BltFast( SRCCOPY); */ } - else if (dwFlags & DDBLTFAST_SRCCOLORKEY) + else if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) { blt_colorkey( dst_buf, From 6e0ddb8474452514c7de74f6ee7ec8769b0e2ad4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 01:35:37 +0100 Subject: [PATCH 1628/1724] disable debug code --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index be1af88..ddb89f1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -77,13 +77,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - dbg_print_rect("lpSrcRect", lpSrcRect); + //dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - dbg_print_rect("lpDestRect", lpDestRect); + //dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From f6274bc16c410ee0ee06da8373de1ad1a67b3888 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:00:51 +0100 Subject: [PATCH 1629/1724] add preset for metal knight --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 8db872a..dbf37cc 100644 --- a/src/config.c +++ b/src/config.c @@ -1358,6 +1358,11 @@ static void cfg_create_ini() "[Moorhuhn2]\n" "fix_alt_key_stuck=true\n" "\n" + "; Metal Knight\n" + "[mk]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" From 75283cef2c9492de166a68b5130716399abfa411 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:03:43 +0100 Subject: [PATCH 1630/1724] update and sort presets --- README.md | 69 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 91b0a59..f1ace48 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Age of Wonders 2 - Age of Wonders: Shadow Magic - Agharta the Hollow Earth +- Airline 69: Return to Casablanca - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) @@ -69,20 +70,19 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Army Men 2 - Army Men Air Tactics +- Army Men: Air Tactics +- Army Men: Toys in Space +- Army Men: World War / Army Men: Operation Meltdown - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue -- Army Men: World War / Army Men: Operation Meltdown -- Army Men: Air Tactics -- Army Men: Toys in Space -- Army Men 2 - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Airline 69: Return to Casablanca - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 @@ -137,9 +137,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 +- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest -- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cydonia Mars - The First Manned Mission - Dark Earth - Dark Reign: The Future of War @@ -150,24 +150,24 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Deadly Tide - Delta Force - Desperados: Wanted Dead or Alive -- Dreams to Realty -- Die by the Sword - Diablo - Diablo 2 - Diablo 2: Lord of Destruction - Diablo: Hellfire +- Die by the Sword - Disciples - Disciples 2 - Rise of the Elves - Discoworld Noir - Divine Divinity +- Dominion - Storm Over Gift 3 - Doom 95 - Dragon Throne: Battle of Red Cliffs +- Dreams to Realty - DuelSavior - DuelSavior: Justice - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 -- Dominion - Storm Over Gift 3 - Economic War - Eggsucker - Emperor: Rise of the Middle Kingdom @@ -198,14 +198,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Future Cop L.A.P.D - G-Police - Geneforge +- Gilbert Goodmate And The Mushroom Of Phungoria - Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 +- Gromada Revenge - Gruntz -- Gilbert Goodmate And The Mushroom Of Phungoria -- Handkerchief - Hamtaro: Wake Up Snoozer! +- Handkerchief - Hard Truck: Road to Victory - Heart of Darkness - Hearts of Iron 2 @@ -224,9 +225,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Icewind Dale - Icewind Dale 2 - Ignition +- Imperialism 2: The Age of Exploration - Indiana Jones and the Fate of Atlantis - Indiana Jones and the Last Crusade -- Imperialism 2: The Age of Exploration - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus @@ -244,9 +245,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Kohan: Immortal Sovereigns - Konung - Konung 2 -- Last Bronx - Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) +- Last Bronx +- Links Extreme - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures @@ -255,17 +257,17 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Locomotion - Lode Runner 2 - Lost Vikings 2 -- Links Extreme -- Mario Sorb 3 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math - Mageslayer - Majesty Gold - Majesty Gold HD +- Mario Sorb 3 - Mech Warrior 3 - Megaman X4 - Metal Gear Solid +- Metal Knight - Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 @@ -285,14 +287,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - NBA Full Court Press - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes +- Neo Sonic Universe - New Robinson - NexusTk -- Neo Sonic Universe - Nightmare Creatures - Ninja Jonder Deluxe - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee +- Original War - Outlaws - Outlive - Outwars (software mode) @@ -310,6 +313,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) +- Platypus - Populous: The Beginning - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA @@ -321,7 +325,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time -- Platypus - Quest for Glory 5 - Rage of Mages - Rage of Mages 2 @@ -341,15 +344,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D -- Rent-A-Hero -- Return to Krondor - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) - Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and the UFO (Reksio i Ufo) - Reksio and the Wizards (Reksio i Czarodzieje) +- Rent-A-Hero - Resurrection - The Return of the Black Dragon (software mode) +- Return to Krondor - Rising Lands (patched) - Road Rash - Robin Hood - The Legend of Sherwood @@ -367,33 +370,33 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division +- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) -- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sonic 3D Blast - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing -- Squad Leader - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Squad Leader - Star Trek Away Team - Star Trek Generations -- Star Wars: Pit Droids - Star Wars Anakin's Speedway - Star Wars Early Learning Activity Center - Star Wars Episode I: The Gungan Frontier - Star Wars Jedi Knight: Dark Forces II - Star Wars Rebellion - Star Wars Yoda's Challenge +- Star Wars: Droid Works - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns -- Star Wars: Droid Works +- Star Wars: Pit Droids - StarCraft - StarCraft: Broodwars - StarFlyers Alien Space Chase @@ -410,35 +413,37 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Swarog - The Curse Of Monkey Island - The Dig +- The Last Express - The Missing on Lost Island +- The Neverhood +- The Next Worlds - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone -- The X-Files DVD -- The Last Express -- The Neverhood - The Rocky Interactive Horror Show -- The Next Worlds - The Sex Files +- The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness +- Thunder Brigade - TianLong BaBu - Tone Rebellion +- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms - Toy Story -- Tone Rebellion +- Tridonis - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown - Uprising 2: Lead and Destroy - Uprising: Join or Die - Vermeer -- Virtua Fighter PC - Virtua Cop - Virtua Cop 2 - Virtua Fighter 2 +- Virtua Fighter PC - Virtual Springfield - War Wind - War Wind II - Human Onslaught @@ -449,19 +454,19 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Warlords Battlecry 2 - Warlords Battlecry 3 - Weird War +- Wheel Of Fortune - Wing Commander - The Kilrathi Saga - Wizardry 8 - Wizards and Warriors - Worms 2 - Worms Armageddon -- Wheel Of Fortune +- Z & Z Expansion Kit - Zeus: Master of Olympus - Zoombinis Island Odyssey - Zoombinis Logical Journey - Zoombinis Mountain Rescue -- Zuma Deluxe - Zork Nemesis -- Z & Z Expansion Kit +- Zuma Deluxe - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From 90fadd36dbbb6790a3855b4ec7d3cbed55ab64cb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:06:40 +0100 Subject: [PATCH 1631/1724] remove duplicate entry --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f1ace48..667fbc5 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Thunder Brigade - TianLong BaBu - Tone Rebellion -- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From 93319d4c836dcd5f90bedb40184672d00bca21dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:24:05 +0100 Subject: [PATCH 1632/1724] add support for limiting game speed of GDI games --- src/winapi_hooks.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 0d2f981..7637d49 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1032,6 +1032,11 @@ BOOL WINAPI fake_StretchBlt( { HWND hwnd = WindowFromDC(hdcDest); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1140,6 +1145,11 @@ BOOL WINAPI fake_BitBlt( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1236,6 +1246,11 @@ int WINAPI fake_SetDIBitsToDevice( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1326,6 +1341,11 @@ int WINAPI fake_StretchDIBits( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) From 9ac0054f1ab1c1e5514aac5be710a5f7e8b0b058 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:37:54 +0100 Subject: [PATCH 1633/1724] add support for Soldiers At War --- README.md | 1 + src/config.c | 5 +++++ src/winapi_hooks.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 667fbc5..8d5e8ff 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) - Sonic 3D Blast +- Soldiers At War - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing diff --git a/src/config.c b/src/config.c index dbf37cc..68aa2ae 100644 --- a/src/config.c +++ b/src/config.c @@ -1724,6 +1724,11 @@ static void cfg_create_ini() "maxgameticks=30\n" "limiter_type=4\n" "\n" + "; Soldiers At War\n" + "[SAW_Game]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; The Curse Of Monkey Island\n" "[COMI]\n" "singlecpu=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7637d49..fc6fdbd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -986,7 +986,7 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) } } - if (width && WindowFromDC(hdc) == GetDesktopWindow()) + if (width && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { if (index == HORZRES) { From 636b78d99db637b8b94d324e34fd43a4810ecde6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:41:10 +0100 Subject: [PATCH 1634/1724] limit Soldiers At War to 20 fps --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 68aa2ae..f99c7ba 100644 --- a/src/config.c +++ b/src/config.c @@ -1726,7 +1726,7 @@ static void cfg_create_ini() "\n" "; Soldiers At War\n" "[SAW_Game]\n" - "maxgameticks=30\n" + "maxgameticks=20\n" "limiter_type=4\n" "\n" "; The Curse Of Monkey Island\n" From 2f40bb7c8d1faae59cbb23c8788f1543785f423d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:58:09 +0100 Subject: [PATCH 1635/1724] update Zork Nemesis preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index f99c7ba..0b8e8fc 100644 --- a/src/config.c +++ b/src/config.c @@ -1889,6 +1889,7 @@ static void cfg_create_ini() "\n" "; Zork Nemesis\n" "[znemesis]\n" + "fix_not_responding=true\n" "singlecpu=false\n" "maxgameticks=60\n" "limiter_type=4\n" From ca195bcb3f402266f7708698e28c1f3c2a801706 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 07:42:40 +0100 Subject: [PATCH 1636/1724] update Soldiers At War preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0b8e8fc..ea2a00d 100644 --- a/src/config.c +++ b/src/config.c @@ -1726,7 +1726,7 @@ static void cfg_create_ini() "\n" "; Soldiers At War\n" "[SAW_Game]\n" - "maxgameticks=20\n" + "maxgameticks=30\n" "limiter_type=4\n" "\n" "; The Curse Of Monkey Island\n" From 1e03e9cec686c818d17f4d36223c9675e38eb325 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 23:59:05 +0100 Subject: [PATCH 1637/1724] add bpp check to dds blt --- inc/IDirectDrawSurface.h | 2 +- src/ddsurface.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index d8eb99f..b96314a 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -23,9 +23,9 @@ typedef struct IDirectDrawSurfaceImpl ULONG ref; + DWORD bpp; DWORD width; DWORD height; - DWORD bpp; DWORD size; DWORD flags; DWORD caps; diff --git a/src/ddsurface.c b/src/ddsurface.c index ddb89f1..3a4c26a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,6 +50,15 @@ HRESULT dds_Blt( DWORD dwFlags, LPDDBLTFX lpDDBltFx) { + if (lpDDSrcSurface && + lpDDSrcSurface->bpp != 8 && + lpDDSrcSurface->bpp != 16 && + lpDDSrcSurface->bpp != 24 && + lpDDSrcSurface->bpp != 32) + { + return DDERR_INVALIDPARAMS; + } + dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); @@ -77,13 +86,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - //dbg_print_rect("lpSrcRect", lpSrcRect); + dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - //dbg_print_rect("lpDestRect", lpDestRect); + dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From 1c5a5a20458b10c89da7db27e38fa018d077f2d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 23:59:55 +0100 Subject: [PATCH 1638/1724] disable debug code --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 3a4c26a..8166bb0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -86,13 +86,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - dbg_print_rect("lpSrcRect", lpSrcRect); + //dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - dbg_print_rect("lpDestRect", lpDestRect); + //dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From d58b38095c8c74055882c96e0444b842f89a3fc3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:15:01 +0100 Subject: [PATCH 1639/1724] remove DDSD_LPSURFACE flag --- src/ddsurface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8166bb0..4fd92c1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -733,8 +733,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | - DDSD_PIXELFORMAT | - DDSD_LPSURFACE; + DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; From 0edec22452556c64a8acb6f74585ef4bd05746d8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:34:38 +0100 Subject: [PATCH 1640/1724] don'T pass WM_KILLFOCUS messages to the game with noactivateapp --- src/wndproc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wndproc.c b/src/wndproc.c index 6043467..76f3387 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -90,6 +90,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } + case WM_KILLFOCUS: case WM_NCACTIVATE: { if (g_config.noactivateapp) From f1e1578276c8852141b05c692693b9cb880264aa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:34:48 +0100 Subject: [PATCH 1641/1724] add preset for unreal --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ea2a00d..dfa23fb 100644 --- a/src/config.c +++ b/src/config.c @@ -1733,6 +1733,10 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "noactivateapp=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 6cb005cbc1586c323502ad5055e54be4a239efe4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:35:04 +0100 Subject: [PATCH 1642/1724] update supported games list --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d5e8ff..5ed529e 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura - Army Men 2 -- Army Men Air Tactics - Army Men: Air Tactics - Army Men: Toys in Space - Army Men: World War / Army Men: Operation Meltdown @@ -274,6 +273,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Moorhuhn Adventure: Fluch des Goldes - Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon +- MiG-29 Fulcrum - Moto Racer - Moto Racer 2 - Nancy Drew: Danger on Deception Island @@ -437,6 +437,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown +- Unreal - Uprising 2: Lead and Destroy - Uprising: Join or Die - Vermeer @@ -445,6 +446,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Virtua Fighter 2 - Virtua Fighter PC - Virtual Springfield +- WarGames - War Wind - War Wind II - Human Onslaught - Warcraft 2 From ca4aaf8bfc56a8d4c66af45ba75814c88325676a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:44:37 +0100 Subject: [PATCH 1643/1724] sort ini --- src/config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index dfa23fb..5c5f8dc 100644 --- a/src/config.c +++ b/src/config.c @@ -1733,10 +1733,6 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" - "; Unreal\n" - "[Unreal]\n" - "noactivateapp=true\n" - "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1835,6 +1831,10 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "noactivateapp=true\n" + "\n" "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" From 2090c390b9f86782514c82d6e53949503c5f5a56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 01:54:39 +0100 Subject: [PATCH 1644/1724] add preset for Jeff Wayne's The War of the Worlds --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 5ed529e..94b6d39 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 +- Jeff Wayne's The War of the Worlds - Karma Immortal Wrath - Killing Time - Kings Quest 8: Mask of Eternity diff --git a/src/config.c b/src/config.c index 5c5f8dc..ecae4fd 100644 --- a/src/config.c +++ b/src/config.c @@ -1887,6 +1887,11 @@ static void cfg_create_ini() "[WW]\n" "minfps=-1\n" "\n" + "; Jeff Wayne's 'The War Of The Worlds'\n" + "[WoW]\n" + "singlecpu=false\n" + "minfps=-1\n" + "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From 7dc613e1402e5ba6ef5baa9e8acc09f210cfa7a2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 07:47:18 +0100 Subject: [PATCH 1645/1724] update presets --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index ecae4fd..2aea9dd 100644 --- a/src/config.c +++ b/src/config.c @@ -1196,6 +1196,7 @@ static void cfg_create_ini() "\n" "; Karma Immortal Wrath\n" "[karma]\n" + "fix_not_responding=true\n" "maxgameticks=60\n" "limiter_type=4\n" "\n" @@ -1519,6 +1520,7 @@ static void cfg_create_ini() "\n" "; Railroad Tycoon II\n" "[RT2]\n" + "maxgameticks=60" "adjmouse=true\n" "\n" "; Reader Rabbit Thinking Ages 4-6 (US)\n" @@ -1708,6 +1710,7 @@ static void cfg_create_ini() "; Sim City 3000\n" "[SC3]\n" "minfps=-2\n" + "maxgameticks=60" "\n" "; Shadow Watch\n" "[sw]\n" @@ -1733,6 +1736,10 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" + "; The Tone Rebellion\n" + "[Float]\n" + "hook_peekmessage=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 8e77275da0ccd0a4cab2fee2dcd82962da6a3f70 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:27:35 +0100 Subject: [PATCH 1646/1724] add preset for Unreal --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 2aea9dd..8f30eac 100644 --- a/src/config.c +++ b/src/config.c @@ -1829,6 +1829,12 @@ static void cfg_create_ini() "[Tzar]\n" "adjmouse=true\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "adjmouse=false\n" + "lock_mouse_top_left=true\n" + "center_cursor_fix=true\n" + "\n" "; Uprising\n" "[uprising]\n" "adjmouse=true\n" From 3cf0eda68cfd75042021f6101e6f279586383534 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:31:02 +0100 Subject: [PATCH 1647/1724] fix warnings --- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/IDirect3D/IDirect3D7.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 3a9d493..c4f93ab 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC desc = { 0 }; + //D3DDEVICEDESC desc = { 0 }; //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 6302bf6..8b6ff43 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC desc = { 0 }; + //D3DDEVICEDESC desc = { 0 }; //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 6652e0f..0102923 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D7__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC7 desc = { 0 }; + //D3DDEVICEDESC7 desc = { 0 }; //lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg); } From bfb98f9ee02cce1c53fd7b60ff18cde35d774974 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:37:38 +0100 Subject: [PATCH 1648/1724] fix makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 812f29e..c2f547b 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 -luuid COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) From 541b5de218ec3fbd6ea91e606ebfadc07c1786b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:37:44 +0100 Subject: [PATCH 1649/1724] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index c310b4b..045beec 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 7 -#define VERSION_MINOR 0 +#define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From e7ae07a961ae948b1af03a698bda5dfd4443585a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 00:30:04 +0100 Subject: [PATCH 1650/1724] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 045beec..29e19fa 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 812b7599811b9583c5dd4586871f9d54e54a6008 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 00:30:13 +0100 Subject: [PATCH 1651/1724] align --- src/ddpalette.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 4288b89..e51df8e 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -109,7 +109,7 @@ HRESULT dd_CreatePalette( p->lpVtbl = &g_ddp_vtbl; p->flags = dwFlags; - ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); + ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); IDirectDrawPalette_AddRef(p); *lpDDPalette = p; From b7fdfa434b81929a6db5593998ea656f5839cd94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 09:34:40 +0100 Subject: [PATCH 1652/1724] don't forward WM_NCCALCSIZE to the games --- src/wndproc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wndproc.c b/src/wndproc.c index 76f3387..eebace2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -49,6 +49,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_NCPAINT: case WM_CANCELMODE: case WM_DISPLAYCHANGE: + case WM_NCCALCSIZE: { return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } From 82408006f33f113084f94d3325dec45dddc97f1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 19:50:58 +0100 Subject: [PATCH 1653/1724] add preset for Mission Deliver Kindness --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 94b6d39..6f9007a 100644 --- a/README.md +++ b/README.md @@ -275,6 +275,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon - MiG-29 Fulcrum +- Mission Deliver Kindness - Moto Racer - Moto Racer 2 - Nancy Drew: Danger on Deception Island diff --git a/src/config.c b/src/config.c index 8f30eac..b8c7d10 100644 --- a/src/config.c +++ b/src/config.c @@ -1364,6 +1364,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=4\n" "\n" + "; Mission Deliver Kindness\n" + "[MDK95]\n" + "singlecpu=false\n" + "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" From d1af7faa32de50dc287b8b365f0c9cb63b50857f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 20:16:14 +0100 Subject: [PATCH 1654/1724] allways allow Alt+F4 --- src/wndproc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index eebace2..cbc0c07 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -851,6 +851,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { + if (wParam == VK_F4) + { + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + } + break; } case WM_SYSKEYUP: From 743df36fcb77df9f2d320fe0c4fa4333e0909386 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:27:25 +0100 Subject: [PATCH 1655/1724] hook BeginPaint --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 20 ++++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 089f668..23de636 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -18,7 +18,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -64,6 +64,7 @@ typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); +typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -127,6 +128,7 @@ extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern DEFWINDOWPROCAPROC real_DefWindowProcA; extern SETPARENTPROC real_SetParent; +extern BEGINPAINTPROC real_BeginPaint; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index cab3ab6..ad44c7e 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -39,6 +39,7 @@ BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); +HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 1e536fb..29846c7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -55,6 +55,7 @@ SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; SETPARENTPROC real_SetParent = SetParent; +BEGINPAINTPROC real_BeginPaint = BeginPaint; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -119,6 +120,7 @@ HOOKLIST g_hook_hooklist[] = { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, + { "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fc6fdbd..88c94fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -915,6 +915,26 @@ HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) return real_SetParent(hWndChild, hWndNewParent); } +HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) +{ + if (g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && g_ddraw.hwnd == hWnd && lpPaint) + { + HDC result = real_BeginPaint(hWnd, lpPaint); + + if (result) + { + lpPaint->rcPaint.left = 0; + lpPaint->rcPaint.top = 0; + lpPaint->rcPaint.right = g_ddraw.width; + lpPaint->rcPaint.bottom = g_ddraw.height; + } + + return result; + } + + return real_BeginPaint(hWnd, lpPaint); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 68d6ec1c6a525e42baf160b4b81ea7cf293dd14e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:36:45 +0100 Subject: [PATCH 1656/1724] tweak BeginPaint hook --- src/winapi_hooks.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 88c94fe..8f88179 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -921,7 +921,10 @@ HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) { HDC result = real_BeginPaint(hWnd, lpPaint); - if (result) + RECT size = { 0, 0, g_ddraw.width, g_ddraw.height }; + real_GetClientRect(hWnd, &size); + + if (result && (g_ddraw.width != size.right || g_ddraw.height != size.bottom)) { lpPaint->rcPaint.left = 0; lpPaint->rcPaint.top = 0; From da2430b7d03b81fa86268311af4823510e85e2fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:38:22 +0100 Subject: [PATCH 1657/1724] Revert "tweak BeginPaint hook" This reverts commit 68d6ec1c6a525e42baf160b4b81ea7cf293dd14e. --- src/winapi_hooks.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8f88179..88c94fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -921,10 +921,7 @@ HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) { HDC result = real_BeginPaint(hWnd, lpPaint); - RECT size = { 0, 0, g_ddraw.width, g_ddraw.height }; - real_GetClientRect(hWnd, &size); - - if (result && (g_ddraw.width != size.right || g_ddraw.height != size.bottom)) + if (result) { lpPaint->rcPaint.left = 0; lpPaint->rcPaint.top = 0; From 30e8b70f4d1a23969515e647db64523a5f0ddda4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 04:32:53 +0100 Subject: [PATCH 1658/1724] add workaround for windows 11 freeze issues --- inc/utils.h | 3 ++- src/dd.c | 9 ++++++++- src/dllmain.c | 7 +++++++ src/utils.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 9f7f0ee..3833ede 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,8 +6,9 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +void util_set_process_affinity(); +void util_set_thread_affinity(DWORD tid); void util_pull_messages(); -unsigned long util_get_crc32(char* filename); DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); diff --git a/src/dd.c b/src/dd.c index e69063a..883c1e1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1824,7 +1824,14 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - SetProcessAffinityMask(proc, 1); + if (!IsWine() && IsWindows11OrGreater()) + { + util_set_process_affinity(); + } + else + { + SetProcessAffinityMask(proc, 1); + } } else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) { diff --git a/src/dllmain.c b/src/dllmain.c index 97d675f..f3f98b1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -180,6 +180,13 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) break; } + case DLL_THREAD_ATTACH: + { + if (g_config.singlecpu && !IsWine() && IsWindows11OrGreater()) + { + util_set_thread_affinity(GetCurrentThreadId()); + } + } } return TRUE; diff --git a/src/utils.c b/src/utils.c index d96920b..a6649c4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -71,6 +72,42 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +void util_set_process_affinity() +{ + HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + if (snap == INVALID_HANDLE_VALUE) + return; + + THREADENTRY32 entry = { 0 }; + entry.dwSize = sizeof(THREADENTRY32); + + if (!Thread32First(snap, &entry)) + { + CloseHandle(snap); + return; + } + + do + { + if (entry.th32OwnerProcessID == GetCurrentProcessId()) + { + util_set_thread_affinity(entry.th32ThreadID); + } + } while (Thread32Next(snap, &entry)); + + CloseHandle(snap); +} + +void util_set_thread_affinity(DWORD tid) +{ + HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); + if (thread) + { + SetThreadAffinityMask(thread, 1); + CloseHandle(thread); + } +} + void util_pull_messages() { if (g_config.fix_not_responding && From 1bd4493fbe0347065c24f31a400cca96da43c3ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 05:37:27 +0100 Subject: [PATCH 1659/1724] make sure we set system_affinity before using SetThreadAffinityMask --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 883c1e1..fed3f2e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1826,6 +1826,9 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute { if (!IsWine() && IsWindows11OrGreater()) { + if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + SetProcessAffinityMask(proc, system_affinity); + util_set_process_affinity(); } else From 2aa998f8525973162afd47f3908cb6593b7dac41 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 08:15:03 +0100 Subject: [PATCH 1660/1724] add presets for Cloud Kingdom 3 and Commando 2004 --- README.md | 2 ++ src/config.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index 6f9007a..7d2f021 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Commandos - Commandos - Beyond The Call Of Duty - Commandos 2 +- Commando 2004 (only with /ddraw command line parameter) - Constructor - Corsairs Gold - Cossacks (Steam+GOG) @@ -140,6 +141,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest - Cydonia Mars - The First Manned Mission +- Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle diff --git a/src/config.c b/src/config.c index b8c7d10..44b8cb1 100644 --- a/src/config.c +++ b/src/config.c @@ -804,6 +804,14 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Cloud Kingdom 3 (only with /ddraw command line parameter)\n" + "[Clouds Kingdom 3]\n" + "fake_mode=320x240x32\n" + "\n" + "; Commando 2004 (only with /ddraw command line parameter)\n" + "[commando]\n" + "fake_mode=320x240x32\n" + "\n" "; Chris Sawyer's Locomotion\n" "[LOCO/2]\n" "checkfile=.\\LOCO.EXE\n" From 883aadd449695d89b176d29e0df7550e28702bee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 08:43:11 +0100 Subject: [PATCH 1661/1724] remove singlecpu setting from a few presets --- src/config.c | 68 ---------------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/src/config.c b/src/config.c index b8c7d10..b63adba 100644 --- a/src/config.c +++ b/src/config.c @@ -392,7 +392,6 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "singlecpu=false\n" "\n" "; Atrox\n" "[Atrox]\n" @@ -430,10 +429,6 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; Abomination - The Nemesis Project\n" - "[abomb]\n" - "singlecpu=false\n" - "\n" "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" @@ -530,10 +525,6 @@ static void cfg_create_ini() "[AN]\n" "adjmouse=true\n" "\n" - "; Another War\n" - "[AnotherWar]\n" - "singlecpu=false\n" - "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" @@ -652,10 +643,6 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" - "; Championship Manager 99-00\n" - "[cm9900]\n" - "singlecpu=false\n" - "\n" "; Command & Conquer: Sole Survivor\n" "[SOLE]\n" "maxgameticks=120\n" @@ -921,10 +908,6 @@ static void cfg_create_ini() "[dominion]\n" "flipclear=true\n" "\n" - "; Excalibur 2555AD\n" - "[_FISH]\n" - "singlecpu=false\n" - "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" @@ -951,10 +934,6 @@ static void cfg_create_ini() "[f-16]\n" "resolutions=1\n" "\n" - "; Fable\n" - "[FABLE]\n" - "singlecpu=false\n" - "\n" "; Fallout Tactics: Brotherhood of Steel\n" "[BOS/2]\n" "checkfile=.\\binkw32.dll\n" @@ -968,10 +947,6 @@ static void cfg_create_ini() "[FT Tools]\n" "hook_peekmessage=true\n" "\n" - "; Falcon 4.0 (Microprose version)\n" - "[falcon4]\n" - "singlecpu=false\n" - "\n" "; Flight Simulator 98\n" "[FLTSIM95]\n" "flightsim98_hack=true\n" @@ -1038,7 +1013,6 @@ static void cfg_create_ini() "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" - "singlecpu=false\n" "\n" "; Gangsters: Organized Crime\n" "[gangsters]\n" @@ -1280,10 +1254,6 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" - "; Links Extreme\n" - "[EXTREME]\n" - "singlecpu=false\n" - "\n" "; Lost Vikings 2\n" "[LOSTV95]\n" "fake_mode=320x240x16\n" @@ -1291,7 +1261,6 @@ static void cfg_create_ini() "; Nightmare Creatures\n" "[NC]\n" "maxgameticks=30\n" - "singlecpu=false\n" "\n" "; Moto Racer (software mode)\n" "[moto]\n" @@ -1364,10 +1333,6 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=4\n" "\n" - "; Mission Deliver Kindness\n" - "[MDK95]\n" - "singlecpu=false\n" - "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" @@ -1504,10 +1469,6 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" - "; Panzer Dragoon\n" - "[PANZERDG]\n" - "singlecpu=false\n" - "\n" "; Play with the Teletubbies\n" "[PlayWTT]\n" "hook=3\n" @@ -1565,35 +1526,22 @@ static void cfg_create_ini() "[RtK]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" - "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" "maxgameticks=59\n" "anti_aliased_fonts_min_size=99\n" "\n" - "; Rent-A-Hero\n" - "[Rent-A-Hero]\n" - "singlecpu=false\n" - "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" - "; Rising Lands (patched)\n" - "[Rising]\n" - "singlecpu=false\n" - "\n" "; Robin Hood - The Legend of Sherwood (GOG)\n" "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "fix_not_responding=true\n" "\n" - "; Roland Garros 98 (software mode)\n" - "[rg98]\n" - "singlecpu=false\n" - "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" @@ -1617,7 +1565,6 @@ static void cfg_create_ini() "\n" "; Swarog\n" "[Swarog]\n" - "singlecpu=false\n" "maxfps=60\n" "maxgameticks=60\n" "minfps=-1\n" @@ -1736,10 +1683,6 @@ static void cfg_create_ini() "maxgameticks=30\n" "limiter_type=4\n" "\n" - "; The Curse Of Monkey Island\n" - "[COMI]\n" - "singlecpu=false\n" - "\n" "; The Tone Rebellion\n" "[Float]\n" "hook_peekmessage=true\n" @@ -1759,7 +1702,6 @@ static void cfg_create_ini() "; Virtual Springfield\n" "[VIRTUAL]\n" "game_handles_close=true\n" - "singlecpu=false\n" "\n" "; Total Annihilation: Kingdoms\n" "[Kingdoms]\n" @@ -1771,10 +1713,6 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" - "; The Neverhood\n" - "[nhc]\n" - "singlecpu=false\n" - "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" @@ -1876,10 +1814,6 @@ static void cfg_create_ini() "[WH40K]\n" "maxgameticks=250\n" "\n" - "; Weird War\n" - "[WeirdWar]\n" - "singlecpu=false\n" - "\n" "; Wizardry 8\n" "[Wiz8]\n" "sirtech_hack=true\n" @@ -1906,7 +1840,6 @@ static void cfg_create_ini() "\n" "; Jeff Wayne's 'The War Of The Worlds'\n" "[WoW]\n" - "singlecpu=false\n" "minfps=-1\n" "\n" "; Zeus and Poseidon\n" @@ -1916,7 +1849,6 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "fix_not_responding=true\n" - "singlecpu=false\n" "maxgameticks=60\n" "limiter_type=4\n" "\n" From 8c587b21dd8612200c911917b9ff02722ae41ab3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 04:00:22 +0100 Subject: [PATCH 1662/1724] add separate file for delayed imports --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 ++++++ inc/delay_imports.h | 21 +++++++++++++++++++++ inc/versionhelpers.h | 1 - src/delay_imports.c | 33 +++++++++++++++++++++++++++++++++ src/dllmain.c | 3 ++- src/versionhelpers.c | 28 +--------------------------- 7 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 inc/delay_imports.h create mode 100644 src/delay_imports.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index a4d025d..3f5d12d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -27,6 +27,7 @@ + @@ -80,6 +81,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 0f07cb0..b15230e 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -168,6 +168,9 @@ Source Files + + Source Files + @@ -299,6 +302,9 @@ Header Files + + Header Files + diff --git a/inc/delay_imports.h b/inc/delay_imports.h new file mode 100644 index 0000000..19bbc23 --- /dev/null +++ b/inc/delay_imports.h @@ -0,0 +1,21 @@ +#ifndef DELAY_IMPORTS_H +#define DELAY_IMPORTS_H + +#define ThreadQuerySetWin32StartAddress 9 + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); +typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); + +extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; +extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +extern WINE_GET_VERSIONPROC wine_get_version; +extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; + +extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; + +void imports_init(); + +#endif diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index fa542ac..6c4076d 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -33,7 +33,6 @@ #define VerSetConditionMask verhelp_set_mask #endif -void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); const char* verhelp_wine_get_version(); diff --git a/src/delay_imports.c b/src/delay_imports.c new file mode 100644 index 0000000..3d02969 --- /dev/null +++ b/src/delay_imports.c @@ -0,0 +1,33 @@ +#include +#include "versionhelpers.h" + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); +typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); + +NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; +RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +WINE_GET_VERSIONPROC wine_get_version; +WINE_GET_HOST_VERSIONPROC wine_get_host_version; + +VERSETCONDITIONMASKPROC VerSetConditionMaskProc; + +void imports_init() +{ + HMODULE mod = GetModuleHandleA("ntdll.dll"); + if (mod) + { + NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); + RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); + wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); + wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); + } + + mod = GetModuleHandleA("Kernel32.dll"); + if (mod) + { + VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + } +} diff --git a/src/dllmain.c b/src/dllmain.c index f3f98b1..03a6b5f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -12,6 +12,7 @@ #include "indeo.h" #include "utils.h" #include "versionhelpers.h" +#include "delay_imports.h" #include "keyboard.h" @@ -33,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; - verhelp_init(); + imports_init(); if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 7c19528..9888184 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -1,33 +1,7 @@ #include #include "versionhelpers.h" +#include "delay_imports.h" -typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); -typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); -typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); - -static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -static VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -static WINE_GET_VERSIONPROC wine_get_version; -static WINE_GET_HOST_VERSIONPROC wine_get_host_version; - -/* GetProcAddress is rather slow so we use a function to initialize it once on startup */ -void verhelp_init() -{ - HMODULE mod = GetModuleHandleA("ntdll.dll"); - if (mod) - { - RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); - wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); - wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); - } - - mod = GetModuleHandleA("Kernel32.dll"); - if (mod) - { - VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); - } -} BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) { From 78b2da620a88ae9e0c7214fd1246a58054579207 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 04:01:01 +0100 Subject: [PATCH 1663/1724] add header --- src/delay_imports.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/delay_imports.c b/src/delay_imports.c index 3d02969..f224784 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -1,11 +1,6 @@ #include #include "versionhelpers.h" - -typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); -typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); -typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); -typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); +#include "delay_imports.h" NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; From 354b688a2c3aea13af0b9888daec350474eb7983 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:20:01 +0100 Subject: [PATCH 1664/1724] only SetThreadAffinityMask for threads created by local modules --- inc/delay_imports.h | 6 +++++- src/delay_imports.c | 2 ++ src/utils.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/inc/delay_imports.h b/inc/delay_imports.h index 19bbc23..5221ec4 100644 --- a/inc/delay_imports.h +++ b/inc/delay_imports.h @@ -1,20 +1,24 @@ #ifndef DELAY_IMPORTS_H #define DELAY_IMPORTS_H +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define ThreadQuerySetWin32StartAddress 9 typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*); + extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; extern WINE_GET_VERSIONPROC wine_get_version; extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; +extern GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; void imports_init(); diff --git a/src/delay_imports.c b/src/delay_imports.c index f224784..9becb1f 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -8,6 +8,7 @@ WINE_GET_VERSIONPROC wine_get_version; WINE_GET_HOST_VERSIONPROC wine_get_host_version; VERSETCONDITIONMASKPROC VerSetConditionMaskProc; +GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; void imports_init() { @@ -24,5 +25,6 @@ void imports_init() if (mod) { VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + GetModuleHandleExAProc = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); } } diff --git a/src/utils.c b/src/utils.c index a6649c4..47bd680 100644 --- a/src/utils.c +++ b/src/utils.c @@ -13,6 +13,7 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" +#include "delay_imports.h" /* @@ -103,7 +104,49 @@ void util_set_thread_affinity(DWORD tid) HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); if (thread) { - SetThreadAffinityMask(thread, 1); + void* start = NULL; + NTSTATUS status = STATUS_PENDING; + + if (NtQueryInformationThread) + { + status = NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); + } + + if (status == STATUS_SUCCESS && start && GetModuleHandleExAProc) + { + char game_exe_path[MAX_PATH] = { 0 }; + char game_dir[MAX_PATH] = { 0 }; + + if (GetModuleFileNameA(NULL, game_exe_path, sizeof(game_exe_path))) + { + _splitpath(game_exe_path, NULL, game_dir, NULL, NULL); + + char mod_path[MAX_PATH] = { 0 }; + char mod_dir[MAX_PATH] = { 0 }; + char mod_filename[MAX_PATH] = { 0 }; + HMODULE mod = NULL; + + if (GetModuleHandleExAProc( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod)) + { + if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path))) + { + _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); + + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + _strcmpi(mod_filename, "WINMM") == 0) + { + SetThreadAffinityMask(thread, 1); + } + } + } + } + } + else + { + SetThreadAffinityMask(thread, 1); + } + CloseHandle(thread); } } From 47a5f893270a58b386f2664a9cbc77f81f3ed52b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:30:03 +0100 Subject: [PATCH 1665/1724] add delay_ prefix for delayed imports --- inc/delay_imports.h | 14 +++++++------- src/delay_imports.c | 26 +++++++++++++------------- src/dllmain.c | 2 +- src/utils.c | 9 +++++---- src/versionhelpers.c | 12 ++++++------ 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/inc/delay_imports.h b/inc/delay_imports.h index 5221ec4..ba654ed 100644 --- a/inc/delay_imports.h +++ b/inc/delay_imports.h @@ -12,14 +12,14 @@ typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULON typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*); -extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; -extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -extern WINE_GET_VERSIONPROC wine_get_version; -extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; +extern NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread; +extern RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo; +extern WINE_GET_VERSIONPROC delay_wine_get_version; +extern WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version; -extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -extern GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; +extern VERSETCONDITIONMASKPROC delay_VerSetConditionMask; +extern GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA; -void imports_init(); +void delay_imports_init(); #endif diff --git a/src/delay_imports.c b/src/delay_imports.c index 9becb1f..2b23dda 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -2,29 +2,29 @@ #include "versionhelpers.h" #include "delay_imports.h" -NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; -RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -WINE_GET_VERSIONPROC wine_get_version; -WINE_GET_HOST_VERSIONPROC wine_get_host_version; +NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread; +RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo; +WINE_GET_VERSIONPROC delay_wine_get_version; +WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version; -VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; +VERSETCONDITIONMASKPROC delay_VerSetConditionMask; +GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA; -void imports_init() +void delay_imports_init() { HMODULE mod = GetModuleHandleA("ntdll.dll"); if (mod) { - NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); - RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); - wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); - wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); + delay_NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); + delay_RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); + delay_wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); + delay_wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); } mod = GetModuleHandleA("Kernel32.dll"); if (mod) { - VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); - GetModuleHandleExAProc = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); + delay_VerSetConditionMask = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + delay_GetModuleHandleExA = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); } } diff --git a/src/dllmain.c b/src/dllmain.c index 03a6b5f..adbc8c0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -34,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; - imports_init(); + delay_imports_init(); if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { diff --git a/src/utils.c b/src/utils.c index 47bd680..8bc0c43 100644 --- a/src/utils.c +++ b/src/utils.c @@ -107,12 +107,13 @@ void util_set_thread_affinity(DWORD tid) void* start = NULL; NTSTATUS status = STATUS_PENDING; - if (NtQueryInformationThread) + if (delay_NtQueryInformationThread) { - status = NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); + status = + delay_NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); } - if (status == STATUS_SUCCESS && start && GetModuleHandleExAProc) + if (status == STATUS_SUCCESS && start && delay_GetModuleHandleExA) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -126,7 +127,7 @@ void util_set_thread_affinity(DWORD tid) char mod_filename[MAX_PATH] = { 0 }; HMODULE mod = NULL; - if (GetModuleHandleExAProc( + if (delay_GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod)) { if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path))) diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 9888184..f9f35c2 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -5,26 +5,26 @@ BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) { - return RtlVerifyVersionInfo ? - RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : + return delay_RtlVerifyVersionInfo ? + delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : VerifyVersionInfoW(versionInfo, typeMask, conditionMask); } ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition) { - return VerSetConditionMaskProc ? VerSetConditionMaskProc(ConditionMask, TypeMask, Condition) : 0; + return delay_VerSetConditionMask ? delay_VerSetConditionMask(ConditionMask, TypeMask, Condition) : 0; } const char* verhelp_wine_get_version() { - return wine_get_version ? wine_get_version() : NULL; + return delay_wine_get_version ? delay_wine_get_version() : NULL; } void verhelp_wine_get_host_version(const char** sysname, const char** release) { - if (wine_get_host_version) + if (delay_wine_get_host_version) { - wine_get_host_version(sysname, release); + delay_wine_get_host_version(sysname, release); return; } From e9168a6871dba6e3d38330602cee05e5be68ba2c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:38:20 +0100 Subject: [PATCH 1666/1724] always use delay function --- src/debug.c | 6 ++---- src/utils.c | 35 ++++++++++++++++------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/debug.c b/src/debug.c index 9d615b5..b030114 100644 --- a/src/debug.c +++ b/src/debug.c @@ -17,6 +17,7 @@ #include "crc32.h" #include "dllmain.h" #include "config.h" +#include "delay_imports.h" double g_dbg_frame_time = 0; @@ -89,10 +90,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; - BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); - - if (getModuleHandleExA && getModuleHandleExA( + if (delay_GetModuleHandleExA && delay_GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, &mod)) diff --git a/src/utils.c b/src/utils.c index 8bc0c43..ff89aa6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -264,10 +264,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) BOOL util_caller_is_ddraw_wrapper(void* return_address) { - BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); - - if (!getModuleHandleExA) + if (!delay_GetModuleHandleExA) return FALSE; void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); @@ -281,9 +278,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll"); if (D3dHook_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) { MessageBoxA( NULL, @@ -299,9 +296,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) { MessageBoxA( NULL, @@ -317,9 +314,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); if (windmode_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) { MessageBoxA( NULL, @@ -335,9 +332,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); if (dxwnd_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) { MessageBoxA( NULL, @@ -353,9 +350,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE age_dll = GetModuleHandleA("age.dll"); if (age_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { HKEY hkey; LONG status = From c4ece39e5a4b30830e8dbe8a2b995f588cffaa07 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:27:07 +0100 Subject: [PATCH 1667/1724] don't set thread affinity for winmm threads since it's causing side-effects --- src/utils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index ff89aa6..3d7651f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -134,8 +134,7 @@ void util_set_thread_affinity(DWORD tid) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || - _strcmpi(mod_filename, "WINMM") == 0) + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0) // _strcmpi(mod_filename, "WINMM") == 0 { SetThreadAffinityMask(thread, 1); } From ee247794c554fcd8f00ba7d495e8243b2bc50a68 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:30:54 +0100 Subject: [PATCH 1668/1724] only enable workaround for win 11 24H2 --- inc/versionhelpers.h | 19 +++++++++++++++++++ src/dd.c | 2 +- src/dllmain.c | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 6c4076d..36f2dd6 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -60,6 +60,17 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se VER_SERVICEPACKMAJOR, VER_EQUAL)); } +VERSIONHELPERAPI IsWindowsVersionExcactBuild(DWORD major, DWORD minor, DWORD build, WORD servpack) +{ + RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; + return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), + VER_BUILDNUMBER, VER_EQUAL), + VER_SERVICEPACKMAJOR, VER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; @@ -135,6 +146,10 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } +VERSIONHELPERAPI IsWindows11Version24H2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); +} + VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); @@ -212,6 +227,10 @@ VERSIONHELPERAPI IsWindows11(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } +VERSIONHELPERAPI IsWindows11Version24H2(void) { + return IsWindowsVersionExcactBuild(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); +} + VERSIONHELPERAPI IsWine(void) { return verhelp_wine_get_version() != NULL; } diff --git a/src/dd.c b/src/dd.c index fed3f2e..1e90def 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1824,7 +1824,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - if (!IsWine() && IsWindows11OrGreater()) + if (!IsWine() && IsWindows11Version24H2()) { if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) SetProcessAffinityMask(proc, system_affinity); diff --git a/src/dllmain.c b/src/dllmain.c index adbc8c0..f4ede20 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -183,7 +183,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_THREAD_ATTACH: { - if (g_config.singlecpu && !IsWine() && IsWindows11OrGreater()) + if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2()) { util_set_thread_affinity(GetCurrentThreadId()); } From 2496cf4ddc0d25b7ee987189582dd6860f011948 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:41:45 +0100 Subject: [PATCH 1669/1724] add presets for Fable and Rising Lands --- src/config.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/config.c b/src/config.c index 7707178..d17035e 100644 --- a/src/config.c +++ b/src/config.c @@ -967,6 +967,11 @@ static void cfg_create_ini() "[mrazik]\n" "guard_lines=0\n" "\n" + "; Fable\n" + "[Fable]\n" + "maxgameticks=59\n" + "limiter_type=4\n" + "\n" "; Final Liberation: Warhammer Epic 40000\n" "[Epic40k]\n" "hook_peekmessage=true\n" @@ -1560,6 +1565,11 @@ static void cfg_create_ini() "singlecpu=false\n" "fix_not_responding=true\n" "\n" + "; Rising Lands\n" + "[Rising]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" "windowed=true\n" From f014f9406deb14cc71fd09525fa2d77bd1ec1e14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 05:05:04 +0100 Subject: [PATCH 1670/1724] center Metal Knight Movies --- src/winapi_hooks.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 88c94fe..2954121 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2058,6 +2058,28 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Metal Knight Movies */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3:0:1900011:0") == 0 && + lpWindowName && _strcmpi(lpWindowName, "AVI player") == 0 && + dwStyle == WS_POPUP && + dwExStyle == WS_EX_TOPMOST && + g_ddraw.ref && g_ddraw.hwnd && + g_ddraw.width) + { + dwExStyle = 0; + + POINT pt = { 0, 0 }; + real_ClientToScreen(g_ddraw.hwnd, &pt); + + int added_height = g_ddraw.render.height - g_ddraw.height; + int added_width = g_ddraw.render.width - g_ddraw.width; + int align_y = added_height > 0 ? added_height / 2 : 0; + int align_x = added_width > 0 ? added_width / 2 : 0; + + X += pt.x + align_x; + Y += pt.y + align_y; + } + /* Disney Trivia Challenge */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Disney Trivia Challenge") == 0 && hWndParent && (dwStyle & WS_CHILD)) From d106cf3c6070eae552367cc4a5a7a8035ce83bb1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 08:42:59 +0100 Subject: [PATCH 1671/1724] fix unreal preset --- src/config.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index d17035e..39bcfda 100644 --- a/src/config.c +++ b/src/config.c @@ -1794,6 +1794,7 @@ static void cfg_create_ini() "adjmouse=false\n" "lock_mouse_top_left=true\n" "center_cursor_fix=true\n" + "noactivateapp=true\n" "\n" "; Uprising\n" "[uprising]\n" @@ -1804,10 +1805,6 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" - "; Unreal\n" - "[Unreal]\n" - "noactivateapp=true\n" - "\n" "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" From b7b60aa908533f89d1a06058e897f33ec472f77c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 23:13:40 +0100 Subject: [PATCH 1672/1724] #373 fix double screenshot issue --- src/keyboard.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 2ca9fbb..f54ba63 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -86,9 +86,22 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == g_config.hotkeys.screenshot && key_released) + if (wParam == g_config.hotkeys.screenshot) { - ss_take_screenshot(g_ddraw.primary); + // VK_SNAPSHOT does not have a KEYDOWN event... + if (g_config.hotkeys.screenshot == VK_SNAPSHOT) + { + if (key_released) + { + ss_take_screenshot(g_ddraw.primary); + return 1; + } + } + else if (key_triggered) + { + ss_take_screenshot(g_ddraw.primary); + return 1; + } } if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) From 7df6a4e47b7fc90c03dcf81d57ec77e6ea98a204 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:04:50 +0100 Subject: [PATCH 1673/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7d2f021..82e0727 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sim City 3000 - Sim Copter +- SimTunes - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) From ed8584129dccc1d7f50b35d123a5fc0b5295a6f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:22:03 +0100 Subject: [PATCH 1674/1724] add new .ini setting "terminate_process" --- inc/config.h | 1 + src/config.c | 2 ++ src/dllmain.c | 3 +++ src/wndproc.c | 3 +++ 4 files changed, 9 insertions(+) diff --git a/inc/config.h b/inc/config.h index d1600d5..a353aa8 100644 --- a/inc/config.h +++ b/inc/config.h @@ -80,6 +80,7 @@ typedef struct CNCDDRAWCONFIG BOOL limit_gdi_handles; BOOL remove_menu; int refresh_rate; + int terminate_process; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 39bcfda..f9cf3e2 100644 --- a/src/config.c +++ b/src/config.c @@ -93,6 +93,7 @@ void cfg_load() GET_BOOL(g_config.limit_gdi_handles, "limit_gdi_handles", FALSE); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); + GET_BOOL(g_config.terminate_process, "terminate_process", FALSE); /* Hotkeys */ @@ -336,6 +337,7 @@ static void cfg_create_ini() "limit_gdi_handles=false\n" "remove_menu=false\n" "refresh_rate=0\n" + "terminate_process=false\n" "\n" "\n" "\n" diff --git a/src/dllmain.c b/src/dllmain.c index f4ede20..5e71859 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -179,6 +179,9 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (g_dbg_exception_handle && remove_handler) remove_handler(g_dbg_exception_handle); + if (g_config.terminate_process == 2) + TerminateProcess(GetCurrentProcess(), 0); + break; } case DLL_THREAD_ATTACH: diff --git a/src/wndproc.c b/src/wndproc.c index cbc0c07..3555058 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -620,6 +620,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { + if (g_config.terminate_process) + g_config.terminate_process = 2; + ExitProcess(0); //_exit(0); } From 7edf2c35b31cd412e36ca7abdec009e9c51209a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:25:55 +0100 Subject: [PATCH 1675/1724] add preset for 101: The Airborne Invasion of Normandy and SimTunes --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index f9cf3e2..290b22b 100644 --- a/src/config.c +++ b/src/config.c @@ -391,6 +391,10 @@ static void cfg_create_ini() "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" + "; 101: The Airborne Invasion of Normandy\n" + "[101]\n" + "terminate_process=true" + "\n" "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" @@ -1683,6 +1687,10 @@ static void cfg_create_ini() "minfps=-2\n" "maxgameticks=60" "\n" + "; SimTunes\n" + "[SIMTUNES]\n" + "terminate_process=true" + "\n" "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" From ef440dfa24e4a1ecee676f3cd8258559576d809a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:39:36 +0100 Subject: [PATCH 1676/1724] update SimTunes preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 290b22b..f2265fe 100644 --- a/src/config.c +++ b/src/config.c @@ -1690,6 +1690,7 @@ static void cfg_create_ini() "; SimTunes\n" "[SIMTUNES]\n" "terminate_process=true" + "hook=3" "\n" "; Shadow Watch\n" "[sw]\n" From b1e34677c92234da3c96af49368a85d5deadd4d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:43:21 +0100 Subject: [PATCH 1677/1724] fix line breaks in .ini file --- src/config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index f2265fe..5c97ad6 100644 --- a/src/config.c +++ b/src/config.c @@ -393,7 +393,7 @@ static void cfg_create_ini() "\n" "; 101: The Airborne Invasion of Normandy\n" "[101]\n" - "terminate_process=true" + "terminate_process=true\n" "\n" "; 7th Legion\n" "[legion]\n" @@ -1689,8 +1689,8 @@ static void cfg_create_ini() "\n" "; SimTunes\n" "[SIMTUNES]\n" - "terminate_process=true" - "hook=3" + "terminate_process=true\n" + "hook=3\n" "\n" "; Shadow Watch\n" "[sw]\n" From ff0251a318d16bc87f717339e1c1043612684bc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:46:17 +0100 Subject: [PATCH 1678/1724] fix some more line breaks --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 5c97ad6..bfb9183 100644 --- a/src/config.c +++ b/src/config.c @@ -1685,7 +1685,7 @@ static void cfg_create_ini() "; Sim City 3000\n" "[SC3]\n" "minfps=-2\n" - "maxgameticks=60" + "maxgameticks=60\n" "\n" "; SimTunes\n" "[SIMTUNES]\n" @@ -1695,7 +1695,7 @@ static void cfg_create_ini() "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" - "maxgameticks=30" + "maxgameticks=30\n" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From 5cfbf45e960d91c9cc9a7735edc59e9efe2bda8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 03:02:03 +0100 Subject: [PATCH 1679/1724] add preset for Virtual On: Cyber Troopers --- README.md | 1 + src/config.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 82e0727..ac52bf9 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Virtual On: Cyber Troopers - Cydonia Mars - The First Manned Mission - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth diff --git a/src/config.c b/src/config.c index bfb9183..135507c 100644 --- a/src/config.c +++ b/src/config.c @@ -1825,6 +1825,13 @@ static void cfg_create_ini() "[VF2]\n" "fake_mode=640x480x8\n" "\n" + "; Virtual On: Cyber Troopers\n" + "[V_ON]\n" + "devmode=true\n" + "windowed=true\n" + "fullscreen=true\n" + "toggle_borderless=true\n" + "\n" "; Wall Street Trader 2000 - NOT WORKING YET\n" "[WSTrader]\n" "nonexclusive=false\n" From 62603dc479547595c01c877751a47e64bf460202 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 03:11:15 +0100 Subject: [PATCH 1680/1724] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac52bf9..e770d43 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest -- Virtual On: Cyber Troopers - Cydonia Mars - The First Manned Mission - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth @@ -452,6 +451,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Virtua Fighter 2 - Virtua Fighter PC - Virtual Springfield +- Virtual On: Cyber Troopers - WarGames - War Wind - War Wind II - Human Onslaught From aadd8496d1f6b3548362f891553eac07fe0a6f55 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 23:57:16 +0100 Subject: [PATCH 1681/1724] update presets --- src/config.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 135507c..bd0c91b 100644 --- a/src/config.c +++ b/src/config.c @@ -1692,8 +1692,15 @@ static void cfg_create_ini() "terminate_process=true\n" "hook=3\n" "\n" + "; Street Wars: Constructor Underworld\n" + "[Sw]\n" + "checkfile=.\\smackw32.dll\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; Shadow Watch\n" - "[sw]\n" + "[sw/2]\n" + "checkfile=.\\Dx.dll\n" "adjmouse=true\n" "maxgameticks=30\n" "\n" From cbaa29ec7ea8206c4590a94c7d1e965964ec22fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 3 Jan 2025 00:07:31 +0100 Subject: [PATCH 1682/1724] update preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index bd0c91b..6fe6a73 100644 --- a/src/config.c +++ b/src/config.c @@ -1703,6 +1703,7 @@ static void cfg_create_ini() "checkfile=.\\Dx.dll\n" "adjmouse=true\n" "maxgameticks=30\n" + "hook_peekmessage=true\n" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From 47b2bee09a477af49475113afd317ae82926e7b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 08:57:13 +0100 Subject: [PATCH 1683/1724] update lpDDEmulCaps --- src/dd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dd.c b/src/dd.c index 1e90def..23b58b6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -518,6 +518,7 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) memset(lpDDEmulCaps, 0, size); lpDDEmulCaps->dwSize = size; + lpDDEmulCaps->dwCaps = DDCAPS_BLTSTRETCH; } return DD_OK; From 99a43a468c0996cc979837b2cf1d8eb26e7b3267 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 10:14:29 +0100 Subject: [PATCH 1684/1724] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e770d43..33875a4 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt +- Broken Sword 2: The Smoking Mirror - Caesar III (Sierra - 1998) - Call To Power 2 - Callus 95 - CPS-1 (Capcom Play System 1) emulator @@ -162,6 +163,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Divine Divinity - Dominion - Storm Over Gift 3 - Doom 95 +- Dracula - Dragon Throne: Battle of Red Cliffs - Dreams to Realty - DuelSavior From 825614fb548bc39801ea6a2f2a5ff378fc7b15a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 10:14:40 +0100 Subject: [PATCH 1685/1724] update close combat presets --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 6fe6a73..8e470c2 100644 --- a/src/config.c +++ b/src/config.c @@ -820,21 +820,29 @@ static void cfg_create_ini() "\n" "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" From 920e9c458aa435ed8f458cc5ac9a0e53e581a2e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Jan 2025 04:20:34 +0100 Subject: [PATCH 1686/1724] add testing code for AVIWnd32 --- src/winapi_hooks.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2954121..970c7e0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1113,12 +1113,36 @@ BOOL WINAPI fake_StretchBlt( else if ( g_ddraw.width > 0 && g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) + (hwnd == g_ddraw.hwnd || + (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) || + strcmp(class_name, "AVIWnd32") == 0)) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + + if (hwnd != g_ddraw.hwnd && strcmp(class_name, "AVIWnd32") == 0) + { + LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); + if (!(exstyle & WS_EX_TRANSPARENT)) + { + real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); + + real_SetWindowPos( + hwnd, + 0, + 0, + 0, + 0, + 0, + SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + ); + } + } + return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, - (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf((xDest + pt.x) * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf((yDest + pt.y) * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, (int)(roundf(wDest * g_ddraw.render.scale_w)), (int)(roundf(hDest * g_ddraw.render.scale_h)), hdcSrc, From bd0b628dd66f83df42eb969086a8b31cbb43bd3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Jan 2025 08:05:09 +0100 Subject: [PATCH 1687/1724] add test preset for Men In Black --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 8e470c2..11db305 100644 --- a/src/config.c +++ b/src/config.c @@ -1351,6 +1351,11 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" + "; Men In Black - NOT WORKING YET\n" + "[MIB]\n" + "renderer=gdi\n" + "hook=2\n" + "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "fix_alt_key_stuck=true\n" From d017b6860780233546629a94e933af1a98e5763f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Jan 2025 05:26:09 +0100 Subject: [PATCH 1688/1724] Update Close Combat presets --- src/config.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 11db305..950fa8c 100644 --- a/src/config.c +++ b/src/config.c @@ -820,28 +820,29 @@ static void cfg_create_ini() "\n" "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" - "maxgameticks=60\n" - "limiter_type=2\n" + "maxgameticks=20\n" + "limiter_type=4\n" + "minfps=15\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" From 45af838174fa69677b6b16617ad1383013280033 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Jan 2025 13:45:11 +0100 Subject: [PATCH 1689/1724] center cnc-ddraw config to primary screen --- config/ConfigFormUnit.dfm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index a34dc9f..4f108df 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2677,7 +2677,7 @@ object ConfigForm: TConfigForm 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} - Position = poDesktopCenter + Position = poScreenCenter OnActivate = FormActivate OnCreate = FormCreate DesignSize = ( From edae0183ae1fb1bbc1510459e71794e54ce0a09f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 02:42:21 +0100 Subject: [PATCH 1690/1724] add preset for Meat Puppet --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 950fa8c..228484c 100644 --- a/src/config.c +++ b/src/config.c @@ -1348,6 +1348,10 @@ static void cfg_create_ini() "[MajestyHD - Old]\n" "adjmouse=true\n" "\n" + "; Meat Puppet\n" + "[meat]\n" + "hook_peekmessage=true\n" + "\n" "; Mech Warrior 3\n" "[Mech3]\n" "nonexclusive=true\n" From af634df78ab4411dac209058ff0d3f321ac94070 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 02:42:30 +0100 Subject: [PATCH 1691/1724] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 33875a4..0b59da4 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt +- Broken Sword - Broken Sword 2: The Smoking Mirror - Caesar III (Sierra - 1998) - Call To Power 2 @@ -268,6 +269,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Majesty Gold - Majesty Gold HD - Mario Sorb 3 +- Meat Puppet - Mech Warrior 3 - Megaman X4 - Metal Gear Solid From 209703d9767a6bc12b9a2e642cba7f269c4ba349 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 04:34:42 +0100 Subject: [PATCH 1692/1724] remove old hook=2 checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 970c7e0..c0705f7 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -976,12 +976,12 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) bpp = strtoul(e + 1, &e, 0); } - if (bpp && index == BITSPIXEL && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp && index == BITSPIXEL) { return bpp; } - if (bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp == 8) { if (index == RASTERCAPS) { From a1dcb4c04025158aae55c71b94c52cfeeb53716a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 04:37:45 +0100 Subject: [PATCH 1693/1724] update Men In Black preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 228484c..95b73c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1358,7 +1358,6 @@ static void cfg_create_ini() "\n" "; Men In Black - NOT WORKING YET\n" "[MIB]\n" - "renderer=gdi\n" "hook=2\n" "\n" "; Moorhuhn 2\n" From 870353254deb2f59d7cbfcfcbcdb446676df03d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 Jan 2025 04:43:24 +0100 Subject: [PATCH 1694/1724] update Heroes of Might and Magic II preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 95b73c7..01ba2e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1092,6 +1092,7 @@ static void cfg_create_ini() "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III\n" "[Heroes3]\n" From ac07df92409004e06986645eb63d26c96f8c1eb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 04:17:01 +0100 Subject: [PATCH 1695/1724] update chinese translation --- config/ConfigFormUnit.cpp | 61 ++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 02723d7..f03d8c1 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -132,31 +132,31 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw 配置"; DisplayBtn->Caption = L"显示设置"; AdvancedBtn->Caption = L"高级设置"; - HotkeyBtn->Caption = L"热键设置"; + HotkeyBtn->Caption = L"快捷键设置"; CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; - PresentationLbl->Caption = L"显示方式"; - MaintasLbl->Caption = L"保持纵横比"; - VsyncLbl->Caption = L"打开垂直同步"; + PresentationLbl->Caption = L"演示"; + MaintasLbl->Caption = L"保持宽高比"; + VsyncLbl->Caption = L"启用垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; - DevmodeLbl->Caption = L"锁定光标到窗口/屏幕"; + DevmodeLbl->Caption = L"将光标锁定到窗口/屏幕"; RendererLbl->Caption = L"渲染器"; BorderLbl->Caption = L"在窗口模式下显示窗口边框"; SavesettingsLbl->Caption = L"记住窗口位置和大小"; - ShaderLbl->Caption = L"OpenGL着色器"; - MaxfpsLbl->Caption = L"限制帧率"; - BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; + ShaderLbl->Caption = L"OpenGL 着色器"; + MaxfpsLbl->Caption = L"限制帧速率"; + BoxingLbl->Caption = L"启用窗口框/整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor2Lbl->Caption = L"解锁光标 2"; - ScreenshotLbl->Caption = L"截屏"; - MaxgameticksLbl->Caption = L"限制游戏速率"; - NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; - ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; - MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; - SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; - NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; + ScreenshotLbl->Caption = L"截图"; + MaxgameticksLbl->Caption = L"限制游戏速度"; + NoactivateappLbl->Caption = L"修复 Alt+Tab 错误"; + ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; + MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; + SinglecpuLbl->Caption = L"修复性能和声音问题"; + NonexclusiveLbl->Caption = L"修复不可见的视频/UI 元素"; RendererCbx->Items->Clear(); RendererCbx->AddItem(L"自动", NULL); @@ -166,32 +166,33 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"全屏", NULL); - PresentationCbx->AddItem(L"拉伸至全屏", NULL); + PresentationCbx->AddItem(L"全屏放大", NULL); PresentationCbx->AddItem(L"无边框", NULL); - PresentationCbx->AddItem(L"窗口化", NULL); + PresentationCbx->AddItem(L"窗口", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"无限制", NULL); MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL); - MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL); - MaxgameticksCbx->AddItem(L"1000tick每秒", NULL); - MaxgameticksCbx->AddItem(L"500tick每秒", NULL); - MaxgameticksCbx->AddItem(L"250tick每秒", NULL); - MaxgameticksCbx->AddItem(L"125tick每秒", NULL); - MaxgameticksCbx->AddItem(L"60tick每秒", NULL); - MaxgameticksCbx->AddItem(L"30tick每秒", NULL); - MaxgameticksCbx->AddItem(L"25tick每秒", NULL); - MaxgameticksCbx->AddItem(L"15tick每秒", NULL); + MaxgameticksCbx->AddItem(L"模拟 60hz 刷新率显示器", NULL); + MaxgameticksCbx->AddItem(L"1000 次每秒", NULL); + MaxgameticksCbx->AddItem(L"500 次每秒", NULL); + MaxgameticksCbx->AddItem(L"250 次每秒", NULL); + MaxgameticksCbx->AddItem(L"125 次每秒", NULL); + MaxgameticksCbx->AddItem(L"60 次每秒", NULL); + MaxgameticksCbx->AddItem(L"30 次每秒", NULL); + MaxgameticksCbx->AddItem(L"25 次每秒", NULL); + MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"某些着色器仅在打开放大功能时生效。\n\n"; + L"一些着色器只有在启用放大时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须打开放大功能才能使此设置生效。\n\n"; + L"必须启用放大才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要打开放大功能,请将显示方式设置为‘无边框’或‘拉伸至全屏’。\n" - "对于‘窗口化’显示方式,您必须调整窗口大小或最大化窗口。"; + L"要启用放大,请将演示设置为“无边框” \n" + "或“全屏放大”。对于“窗口”演示, \n" + "你必须调整或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From ce91df2bedb1e082bd85bc7364528349ddd0938c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 04:47:19 +0100 Subject: [PATCH 1696/1724] update chinese translation --- config/ConfigFormUnit.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f03d8c1..250c256 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -135,7 +135,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) HotkeyBtn->Caption = L"快捷键设置"; CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; - PresentationLbl->Caption = L"演示"; + PresentationLbl->Caption = L"显示方式"; MaintasLbl->Caption = L"保持宽高比"; VsyncLbl->Caption = L"启用垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; @@ -145,18 +145,18 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"记住窗口位置和大小"; ShaderLbl->Caption = L"OpenGL 着色器"; MaxfpsLbl->Caption = L"限制帧速率"; - BoxingLbl->Caption = L"启用窗口框/整数缩放"; + BoxingLbl->Caption = L"启用窗框显示/整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor2Lbl->Caption = L"解锁光标 2"; ScreenshotLbl->Caption = L"截图"; MaxgameticksLbl->Caption = L"限制游戏速度"; - NoactivateappLbl->Caption = L"修复 Alt+Tab 错误"; + NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; - SinglecpuLbl->Caption = L"修复性能和声音问题"; - NonexclusiveLbl->Caption = L"修复不可见的视频/UI 元素"; + SinglecpuLbl->Caption = L"修复低性能和声音问题"; + NonexclusiveLbl->Caption = L"修复不显示的视频/UI 元素"; RendererCbx->Items->Clear(); RendererCbx->AddItem(L"自动", NULL); @@ -166,9 +166,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"全屏", NULL); - PresentationCbx->AddItem(L"全屏放大", NULL); + PresentationCbx->AddItem(L"拉伸至全屏", NULL); PresentationCbx->AddItem(L"无边框", NULL); - PresentationCbx->AddItem(L"窗口", NULL); + PresentationCbx->AddItem(L"窗口化", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"无限制", NULL); From a46da149de5a831796d0b91dc70117d264f7bbc1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 07:14:33 +0100 Subject: [PATCH 1697/1724] make sure build is still compatible with older versions of windows --- src/utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/utils.c b/src/utils.c index 3d7651f..fafd4ed 100644 --- a/src/utils.c +++ b/src/utils.c @@ -75,6 +75,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) void util_set_process_affinity() { +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (snap == INVALID_HANDLE_VALUE) return; @@ -97,10 +98,12 @@ void util_set_process_affinity() } while (Thread32Next(snap, &entry)); CloseHandle(snap); +#endif } void util_set_thread_affinity(DWORD tid) { +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); if (thread) { @@ -149,6 +152,7 @@ void util_set_thread_affinity(DWORD tid) CloseHandle(thread); } +#endif } void util_pull_messages() From 50ac66d06830a64d0ff0b4a733c58b2fcbf2b134 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 08:37:41 +0100 Subject: [PATCH 1698/1724] update chinese translation --- config/ConfigFormUnit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 250c256..18f267c 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -145,7 +145,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"记住窗口位置和大小"; ShaderLbl->Caption = L"OpenGL 着色器"; MaxfpsLbl->Caption = L"限制帧速率"; - BoxingLbl->Caption = L"启用窗框显示/整数缩放"; + BoxingLbl->Caption = L"启用整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; @@ -184,15 +184,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"一些着色器只有在启用放大时才有效。\n\n"; + L"一些着色器只有在启用缩放时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须启用放大才能使此设置生效。\n\n"; + L"必须启用缩放才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用放大,请将演示设置为“无边框” \n" - "或“全屏放大”。对于“窗口”演示, \n" - "你必须调整或最大化窗口。"; + L"要启用缩放,请将显示方式设置为“无边框” \n" + "或“拉伸至全屏”。对于“窗口化”, \n" + "你必须调整窗口大小或将窗口开启最大化。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 6a7e862258af2a162dc59e73b4bf5d78ae52b0c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 06:28:14 +0100 Subject: [PATCH 1699/1724] update HOMM2 preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 01ba2e5..d6b4c78 100644 --- a/src/config.c +++ b/src/config.c @@ -1092,6 +1092,7 @@ static void cfg_create_ini() "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" + "game_handles_close=true\n" "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III\n" From 4fdbfa61e22395e85509ff09e297bdb47851eaee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 07:10:53 +0100 Subject: [PATCH 1700/1724] set g_config.toggle_borderless to TRUE on failure --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 23b58b6..0e58170 100644 --- a/src/dd.c +++ b/src/dd.c @@ -890,6 +890,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ @@ -1253,6 +1254,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } @@ -1269,6 +1271,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } } From 03760a3570dd0cc827195d6080afa6da5f12b21a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 09:31:03 +0100 Subject: [PATCH 1701/1724] add preset for JA2 Vengeance Reloaded mod German exe --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index d6b4c78..864b10b 100644 --- a/src/config.c +++ b/src/config.c @@ -1194,6 +1194,12 @@ static void cfg_create_ini() "sirtech_hack=true\n" "fix_alt_key_stuck=true\n" "\n" + "; Jagged Alliance 2 - Vengeance Reloaded mod German exe\n" + "[JA2_Vengeance_DE]\n" + "singlecpu=false\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" + "\n" "; Jeopardy! - NOT WORKING YET\n" "[jeoppc]\n" "singlecpu=false\n" From 86b4ec05c4e2eec404c5b903b1af9c1a88528deb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 10:26:51 +0100 Subject: [PATCH 1702/1724] update chinese translation --- config/ConfigFormUnit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 18f267c..e203af5 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -184,13 +184,13 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"一些着色器只有在启用缩放时才有效。\n\n"; + L"一些着色器只有在启用放大时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须启用缩放才能使此设置生效。\n\n"; + L"必须启用放大才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用缩放,请将显示方式设置为“无边框” \n" + L"要启用放大,请将显示方式设置为“无边框” \n" "或“拉伸至全屏”。对于“窗口化”, \n" "你必须调整窗口大小或将窗口开启最大化。"; From a753a857879eb0c46c199e9bd60b195ba17bb5fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:09:08 +0100 Subject: [PATCH 1703/1724] #364 allow to use custom shaders with HD 4000 for some games at least --- src/render_ogl.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index cf85022..d1ac27e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,8 +253,17 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - shader_path[0] = 0; - g_config.shader[0] = 0; + /* First time compiling the shader works, second time fails */ + static BOOL once; + if (!once) + { + once = TRUE; + } + else + { + shader_path[0] = 0; + g_config.shader[0] = 0; + } } /* detect common upscaling shaders and disable them if no upscaling is required */ From f4b97bac8f3f05fc03f521296241334a1e758dda Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:37:15 +0100 Subject: [PATCH 1704/1724] Revert "#364 allow to use custom shaders with HD 4000 for some games at least" This reverts commit a753a857879eb0c46c199e9bd60b195ba17bb5fe. --- src/render_ogl.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index d1ac27e..cf85022 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,17 +253,8 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - /* First time compiling the shader works, second time fails */ - static BOOL once; - if (!once) - { - once = TRUE; - } - else - { - shader_path[0] = 0; - g_config.shader[0] = 0; - } + shader_path[0] = 0; + g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From 1dc51c072c81367d640d22bec251fb474167ee74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:37:52 +0100 Subject: [PATCH 1705/1724] #380 disable Intel HD 4000 workaround for now --- src/render_ogl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index cf85022..aae1d34 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,8 +253,8 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - shader_path[0] = 0; - g_config.shader[0] = 0; + //shader_path[0] = 0; + //g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From e11cc2f0d33845f7c5b7420aed4565606ba85158 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 09:31:16 +0100 Subject: [PATCH 1706/1724] Enable low FPS fix for newer versions of windows as well --- src/dd.c | 2 +- src/dllmain.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 0e58170..b9e5b12 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1828,7 +1828,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - if (!IsWine() && IsWindows11Version24H2()) + if (!IsWine() && IsWindows11Version24H2OrGreater()) { if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) SetProcessAffinityMask(proc, system_affinity); diff --git a/src/dllmain.c b/src/dllmain.c index 5e71859..8832177 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -186,7 +186,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_THREAD_ATTACH: { - if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2()) + if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2OrGreater()) { util_set_thread_affinity(GetCurrentThreadId()); } From dd7602b1d35f0d48e9c0803361e0a91383bbaa8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 08:31:20 +0100 Subject: [PATCH 1707/1724] #102 add polish translation by WaRzillA --- config/ConfigFormUnit.cpp | 87 +++++++++++++++++++++++++++ config/Resources/pl.png | Bin 0 -> 374 bytes config/cnc-ddraw config.cbproj | 12 +++- config/cnc-ddraw config_resources.rc | 1 + src/config.c | 2 +- 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 config/Resources/pl.png diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index e203af5..97e9c2c 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -774,6 +774,87 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Hint = upscaleHint + enableUpscaleHint; BoxingChk->Hint = upscaleHint + enableUpscaleHint; } + else if (lang == "polish" || (lang == "auto" && priID == LANG_POLISH)) { + LanguageImg->Visible = true; + + /* -polish - made by WaRzillA @ github */ + + ConfigForm->Caption = L"Konfiguracja cnc-ddraw"; + DisplayBtn->Caption = L"Ustawienia wyświetlania"; + AdvancedBtn->Caption = L"Zaawansowane ustawienia"; + HotkeyBtn->Caption = L"Ustawienia skrótów klawiszowych"; + CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; + RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; + PresentationLbl->Caption = L"Prezentacja"; + MaintasLbl->Caption = L"Zachowaj proporcje obrazu"; + VsyncLbl->Caption = L"Włącz VSync"; + AdjmouseLbl->Caption = L"Dostosuj czułość myszy"; + DevmodeLbl->Caption = L"Zablokuj kursor w oknie/na ekranie"; + RendererLbl->Caption = L"Silnik renderowania"; + BorderLbl->Caption = L"Pokaż ramki okna w trybie okienkowym"; + SavesettingsLbl->Caption = L"Zapamiętaj pozycję i rozmiar okna"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Ogranicz liczbę klatek na sekundę"; + BoxingLbl->Caption = L"Włącz windowboxing / integer scaling "; + ToggleWindowedLbl->Caption = L"Przełącz na tryb okienkowy"; + MaximizeWindowLbl->Caption = L"Maksymalizuj okno"; + UnlockCursor1Lbl->Caption = L"Odblokuj kursor 1"; + UnlockCursor2Lbl->Caption = L"Odblokuj kursor 2"; + ScreenshotLbl->Caption = L"Zrzut ekranu"; + MaxgameticksLbl->Caption = L"Ogranicz prędkość gry"; + NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab"; + ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu"; + MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie na Freesync/G-Sync"; + SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem"; + NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Automatyczny", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Pełny ekran", NULL); + PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL); + PresentationCbx->AddItem(L"Bezramkowy", NULL); + PresentationCbx->AddItem(L"Okienkowy", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Bez limitu", NULL); + MaxgameticksCbx->AddItem(L"Synchronizacja z odświeżaniem monitora", NULL); + MaxgameticksCbx->AddItem(L"Symulacja monitora 60 Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"500 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"250 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"125 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"60 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"30 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"25 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"15 tików na sekundę", NULL); + + System::UnicodeString shaderHint = + L"Niektóre shadery działają tylko wtedy, gdy włączone jest skalowanie. \n\n"; + + System::UnicodeString upscaleHint = + L"Skalowanie musi być włączone, aby ta opcja działała. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Aby włączyć skalowanie, ustaw prezentację na tryb 'Bezramkowy' \n" + "lub 'Pełny ekran z upscalingiem'. Dla prezentacji 'Okienkowy' \n" + "musisz zmienić rozmiar lub zmaksymalizować okno."; + + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; + } else { IsEnglish = true; @@ -826,6 +907,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_POLISH) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_PL"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } diff --git a/config/Resources/pl.png b/config/Resources/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 GIT binary patch literal 374 zcmV-+0g3*JP)Ab?mv3iQ8Nu5A{|6C_|Nk>HFfjc`0biay0|+1% z2B@O{$c+Ek03##gzdwHf0*Hl3)etG5lK=vU1?W~rxN0!OqXDP`Ab?mH`1u+7`u;zA z_W#cxhChG)!_n{G|9=A+zrl>(AX#bYe+w4^1Q6Is4VEzI_51&? zUm!LT$@u9L&^Z7B1a=Zw2xL66B2?87%l|Mi00a<712fnG3~)u5+Wr7F{AKw27w8;- z00L=X`u&GNQW9*;Uxq&*os3{386YGO{rw9;K*az7#P}5)xp2gQ%0-g`0)PMm0MPYZ UsK>Njp#T5?07*qoM6N<$g4HXSwg3PC literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index b2de346..7792b8b 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -227,6 +227,10 @@ RCDATA PngImage_IT + + RCDATA + PngImage_PL + RCDATA PngImage_RU @@ -364,7 +368,7 @@ - cnc-ddraw_config.exe + cnc-ddraw config.exe true @@ -430,6 +434,12 @@ true + + + .\ + true + + 1 diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index 9d29fa1..b077d3a 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -4,6 +4,7 @@ PngImage_ES RCDATA "Resources\\ES.png" PngImage_FR RCDATA "Resources\\fr.png" PngImage_HU RCDATA "Resources\\hu.png" PngImage_IT RCDATA "Resources\\IT.png" +PngImage_PL RCDATA "Resources\\pl.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" PngImage_VN RCDATA "Resources\\VN.png" diff --git a/src/config.c b/src/config.c index 864b10b..d624aa9 100644 --- a/src/config.c +++ b/src/config.c @@ -373,7 +373,7 @@ static void cfg_create_ini() "; The following settings are for cnc-ddraw config.exe\n" "\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese, polish\n" "configlang=auto\n" "\n" "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" From c37f5b42843e5611c9c820e8c58cd9c3f483d456 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 08:37:39 +0100 Subject: [PATCH 1708/1724] update polish translation --- config/ConfigFormUnit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 97e9c2c..2dfee0d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -781,8 +781,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Konfiguracja cnc-ddraw"; DisplayBtn->Caption = L"Ustawienia wyświetlania"; - AdvancedBtn->Caption = L"Zaawansowane ustawienia"; - HotkeyBtn->Caption = L"Ustawienia skrótów klawiszowych"; + AdvancedBtn->Caption = L"Ustawienia zaawansowane"; + HotkeyBtn->Caption = L"Skróty klawiaturowe"; CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; PresentationLbl->Caption = L"Prezentacja"; From 3115122074cbc4c0f43c24bba336b9c8f0729b58 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 09:46:48 +0100 Subject: [PATCH 1709/1724] update polish translation --- config/ConfigFormUnit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 2dfee0d..7cad46f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -785,7 +785,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) HotkeyBtn->Caption = L"Skróty klawiaturowe"; CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; - PresentationLbl->Caption = L"Prezentacja"; + PresentationLbl->Caption = L"Tryb wyświetlania"; MaintasLbl->Caption = L"Zachowaj proporcje obrazu"; VsyncLbl->Caption = L"Włącz VSync"; AdjmouseLbl->Caption = L"Dostosuj czułość myszy"; @@ -804,7 +804,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksLbl->Caption = L"Ogranicz prędkość gry"; NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab"; ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu"; - MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie na Freesync/G-Sync"; + MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie Freesync/G-Sync"; SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem"; NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu"; @@ -817,8 +817,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"Pełny ekran", NULL); PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL); - PresentationCbx->AddItem(L"Bezramkowy", NULL); - PresentationCbx->AddItem(L"Okienkowy", NULL); + PresentationCbx->AddItem(L"Tryb bezramkowy", NULL); + PresentationCbx->AddItem(L"Tryb okienkowy", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"Bez limitu", NULL); @@ -840,8 +840,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Skalowanie musi być włączone, aby ta opcja działała. \n\n"; System::UnicodeString enableUpscaleHint = - L"Aby włączyć skalowanie, ustaw prezentację na tryb 'Bezramkowy' \n" - "lub 'Pełny ekran z upscalingiem'. Dla prezentacji 'Okienkowy' \n" + L"Aby włączyć skalowanie, ustaw tryb wyświetlania na 'Tryb bezramkowy' \n" + "lub 'Pełny ekran z upscalingiem'. Dla 'Tryb okienkowy' \n" "musisz zmienić rozmiar lub zmaksymalizować okno."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; From d45f35ab57eed27174c4f755043a6485961c7eab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 04:47:38 +0100 Subject: [PATCH 1710/1724] #382 Fix colorkey issues in Sanitarium --- src/ddsurface.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 4fd92c1..8d68052 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -909,6 +909,11 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { + if (!(This->flags & DDSD_CKSRCBLT)) + { + return DDERR_NOCOLORKEY; + } + if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) { TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); From f4325a73f52b731750a301e02a0ea13c5ac9fa05 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:44:12 +0100 Subject: [PATCH 1711/1724] #383 add support for Dark Colony --- build.cmd | 2 +- inc/config.h | 1 + inc/dllmain.h | 1 + src/config.c | 6 ++++++ src/dllmain.c | 5 +++++ src/winapi_hooks.c | 8 ++++++++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 801abe4..8f1fdbb 100644 --- a/build.cmd +++ b/build.cmd @@ -9,7 +9,7 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% -make clean + make _WIN32_WINNT=0x0400 pause diff --git a/inc/config.h b/inc/config.h index a353aa8..e15bece 100644 --- a/inc/config.h +++ b/inc/config.h @@ -106,6 +106,7 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; + BOOL darkcolony_hack; } CNCDDRAWCONFIG; diff --git a/inc/dllmain.h b/inc/dllmain.h index f7e028b..13039f8 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -31,6 +31,7 @@ typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) #define SetThreadExecutionState(a) +#define DisableProcessWindowsGhosting() #endif #endif diff --git a/src/config.c b/src/config.c index d624aa9..51e0814 100644 --- a/src/config.c +++ b/src/config.c @@ -116,6 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GET_BOOL(g_config.darkcolony_hack, "darkcolony_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -874,6 +875,11 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; Dark Colony\n" + "[dc16]\n" + "maxgameticks=30\n" + "darkcolony_hack=true\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" diff --git a/src/dllmain.c b/src/dllmain.c index 8832177..e596372 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -57,6 +57,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } + if (g_config.darkcolony_hack) + { + DisableProcessWindowsGhosting(); + } + char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c0705f7..c44cd3a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2046,6 +2046,14 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } + /* Dark Colony */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Merc Direct Draw Driver") == 0 && + lpWindowName && _strcmpi(lpWindowName, "Direct Draw Driver") == 0 && + !dwExStyle) + { + dwExStyle |= WS_EX_APPWINDOW; + } + /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && lpWindowName && strstr(lpWindowName, "FALLOUT")) From 49a0758602016de1d347c41f9a6b1dcfc5d91cf3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:44:25 +0100 Subject: [PATCH 1712/1724] revert change --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 8f1fdbb..801abe4 100644 --- a/build.cmd +++ b/build.cmd @@ -9,7 +9,7 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% - +make clean make _WIN32_WINNT=0x0400 pause From 8841285ba9eb188551824b00eb64f5d5f5a39df7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:49:54 +0100 Subject: [PATCH 1713/1724] update Dark Colony preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 51e0814..a34d0eb 100644 --- a/src/config.c +++ b/src/config.c @@ -879,6 +879,7 @@ static void cfg_create_ini() "[dc16]\n" "maxgameticks=30\n" "darkcolony_hack=true\n" + "hook_peekmessage=true\n" "\n" "; Divine Divinity\n" "[div]\n" From ab2d86f983ecd8f7d015b66ff51834250ace95ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 06:29:04 +0100 Subject: [PATCH 1714/1724] don't use DisableProcessWindowsGhosting, it got too bad side-effects --- inc/dllmain.h | 1 - src/dllmain.c | 5 ----- src/winapi_hooks.c | 8 ++++++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/inc/dllmain.h b/inc/dllmain.h index 13039f8..f7e028b 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -31,7 +31,6 @@ typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) #define SetThreadExecutionState(a) -#define DisableProcessWindowsGhosting() #endif #endif diff --git a/src/dllmain.c b/src/dllmain.c index e596372..8832177 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -57,11 +57,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } - if (g_config.darkcolony_hack) - { - DisableProcessWindowsGhosting(); - } - char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c44cd3a..33655c1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -780,6 +780,14 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_config.darkcolony_hack && !hWnd) + { + hWnd = g_ddraw.hwnd; + + MSG msg; + real_PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + } + if (g_config.limiter_type == LIMIT_PEEKMESSAGE && g_ddraw.ticks_limiter.tick_length > 0 && InterlockedExchange(&g_ddraw.render.screen_updated, FALSE)) From cd080f10c4691ea9cb70f3de5b316d335c2802ba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:39:46 +0100 Subject: [PATCH 1715/1724] add preset for Seven Games of the Soul --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a34d0eb..7a14730 100644 --- a/src/config.c +++ b/src/config.c @@ -1619,6 +1619,10 @@ static void cfg_create_ini() "fake_mode=352x240x32\n" "fix_not_responding=true\n" "\n" + "; Seven Games of the Soul\n" + "[faust]\n" + "maxgameticks=25\n" + "\n" "; Swarog\n" "[Swarog]\n" "maxfps=60\n" From dff8fc52f1db5b397c744ec977b89bd67296d083 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:41:08 +0100 Subject: [PATCH 1716/1724] update Atlantis preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 7a14730..21b3cfb 100644 --- a/src/config.c +++ b/src/config.c @@ -535,7 +535,7 @@ static void cfg_create_ini() "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "center_cursor_fix=true\n" "\n" "; Airline Tycoon Deluxe\n" From e4b0fc3f9dfc7a4a7280134cd51b2ca4a62d7a62 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:55:11 +0100 Subject: [PATCH 1717/1724] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0b59da4..5e6875b 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police +- Gateway (Remake) - Geneforge - Gilbert Goodmate And The Mushroom Of Phungoria - Gorasul: The Legacy of the Dragon From 30e6010a8875f7e1081733cb06ef27f68c9b0394 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 Jan 2025 08:53:59 +0100 Subject: [PATCH 1718/1724] revert "disable Vsync checkbox in case we are in borderelss or windowed mode to avoid unnecessary input lag" --- config/ConfigFormUnit.cpp | 34 ---------------------------------- config/ConfigFormUnit.h | 1 - 2 files changed, 35 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 7cad46f..7d40a88 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -1286,11 +1285,6 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) delete ini; - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - Initialized = true; } @@ -1712,31 +1706,8 @@ bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValu return s == "true" || s == "yes" || s == "1"; } -bool TConfigForm::VsyncAllowed() -{ - if (GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) { - return true; - } - - if (!IsWindows8OrGreater()) { - return true; - } - - if (NonexclusiveChk->State == tssOff && - (PresentationCbx->ItemIndex == 0 || PresentationCbx->ItemIndex == 1)) { - return true; - } - - return false; -} - void __fastcall TConfigForm::PresentationCbxChange(TObject *Sender) { - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - SaveSettings(); } @@ -1845,11 +1816,6 @@ void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) { - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - SaveSettings(); } diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8a46bf8..8a8a14c 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,7 +118,6 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); - bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From 14336e8d39a0361491bcfd50e3dc9d50d26bbacc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 05:32:07 +0100 Subject: [PATCH 1719/1724] add guard lines on both on top and bottom of the buffer --- src/ddsurface.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8d68052..c6d3350 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,17 +1553,17 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); + DWORD map_offset = dst_surface->pitch * g_config.guard_lines; + dst_surface->mapping = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, - bmp_size + 256, + bmp_size + 256 + map_offset, NULL); - DWORD map_offset = 0; - if (dst_surface->mapping) { LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); From 3467a05eaa145783feb513499665b3f591fadfa7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:23:29 +0100 Subject: [PATCH 1720/1724] add preset for Arcatera the Dark Brotherhood --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 21b3cfb..43e34c0 100644 --- a/src/config.c +++ b/src/config.c @@ -404,6 +404,12 @@ static void cfg_create_ini() "[Atrox]\n" "nonexclusive=true\n" "\n" + "; Arcatera the Dark Brotherhood\n" + "[darksun]\n" + "maxgameticks=60\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" "; Atomic Bomberman\n" "[BM]\n" "maxgameticks=60\n" From f6d105bb9ec4caa551522b7771cf3962805ff706 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:29:39 +0100 Subject: [PATCH 1721/1724] add preset for Dark Secret of Africa --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 43e34c0..36b756a 100644 --- a/src/config.c +++ b/src/config.c @@ -902,6 +902,12 @@ static void cfg_create_ini() "noactivateapp=true\n" "limiter_type=2\n" "\n" + "; Dark Secret of Africa\n" + "[Game/5]\n" + "checkfile=.\\CONFIG.CFG\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" "maxgameticks=60\n" From 2c2fd7feb687c8d0fd9b39411c08b829db6b3c46 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:29:50 +0100 Subject: [PATCH 1722/1724] update supported games list --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5e6875b..7485601 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arcatera the Dark Brotherhood - Army Men 2 - Army Men: Air Tactics - Army Men: Toys in Space @@ -146,6 +147,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth - Dark Reign: The Future of War +- Dark Secret of Africa - Day Of The Tentacle - Daytona - Daytona USA (Sega - 1996) @@ -422,6 +424,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sudden Strike 2 - Superbike 2000 - Swarog +- The Jungle Book Groove Party - The Curse Of Monkey Island - The Dig - The Last Express From 6ec7c0c701e17bd3737d976d86bdb39cf7192ed7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 08:03:09 +0100 Subject: [PATCH 1723/1724] add workaround for CreateDIBSection offset bug --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c6d3350..e52b3fb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,7 +1553,7 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); - DWORD map_offset = dst_surface->pitch * g_config.guard_lines; + DWORD map_offset = 65280; // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); dst_surface->mapping = CreateFileMappingA( From 33f2b91c9915ae886f7c8847bfb907cf0fb5b649 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 09:27:26 +0100 Subject: [PATCH 1724/1724] tweak workaound for CreateDIBSection offset bug --- src/ddsurface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index e52b3fb..96d69de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,7 +1553,8 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); - DWORD map_offset = 65280; // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); + // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); + DWORD map_offset = min(65280, dst_surface->pitch * g_config.guard_lines); dst_surface->mapping = CreateFileMappingA(