From 9cdae2d1e2b5e58bcec1e7317fd41d4405fd0524 Mon Sep 17 00:00:00 2001 From: Tom Parsons <43040194+tombomp@users.noreply.github.com> Date: Fri, 21 Aug 2020 03:32:56 +0100 Subject: [PATCH] Fix #12401: Refactor SCALE_QUALITY to use strong enum (#12673) --- src/openrct2-ui/UiContext.cpp | 14 +++++++------- .../engines/HardwareDisplayDrawingEngine.cpp | 8 ++++---- .../drawing/engines/opengl/OpenGLDrawingEngine.cpp | 4 ++-- src/openrct2-ui/windows/Options.cpp | 8 ++++---- src/openrct2/config/Config.cpp | 13 +++++++------ src/openrct2/config/Config.h | 11 ++++++----- src/openrct2/ui/DummyUiContext.cpp | 5 +++-- src/openrct2/ui/UiContext.h | 3 ++- 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index 20fe56f6a6..f56872696c 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -72,7 +72,7 @@ private: SDL_Window* _window = nullptr; int32_t _width = 0; int32_t _height = 0; - int32_t _scaleQuality = 0; + ScaleQuality _scaleQuality = ScaleQuality::NearestNeighbour; std::vector _fsResolutions; @@ -155,7 +155,7 @@ public: return _height; } - int32_t GetScaleQuality() override + ScaleQuality GetScaleQuality() override { return _scaleQuality; } @@ -547,15 +547,15 @@ public: _scaleQuality = gConfigGeneral.scale_quality; if (gConfigGeneral.window_scale == std::floor(gConfigGeneral.window_scale)) { - _scaleQuality = SCALE_QUALITY_NN; + _scaleQuality = ScaleQuality::NearestNeighbour; } - int32_t scaleQuality = _scaleQuality; - if (_scaleQuality == SCALE_QUALITY_SMOOTH_NN) + ScaleQuality scaleQuality = _scaleQuality; + if (_scaleQuality == ScaleQuality::SmoothNearestNeighbour) { - scaleQuality = SCALE_QUALITY_LINEAR; + scaleQuality = ScaleQuality::Linear; } - snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", scaleQuality); + snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", static_cast(scaleQuality)); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaleQualityBuffer); int32_t width, height; diff --git a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp index c4cac9b592..8f0325938a 100644 --- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp @@ -115,10 +115,10 @@ public: } } - int32_t scaleQuality = GetContext()->GetUiContext()->GetScaleQuality(); - if (scaleQuality == SCALE_QUALITY_SMOOTH_NN) + ScaleQuality scaleQuality = GetContext()->GetUiContext()->GetScaleQuality(); + if (scaleQuality == ScaleQuality::SmoothNearestNeighbour) { - scaleQuality = SCALE_QUALITY_LINEAR; + scaleQuality = ScaleQuality::Linear; smoothNN = true; } else @@ -134,7 +134,7 @@ public: } char scaleQualityBuffer[4]; - snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", scaleQuality); + snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", static_cast(scaleQuality)); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); _screenTexture = SDL_CreateTexture(_sdlRenderer, pixelFormat, SDL_TEXTUREACCESS_STREAMING, width, height); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaleQualityBuffer); diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp index 8c84c6a483..80078d9e61 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -465,11 +465,11 @@ private: delete _smoothScaleFramebuffer; _smoothScaleFramebuffer = nullptr; } - if (GetContext()->GetUiContext()->GetScaleQuality() > 0) + if (GetContext()->GetUiContext()->GetScaleQuality() != ScaleQuality::NearestNeighbour) { _scaleFramebuffer = new OpenGLFramebuffer(_width, _height, false, false); } - if (GetContext()->GetUiContext()->GetScaleQuality() == SCALE_QUALITY_SMOOTH_NN) + if (GetContext()->GetUiContext()->GetScaleQuality() == ScaleQuality::SmoothNearestNeighbour) { uint32_t scale = std::ceil(gConfigGeneral.window_scale); _smoothScaleFramebuffer = new OpenGLFramebuffer(_width * scale, _height * scale, false, false); diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index cddb90f751..af5fa99339 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -1069,7 +1069,7 @@ static void window_options_mousedown(rct_window* w, rct_widgetindex widgetIndex, window_options_show_dropdown(w, widget, 2); // Note: offset by one to compensate for lack of NN option. - dropdown_set_checked(gConfigGeneral.scale_quality - 1, true); + dropdown_set_checked(static_cast(gConfigGeneral.scale_quality) - 1, true); break; } break; @@ -1367,9 +1367,9 @@ static void window_options_dropdown(rct_window* w, rct_widgetindex widgetIndex, break; case WIDX_SCALE_QUALITY_DROPDOWN: // Note: offset by one to compensate for lack of NN option. - if ((dropdownIndex + 1) != gConfigGeneral.scale_quality) + if (static_cast(dropdownIndex + 1) != gConfigGeneral.scale_quality) { - gConfigGeneral.scale_quality = static_cast(dropdownIndex) + 1; + gConfigGeneral.scale_quality = static_cast(dropdownIndex + 1); config_save_default(); gfx_invalidate_screen(); context_trigger_resize(); @@ -1667,7 +1667,7 @@ static void window_options_invalidate(rct_window* w) .fullscreen_mode]; window_options_display_widgets[WIDX_DRAWING_ENGINE].text = DrawingEngineStringIds[gConfigGeneral.drawing_engine]; window_options_display_widgets[WIDX_SCALE_QUALITY].text = window_options_scale_quality_names - [gConfigGeneral.scale_quality - 1]; + [static_cast(gConfigGeneral.scale_quality) - 1]; break; } diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index 198611764c..377273f1ec 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -93,10 +93,10 @@ namespace Config ConfigEnumEntry("FAHRENHEIT", TemperatureUnit::Fahrenheit), }); - static const auto Enum_ScaleQuality = ConfigEnum({ - ConfigEnumEntry("NEAREST_NEIGHBOUR", SCALE_QUALITY_NN), - ConfigEnumEntry("LINEAR", SCALE_QUALITY_LINEAR), - ConfigEnumEntry("SMOOTH_NEAREST_NEIGHBOUR", SCALE_QUALITY_SMOOTH_NN), + static const auto Enum_ScaleQuality = ConfigEnum({ + ConfigEnumEntry("NEAREST_NEIGHBOUR", ScaleQuality::NearestNeighbour), + ConfigEnumEntry("LINEAR", ScaleQuality::Linear), + ConfigEnumEntry("SMOOTH_NEAREST_NEIGHBOUR", ScaleQuality::SmoothNearestNeighbour), }); static const auto Enum_VirtualFloorStyle = ConfigEnum({ @@ -192,7 +192,8 @@ namespace Config model->allow_loading_with_incorrect_checksum = reader->GetBoolean("allow_loading_with_incorrect_checksum", true); model->steam_overlay_pause = reader->GetBoolean("steam_overlay_pause", true); model->window_scale = reader->GetFloat("window_scale", platform_get_default_scale()); - model->scale_quality = reader->GetEnum("scale_quality", SCALE_QUALITY_SMOOTH_NN, Enum_ScaleQuality); + model->scale_quality = reader->GetEnum( + "scale_quality", ScaleQuality::SmoothNearestNeighbour, Enum_ScaleQuality); model->show_fps = reader->GetBoolean("show_fps", false); model->multithreading = reader->GetBoolean("multi_threading", false); model->trap_cursor = reader->GetBoolean("trap_cursor", false); @@ -267,7 +268,7 @@ namespace Config writer->WriteBoolean("allow_loading_with_incorrect_checksum", model->allow_loading_with_incorrect_checksum); writer->WriteBoolean("steam_overlay_pause", model->steam_overlay_pause); writer->WriteFloat("window_scale", model->window_scale); - writer->WriteEnum("scale_quality", model->scale_quality, Enum_ScaleQuality); + writer->WriteEnum("scale_quality", model->scale_quality, Enum_ScaleQuality); writer->WriteBoolean("show_fps", model->show_fps); writer->WriteBoolean("multi_threading", model->multithreading); writer->WriteBoolean("trap_cursor", model->trap_cursor); diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index 23061b144d..6c97b7dfd4 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -17,6 +17,7 @@ enum class MeasurementFormat : int32_t; enum class TemperatureUnit : int32_t; +enum class ScaleQuality : int32_t; struct GeneralConfiguration { @@ -33,7 +34,7 @@ struct GeneralConfiguration int32_t fullscreen_height; float window_scale; int32_t drawing_engine; - int32_t scale_quality; + ScaleQuality scale_quality; bool uncap_fps; bool use_vsync; bool show_fps; @@ -216,11 +217,11 @@ enum class TemperatureUnit : int32_t Fahrenheit }; -enum SCALE_QUALITY +enum class ScaleQuality : int32_t { - SCALE_QUALITY_NN, - SCALE_QUALITY_LINEAR, - SCALE_QUALITY_SMOOTH_NN + NearestNeighbour, + Linear, + SmoothNearestNeighbour }; enum class MeasurementFormat : int32_t diff --git a/src/openrct2/ui/DummyUiContext.cpp b/src/openrct2/ui/DummyUiContext.cpp index c24d2850d7..cfc1529768 100644 --- a/src/openrct2/ui/DummyUiContext.cpp +++ b/src/openrct2/ui/DummyUiContext.cpp @@ -7,6 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include "../config/Config.h" #include "../drawing/X8DrawingEngine.h" #include "UiContext.h" #include "WindowManager.h" @@ -55,9 +56,9 @@ namespace OpenRCT2::Ui { return 0; } - int32_t GetScaleQuality() override + ScaleQuality GetScaleQuality() override { - return 0; + return ScaleQuality::NearestNeighbour; } void SetFullscreenMode(FULLSCREEN_MODE /*mode*/) override { diff --git a/src/openrct2/ui/UiContext.h b/src/openrct2/ui/UiContext.h index 4f5ded9393..39d3e00e2a 100644 --- a/src/openrct2/ui/UiContext.h +++ b/src/openrct2/ui/UiContext.h @@ -11,6 +11,7 @@ #include "../Context.h" #include "../common.h" +#include "../config/Config.h" #include "../interface/Cursors.h" #include @@ -102,7 +103,7 @@ namespace OpenRCT2 virtual void* GetWindow() abstract; virtual int32_t GetWidth() abstract; virtual int32_t GetHeight() abstract; - virtual int32_t GetScaleQuality() abstract; + virtual ScaleQuality GetScaleQuality() abstract; virtual void SetFullscreenMode(FULLSCREEN_MODE mode) abstract; virtual const std::vector& GetFullscreenResolutions() abstract; virtual bool HasFocus() abstract;