peter1138@3595: /* $Id$ */ peter1138@3595: peter1138@3595: #include "stdafx.h" peter1138@3595: #include "openttd.h" peter1138@3595: #include "pool.h" peter1138@3595: #include "sprite.h" peter1138@3595: peter1138@3595: enum { peter1138@3595: SPRITEGROUP_POOL_BLOCK_SIZE_BITS = 4, /* (1 << 4) == 16 items */ peter1138@3595: SPRITEGROUP_POOL_MAX_BLOCKS = 8000, peter1138@3595: }; peter1138@3595: peter1138@3595: static uint _spritegroup_count = 0; peter1138@3595: static MemoryPool _spritegroup_pool; peter1138@3595: peter1138@3595: peter1138@3595: static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item) peter1138@3595: { peter1138@3595: uint i; peter1138@3595: peter1138@3595: for (i = start_item; i <= end_item; i++) { peter1138@3595: SpriteGroup *group = (SpriteGroup*)GetItemFromPool(&_spritegroup_pool, i); peter1138@3595: peter1138@3595: /* Free dynamically allocated memory */ peter1138@3595: switch (group->type) { peter1138@3595: case SGT_REAL: peter1138@3595: free(group->g.real.loaded); peter1138@3595: free(group->g.real.loading); peter1138@3595: break; peter1138@3595: peter1138@3595: case SGT_DETERMINISTIC: peter1138@3595: free(group->g.determ.ranges); peter1138@3595: break; peter1138@3595: peter1138@3595: case SGT_RANDOMIZED: peter1138@3595: free(group->g.random.groups); peter1138@3595: break; peter1138@3595: peter1138@3595: default: peter1138@3595: break; peter1138@3595: } peter1138@3595: } peter1138@3595: } peter1138@3595: peter1138@3595: peter1138@3595: /* Initialize the SpriteGroup pool */ peter1138@3595: static MemoryPool _spritegroup_pool = { "SpriteGr", SPRITEGROUP_POOL_MAX_BLOCKS, SPRITEGROUP_POOL_BLOCK_SIZE_BITS, sizeof(SpriteGroup), NULL, &SpriteGroupPoolCleanBlock, 0, 0, NULL }; peter1138@3595: peter1138@3595: peter1138@3595: /* Allocate a new SpriteGroup */ peter1138@3595: SpriteGroup *AllocateSpriteGroup(void) peter1138@3595: { peter1138@3595: /* This is totally different to the other pool allocators, as we never remove an item from the pool. */ peter1138@3595: if (_spritegroup_count == _spritegroup_pool.total_items) { peter1138@3595: if (!AddBlockToPool(&_spritegroup_pool)) return NULL; peter1138@3595: } peter1138@3595: peter1138@3595: return (SpriteGroup*)GetItemFromPool(&_spritegroup_pool, _spritegroup_count++); peter1138@3595: } peter1138@3595: peter1138@3595: peter1138@3595: void InitializeSpriteGroupPool(void) peter1138@3595: { peter1138@3595: CleanPool(&_spritegroup_pool); peter1138@3595: AddBlockToPool(&_spritegroup_pool); peter1138@3595: peter1138@3595: _spritegroup_count = 0; peter1138@3595: }