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

move all ini settings to c_config

This commit is contained in:
FunkyFr3sh 2023-09-22 00:38:42 +02:00
parent 5ebda1fec7
commit fa8cdbd0df
18 changed files with 523 additions and 488 deletions

View File

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

View File

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

View File

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

View File

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

225
src/dd.c
View File

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

View File

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

View File

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

View File

@ -104,6 +104,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
set_aware();
}
cfg_load();
timeBeginPeriod(1);
hook_init(TRUE);
break;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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