summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf.cpp25
-rw-r--r--src/newgrf_spritegroup.cpp54
-rw-r--r--src/newgrf_spritegroup.h19
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 {