summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--newgrf.c16
-rw-r--r--newgrf_station.h1
2 files changed, 16 insertions, 1 deletions
diff --git a/newgrf.c b/newgrf.c
index b617597f2..12b6e304a 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -805,6 +805,8 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
statspec->tiles = grf_load_extended(&buf);
statspec->renderdata = calloc(statspec->tiles, sizeof(*statspec->renderdata));
+ statspec->copied_renderdata = false;
+
for (t = 0; t < statspec->tiles; t++) {
DrawTileSprites *dts = &statspec->renderdata[t];
uint seq_count = 0;
@@ -850,6 +852,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
statspec->tiles = srcstatspec->tiles;
statspec->renderdata = srcstatspec->renderdata;
+ statspec->copied_renderdata = true;
}
break;
@@ -2475,14 +2478,25 @@ static void InitializeGRFSpecial(void)
static void ResetCustomStations(void)
{
+ StationSpec *statspec;
GRFFile *file;
uint i;
+ uint t;
for (file = _first_grffile; file != NULL; file = file->next) {
for (i = 0; i < file->num_stations; i++) {
if (file->stations[i].grfid != file->grfid) continue;
+ statspec = &file->stations[i];
+
+ /* Release renderdata, if it wasn't copied from another custom station spec */
+ if (!statspec->copied_renderdata) {
+ for (t = 0; t < statspec->tiles; t++) {
+ free((void*)statspec->renderdata[t].seq);
+ }
+ free(statspec->renderdata);
+ }
- // TODO: Release renderdata, platforms and layouts
+ // TODO: Release platforms and layouts
}
/* Free and reset the station data */
diff --git a/newgrf_station.h b/newgrf_station.h
index 7ebe78852..073cfe35d 100644
--- a/newgrf_station.h
+++ b/newgrf_station.h
@@ -44,6 +44,7 @@ typedef struct StationSpec {
*/
uint tiles;
DrawTileSprites *renderdata; ///< Array of tile layouts.
+ bool copied_renderdata;
/** Cargo threshold for choosing between little and lots of cargo
* @note little/lots are equivalent to the moving/loading states for vehicles