diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index cd80fc972a..190617e9db 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -4029,13 +4029,13 @@ STR_5723 :Heavy Rain STR_5724 :Thunderstorm STR_5725 :{BLACK}Force weather: STR_5726 :{SMALLFONT}{BLACK}Sets the current weather in park - STR_5727 :Scaling quality STR_5728 :Requires hardware display option STR_5729 :{SMALLFONT}{BLACK}Requires hardware display option STR_5730 :Nearest neighbour STR_5731 :Linear STR_5732 :Anisotropic +STR_5733 :Use NN scaling at integer scales ############# # Scenarios # diff --git a/src/config.c b/src/config.c index 3b728e1e78..3aee605f8f 100644 --- a/src/config.c +++ b/src/config.c @@ -206,6 +206,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, window_scale), "window_scale", CONFIG_VALUE_TYPE_FLOAT, { .value_float = 1.0f }, NULL }, { offsetof(general_configuration, scale_quality), "scale_quality", CONFIG_VALUE_TYPE_UINT8, 1, NULL }, + { offsetof(general_configuration, use_nn_at_integer_scales), "use_nn_at_integer_scales", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, show_fps), "show_fps", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, trap_cursor), "trap_cursor", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, auto_open_shops), "auto_open_shops", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, diff --git a/src/config.h b/src/config.h index 7f46ebb1f7..b94fcb2b22 100644 --- a/src/config.h +++ b/src/config.h @@ -178,6 +178,7 @@ typedef struct { uint8 steam_overlay_pause; float window_scale; uint8 scale_quality; + uint8 use_nn_at_integer_scales; uint8 show_fps; uint8 trap_cursor; uint8 auto_open_shops; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 0eb2916542..f88d2670d0 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2328,6 +2328,7 @@ enum { STR_SCALING_QUALITY_NN = 5730, STR_SCALING_QUALITY_LINEAR = 5731, STR_SCALING_QUALITY_ANISOTROPIC = 5732, + STR_USE_NN_AT_INTEGER_SCALE = 5733, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/platform/shared.c b/src/platform/shared.c index 77904f7031..ac6784081e 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -360,9 +360,13 @@ static void platform_resize(int width, int height) */ void platform_trigger_resize() { - char scale_quality[4]; // just to make sure we can hold whole uint8 - snprintf(scale_quality, sizeof(scale_quality), "%u", gConfigGeneral.scale_quality); - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scale_quality); + char scale_quality_buffer[4]; // just to make sure we can hold whole uint8 + uint8 scale_quality = gConfigGeneral.scale_quality; + if (gConfigGeneral.use_nn_at_integer_scales && gConfigGeneral.window_scale == floor(gConfigGeneral.window_scale)) { + scale_quality = 0; + } + snprintf(scale_quality_buffer, sizeof(scale_quality_buffer), "%u", scale_quality); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scale_quality_buffer); int w, h; SDL_GetWindowSize(gWindow, &w, &h); diff --git a/src/windows/options.c b/src/windows/options.c index 8496764fb2..32f05912a2 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -88,6 +88,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_SCALE_DOWN, WIDX_SCALE_QUALITY, WIDX_SCALE_QUALITY_DROPDOWN, + WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX, WIDX_RENDERING_GROUP, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, @@ -167,7 +168,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 317 +#define WH 332 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -183,7 +184,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { static rct_widget window_options_display_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_GROUPBOX, 1, 5, 304, 53, 190, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group + { WWT_GROUPBOX, 1, 5, 304, 53, 205, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen @@ -198,8 +199,9 @@ static rct_widget window_options_display_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, 288, 298, 165, 169, STR_NUMERIC_DOWN, STR_NONE }, // scale spinner down { WWT_DROPDOWN, 1, 155, 299, 174, 185, STR_NONE, STR_REQUIRES_HW_DISPLAY }, // scaling quality hint { WWT_DROPDOWN_BUTTON, 1, 288, 298, 175, 184, STR_DROPDOWN_GLYPH, STR_REQUIRES_HW_DISPLAY_TIP }, + { WWT_CHECKBOX, 1, 10, 290, 189, 200, STR_USE_NN_AT_INTEGER_SCALE, STR_NONE }, // use nn scaling at integer scales -#define FRAME_RENDERING_START 194 +#define FRAME_RENDERING_START 209 { WWT_GROUPBOX, 1, 5, 304, FRAME_RENDERING_START + 0, FRAME_RENDERING_START + 91, STR_RENDERING_GROUP, STR_NONE }, // Rendering group { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 15, FRAME_RENDERING_START + 26, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 30, FRAME_RENDERING_START + 41, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines @@ -392,9 +394,10 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_SCALE_DOWN) | (1 << WIDX_SCALE_QUALITY) | (1 << WIDX_SCALE_QUALITY_DROPDOWN) | + (1 << WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | - (1 << WIDX_DAY_NIGHT_CHECKBOX) | + (1u << WIDX_DAY_NIGHT_CHECKBOX) | (1u << WIDX_UPPER_CASE_BANNERS_CHECKBOX), MAIN_OPTIONS_ENABLED_WIDGETS | @@ -564,6 +567,12 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX: + gConfigGeneral.use_nn_at_integer_scales ^= 1; + config_save_default(); + gfx_invalidate_screen(); + platform_trigger_resize(); + break; case WIDX_DAY_NIGHT_CHECKBOX: gConfigGeneral.day_night_cycle ^= 1; config_save_default(); @@ -1277,6 +1286,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_SHOW_FPS_CHECKBOX, gConfigGeneral.show_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); widget_set_checkbox_value(w, WIDX_STEAM_OVERLAY_PAUSE, gConfigGeneral.steam_overlay_pause); + widget_set_checkbox_value(w, WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX, gConfigGeneral.use_nn_at_integer_scales); widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners);