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:
parent
b417da74f6
commit
be79bb8c8b
@ -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 {
|
||||
|
27
src/config.c
27
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));
|
||||
|
42
src/dd.c
42
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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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, ...)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user