From 8800c32e52b35546bf1d20b89b7bb8bd18f01c28 Mon Sep 17 00:00:00 2001 From: Julia Pinheiro <66486603+ju-pinheiro@users.noreply.github.com> Date: Fri, 2 Oct 2020 22:41:30 -0300 Subject: [PATCH] Close #12404: Refactor DRAWING_ENGINE to use strong enum (#13070) --- src/openrct2-ui/UiContext.cpp | 2 +- .../drawing/engines/DrawingEngineFactory.hpp | 11 ++++---- src/openrct2-ui/windows/Options.cpp | 26 +++++++++---------- src/openrct2/Context.cpp | 18 ++++++------- src/openrct2/Context.h | 4 ++- src/openrct2/config/Config.cpp | 13 +++++----- src/openrct2/config/Config.h | 3 ++- src/openrct2/drawing/IDrawingEngine.h | 15 +++++------ src/openrct2/drawing/NewDrawing.cpp | 6 ++--- src/openrct2/drawing/NewDrawing.h | 5 ++-- src/openrct2/interface/Screenshot.cpp | 2 +- src/openrct2/interface/Viewport.cpp | 2 +- src/openrct2/ui/DummyUiContext.cpp | 2 +- 13 files changed, 56 insertions(+), 53 deletions(-) diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index 816904e50a..0251be007d 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -658,7 +658,7 @@ private: // Create window in window first rather than fullscreen so we have the display the window is on first uint32_t flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI; - if (gConfigGeneral.drawing_engine == DRAWING_ENGINE_OPENGL) + if (gConfigGeneral.drawing_engine == DrawingEngine::OpenGL) { flags |= SDL_WINDOW_OPENGL; } diff --git a/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp b/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp index d57fd421fc..47b6868708 100644 --- a/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp +++ b/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp @@ -30,17 +30,16 @@ namespace OpenRCT2 class DrawingEngineFactory final : public IDrawingEngineFactory { public: - std::unique_ptr Create( - DRAWING_ENGINE_TYPE type, const std::shared_ptr& uiContext) override + std::unique_ptr Create(DrawingEngine type, const std::shared_ptr& uiContext) override { - switch (static_cast(type)) + switch (type) { - case DRAWING_ENGINE_SOFTWARE: + case DrawingEngine::Software: return CreateSoftwareDrawingEngine(uiContext); - case DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY: + case DrawingEngine::SoftwareWithHardwareDisplay: return CreateHardwareDisplayDrawingEngine(uiContext); #ifndef DISABLE_OPENGL - case DRAWING_ENGINE_OPENGL: + case DrawingEngine::OpenGL: return CreateOpenGLDrawingEngine(uiContext); #endif default: diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 3ccd8f592b..220981afea 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -1023,7 +1023,7 @@ static void window_options_mousedown(rct_window* w, rct_widgetindex widgetIndex, gDropdownItemsArgs[i] = DrawingEngineStringIds[i]; } window_options_show_dropdown(w, widget, numItems); - dropdown_set_checked(gConfigGeneral.drawing_engine, true); + dropdown_set_checked(EnumValue(gConfigGeneral.drawing_engine), true); break; } case WIDX_SCALE_UP: @@ -1334,12 +1334,12 @@ static void window_options_dropdown(rct_window* w, rct_widgetindex widgetIndex, } break; case WIDX_DRAWING_ENGINE_DROPDOWN: - if (dropdownIndex != gConfigGeneral.drawing_engine) + if (dropdownIndex != EnumValue(gConfigGeneral.drawing_engine)) { - int32_t srcEngine = drawing_engine_get_type(); - int32_t dstEngine = dropdownIndex; + DrawingEngine srcEngine = drawing_engine_get_type(); + DrawingEngine dstEngine = static_cast(dropdownIndex); - gConfigGeneral.drawing_engine = static_cast(dstEngine); + gConfigGeneral.drawing_engine = dstEngine; bool recreate_window = drawing_engine_requires_new_window(srcEngine, dstEngine); platform_refresh_video(recreate_window); config_save_default(); @@ -1604,7 +1604,7 @@ static void window_options_invalidate(rct_window* w) } // Disable Steam Overlay checkbox when using software rendering. - if (gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE) + if (gConfigGeneral.drawing_engine == DrawingEngine::Software) { w->disabled_widgets |= (1 << WIDX_STEAM_OVERLAY_PAUSE); } @@ -1615,7 +1615,7 @@ static void window_options_invalidate(rct_window* w) // Disable scaling quality dropdown when using software rendering or when using an integer scalar. // In the latter case, nearest neighbour rendering will be used to scale. - if (gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE + if (gConfigGeneral.drawing_engine == DrawingEngine::Software || gConfigGeneral.window_scale == std::floor(gConfigGeneral.window_scale)) { w->disabled_widgets |= (1 << WIDX_SCALE_QUALITY); @@ -1628,7 +1628,7 @@ static void window_options_invalidate(rct_window* w) } // Disable changing VSync for Software engine, as we can't control its use of VSync - if (gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE) + if (gConfigGeneral.drawing_engine == DrawingEngine::Software) { w->disabled_widgets |= (1 << WIDX_USE_VSYNC_CHECKBOX); } @@ -1647,7 +1647,8 @@ static void window_options_invalidate(rct_window* w) // Dropdown captions for straightforward strings. window_options_display_widgets[WIDX_FULLSCREEN].text = window_options_fullscreen_mode_names[gConfigGeneral .fullscreen_mode]; - window_options_display_widgets[WIDX_DRAWING_ENGINE].text = DrawingEngineStringIds[gConfigGeneral.drawing_engine]; + window_options_display_widgets[WIDX_DRAWING_ENGINE].text = DrawingEngineStringIds[EnumValue( + gConfigGeneral.drawing_engine)]; window_options_display_widgets[WIDX_SCALE_QUALITY].text = window_options_scale_quality_names [static_cast(gConfigGeneral.scale_quality) - 1]; @@ -1670,8 +1671,7 @@ static void window_options_invalidate(rct_window* w) gConfigGeneral.virtual_floor_style)]; widget_set_checkbox_value(w, WIDX_ENABLE_LIGHT_FX_CHECKBOX, gConfigGeneral.enable_light_fx); - if (gConfigGeneral.day_night_cycle - && gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY) + if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DrawingEngine::SoftwareWithHardwareDisplay) { w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX); } @@ -1682,7 +1682,7 @@ static void window_options_invalidate(rct_window* w) widget_set_checkbox_value( w, WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX, gConfigGeneral.enable_light_fx_for_vehicles); - if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY + if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DrawingEngine::SoftwareWithHardwareDisplay && gConfigGeneral.enable_light_fx) { w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX); @@ -1982,7 +1982,7 @@ static void window_options_paint(rct_window* w, rct_drawpixelinfo* dpi) w->windowPos + ScreenCoordsXY{ w->widgets[WIDX_SCALE].left + 1, w->widgets[WIDX_SCALE].top + 1 }); colour = w->colours[1]; - if (gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE + if (gConfigGeneral.drawing_engine == DrawingEngine::Software || gConfigGeneral.window_scale == std::floor(gConfigGeneral.window_scale)) { colour |= COLOUR_FLAG_INSET; diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 674296d33d..2c166dafae 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -111,7 +111,7 @@ namespace OpenRCT2 std::unique_ptr _titleScreen; std::unique_ptr _gameState; - int32_t _drawingEngineType = DRAWING_ENGINE_SOFTWARE; + DrawingEngine _drawingEngineType = DrawingEngine::Software; std::unique_ptr _drawingEngine; std::unique_ptr _painter; @@ -241,7 +241,7 @@ namespace OpenRCT2 return _gameStateSnapshots.get(); } - int32_t GetDrawingEngineType() override + DrawingEngine GetDrawingEngineType() override { return _drawingEngineType; } @@ -486,13 +486,13 @@ namespace OpenRCT2 _drawingEngineType = gConfigGeneral.drawing_engine; auto drawingEngineFactory = _uiContext->GetDrawingEngineFactory(); - auto drawingEngine = drawingEngineFactory->Create(static_cast(_drawingEngineType), _uiContext); + auto drawingEngine = drawingEngineFactory->Create(_drawingEngineType, _uiContext); if (drawingEngine == nullptr) { - if (_drawingEngineType == DRAWING_ENGINE_SOFTWARE) + if (_drawingEngineType == DrawingEngine::Software) { - _drawingEngineType = DRAWING_ENGINE_NONE; + _drawingEngineType = DrawingEngine::None; log_fatal("Unable to create a drawing engine."); exit(-1); } @@ -501,7 +501,7 @@ namespace OpenRCT2 log_error("Unable to create drawing engine. Falling back to software."); // Fallback to software - gConfigGeneral.drawing_engine = DRAWING_ENGINE_SOFTWARE; + gConfigGeneral.drawing_engine = DrawingEngine::Software; config_save_default(); drawing_engine_init(); } @@ -516,9 +516,9 @@ namespace OpenRCT2 } catch (const std::exception& ex) { - if (_drawingEngineType == DRAWING_ENGINE_SOFTWARE) + if (_drawingEngineType == DrawingEngine::Software) { - _drawingEngineType = DRAWING_ENGINE_NONE; + _drawingEngineType = DrawingEngine::None; log_error(ex.what()); log_fatal("Unable to initialise a drawing engine."); exit(-1); @@ -529,7 +529,7 @@ namespace OpenRCT2 log_error("Unable to initialise drawing engine. Falling back to software."); // Fallback to software - gConfigGeneral.drawing_engine = DRAWING_ENGINE_SOFTWARE; + gConfigGeneral.drawing_engine = DrawingEngine::Software; config_save_default(); drawing_engine_init(); } diff --git a/src/openrct2/Context.h b/src/openrct2/Context.h index 96330ed226..39b7ccb021 100644 --- a/src/openrct2/Context.h +++ b/src/openrct2/Context.h @@ -18,6 +18,8 @@ struct IObjectManager; struct IObjectRepository; struct IScenarioRepository; +enum class DrawingEngine : int32_t; + namespace OpenRCT2 { struct IStream; @@ -125,7 +127,7 @@ namespace OpenRCT2 virtual IScenarioRepository* GetScenarioRepository() abstract; virtual IReplayManager* GetReplayManager() abstract; virtual IGameStateSnapshots* GetGameStateSnapshots() abstract; - virtual int32_t GetDrawingEngineType() abstract; + virtual DrawingEngine GetDrawingEngineType() abstract; virtual Drawing::IDrawingEngine* GetDrawingEngine() abstract; virtual Paint::Painter* GetPainter() abstract; diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index ee41ba6fdb..824fdadbdc 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -82,10 +82,10 @@ namespace Config ConfigEnumEntry("YY/DD/MM", DATE_FORMAT_YEAR_DAY_MONTH), }); - static const auto Enum_DrawingEngine = ConfigEnum({ - ConfigEnumEntry("SOFTWARE", DRAWING_ENGINE_SOFTWARE), - ConfigEnumEntry("SOFTWARE_HWD", DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY), - ConfigEnumEntry("OPENGL", DRAWING_ENGINE_OPENGL), + static const auto Enum_DrawingEngine = ConfigEnum({ + ConfigEnumEntry("SOFTWARE", DrawingEngine::Software), + ConfigEnumEntry("SOFTWARE_HWD", DrawingEngine::SoftwareWithHardwareDisplay), + ConfigEnumEntry("OPENGL", DrawingEngine::OpenGL), }); static const auto Enum_Temperature = ConfigEnum({ @@ -168,7 +168,8 @@ namespace Config model->window_snap_proximity = reader->GetInt32("window_snap_proximity", 5); model->window_width = reader->GetInt32("window_width", -1); model->default_display = reader->GetInt32("default_display", 0); - model->drawing_engine = reader->GetEnum("drawing_engine", DRAWING_ENGINE_SOFTWARE, Enum_DrawingEngine); + model->drawing_engine = reader->GetEnum( + "drawing_engine", DrawingEngine::Software, Enum_DrawingEngine); model->uncap_fps = reader->GetBoolean("uncap_fps", false); model->use_vsync = reader->GetBoolean("use_vsync", true); model->virtual_floor_style = reader->GetEnum( @@ -249,7 +250,7 @@ namespace Config writer->WriteInt32("window_snap_proximity", model->window_snap_proximity); writer->WriteInt32("window_width", model->window_width); writer->WriteInt32("default_display", model->default_display); - writer->WriteEnum("drawing_engine", model->drawing_engine, Enum_DrawingEngine); + writer->WriteEnum("drawing_engine", model->drawing_engine, Enum_DrawingEngine); writer->WriteBoolean("uncap_fps", model->uncap_fps); writer->WriteBoolean("use_vsync", model->use_vsync); writer->WriteEnum("date_format", model->date_format, Enum_DateFormat); diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index 2ffb76c28c..9c0f28b3f4 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -19,6 +19,7 @@ enum class MeasurementFormat : int32_t; enum class TemperatureUnit : int32_t; enum class ScaleQuality : int32_t; enum class VirtualFloorStyles : int32_t; +enum class DrawingEngine : int32_t; struct GeneralConfiguration { @@ -34,7 +35,7 @@ struct GeneralConfiguration int32_t fullscreen_width; int32_t fullscreen_height; float window_scale; - int32_t drawing_engine; + DrawingEngine drawing_engine; ScaleQuality scale_quality; bool uncap_fps; bool use_vsync; diff --git a/src/openrct2/drawing/IDrawingEngine.h b/src/openrct2/drawing/IDrawingEngine.h index 6e08a45b8c..00481138cc 100644 --- a/src/openrct2/drawing/IDrawingEngine.h +++ b/src/openrct2/drawing/IDrawingEngine.h @@ -14,13 +14,13 @@ #include #include -enum DRAWING_ENGINE +enum class DrawingEngine : int32_t { - DRAWING_ENGINE_NONE = -1, - DRAWING_ENGINE_SOFTWARE, - DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY, - DRAWING_ENGINE_OPENGL, - DRAWING_ENGINE_COUNT, + None = -1, + Software, + SoftwareWithHardwareDisplay, + OpenGL, + Count, }; enum DRAWING_ENGINE_FLAGS @@ -43,7 +43,6 @@ namespace OpenRCT2::Ui namespace OpenRCT2::Drawing { - enum class DRAWING_ENGINE_TYPE; struct IDrawingContext; struct IDrawingEngine @@ -81,7 +80,7 @@ namespace OpenRCT2::Drawing { } virtual std::unique_ptr Create( - DRAWING_ENGINE_TYPE type, const std::shared_ptr& uiContext) abstract; + DrawingEngine type, const std::shared_ptr& uiContext) abstract; }; struct IWeatherDrawer diff --git a/src/openrct2/drawing/NewDrawing.cpp b/src/openrct2/drawing/NewDrawing.cpp index 659154d00c..3eb359272c 100644 --- a/src/openrct2/drawing/NewDrawing.cpp +++ b/src/openrct2/drawing/NewDrawing.cpp @@ -33,7 +33,7 @@ rct_string_id DrawingEngineStringIds[] = { STR_DRAWING_ENGINE_OPENGL, }; -int32_t drawing_engine_get_type() +DrawingEngine drawing_engine_get_type() { auto context = GetContext(); return context->GetDrawingEngineType(); @@ -50,10 +50,10 @@ static IDrawingEngine* GetDrawingEngine() return result; } -bool drawing_engine_requires_new_window(int32_t srcEngine, int32_t dstEngine) +bool drawing_engine_requires_new_window(DrawingEngine srcEngine, DrawingEngine dstEngine) { #ifdef _WIN32 - if (srcEngine != DRAWING_ENGINE_OPENGL && dstEngine != DRAWING_ENGINE_OPENGL) + if (srcEngine != DrawingEngine::OpenGL && dstEngine != DrawingEngine::OpenGL) { // Windows is apparently able to switch to hardware rendering on the fly although // using the same window in an unaccelerated and accelerated context is unsupported by SDL2 diff --git a/src/openrct2/drawing/NewDrawing.h b/src/openrct2/drawing/NewDrawing.h index fc8313b119..80039156b5 100644 --- a/src/openrct2/drawing/NewDrawing.h +++ b/src/openrct2/drawing/NewDrawing.h @@ -13,11 +13,12 @@ struct rct_drawpixelinfo; struct GamePalette; +enum class DrawingEngine : int32_t; extern rct_string_id DrawingEngineStringIds[3]; -int32_t drawing_engine_get_type(); -bool drawing_engine_requires_new_window(int32_t srcEngine, int32_t dstEngine); +DrawingEngine drawing_engine_get_type(); +bool drawing_engine_requires_new_window(DrawingEngine srcEngine, DrawingEngine dstEngine); void drawing_engine_init(); void drawing_engine_resize(); void drawing_engine_set_palette(const GamePalette& colours); diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 997740cf16..b49b42328d 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -495,7 +495,7 @@ static void benchgfx_render_screenshots(const char* inputPath, std::unique_ptr(totalRenderCount); - const auto engineStringId = DrawingEngineStringIds[DRAWING_ENGINE_SOFTWARE]; + const auto engineStringId = DrawingEngineStringIds[EnumValue(DrawingEngine::Software)]; const auto engineName = format_string(engineStringId, nullptr); std::printf("Engine: %s\n", engineName.c_str()); std::printf("Render Count: %u\n", totalRenderCount); diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 3a27712e82..8d59a26a41 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -1930,7 +1930,7 @@ void viewport_set_saved_view() ZoomLevel ZoomLevel::min() { - if (drawing_engine_get_type() == DRAWING_ENGINE_OPENGL) + if (drawing_engine_get_type() == DrawingEngine::OpenGL) { return -2; } diff --git a/src/openrct2/ui/DummyUiContext.cpp b/src/openrct2/ui/DummyUiContext.cpp index 251f9ac37a..ce6c21f6f9 100644 --- a/src/openrct2/ui/DummyUiContext.cpp +++ b/src/openrct2/ui/DummyUiContext.cpp @@ -148,7 +148,7 @@ namespace OpenRCT2::Ui class X8DrawingEngineFactory final : public IDrawingEngineFactory { std::unique_ptr Create( - [[maybe_unused]] DRAWING_ENGINE_TYPE type, const std::shared_ptr& uiContext) override + [[maybe_unused]] DrawingEngine type, const std::shared_ptr& uiContext) override { return std::make_unique(uiContext); }