(svn r4352) - NewGRF Codechange: dynamically allocate the memory used to store custom station data. This saves us approximately 40KB per GRF file, if there are no stations defined.

This commit is contained in:
peter1138 2006-04-11 10:05:52 +00:00
parent 28dfdd7863
commit 432ef5cad9
2 changed files with 18 additions and 5 deletions

View File

@ -762,10 +762,17 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
int i; int i;
int ret = 0; int ret = 0;
/* This is one single huge TODO. It doesn't handle anything more than /* Allocate station specs if necessary */
* just waypoints for now. */ if (_cur_grffile->num_stations < stid + numinfo) {
_cur_grffile->stations = realloc(_cur_grffile->stations, (stid + numinfo) * sizeof(*_cur_grffile->stations))
;
while (_cur_grffile->num_stations < stid + numinfo) {
memset(&_cur_grffile->stations[_cur_grffile->num_stations], 0, sizeof(*_cur_grffile->stations));
_cur_grffile->num_stations++;
}
}
//printf("sci %d %d [0x%02x]\n", stid, numinfo, prop);
switch (prop) { switch (prop) {
case 0x08: case 0x08:
{ /* Class ID */ { /* Class ID */
@ -2357,7 +2364,7 @@ static void ResetCustomStations(void)
CargoID c; CargoID c;
for (file = _first_grffile; file != NULL; file = file->next) { for (file = _first_grffile; file != NULL; file = file->next) {
for (i = 0; i < lengthof(file->stations); i++) { for (i = 0; i < file->num_stations; i++) {
if (file->stations[i].grfid != file->grfid) continue; if (file->stations[i].grfid != file->grfid) continue;
// TODO: Release renderdata, platforms and layouts // TODO: Release renderdata, platforms and layouts
@ -2368,6 +2375,11 @@ static void ResetCustomStations(void)
UnloadSpriteGroup(&file->stations[i].spritegroup[c]); UnloadSpriteGroup(&file->stations[i].spritegroup[c]);
} }
} }
/* Free and reset the station data */
free(file->stations);
file->stations = NULL;
file->num_stations = 0;
} }
} }

View File

@ -34,7 +34,8 @@ struct GRFFile {
int spritegroups_count; int spritegroups_count;
SpriteGroup **spritegroups; SpriteGroup **spritegroups;
StationSpec stations[256]; uint num_stations;
StationSpec *stations;
uint32 param[0x80]; uint32 param[0x80];
uint param_end; /// one more than the highest set parameter uint param_end; /// one more than the highest set parameter