# HG changeset patch # User rubidium # Date 1242570733 0 # Node ID 6734ebc1fa61ea6cb757784c499963ed06a7b801 # Parent 5878eda02d5950caccecc7df7829f53410ab1bb9 (svn r16336) -Codechange: make the SpriteGroup pool more like the 'normal' pools diff --git a/src/newgrf.cpp b/src/newgrf.cpp --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2595,9 +2595,7 @@ */ 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 *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 @@ /* 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 @@ { 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 @@ 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 @@ 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(1); @@ -2987,8 +2980,7 @@ 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 @@ _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 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -7,68 +7,38 @@ #include "newgrf.h" #include "newgrf_spritegroup.h" #include "sprite.h" - -static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item); +#include "oldpool_func.h" -static uint _spritegroup_count = 0; -STATIC_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250, NULL, SpriteGroupPoolCleanBlock) +DEFINE_OLD_POOL_GENERIC(SpriteGroup, SpriteGroup) -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 _temp_store; diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h --- 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 @@ 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(SpriteGroupType type = SGT_INVALID) : + type(type) + { + } + + ~SpriteGroup(); + SpriteGroupType type; union { @@ -195,13 +206,11 @@ TileLayoutSpriteGroup layout; IndustryProductionSpriteGroup indprod; } g; + + inline bool IsValid() const { return this->type != SGT_INVALID; } }; -SpriteGroup *AllocateSpriteGroup(); -void InitializeSpriteGroupPool(); - - struct ResolverObject { CallbackID callback; uint32 callback_param1;