diff --git a/src/openrct2-ui/interface/Widget.cpp b/src/openrct2-ui/interface/Widget.cpp index bbd287c709..368d095056 100644 --- a/src/openrct2-ui/interface/Widget.cpp +++ b/src/openrct2-ui/interface/Widget.cpp @@ -467,10 +467,10 @@ static void widget_groupbox_draw(rct_drawpixelinfo* dpi, rct_window* w, rct_widg colour |= COLOUR_FLAG_INSET; utf8 buffer[512] = { 0 }; - uint8_t args[sizeof(uintptr_t)] = { 0 }; format_string(buffer, sizeof(buffer), stringId, formatArgs); - Formatter(args).Add(buffer); - gfx_draw_string_left(dpi, STR_STRING, args, colour, { l, t }); + Formatter ft; + ft.Add(buffer); + gfx_draw_string_left(dpi, STR_STRING, ft.Data(), colour, { l, t }); textRight = l + gfx_get_string_width(buffer) + 1; } diff --git a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp index d7188c1c5e..c64b3f99e1 100644 --- a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp +++ b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp @@ -1139,11 +1139,10 @@ static void window_editor_objective_options_rides_scrollpaint(rct_window* w, rct } // Ride name - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; ride->FormatNameTo(ft); - gfx_draw_string_left(dpi, stringId, args, COLOUR_BLACK, { 15, y }); + gfx_draw_string_left(dpi, stringId, ft.Data(), COLOUR_BLACK, { 15, y }); } } } diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp index 4dd3426f07..e36d38acb9 100644 --- a/src/openrct2-ui/windows/GuestList.cpp +++ b/src/openrct2-ui/windows/GuestList.cpp @@ -1066,11 +1066,10 @@ static bool guest_should_be_visible(Peep* peep) if (_window_guest_list_filter_name[0] != '\0') { char name[256]{}; - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; peep->FormatNameTo(ft); - format_string(name, sizeof(name), STR_STRINGID, args); + format_string(name, sizeof(name), STR_STRINGID, ft.Data()); if (strcasestr(name, _window_guest_list_filter_name) == nullptr) { return false; diff --git a/src/openrct2-ui/windows/ObjectLoadError.cpp b/src/openrct2-ui/windows/ObjectLoadError.cpp index ab577616a1..ecca89381a 100644 --- a/src/openrct2-ui/windows/ObjectLoadError.cpp +++ b/src/openrct2-ui/windows/ObjectLoadError.cpp @@ -111,14 +111,13 @@ private: else { char str_downloading_objects[256]{}; - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; if (_downloadStatusInfo.Source.empty()) { ft.Add(static_cast(_downloadStatusInfo.Count)); ft.Add(static_cast(_downloadStatusInfo.Total)); ft.Add(_downloadStatusInfo.Name.c_str()); - format_string(str_downloading_objects, sizeof(str_downloading_objects), STR_DOWNLOADING_OBJECTS, args); + format_string(str_downloading_objects, sizeof(str_downloading_objects), STR_DOWNLOADING_OBJECTS, ft.Data()); } else { @@ -126,7 +125,8 @@ private: ft.Add(_downloadStatusInfo.Source.c_str()); ft.Add(static_cast(_downloadStatusInfo.Count)); ft.Add(static_cast(_downloadStatusInfo.Total)); - format_string(str_downloading_objects, sizeof(str_downloading_objects), STR_DOWNLOADING_OBJECTS_FROM, args); + format_string( + str_downloading_objects, sizeof(str_downloading_objects), STR_DOWNLOADING_OBJECTS_FROM, ft.Data()); } auto intent = Intent(WC_NETWORK_STATUS); diff --git a/src/openrct2-ui/windows/TileInspector.cpp b/src/openrct2-ui/windows/TileInspector.cpp index e244a6f14f..6adf5d0e51 100644 --- a/src/openrct2-ui/windows/TileInspector.cpp +++ b/src/openrct2-ui/windows/TileInspector.cpp @@ -2085,11 +2085,10 @@ static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi) auto banner = tileElement->AsWall()->GetBanner(); if (banner != nullptr && !banner->IsNull()) { - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; banner->FormatTextTo(ft); gfx_draw_string_left( - dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, args, COLOUR_WHITE, + dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, ft.Data(), COLOUR_WHITE, screenCoords + ScreenCoordsXY{ 0, 11 }); } } @@ -2152,11 +2151,10 @@ static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi) auto banner = sceneryElement->GetBanner(); if (banner != nullptr && !banner->IsNull()) { - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; banner->FormatTextTo(ft); gfx_draw_string_left( - dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, args, COLOUR_WHITE, + dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, ft.Data(), COLOUR_WHITE, screenCoords + ScreenCoordsXY{ 0, 22 }); } } @@ -2186,10 +2184,9 @@ static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi) auto banner = tileElement->AsBanner()->GetBanner(); if (banner != nullptr && !banner->IsNull()) { - uint8_t args[32]{}; - Formatter ft(args); + Formatter ft; banner->FormatTextTo(ft); - gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, args, COLOUR_WHITE, screenCoords); + gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, ft.Data(), COLOUR_WHITE, screenCoords); } // Properties diff --git a/src/openrct2-ui/windows/TitleCommandEditor.cpp b/src/openrct2-ui/windows/TitleCommandEditor.cpp index baabb1ea32..62e36c300e 100644 --- a/src/openrct2-ui/windows/TitleCommandEditor.cpp +++ b/src/openrct2-ui/windows/TitleCommandEditor.cpp @@ -619,8 +619,7 @@ static void window_title_command_editor_tool_down( if (peep != nullptr) { validSprite = true; - uint8_t formatArgs[32]{}; - Formatter ft(formatArgs); + Formatter ft; peep->FormatNameTo(ft); format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, &peep->Id); } @@ -631,10 +630,9 @@ static void window_title_command_editor_tool_down( auto ride = vehicle->GetRide(); if (ride != nullptr) { - uint8_t formatArgs[32]{}; - Formatter ft(formatArgs); + Formatter ft; ride->FormatNameTo(ft); - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, formatArgs); + format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, ft.Data()); } } else if (litter != nullptr) diff --git a/src/openrct2/drawing/Text.cpp b/src/openrct2/drawing/Text.cpp index d4824398b0..b35f5187ba 100644 --- a/src/openrct2/drawing/Text.cpp +++ b/src/openrct2/drawing/Text.cpp @@ -128,22 +128,14 @@ void DrawTextBasic( rct_drawpixelinfo* dpi, const ScreenCoordsXY& coords, rct_string_id format, const Formatter& ft, colour_t colour, TextAlignment alignment, bool underline) { - return DrawTextBasic(dpi, coords, format, ft.GetStartBuf(), colour, alignment, underline); + return DrawTextBasic(dpi, coords, format, ft.Data(), colour, alignment, underline); } void DrawTextEllipsised( rct_drawpixelinfo* dpi, const ScreenCoordsXY& coords, int32_t width, rct_string_id format, const Formatter& ft, colour_t colour, TextAlignment alignment, bool underline) { - const void* args = ft.GetStartBuf(); - TextPaint textPaint = { colour, FONT_SPRITE_BASE_MEDIUM, underline, alignment }; - gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM; - - utf8 buffer[512]; - format_string(buffer, sizeof(buffer), format, args); - gfx_clip_string(buffer, width); - - DrawText(dpi, coords, textPaint, buffer); + return DrawTextEllipsised(dpi, coords, width, format, ft.Data(), colour, alignment, underline); } void gfx_draw_string(rct_drawpixelinfo* dpi, const_utf8string buffer, uint8_t colour, const ScreenCoordsXY& coords) diff --git a/src/openrct2/localisation/Localisation.h b/src/openrct2/localisation/Localisation.h index 72326161d9..d758ac054d 100644 --- a/src/openrct2/localisation/Localisation.h +++ b/src/openrct2/localisation/Localisation.h @@ -17,6 +17,7 @@ #include "Language.h" #include "StringIds.h" +#include #include #include @@ -82,24 +83,32 @@ extern const rct_string_id DateGameShortMonthNames[MONTH_COUNT]; class Formatter { - const uint8_t* StartBuf; - uint8_t* CurrentBuf; + std::array Buffer{}; + uint8_t* StartBuf{}; + uint8_t* CurrentBuf{}; public: - explicit Formatter(uint8_t* buf) + Formatter(uint8_t* buf) : StartBuf(buf) , CurrentBuf(buf) { } + Formatter() + : Buffer{} + , StartBuf(Buffer.data()) + , CurrentBuf(StartBuf) + { + } + static Formatter Common() { - return Formatter(gCommonFormatArgs); + return Formatter{ gCommonFormatArgs }; } static Formatter MapTooltip() { - return Formatter(gMapTooltipFormatArgs); + return Formatter{ gMapTooltipFormatArgs }; } auto Buf() @@ -107,7 +116,7 @@ public: return CurrentBuf; } - auto GetStartBuf() const + auto Data() const { return StartBuf; } diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 2d41c29de2..90d80be133 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -2443,11 +2443,11 @@ void NetworkBase::Client_Handle_GAMESTATE(NetworkConnection& connection, Network { log_info("Wrote desync report to '%s'", outputFile.c_str()); - uint8_t args[32]{}; - Formatter(args).Add(uniqueFileName); + Formatter ft; + ft.Add(uniqueFileName); char str_desync[1024]; - format_string(str_desync, sizeof(str_desync), STR_DESYNC_REPORT, args); + format_string(str_desync, sizeof(str_desync), STR_DESYNC_REPORT, ft.Data()); auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_desync }); diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index dbc59609ba..20adbd0026 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -536,12 +536,11 @@ void Guest::UpdateEasterEggInteractions() int32_t Guest::GetEasterEggNameId() const { - uint8_t args[32]{}; char buffer[256]{}; - Formatter ft(args); + Formatter ft; FormatNameTo(ft); - format_string(buffer, sizeof(buffer), STR_STRINGID, args); + format_string(buffer, sizeof(buffer), STR_STRINGID, ft.Data()); for (uint32_t i = 0; i < std::size(gPeepEasterEggNames); i++) if (_stricmp(buffer, gPeepEasterEggNames[i]) == 0) @@ -684,12 +683,11 @@ void Guest::HandleEasterEggName() */ int32_t Guest::CheckEasterEggName(int32_t index) const { - uint8_t args[32]{}; char buffer[256]{}; - Formatter ft(args); + Formatter ft; FormatNameTo(ft); - format_string(buffer, sizeof(buffer), STR_STRINGID, args); + format_string(buffer, sizeof(buffer), STR_STRINGID, ft.Data()); return _stricmp(buffer, gPeepEasterEggNames[index]) == 0; } diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 87673c5912..f45ec76789 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -1967,11 +1967,9 @@ void Peep::FormatNameTo(Formatter& ft) const std::string Peep::GetName() const { - uint8_t args[32]{}; - - Formatter ft(args); + Formatter ft; FormatNameTo(ft); - return format_string(STR_STRINGID, args); + return format_string(STR_STRINGID, ft.Data()); } bool Peep::SetName(const std::string_view& value) @@ -3230,17 +3228,15 @@ int32_t peep_compare(const uint16_t sprite_index_a, const uint16_t sprite_index_ } // Compare their names as strings - uint8_t args[32]{}; - char nameA[256]{}; - Formatter ft(args); + Formatter ft; peep_a->FormatNameTo(ft); - format_string(nameA, sizeof(nameA), STR_STRINGID, args); + format_string(nameA, sizeof(nameA), STR_STRINGID, ft.Data()); char nameB[256]{}; - ft = Formatter(args); + ft.Rewind(); peep_b->FormatNameTo(ft); - format_string(nameB, sizeof(nameB), STR_STRINGID, args); + format_string(nameB, sizeof(nameB), STR_STRINGID, ft.Data()); return strlogicalcmp(nameA, nameB); } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 00b4710f39..c3cbceed5c 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -5498,15 +5498,13 @@ static bool ride_with_colour_config_exists(uint8_t ride_type, const TrackColour* bool Ride::NameExists(const std::string_view& name, ride_id_t excludeRideId) { char buffer[256]{}; - uint8_t formatArgs[32]{}; - for (auto& ride : GetRideManager()) { if (ride.id != excludeRideId) { - Formatter ft(formatArgs); + Formatter ft; ride.FormatNameTo(ft); - format_string(buffer, 256, STR_STRINGID, formatArgs); + format_string(buffer, 256, STR_STRINGID, ft.Data()); if (std::string_view(buffer) == name && ride_has_any_track_elements(&ride)) { return true; @@ -5590,7 +5588,6 @@ money32 ride_get_common_price(Ride* forRide) void Ride::SetNameToDefault() { char rideNameBuffer[256]{}; - uint8_t rideNameArgs[32]{}; // Increment default name number until we find a unique name custom_name = {}; @@ -5598,9 +5595,9 @@ void Ride::SetNameToDefault() do { default_name_number++; - Formatter ft(rideNameArgs); + Formatter ft; FormatNameTo(ft); - format_string(rideNameBuffer, 256, STR_STRINGID, &rideNameArgs); + format_string(rideNameBuffer, 256, STR_STRINGID, ft.Data()); } while (Ride::NameExists(rideNameBuffer, id)); } @@ -7565,11 +7562,9 @@ void ride_clear_leftover_entrances(Ride* ride) std::string Ride::GetName() const { - uint8_t args[32]{}; - - Formatter ft(args); + Formatter ft; FormatNameTo(ft); - return format_string(STR_STRINGID, args); + return format_string(STR_STRINGID, ft.Data()); } void Ride::FormatNameTo(Formatter& ft) const diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index a1ed66ad99..dd864b6ce3 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -59,10 +59,9 @@ static constexpr CodePointToUtf8(STR_NO_ENTRY).NumBytes(); + ft.Add(STR_NO_ENTRY); } else if (flags & BANNER_FLAG_LINKED_TO_RIDE) { @@ -90,16 +89,16 @@ void Banner::FormatTextTo(Formatter& ft) const } else { - ft.Add(STR_DEFAULT_SIGN).NumBytes(); + ft.Add(STR_DEFAULT_SIGN); } } else if (text.empty()) { - ft.Add(STR_DEFAULT_SIGN).NumBytes(); + ft.Add(STR_DEFAULT_SIGN); } else { - ft.Add(STR_STRING).Add(text.c_str()).NumBytes(); + ft.Add(STR_STRING).Add(text.c_str()); } }