1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

align and tweak some more

This commit is contained in:
FunkyFr3sh 2020-10-13 11:29:52 +02:00
parent b417da74f6
commit be79bb8c8b
8 changed files with 75 additions and 30 deletions

View File

@ -5,6 +5,7 @@
#include <windows.h>
extern BOOL GameHandlesClose;
extern void* g_fake_primary_surface_export;
extern HMODULE g_ddraw_module;
typedef enum PROCESS_DPI_AWARENESS {

View File

@ -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));

View File

@ -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;
}

View File

@ -1,5 +1,6 @@
#include <windows.h>
#include <stdio.h>
#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)
{

View File

@ -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, ...)

View File

@ -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;

View File

@ -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);

View File

@ -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);