diff --git a/client/src/config.c b/client/src/config.c index cd5871dd..296a2504 100644 --- a/client/src/config.c +++ b/client/src/config.c @@ -163,6 +163,13 @@ static struct Option options[] = .type = OPTION_TYPE_BOOL, .value.x_bool = false, }, + { + .module = "win", + .name = "intUpscale", + .description = "Allow only integer upscaling", + .type = OPTION_TYPE_BOOL, + .value.x_bool = false, + }, { .module = "win", .name = "shrinkOnUpscale", @@ -603,6 +610,7 @@ bool config_load(int argc, char * argv[]) g_params.keepAspect = option_get_bool ("win", "keepAspect" ); g_params.forceAspect = option_get_bool ("win", "forceAspect" ); g_params.dontUpscale = option_get_bool ("win", "dontUpscale" ); + g_params.intUpscale = option_get_bool ("win", "intUpscale" ); g_params.shrinkOnUpscale = option_get_bool ("win", "shrinkOnUpscale"); g_params.borderless = option_get_bool ("win", "borderless" ); g_params.fullscreen = option_get_bool ("win", "fullScreen" ); diff --git a/client/src/core.c b/client/src/core.c index eaf3fd7a..8a6ccdd7 100644 --- a/client/src/core.c +++ b/client/src/core.c @@ -223,6 +223,20 @@ void core_updatePositionInfo(void) g_state.dstRect.y = g_state.windowCY - srcH / 2; } else + if (g_params.intUpscale && + srcW <= g_state.windowW && + srcH <= g_state.windowH) + { + force = false; + const int scale = min( + floor(g_state.windowW / srcW), + floor(g_state.windowH / srcH)); + g_state.dstRect.w = srcW * scale; + g_state.dstRect.h = srcH * scale; + g_state.dstRect.x = g_state.windowCX - g_state.dstRect.w / 2; + g_state.dstRect.y = g_state.windowCY - g_state.dstRect.h / 2; + } + else if ((int)(wndAspect * 1000) == (int)(srcAspect * 1000)) { force = false; diff --git a/client/src/main.h b/client/src/main.h index b2ba967a..ae05fc63 100644 --- a/client/src/main.h +++ b/client/src/main.h @@ -148,6 +148,7 @@ struct AppParams bool keepAspect; bool forceAspect; bool dontUpscale; + bool intUpscale; bool shrinkOnUpscale; bool borderless; bool fullscreen;