1
0
Fork 0

Codechange: use std::vector/std::span over MallocT for NewGRF bridge sprites

pull/13641/head
Rubidium 2025-02-20 20:32:35 +01:00 committed by rubidium42
parent 7121bc9f31
commit b64e8c0aea
4 changed files with 27 additions and 39 deletions

View File

@ -50,7 +50,7 @@ struct BridgeSpec {
PaletteID pal; ///< the palette which is used in the GUI PaletteID pal; ///< the palette which is used in the GUI
StringID material; ///< the string that contains the bridge description StringID material; ///< the string that contains the bridge description
StringID transport_name[2]; ///< description of the bridge, when built for road or rail 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<std::vector<PalSpriteID>> sprite_table; ///< table of sprites for drawing the bridge
uint8_t flags; ///< bit 0 set: disable drawing of far pillars. uint8_t flags; ///< bit 0 set: disable drawing of far pillars.
}; };

View File

@ -2376,10 +2376,11 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe
case 0x0D: { // Bridge sprite tables case 0x0D: { // Bridge sprite tables
uint8_t tableid = buf.ReadByte(); uint8_t tableid = buf.ReadByte();
uint8_t numtables = 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 */ /* Allocate memory for sprite table pointers and zero out */
bridge->sprite_table = CallocT<PalSpriteID*>(NUM_BRIDGE_PIECES); bridge->sprite_table.resize(std::min<size_t>(size, NUM_BRIDGE_PIECES));
} }
for (; numtables-- != 0; tableid++) { for (; numtables-- != 0; tableid++) {
@ -2389,8 +2390,8 @@ static ChangeInfoResult BridgeChangeInfo(uint first, uint last, int prop, ByteRe
continue; continue;
} }
if (bridge->sprite_table[tableid] == nullptr) { if (bridge->sprite_table[tableid].empty()) {
bridge->sprite_table[tableid] = MallocT<PalSpriteID>(SPRITES_PER_BRIDGE_PIECE); bridge->sprite_table[tableid].resize(SPRITES_PER_BRIDGE_PIECE);
} }
for (uint8_t sprite = 0; sprite < SPRITES_PER_BRIDGE_PIECE; sprite++) { for (uint8_t sprite = 0; sprite < SPRITES_PER_BRIDGE_PIECE; sprite++) {

View File

@ -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 }, { 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<const PalSpriteID> _bridge_sprite_table_archgirder[] = {
_bridge_sprite_table_archgirder_middle, _bridge_sprite_table_archgirder_middle,
_bridge_sprite_table_archgirder_middle, _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, _bridge_sprite_table_archgirder_heads,
}; };
static const PalSpriteID * const _bridge_sprite_table_4[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_4[] = {
_bridge_sprite_table_4_0, _bridge_sprite_table_4_0,
_bridge_sprite_table_4_1, _bridge_sprite_table_4_1,
_bridge_sprite_table_4_2, _bridge_sprite_table_4_2,
@ -599,7 +599,7 @@ static const PalSpriteID * const _bridge_sprite_table_4[] = {
_bridge_sprite_table_4_6, _bridge_sprite_table_4_6,
}; };
static const PalSpriteID * const _bridge_sprite_table_5[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_5[] = {
_bridge_sprite_table_5_0, _bridge_sprite_table_5_0,
_bridge_sprite_table_5_1, _bridge_sprite_table_5_1,
_bridge_sprite_table_5_2, _bridge_sprite_table_5_2,
@ -609,7 +609,7 @@ static const PalSpriteID * const _bridge_sprite_table_5[] = {
_bridge_sprite_table_5_6, _bridge_sprite_table_5_6,
}; };
static const PalSpriteID * const _bridge_sprite_table_concrete_suspended[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_concrete_suspended[] = {
_bridge_sprite_table_concrete_suspended_A, _bridge_sprite_table_concrete_suspended_A,
_bridge_sprite_table_concrete_suspended_B, _bridge_sprite_table_concrete_suspended_B,
_bridge_sprite_table_concrete_suspended_C, _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, _bridge_sprite_table_concrete_suspended_heads,
}; };
static const PalSpriteID * const _bridge_sprite_table_6[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_6[] = {
_bridge_sprite_table_6_0, _bridge_sprite_table_6_0,
_bridge_sprite_table_6_1, _bridge_sprite_table_6_1,
_bridge_sprite_table_6_2, _bridge_sprite_table_6_2,
@ -629,7 +629,7 @@ static const PalSpriteID * const _bridge_sprite_table_6[] = {
_bridge_sprite_table_6_3, _bridge_sprite_table_6_3,
}; };
static const PalSpriteID * const _bridge_sprite_table_7[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_7[] = {
_bridge_sprite_table_7_0, _bridge_sprite_table_7_0,
_bridge_sprite_table_7_1, _bridge_sprite_table_7_1,
_bridge_sprite_table_7_2, _bridge_sprite_table_7_2,
@ -639,7 +639,7 @@ static const PalSpriteID * const _bridge_sprite_table_7[] = {
_bridge_sprite_table_7_3, _bridge_sprite_table_7_3,
}; };
static const PalSpriteID * const _bridge_sprite_table_8[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_8[] = {
_bridge_sprite_table_8_0, _bridge_sprite_table_8_0,
_bridge_sprite_table_8_1, _bridge_sprite_table_8_1,
_bridge_sprite_table_8_2, _bridge_sprite_table_8_2,
@ -649,7 +649,7 @@ static const PalSpriteID * const _bridge_sprite_table_8[] = {
_bridge_sprite_table_8_3, _bridge_sprite_table_8_3,
}; };
static const PalSpriteID * const _bridge_sprite_table_wood[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_wood[] = {
_bridge_sprite_table_wood_middle, _bridge_sprite_table_wood_middle,
_bridge_sprite_table_wood_middle, _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, _bridge_sprite_table_wood_heads,
}; };
static const PalSpriteID * const _bridge_sprite_table_concrete[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_concrete[] = {
_bridge_sprite_table_concrete_middle, _bridge_sprite_table_concrete_middle,
_bridge_sprite_table_concrete_middle, _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, _bridge_sprite_table_concrete_heads,
}; };
static const PalSpriteID * const _bridge_sprite_table_9[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_9[] = {
_bridge_sprite_table_9_0, _bridge_sprite_table_9_0,
_bridge_sprite_table_9_0, _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, _bridge_sprite_table_4_6,
}; };
static const PalSpriteID * const _bridge_sprite_table_10[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_10[] = {
_bridge_sprite_table_10_0, _bridge_sprite_table_10_0,
_bridge_sprite_table_10_1, _bridge_sprite_table_10_1,
_bridge_sprite_table_10_2, _bridge_sprite_table_10_2,
@ -689,7 +689,7 @@ static const PalSpriteID * const _bridge_sprite_table_10[] = {
_bridge_sprite_table_4_6, _bridge_sprite_table_4_6,
}; };
static const PalSpriteID * const _bridge_sprite_table_11[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_11[] = {
_bridge_sprite_table_11_0, _bridge_sprite_table_11_0,
_bridge_sprite_table_11_1, _bridge_sprite_table_11_1,
_bridge_sprite_table_11_2, _bridge_sprite_table_11_2,
@ -699,7 +699,7 @@ static const PalSpriteID * const _bridge_sprite_table_11[] = {
_bridge_sprite_table_5_6, _bridge_sprite_table_5_6,
}; };
static const PalSpriteID * const _bridge_sprite_table_12[] = { static const std::span<const PalSpriteID> _bridge_sprite_table_12[] = {
_bridge_sprite_table_12_0, _bridge_sprite_table_12_0,
_bridge_sprite_table_12_1, _bridge_sprite_table_12_1,
_bridge_sprite_table_12_2, _bridge_sprite_table_12_2,
@ -709,7 +709,7 @@ static const PalSpriteID * const _bridge_sprite_table_12[] = {
_bridge_sprite_table_concrete_suspended_heads, _bridge_sprite_table_concrete_suspended_heads,
}; };
static const PalSpriteID * const * const _bridge_sprite_table[MAX_BRIDGES] = { static const std::span<const std::span<const PalSpriteID>> _bridge_sprite_table[MAX_BRIDGES] = {
_bridge_sprite_table_wood, _bridge_sprite_table_wood,
_bridge_sprite_table_concrete, _bridge_sprite_table_concrete,
_bridge_sprite_table_archgirder, _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 * @param nrd description of the road bridge in query tool
*/ */
#define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \ #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[] = { const BridgeSpec _orig_bridge[] = {
/* /*

View File

@ -85,18 +85,7 @@ void MarkBridgeDirty(TileIndex tile)
/** Reset the data been eventually changed by the grf loaded. */ /** Reset the data been eventually changed by the grf loaded. */
void ResetBridges() void ResetBridges()
{ {
/* First, free sprite table data */ std::ranges::copy(_orig_bridge, std::begin(_bridge));
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));
} }
/** /**
@ -149,15 +138,13 @@ bool HasBridgeFlatRamp(Slope tileh, Axis axis)
return (tileh != SLOPE_FLAT); return (tileh != SLOPE_FLAT);
} }
static inline const PalSpriteID *GetBridgeSpriteTable(int index, BridgePieces table) static inline std::span<const PalSpriteID> GetBridgeSpriteTable(int index, BridgePieces table)
{ {
const BridgeSpec *bridge = GetBridgeSpec(index); const BridgeSpec *bridge = GetBridgeSpec(index);
assert(table < NUM_BRIDGE_PIECES); assert(table < NUM_BRIDGE_PIECES);
if (bridge->sprite_table == nullptr || bridge->sprite_table[table] == nullptr) { if (table < bridge->sprite_table.size() && !bridge->sprite_table[table].empty()) return bridge->sprite_table[table];
return _bridge_sprite_table[index][table]; return _bridge_sprite_table[index][table];
} else {
return bridge->sprite_table[table];
}
} }
@ -1581,7 +1568,7 @@ void DrawBridgeMiddle(const TileInfo *ti)
base_offset = 8; base_offset = 8;
} }
psid = base_offset + GetBridgeSpriteTable(type, piece); psid = &GetBridgeSpriteTable(type, piece)[base_offset];
} else { } else {
drawfarpillar = true; drawfarpillar = true;
psid = _aqueduct_sprites; psid = _aqueduct_sprites;