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
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<std::vector<PalSpriteID>> sprite_table; ///< table of sprites for drawing the bridge
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
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<PalSpriteID*>(NUM_BRIDGE_PIECES);
bridge->sprite_table.resize(std::min<size_t>(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<PalSpriteID>(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++) {

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 },
};
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,
@ -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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const PalSpriteID> _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<const std::span<const PalSpriteID>> _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[] = {
/*

View File

@ -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<const PalSpriteID> 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;