From abe60acbbb18414c088a77958eb04d5d68a7f9cc Mon Sep 17 00:00:00 2001 From: peter1138 Date: Tue, 4 Oct 2005 21:42:00 +0000 Subject: (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading. --- newgrf.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'newgrf.c') diff --git a/newgrf.c b/newgrf.c index 9bbeea5c2..fb8f28a74 100644 --- a/newgrf.c +++ b/newgrf.c @@ -1404,6 +1404,8 @@ static void NewSpriteGroup(byte *buf, int len) } dg->default_group->ref_count++; + if (_cur_grffile->spritegroups[setid] != NULL) + UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]); _cur_grffile->spritegroups[setid] = group; group->ref_count++; return; @@ -1454,6 +1456,8 @@ static void NewSpriteGroup(byte *buf, int len) } } + if (_cur_grffile->spritegroups[setid] != NULL) + UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]); _cur_grffile->spritegroups[setid] = group; group->ref_count++; return; @@ -1519,6 +1523,8 @@ static void NewSpriteGroup(byte *buf, int len) DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i]->g.result.result, spriteset_id); } + if (_cur_grffile->spritegroups[setid] != NULL) + UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]); _cur_grffile->spritegroups[setid] = group; group->ref_count++; } @@ -2295,6 +2301,29 @@ static void InitializeGRFSpecial(void) | (_patches.wagon_speed_limits ? (1 << 0x1D) : 0); /* wagonspeedlimits */ } +/** + * Unload unused sprite groups from the specified GRF file. + * Called after loading each GRF file. + * @param file GRF file + */ +static void ReleaseSpriteGroups(GRFFile *file) +{ + int i; + + // Bail out if no spritegroups were defined. + if (file->spritegroups == NULL) + return; + + DEBUG(grf, 6)("ReleaseSpriteGroups: Releasing for `%s'.", file->filename); + for (i = 0; i < file->spritegroups_count; i++) { + if (file->spritegroups[i] != NULL) + UnloadSpriteGroup(&file->spritegroups[i]); + } + free(file->spritegroups); + file->spritegroups = NULL; + file->spritegroups_count = 0; +} + /** * Reset all NewGRF loaded data * TODO @@ -2321,6 +2350,10 @@ static void ResetNewGRFData(void) } } memcpy(&_bridge, &orig_bridge, sizeof(_bridge)); + + // Unload sprite group data + UnloadWagonOverrides(); + UnloadCustomEngineSprites(); } static void InitNewGRFFile(const char* filename, int sprite_offset) @@ -2493,6 +2526,11 @@ static void LoadNewGRFFile(const char* filename, uint file_index, uint stage) if (_skip_sprites > 0) _skip_sprites--; } + + // Release our sprite group references. + // Any groups that are referenced elsewhere will be cleaned up later. + // This removes groups that aren't used. (Perhaps skipped?) + ReleaseSpriteGroups(_cur_grffile); } -- cgit v1.2.3-54-g00ecf