From b64e8c0aea7be7f57bb51f4691ae0d49d6c4fbcf Mon Sep 17 00:00:00 2001 From: Rubidium Date: Thu, 20 Feb 2025 20:32:35 +0100 Subject: [PATCH] Codechange: use std::vector/std::span over MallocT for NewGRF bridge sprites --- src/bridge.h | 2 +- src/newgrf.cpp | 9 +++++---- src/table/bridge_land.h | 30 +++++++++++++++--------------- src/tunnelbridge_cmd.cpp | 25 ++++++------------------- 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/src/bridge.h b/src/bridge.h index 0b23b24ea4..c9e7200698 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -50,7 +50,7 @@ struct BridgeSpec { PaletteID pal; ///< the palette which is used in the GUI StringID material; ///< the string that contains the bridge description StringID transport_name[2]; ///< description of the bridge, when built for road or rail - PalSpriteID **sprite_table; ///< table of sprites for drawing the bridge + std::vector> sprite_table; ///< table of sprites for drawing the bridge uint8_t flags; ///< bit 0 set: disable drawing of far pillars. }; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 153bbce7ae..7604c416b3 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2376,10 +2376,11 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe case 0x0D: { // Bridge sprite tables uint8_t tableid = buf.ReadByte(); uint8_t numtables = buf.ReadByte(); + size_t size = tableid + numtables; - if (bridge->sprite_table == nullptr) { + if (bridge->sprite_table.size() < size) { /* Allocate memory for sprite table pointers and zero out */ - bridge->sprite_table = CallocT(NUM_BRIDGE_PIECES); + bridge->sprite_table.resize(std::min(size, NUM_BRIDGE_PIECES)); } for (; numtables-- != 0; tableid++) { @@ -2389,8 +2390,8 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe continue; } - if (bridge->sprite_table[tableid] == nullptr) { - bridge->sprite_table[tableid] = MallocT(SPRITES_PER_BRIDGE_PIECE); + if (bridge->sprite_table[tableid].empty()) { + bridge->sprite_table[tableid].resize(SPRITES_PER_BRIDGE_PIECE); } for (uint8_t sprite = 0; sprite < SPRITES_PER_BRIDGE_PIECE; sprite++) { diff --git a/src/table/bridge_land.h b/src/table/bridge_land.h index 6ac0056c27..8561149695 100644 --- a/src/table/bridge_land.h +++ b/src/table/bridge_land.h @@ -579,7 +579,7 @@ static const PalSpriteID _bridge_sprite_table_12_2[] = { { 0xA1F, PALETTE_TO_STRUCT_CONCRETE }, { 0xA03, PALETTE_TO_STRUCT_CONCRETE }, { 0xA07, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE }, }; -static const PalSpriteID * const _bridge_sprite_table_archgirder[] = { +static const std::span _bridge_sprite_table_archgirder[] = { _bridge_sprite_table_archgirder_middle, _bridge_sprite_table_archgirder_middle, _bridge_sprite_table_archgirder_middle, @@ -589,7 +589,7 @@ static const PalSpriteID * const _bridge_sprite_table_archgirder[] = { _bridge_sprite_table_archgirder_heads, }; -static const PalSpriteID * const _bridge_sprite_table_4[] = { +static const std::span _bridge_sprite_table_4[] = { _bridge_sprite_table_4_0, _bridge_sprite_table_4_1, _bridge_sprite_table_4_2, @@ -599,7 +599,7 @@ static const PalSpriteID * const _bridge_sprite_table_4[] = { _bridge_sprite_table_4_6, }; -static const PalSpriteID * const _bridge_sprite_table_5[] = { +static const std::span _bridge_sprite_table_5[] = { _bridge_sprite_table_5_0, _bridge_sprite_table_5_1, _bridge_sprite_table_5_2, @@ -609,7 +609,7 @@ static const PalSpriteID * const _bridge_sprite_table_5[] = { _bridge_sprite_table_5_6, }; -static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = { +static const std::span _bridge_sprite_table_concrete_suspended[] = { _bridge_sprite_table_concrete_suspended_A, _bridge_sprite_table_concrete_suspended_B, _bridge_sprite_table_concrete_suspended_C, @@ -619,7 +619,7 @@ static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = { _bridge_sprite_table_concrete_suspended_heads, }; -static const PalSpriteID * const _bridge_sprite_table_6[] = { +static const std::span _bridge_sprite_table_6[] = { _bridge_sprite_table_6_0, _bridge_sprite_table_6_1, _bridge_sprite_table_6_2, @@ -629,7 +629,7 @@ static const PalSpriteID * const _bridge_sprite_table_6[] = { _bridge_sprite_table_6_3, }; -static const PalSpriteID * const _bridge_sprite_table_7[] = { +static const std::span _bridge_sprite_table_7[] = { _bridge_sprite_table_7_0, _bridge_sprite_table_7_1, _bridge_sprite_table_7_2, @@ -639,7 +639,7 @@ static const PalSpriteID * const _bridge_sprite_table_7[] = { _bridge_sprite_table_7_3, }; -static const PalSpriteID * const _bridge_sprite_table_8[] = { +static const std::span _bridge_sprite_table_8[] = { _bridge_sprite_table_8_0, _bridge_sprite_table_8_1, _bridge_sprite_table_8_2, @@ -649,7 +649,7 @@ static const PalSpriteID * const _bridge_sprite_table_8[] = { _bridge_sprite_table_8_3, }; -static const PalSpriteID * const _bridge_sprite_table_wood[] = { +static const std::span _bridge_sprite_table_wood[] = { _bridge_sprite_table_wood_middle, _bridge_sprite_table_wood_middle, _bridge_sprite_table_wood_middle, @@ -659,7 +659,7 @@ static const PalSpriteID * const _bridge_sprite_table_wood[] = { _bridge_sprite_table_wood_heads, }; -static const PalSpriteID * const _bridge_sprite_table_concrete[] = { +static const std::span _bridge_sprite_table_concrete[] = { _bridge_sprite_table_concrete_middle, _bridge_sprite_table_concrete_middle, _bridge_sprite_table_concrete_middle, @@ -669,7 +669,7 @@ static const PalSpriteID * const _bridge_sprite_table_concrete[] = { _bridge_sprite_table_concrete_heads, }; -static const PalSpriteID * const _bridge_sprite_table_9[] = { +static const std::span _bridge_sprite_table_9[] = { _bridge_sprite_table_9_0, _bridge_sprite_table_9_0, _bridge_sprite_table_9_0, @@ -679,7 +679,7 @@ static const PalSpriteID * const _bridge_sprite_table_9[] = { _bridge_sprite_table_4_6, }; -static const PalSpriteID * const _bridge_sprite_table_10[] = { +static const std::span _bridge_sprite_table_10[] = { _bridge_sprite_table_10_0, _bridge_sprite_table_10_1, _bridge_sprite_table_10_2, @@ -689,7 +689,7 @@ static const PalSpriteID * const _bridge_sprite_table_10[] = { _bridge_sprite_table_4_6, }; -static const PalSpriteID * const _bridge_sprite_table_11[] = { +static const std::span _bridge_sprite_table_11[] = { _bridge_sprite_table_11_0, _bridge_sprite_table_11_1, _bridge_sprite_table_11_2, @@ -699,7 +699,7 @@ static const PalSpriteID * const _bridge_sprite_table_11[] = { _bridge_sprite_table_5_6, }; -static const PalSpriteID * const _bridge_sprite_table_12[] = { +static const std::span _bridge_sprite_table_12[] = { _bridge_sprite_table_12_0, _bridge_sprite_table_12_1, _bridge_sprite_table_12_2, @@ -709,7 +709,7 @@ static const PalSpriteID * const _bridge_sprite_table_12[] = { _bridge_sprite_table_concrete_suspended_heads, }; -static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = { +static const std::span> _bridge_sprite_table[MAX_BRIDGES] = { _bridge_sprite_table_wood, _bridge_sprite_table_concrete, _bridge_sprite_table_archgirder, @@ -739,7 +739,7 @@ static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = { * @param nrd description of the road bridge in query tool */ #define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \ - {TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, nullptr, 0} + {TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0} const BridgeSpec _orig_bridge[] = { /* diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 95f6962b1d..0daa3e043b 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -85,18 +85,7 @@ void MarkBridgeDirty(TileIndex tile) /** Reset the data been eventually changed by the grf loaded. */ void ResetBridges() { - /* First, free sprite table data */ - for (BridgeType i = 0; i < MAX_BRIDGES; i++) { - if (_bridge[i].sprite_table != nullptr) { - for (BridgePieces j = BRIDGE_PIECE_NORTH; j < NUM_BRIDGE_PIECES; j++) free(_bridge[i].sprite_table[j]); - free(_bridge[i].sprite_table); - } - } - - /* Then, wipe out current bridges */ - memset(&_bridge, 0, sizeof(_bridge)); - /* And finally, reinstall default data */ - memcpy(&_bridge, &_orig_bridge, sizeof(_orig_bridge)); + std::ranges::copy(_orig_bridge, std::begin(_bridge)); } /** @@ -149,15 +138,13 @@ bool HasBridgeFlatRamp(Slope tileh, Axis axis) return (tileh != SLOPE_FLAT); } -static inline const PalSpriteID *GetBridgeSpriteTable(int index, BridgePieces table) +static inline std::span GetBridgeSpriteTable(int index, BridgePieces table) { const BridgeSpec *bridge = GetBridgeSpec(index); assert(table < NUM_BRIDGE_PIECES); - if (bridge->sprite_table == nullptr || bridge->sprite_table[table] == nullptr) { - return _bridge_sprite_table[index][table]; - } else { - return bridge->sprite_table[table]; - } + if (table < bridge->sprite_table.size() && !bridge->sprite_table[table].empty()) return bridge->sprite_table[table]; + + return _bridge_sprite_table[index][table]; } @@ -1581,7 +1568,7 @@ void DrawBridgeMiddle(const TileInfo *ti) base_offset = 8; } - psid = base_offset + GetBridgeSpriteTable(type, piece); + psid = &GetBridgeSpriteTable(type, piece)[base_offset]; } else { drawfarpillar = true; psid = _aqueduct_sprites;