diff options
-rw-r--r-- | src/newgrf.cpp | 25 | ||||
-rw-r--r-- | src/newgrf_spritegroup.cpp | 54 | ||||
-rw-r--r-- | src/newgrf_spritegroup.h | 19 |
3 files changed, 35 insertions, 63 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp index e81681ebc..43a5e9f1f 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2595,9 +2595,7 @@ static void ReserveChangeInfo(byte *buf, size_t len) */ static const SpriteGroup *NewCallBackResultSpriteGroup(uint16 value) { - SpriteGroup *group = AllocateSpriteGroup(); - - group->type = SGT_CALLBACK; + SpriteGroup *group = new SpriteGroup(SGT_CALLBACK); /* Old style callback results have the highest byte 0xFF so signify it is a callback result * New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */ @@ -2620,8 +2618,7 @@ static const SpriteGroup *NewCallBackResultSpriteGroup(uint16 value) */ static const SpriteGroup *NewResultSpriteGroup(SpriteID sprite, byte num_sprites) { - SpriteGroup *group = AllocateSpriteGroup(); - group->type = SGT_RESULT; + SpriteGroup *group = new SpriteGroup(SGT_RESULT); group->g.result.sprite = sprite; group->g.result.num_sprites = num_sprites; return group; @@ -2768,8 +2765,7 @@ static void NewSpriteGroup(byte *buf, size_t len) /* Check we can load the var size parameter */ if (!check_length(bufend - buf, 1, "NewSpriteGroup (Deterministic) (1)")) return; - group = AllocateSpriteGroup(); - group->type = SGT_DETERMINISTIC; + group = new SpriteGroup(SGT_DETERMINISTIC); group->g.determ.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF; switch (GB(type, 2, 2)) { @@ -2843,8 +2839,7 @@ static void NewSpriteGroup(byte *buf, size_t len) { if (!check_length(bufend - buf, HasBit(type, 2) ? 8 : 7, "NewSpriteGroup (Randomized) (1)")) return; - group = AllocateSpriteGroup(); - group->type = SGT_RANDOMIZED; + group = new SpriteGroup(SGT_RANDOMIZED); group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF; if (HasBit(type, 2)) { @@ -2893,8 +2888,7 @@ static void NewSpriteGroup(byte *buf, size_t len) if (!check_length(bufend - buf, 2 * num_loaded + 2 * num_loading, "NewSpriteGroup (Real) (1)")) return; - group = AllocateSpriteGroup(); - group->type = SGT_REAL; + group = new SpriteGroup(SGT_REAL); group->g.real.num_loaded = num_loaded; group->g.real.num_loading = num_loading; @@ -2925,8 +2919,7 @@ static void NewSpriteGroup(byte *buf, size_t len) byte num_sprites = max((uint8)1, type); uint i; - group = AllocateSpriteGroup(); - group->type = SGT_TILELAYOUT; + group = new SpriteGroup(SGT_TILELAYOUT); group->g.layout.num_sprites = sprites; group->g.layout.dts = CallocT<DrawTileSprites>(1); @@ -2987,8 +2980,7 @@ static void NewSpriteGroup(byte *buf, size_t len) break; } - group = AllocateSpriteGroup(); - group->type = SGT_INDUSTRY_PRODUCTION; + group = new SpriteGroup(SGT_INDUSTRY_PRODUCTION); group->g.indprod.version = type; if (type == 0) { for (uint i = 0; i < 3; i++) { @@ -5631,7 +5623,8 @@ static void ResetNewGRFData() _grf_id_overrides.clear(); InitializeSoundPool(); - InitializeSpriteGroupPool(); + _SpriteGroup_pool.CleanPool(); + _SpriteGroup_pool.AddBlockToPool(); } static void BuildCargoTranslationMap() diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 511a6be2c..c4b400210 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -7,68 +7,38 @@ #include "newgrf.h" #include "newgrf_spritegroup.h" #include "sprite.h" +#include "oldpool_func.h" -static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item); +DEFINE_OLD_POOL_GENERIC(SpriteGroup, SpriteGroup) -static uint _spritegroup_count = 0; -STATIC_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250, NULL, SpriteGroupPoolCleanBlock) - -static void DestroySpriteGroup(SpriteGroup *group) +SpriteGroup::~SpriteGroup() { /* Free dynamically allocated memory */ - /* XXX Cast away the consts due to MSVC being buggy... */ - switch (group->type) { + switch (this->type) { case SGT_REAL: - free((SpriteGroup**)group->g.real.loaded); - free((SpriteGroup**)group->g.real.loading); + free((SpriteGroup**)this->g.real.loaded); + free((SpriteGroup**)this->g.real.loading); break; case SGT_DETERMINISTIC: - free(group->g.determ.adjusts); - free(group->g.determ.ranges); + free(this->g.determ.adjusts); + free(this->g.determ.ranges); break; case SGT_RANDOMIZED: - free((SpriteGroup**)group->g.random.groups); + free((SpriteGroup**)this->g.random.groups); break; case SGT_TILELAYOUT: - free((void*)group->g.layout.dts->seq); - free(group->g.layout.dts); + free((void*)this->g.layout.dts->seq); + free(this->g.layout.dts); break; default: break; } -} - -static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item) -{ - uint i; - - for (i = start_item; i <= end_item; i++) { - DestroySpriteGroup(GetSpriteGroup(i)); - } -} - - -/* Allocate a new SpriteGroup */ -SpriteGroup *AllocateSpriteGroup() -{ - /* This is totally different to the other pool allocators, as we never remove an item from the pool. */ - if (_spritegroup_count == GetSpriteGroupPoolSize()) { - if (!_SpriteGroup_pool.AddBlockToPool()) return NULL; - } - - return GetSpriteGroup(_spritegroup_count++); -} - - -void InitializeSpriteGroupPool() -{ - _SpriteGroup_pool.CleanPool(); - _spritegroup_count = 0; + this->type = SGT_INVALID; } TemporaryStorageArray<uint32, 0x110> _temp_store; diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index 0b83934d9..1e745480b 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -11,6 +11,7 @@ #include "gfx_type.h" #include "engine_type.h" #include "tile_type.h" +#include "oldpool.h" #include "newgrf_cargo.h" #include "newgrf_callbacks.h" @@ -182,8 +183,18 @@ enum SpriteGroupType { SGT_INDUSTRY_PRODUCTION, }; +typedef uint32 SpriteGroupID; +DECLARE_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250) + /* Common wrapper for all the different sprite group types */ -struct SpriteGroup { +struct SpriteGroup : PoolItem<SpriteGroup, SpriteGroupID, &_SpriteGroup_pool> { + SpriteGroup(SpriteGroupType type = SGT_INVALID) : + type(type) + { + } + + ~SpriteGroup(); + SpriteGroupType type; union { @@ -195,11 +206,9 @@ struct SpriteGroup { TileLayoutSpriteGroup layout; IndustryProductionSpriteGroup indprod; } g; -}; - -SpriteGroup *AllocateSpriteGroup(); -void InitializeSpriteGroupPool(); + inline bool IsValid() const { return this->type != SGT_INVALID; } +}; struct ResolverObject { |