From be79bb8c8bdb0b22b7e84a85133e98797cbf3633 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Oct 2020 11:29:52 +0200 Subject: [PATCH] align and tweak some more --- inc/dllmain.h | 1 + src/config.c | 27 +++++++++++++++++---------- src/dd.c | 42 ++++++++++++++++++++++++++++++++++-------- src/ddsurface.c | 12 ++++++------ src/debug.c | 8 ++++---- src/dllmain.c | 3 +++ src/utils.c | 8 ++++++++ src/winapi_hooks.c | 4 ++-- 8 files changed, 75 insertions(+), 30 deletions(-) diff --git a/inc/dllmain.h b/inc/dllmain.h index 78a2ff6..58a90ca 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -5,6 +5,7 @@ #include extern BOOL GameHandlesClose; +extern void* g_fake_primary_surface_export; extern HMODULE g_ddraw_module; typedef enum PROCESS_DPI_AWARENESS { diff --git a/src/config.c b/src/config.c index b059801..839e531 100644 --- a/src/config.c +++ b/src/config.c @@ -11,9 +11,9 @@ #include "debug.h" -static BOOL cfg_get_bool(LPCSTR key, BOOL defaultValue); -static int cfg_get_int(LPCSTR key, int defaultValue); -static DWORD cfg_get_string(LPCSTR key, LPCSTR defaultValue, LPSTR outString, DWORD outSize); +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 void cfg_create_ini(); cnc_ddraw_config g_config = @@ -71,6 +71,7 @@ void cfg_load() //can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency int max_ticks = cfg_get_int("maxgameticks", 0); + if (max_ticks > 0 && max_ticks <= 1000) { if (g_ddraw->accurate_timers) @@ -93,10 +94,14 @@ void cfg_load() } if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE))) + { g_config.window_rect.left = g_config.window_rect.top = -32000; + } if (!(g_ddraw->handlemouse = cfg_get_bool("handlemouse", TRUE))) + { g_ddraw->adjmouse = TRUE; + } if (cfg_get_bool("singlecpu", TRUE)) { @@ -114,7 +119,9 @@ void cfg_load() 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", "", g_ddraw->shader, sizeof(g_ddraw->shader)); @@ -498,10 +505,10 @@ static void cfg_create_ini() } } -static DWORD cfg_get_string(LPCSTR key, LPCSTR defaultValue, LPSTR outString, DWORD outSize) +static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) { DWORD s = GetPrivateProfileStringA( - g_config.process_file_name, key, "", outString, outSize, g_config.ini_path); + g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); if (s > 0) { @@ -517,21 +524,21 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR defaultValue, LPSTR outString, DW return s; } - return GetPrivateProfileStringA("ddraw", key, defaultValue, outString, outSize, g_config.ini_path); + return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); } -static BOOL cfg_get_bool(LPCSTR key, BOOL defaultValue) +static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) { char value[8]; - cfg_get_string(key, defaultValue ? "Yes" : "No", value, sizeof(value)); + cfg_get_string(key, default_value ? "Yes" : "No", value, sizeof(value)); return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); } -static int cfg_get_int(LPCSTR key, int defaultValue) +static int cfg_get_int(LPCSTR key, int default_value) { char def_value[16]; - _snprintf(def_value, sizeof(def_value), "%d", defaultValue); + _snprintf(def_value, sizeof(def_value), "%d", default_value); char value[16]; cfg_get_string(key, def_value, value, sizeof(value)); diff --git a/src/dd.c b/src/dd.c index ed67f60..f08d5f7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -56,6 +56,7 @@ HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVO memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); i = 0; + while (EnumDisplaySettings(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && @@ -91,6 +92,7 @@ HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVO break; } } + memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); i++; @@ -264,6 +266,7 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) 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->render.bpp) { g_ddraw->render.mode.dmFields |= DM_BITSPERPEL; @@ -300,7 +303,7 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) BOOL border = g_ddraw->border; - if(g_ddraw->fullscreen) + if (g_ddraw->fullscreen) { g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; @@ -318,11 +321,11 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) } } - if(g_ddraw->render.width < g_ddraw->width) + if (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; } @@ -431,12 +434,16 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) } } - if (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main) + if (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main) + { g_ddraw->render.height++; + } if (!g_ddraw->handlemouse) + { g_ddraw->boxing = maintas = FALSE; - + } + g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = g_ddraw->render.height; g_ddraw->render.viewport.x = 0; @@ -505,15 +512,19 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) 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); + 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); real_MoveWindow(g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); BOOL d3d9_active = FALSE; + if (g_ddraw->renderer == d3d9_render_main) { d3d9_active = d3d9_create(); + if (!d3d9_active) { d3d9_release(); @@ -535,9 +546,11 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) } BOOL d3d9_active = FALSE; + if (g_ddraw->renderer == d3d9_render_main) { d3d9_active = d3d9_create(); + if (!d3d9_active) { d3d9_release(); @@ -554,7 +567,9 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) } if (g_ddraw->wine) + { real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); + } real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, g_ddraw->render.width, g_ddraw->render.height, SWP_SHOWWINDOW); g_ddraw->last_set_window_pos_tick = timeGetTime(); @@ -562,12 +577,12 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) mouse_lock(); } - 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) { RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); } - 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); @@ -636,7 +651,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw->iscnc1 = strcmp(g_ddraw->title, "Command & Conquer") == 0; if (g_ddraw->vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1) + { g_ddraw->vhack = 0; + } } return DD_OK; @@ -668,19 +685,26 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE h) else { static DWORD next_game_tick; + if (!next_game_tick) { next_game_tick = timeGetTime(); return DD_OK; } + 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) + { next_game_tick = tick_count; + } else + { Sleep(sleep_time); + } } return DD_OK; @@ -723,7 +747,7 @@ 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; @@ -754,8 +778,10 @@ ULONG dd_Release() /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + HeapFree(GetProcessHeap(), 0, g_ddraw); g_ddraw = NULL; + return 0; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 2e3311b..818de72 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1,5 +1,6 @@ #include #include +#include "dllmain.h" #include "dd.h" #include "hook.h" #include "ddsurface.h" @@ -11,8 +12,6 @@ #include "utils.h" -void *g_fake_primary_surface_export; // hack for some warcraft II tools - HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWSURFACE lpDDSurface) { IDirectDrawSurface_AddRef(lpDDSurface); @@ -713,6 +712,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWPALETTE lpDDPal HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect) { HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; + if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb) @@ -831,11 +831,11 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 16 ? BI_BITFIELDS : BI_RGB; - WORD c_clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - if (c_clr_bits < 24) - dst_surface->bmi->bmiHeader.biClrUsed = (1 << c_clr_bits); + 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.biSizeImage = ((dst_surface->width * c_clr_bits + 31) & ~31) / 8 * dst_surface->height; + dst_surface->bmi->bmiHeader.biSizeImage = ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { diff --git a/src/debug.c b/src/debug.c index 085f4d6..d882df1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -59,11 +59,11 @@ double dbg_counter_stop() void dbg_debug_string(const char *format, ...) { - va_list args; - va_start(args, format); + va_list args; + va_start(args, format); char buffer[512] = { 0 }; - _vsnprintf(buffer, sizeof(buffer), format, args); - OutputDebugStringA(buffer); + _vsnprintf(buffer, sizeof(buffer), format, args); + OutputDebugStringA(buffer); } int dbg_printf(const char *fmt, ...) diff --git a/src/dllmain.c b/src/dllmain.c index 1fc519c..634875f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -17,6 +17,9 @@ DWORD AmdPowerXpressRequestHighPerformance = 1; // export for cncnet cnc games BOOL GameHandlesClose; +// export for some warcraft II tools +void *g_fake_primary_surface_export; + HMODULE g_ddraw_module; diff --git a/src/utils.c b/src/utils.c index 8427d81..e481d46 100644 --- a/src/utils.c +++ b/src/utils.c @@ -89,17 +89,25 @@ void util_update_bnet_pos(int new_x, int new_y) if (rc.bottom - rc.top <= g_ddraw->height) { if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y)) + { adj_y = mainrc.bottom - rc.bottom; + } else if (rc.top < mainrc.top && abs(mainrc.top - rc.top) > abs(adj_y)) + { adj_y = mainrc.top - rc.top; + } } if (rc.right - rc.left <= g_ddraw->width) { if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x)) + { adj_x = mainrc.right - rc.right; + } else if (rc.left < mainrc.left && abs(mainrc.left - rc.left) > abs(adj_x)) + { adj_x = mainrc.left - rc.left; + } } hwnd = FindWindowEx(HWND_DESKTOP, hwnd, "SDlgDialog", NULL); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f33cd0c..a6c26d6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -231,9 +231,9 @@ int WINAPI fake_GetSystemMetrics(int nIndex) BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { - UINT reqFlags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER; + UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER; - if (g_ddraw && g_ddraw->hwnd == hWnd && (uFlags & reqFlags) != reqFlags) + if (g_ddraw && g_ddraw->hwnd == hWnd && (uFlags & req_flags) != req_flags) return TRUE; return real_SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags);