From 3d137e9c0f25fb3d9fc2cfa5013310818c0d37da Mon Sep 17 00:00:00 2001 From: peter1138 Date: Thu, 20 Apr 2006 13:33:40 +0000 Subject: [PATCH] (svn r4483) - NewGRF: Dynamically allocate memory for 'real' spritegroups. This removes the limit of 16 loading/unloading states, although will result in less memory usage as most of the time the full fixed allocation wasn't used. --- newgrf.c | 12 +++--------- sprite.c | 2 ++ sprite.h | 10 ++++------ 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/newgrf.c b/newgrf.c index a5efdff4d1..f3a8861345 100644 --- a/newgrf.c +++ b/newgrf.c @@ -1480,15 +1480,6 @@ static void NewSpriteGroup(byte *buf, int len) if (_cur_grffile->first_spriteset == 0) _cur_grffile->first_spriteset = _cur_grffile->spriteset_start; - if (numloaded > 16) { - grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid); - numloaded = 16; - } - if (numloading > 16) { - grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid); - numloading = 16; - } - group = calloc(1, sizeof(*group)); group->type = SGT_REAL; rg = &group->g.real; @@ -1497,6 +1488,9 @@ static void NewSpriteGroup(byte *buf, int len) rg->loaded_count = numloaded; rg->loading_count = numloading; + rg->loaded = calloc(rg->loaded_count, sizeof(*rg->loaded)); + rg->loading = calloc(rg->loading_count, sizeof(*rg->loading)); + DEBUG(grf, 6) ("NewSpriteGroup: New SpriteGroup 0x%02hhx, %u views, %u loaded, %u loading, sprites %u - %u", setid, rg->sprites_per_set, rg->loaded_count, rg->loading_count, _cur_grffile->spriteset_start - _cur_grffile->sprite_offset, diff --git a/sprite.c b/sprite.c index 2d76b75272..47d0c1c8b0 100644 --- a/sprite.c +++ b/sprite.c @@ -132,6 +132,8 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr) for (i = 0; i < rsg->loaded_count; i++) { if (rsg->loaded[i] != NULL) UnloadSpriteGroup(&rsg->loaded[i]); } + free(group->g.real.loaded); + free(group->g.real.loading); free(group); return; } diff --git a/sprite.h b/sprite.h index 877e3c9e84..cba95de447 100644 --- a/sprite.h +++ b/sprite.h @@ -32,8 +32,6 @@ typedef struct DrawTileSprites { typedef struct SpriteGroup SpriteGroup; typedef struct RealSpriteGroup { - // XXX: Would anyone ever need more than 16 spritesets? Maybe we should - // use even less, now we take whole 8kb for custom sprites table, oh my! byte sprites_per_set; // means number of directions - 4 or 8 // Loaded = in motion, loading = not moving @@ -43,10 +41,10 @@ typedef struct RealSpriteGroup { // with small amount of cargo whilst loading is for stations with a lot // of da stuff. - byte loaded_count; - SpriteGroup *loaded[16]; // sprite ids - byte loading_count; - SpriteGroup *loading[16]; // sprite ids + byte loaded_count; ///< Number of loaded groups + SpriteGroup **loaded; ///< List of loaded groups (can be SpriteIDs or Callback results) + byte loading_count; ///< Number of loading groups + SpriteGroup **loading; ///< List of loading groups (can be SpriteIDs or Callback results) } RealSpriteGroup; /* Shared by deterministic and random groups. */