From e7845e48dc8592da1f0e443d4880375ba7bdf0fc Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 19 May 2026 06:21:38 +0100 Subject: [PATCH] Codechange: make DisplayOption a scoped enum/enum bitset (#15611) --- src/gfxinit.cpp | 2 +- src/newgrf.cpp | 8 ++++---- src/openttd.cpp | 2 +- src/openttd.h | 19 +++++++++++-------- src/rail_cmd.cpp | 2 +- src/road_cmd.cpp | 2 +- src/signs_gui.cpp | 4 ++-- src/table/settings/misc_settings.ini | 2 +- src/toolbar_gui.cpp | 28 ++++++++++++++-------------- src/transparency.h | 2 +- src/transparency_gui.cpp | 2 +- src/viewport.cpp | 20 ++++++++++---------- 12 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index ba664e4474..177fdc08dc 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -297,7 +297,7 @@ static bool SwitchNewGRFBlitter() { "32bpp-anim", 1, 8, 32, 8, 32 }, }; - const bool animation_wanted = HasBit(_display_opt, DO_FULL_ANIMATION); + const bool animation_wanted = _display_opt.Test(DisplayOption::FullAnimation); std::string_view cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); for (const auto &replacement_blitter : replacement_blitters) { diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 035f978d17..1a7248c584 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1775,8 +1775,8 @@ void LoadNewGRF(SpriteID load_index, uint num_baseset) TimerGameEconomy::Year economy_year = TimerGameEconomy::year; TimerGameEconomy::DateFract economy_date_fract = TimerGameEconomy::date_fract; - uint64_t tick_counter = TimerGameTick::counter; - uint8_t display_opt = _display_opt; + uint64_t tick_counter = TimerGameTick::counter; + DisplayOptions display_opt = _display_opt; if (_networking) { TimerGameCalendar::year = _settings_game.game_creation.starting_year; @@ -1788,7 +1788,7 @@ void LoadNewGRF(SpriteID load_index, uint num_baseset) TimerGameEconomy::date_fract = 0; TimerGameTick::counter = 0; - _display_opt = 0; + _display_opt.Reset(); } InitializePatchFlags(); @@ -1894,7 +1894,7 @@ void LoadNewGRF(SpriteID load_index, uint num_baseset) TimerGameEconomy::date_fract = economy_date_fract; TimerGameTick::counter = tick_counter; - _display_opt = display_opt; + _display_opt = display_opt; } /** diff --git a/src/openttd.cpp b/src/openttd.cpp index 1a2e5071d2..9cce15312d 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1385,7 +1385,7 @@ void GameLoop() StateGameLoop(); } - if (_pause_mode.None() && HasBit(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations(); + if (_pause_mode.None() && _display_opt.Test(DisplayOption::FullAnimation)) DoPaletteAnimations(); SoundDriver::GetInstance()->MainLoop(); MusicLoop(); diff --git a/src/openttd.h b/src/openttd.h index b991fcb116..51e7bdb8e3 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -42,16 +42,19 @@ enum SwitchMode : uint8_t { }; /** Display Options */ -enum DisplayOptions : uint8_t { - DO_SHOW_TOWN_NAMES = 0, ///< Display town names. - DO_SHOW_STATION_NAMES = 1, ///< Display station names. - DO_SHOW_SIGNS = 2, ///< Display signs. - DO_FULL_ANIMATION = 3, ///< Perform palette animation. - DO_FULL_DETAIL = 5, ///< Also draw details of track and roads. - DO_SHOW_WAYPOINT_NAMES = 6, ///< Display waypoint names. - DO_SHOW_COMPETITOR_SIGNS = 7, ///< Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are always shown, even if this option is turned off. +enum class DisplayOption : uint8_t { + ShowTownNames = 0, ///< Display town names. + ShowStationNames = 1, ///< Display station names. + ShowSigns = 2, ///< Display signs. + FullAnimation = 3, ///< Perform palette animation. + FullDetail = 5, ///< Also draw details of track and roads. + ShowWaypointNames = 6, ///< Display waypoint names. + ShowCompetitorSigns = 7, ///< Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are always shown, even if this option is turned off. }; +/** Bitset of \c DisplayOption elements. */ +using DisplayOptions = EnumBitSet; + struct GameSessionStats { std::chrono::steady_clock::time_point start_time; ///< Time when the current game was started. std::string savegame_id; ///< Unique ID of the savegame. diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index cdaa6693a0..a23e29bf74 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -2449,7 +2449,7 @@ static void DrawTile_Rail(TileInfo *ti) DrawTrackBits(ti, rails); - if (HasBit(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti, rti, pal); + if (_display_opt.Test(DisplayOption::FullDetail)) DrawTrackDetails(ti, rti, pal); if (HasRailCatenaryDrawn(GetRailType(ti->tile))) DrawRailCatenary(ti); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 4dd9eeef13..7aca3e8a90 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1670,7 +1670,7 @@ static void DrawRoadBits(TileInfo *ti) DrawRoadCatenary(ti); /* Return if full detail is disabled, or we are zoomed fully out. */ - if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZoomLevel::Detail) return; + if (!_display_opt.Test(DisplayOption::FullDetail) || _cur_dpi->zoom > ZoomLevel::Detail) return; /* Do not draw details (street lights, trees) under low bridge */ Roadside roadside = GetRoadside(ti->tile); diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index b217512e24..0453344cf0 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -116,7 +116,7 @@ struct SignList { /** Filter sign list by owner. @copydoc GUIList::FilterFunction */ static bool OwnerVisibilityFilter(const Sign * const *item, [[maybe_unused]] StringFilter &filter) { - assert(!HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS)); + assert(!_display_opt.Test(DisplayOption::ShowCompetitorSigns)); /* Hide sign if non-own signs are hidden in the viewport */ return (*item)->owner == _local_company || (*item)->owner == OWNER_DEITY; } @@ -126,7 +126,7 @@ struct SignList { { this->signs.Filter(&SignNameFilter, this->string_filter); if (_game_mode != GM_EDITOR) this->signs.Filter(&OwnerDeityFilter, this->string_filter); - if (!HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS)) { + if (!_display_opt.Test(DisplayOption::ShowCompetitorSigns)) { this->signs.Filter(&OwnerVisibilityFilter, this->string_filter); } } diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index ad9e6fb58d..60d4dd39dc 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -62,7 +62,7 @@ startup = true name = ""display_opt"" type = SLE_UINT8 var = _display_opt -def = (1 << DO_SHOW_TOWN_NAMES | 1 << DO_SHOW_STATION_NAMES | 1 << DO_SHOW_SIGNS | 1 << DO_FULL_ANIMATION | 1 << DO_FULL_DETAIL | 1 << DO_SHOW_WAYPOINT_NAMES | 1 << DO_SHOW_COMPETITOR_SIGNS) +def = DisplayOptions({DisplayOption::ShowTownNames, DisplayOption::ShowStationNames, DisplayOption::ShowSigns, DisplayOption::FullAnimation, DisplayOption::FullDetail, DisplayOption::ShowWaypointNames, DisplayOption::ShowCompetitorSigns}) full = _display_opt_modes [SDTG_MMANY] diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index b79a66cea5..a65302197d 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -287,19 +287,19 @@ static CallBackFunction ToolbarOptionsClick(Window *w) } list.push_back(MakeDropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS, OptionMenuEntries::Transparencies)); list.push_back(MakeDropDownListDividerItem()); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_TOWN_NAMES), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_STATION_NAMES), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowTownNames), STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED, OptionMenuEntries::ShowTownNames)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowStationNames), STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OptionMenuEntries::ShowStationNames)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Train), STR_SETTINGS_MENU_STATION_NAMES_TRAIN, OptionMenuEntries::ShowTrainStationNames, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::TruckStop), STR_SETTINGS_MENU_STATION_NAMES_LORRY, OptionMenuEntries::ShowLorryStationNames, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::BusStop), STR_SETTINGS_MENU_STATION_NAMES_BUS, OptionMenuEntries::ShowBusStationNames, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Dock), STR_SETTINGS_MENU_STATION_NAMES_SHIP, OptionMenuEntries::ShowDockNames, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(StationFacility::Airport), STR_SETTINGS_MENU_STATION_NAMES_PLANE, OptionMenuEntries::ShowAirportNames, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(_facility_display_opt.Test(STATION_FACILITY_GHOST), STR_SETTINGS_MENU_STATION_NAMES_GHOST, OptionMenuEntries::ShowGhostStationNames, false, false, 1)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OptionMenuEntries::ShowCompetitorSigns)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_ANIMATION), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation)); - list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_FULL_DETAIL), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowWaypointNames), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OptionMenuEntries::ShowWaypointNames)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowSigns), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OptionMenuEntries::ShowSigns)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::ShowCompetitorSigns), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OptionMenuEntries::ShowCompetitorSigns)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullAnimation), STR_SETTINGS_MENU_FULL_ANIMATION, OptionMenuEntries::FullAnimation)); + list.push_back(MakeDropDownListCheckedItem(_display_opt.Test(DisplayOption::FullDetail), STR_SETTINGS_MENU_FULL_DETAIL, OptionMenuEntries::FullDetails)); list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OptionMenuEntries::TransparentBuildings)); list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OptionMenuEntries::TransparentStationSigns)); @@ -323,22 +323,22 @@ static CallBackFunction MenuClickSettings(int index) case OptionMenuEntries::SandboxOptions: ShowCheatWindow(); break; case OptionMenuEntries::Transparencies: ShowTransparencyToolbar(); break; - case OptionMenuEntries::ShowTownNames: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break; - case OptionMenuEntries::ShowStationNames: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break; + case OptionMenuEntries::ShowTownNames: _display_opt.Flip(DisplayOption::ShowTownNames); break; + case OptionMenuEntries::ShowStationNames: _display_opt.Flip(DisplayOption::ShowStationNames); break; case OptionMenuEntries::ShowTrainStationNames: _facility_display_opt.Flip(StationFacility::Train); break; case OptionMenuEntries::ShowLorryStationNames: _facility_display_opt.Flip(StationFacility::TruckStop); break; case OptionMenuEntries::ShowBusStationNames: _facility_display_opt.Flip(StationFacility::BusStop); break; case OptionMenuEntries::ShowDockNames: _facility_display_opt.Flip(StationFacility::Dock); break; case OptionMenuEntries::ShowAirportNames: _facility_display_opt.Flip(StationFacility::Airport); break; case OptionMenuEntries::ShowGhostStationNames: _facility_display_opt.Flip(STATION_FACILITY_GHOST); break; - case OptionMenuEntries::ShowWaypointNames: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break; - case OptionMenuEntries::ShowSigns: ToggleBit(_display_opt, DO_SHOW_SIGNS); break; + case OptionMenuEntries::ShowWaypointNames: _display_opt.Flip(DisplayOption::ShowWaypointNames); break; + case OptionMenuEntries::ShowSigns: _display_opt.Flip(DisplayOption::ShowSigns); break; case OptionMenuEntries::ShowCompetitorSigns: - ToggleBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS); + _display_opt.Flip(DisplayOption::ShowCompetitorSigns); InvalidateWindowClassesData(WC_SIGN_LIST, -1); break; - case OptionMenuEntries::FullAnimation: ToggleBit(_display_opt, DO_FULL_ANIMATION); CheckBlitter(); break; - case OptionMenuEntries::FullDetails: ToggleBit(_display_opt, DO_FULL_DETAIL); break; + case OptionMenuEntries::FullAnimation: _display_opt.Flip(DisplayOption::FullAnimation); CheckBlitter(); break; + case OptionMenuEntries::FullDetails: _display_opt.Flip(DisplayOption::FullDetail); break; case OptionMenuEntries::TransparentBuildings: ToggleTransparency(TO_HOUSES); break; case OptionMenuEntries::TransparentStationSigns: ToggleTransparency(TO_SIGNS); break; } diff --git a/src/transparency.h b/src/transparency.h index 934f360505..e0b85e7690 100644 --- a/src/transparency.h +++ b/src/transparency.h @@ -38,7 +38,7 @@ typedef uint TransparencyOptionBits; ///< transparency option bits extern TransparencyOptionBits _transparency_opt; extern TransparencyOptionBits _transparency_lock; extern TransparencyOptionBits _invisibility_opt; -extern uint8_t _display_opt; +extern DisplayOptions _display_opt; extern StationFacilities _facility_display_opt; /** diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index 23e26669c6..5b5e074391 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -23,7 +23,7 @@ TransparencyOptionBits _transparency_opt; ///< The bits that should be transparent. TransparencyOptionBits _transparency_lock; ///< Prevent these bits from flipping with X. TransparencyOptionBits _invisibility_opt; ///< The bits that should be invisible. -uint8_t _display_opt; ///< What do we want to draw/do? +DisplayOptions _display_opt; ///< What do we want to draw/do? StationFacilities _facility_display_opt; ///< What station facilities to draw. class TransparenciesWindow : public Window diff --git a/src/viewport.cpp b/src/viewport.cpp index b9a045646e..5c45b2d8f2 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1447,11 +1447,11 @@ static void ViewportAddKdtreeSigns(DrawPixelInfo *dpi) Rect search_rect{ dpi->left, dpi->top, dpi->left + dpi->width, dpi->top + dpi->height }; search_rect = ExpandRectWithViewportSignMargins(search_rect, dpi->zoom); - bool show_stations = HasBit(_display_opt, DO_SHOW_STATION_NAMES) && _game_mode != GM_MENU; - bool show_waypoints = HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES) && _game_mode != GM_MENU; - bool show_towns = HasBit(_display_opt, DO_SHOW_TOWN_NAMES) && _game_mode != GM_MENU; - bool show_signs = HasBit(_display_opt, DO_SHOW_SIGNS) && !IsInvisibilitySet(TO_SIGNS); - bool show_competitors = HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS); + bool show_stations = _display_opt.Test(DisplayOption::ShowStationNames) && _game_mode != GM_MENU; + bool show_waypoints = _display_opt.Test(DisplayOption::ShowWaypointNames) && _game_mode != GM_MENU; + bool show_towns = _display_opt.Test(DisplayOption::ShowTownNames) && _game_mode != GM_MENU; + bool show_signs = _display_opt.Test(DisplayOption::ShowSigns) && !IsInvisibilitySet(TO_SIGNS); + bool show_competitors = _display_opt.Test(DisplayOption::ShowCompetitorSigns); /* Collect all the items first and draw afterwards, to ensure layering */ std::vector stations; @@ -2294,11 +2294,11 @@ static bool CheckClickOnViewportSign(const Viewport &vp, int x, int y) Rect search_rect{ x - 1, y - 1, x + 1, y + 1 }; search_rect = ExpandRectWithViewportSignMargins(search_rect, vp.zoom); - bool show_stations = HasBit(_display_opt, DO_SHOW_STATION_NAMES) && !IsInvisibilitySet(TO_SIGNS); - bool show_waypoints = HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES) && !IsInvisibilitySet(TO_SIGNS); - bool show_towns = HasBit(_display_opt, DO_SHOW_TOWN_NAMES); - bool show_signs = HasBit(_display_opt, DO_SHOW_SIGNS) && !IsInvisibilitySet(TO_SIGNS); - bool show_competitors = HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS); + bool show_stations = _display_opt.Test(DisplayOption::ShowStationNames) && !IsInvisibilitySet(TO_SIGNS); + bool show_waypoints = _display_opt.Test(DisplayOption::ShowWaypointNames) && !IsInvisibilitySet(TO_SIGNS); + bool show_towns = _display_opt.Test(DisplayOption::ShowTownNames); + bool show_signs = _display_opt.Test(DisplayOption::ShowSigns) && !IsInvisibilitySet(TO_SIGNS); + bool show_competitors = _display_opt.Test(DisplayOption::ShowCompetitorSigns); /* Topmost of each type that was hit */ BaseStation *st = nullptr, *last_st = nullptr;