summaryrefslogtreecommitdiff
path: root/newgrf.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2005-10-04 21:42:00 +0000
committerpeter1138 <peter1138@openttd.org>2005-10-04 21:42:00 +0000
commitabe60acbbb18414c088a77958eb04d5d68a7f9cc (patch)
tree8a9d84ea55620c79439c18989514cb8167dfcbb6 /newgrf.c
parentc655e13e92aefef1503e7869b3dc3185cc1b2757 (diff)
downloadopenttd-abe60acbbb18414c088a77958eb04d5d68a7f9cc.tar.xz
(svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
Diffstat (limited to 'newgrf.c')
-rw-r--r--newgrf.c38
1 files changed, 38 insertions, 0 deletions
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++;
}
@@ -2296,6 +2302,29 @@ static void InitializeGRFSpecial(void)
}
/**
+ * 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);
}