diff options
Diffstat (limited to 'newgrf.c')
-rw-r--r-- | newgrf.c | 73 |
1 files changed, 14 insertions, 59 deletions
@@ -21,6 +21,8 @@ #include "newgrf_engine.h" #include "vehicle.h" +#include "newgrf_spritegroup.h" + /* TTDPatch extended GRF format codec * (c) Petr Baudis 2004 (GPL'd) * Changes by Florian octo Forster are (c) by the OpenTTD development team. @@ -1215,7 +1217,7 @@ static void VehicleChangeInfo(byte *buf, int len) */ static SpriteGroup* NewCallBackResultSpriteGroup(uint16 value) { - SpriteGroup *group = calloc(1, sizeof(*group)); + SpriteGroup *group = AllocateSpriteGroup(); group->type = SGT_CALLBACK; @@ -1240,7 +1242,7 @@ static SpriteGroup* NewCallBackResultSpriteGroup(uint16 value) */ static SpriteGroup* NewResultSpriteGroup(uint16 value, byte sprites) { - SpriteGroup *group = calloc(1, sizeof(*group)); + SpriteGroup *group = AllocateSpriteGroup(); group->type = SGT_RESULT; group->g.result.result = value; group->g.result.sprites = sprites; @@ -1348,7 +1350,7 @@ static void NewSpriteGroup(byte *buf, int len) buf += 4; len -= 4; check_length(len, 6, "NewSpriteGroup 0x81/0x82"); - group = calloc(1, sizeof(*group)); + group = AllocateSpriteGroup(); group->type = SGT_DETERMINISTIC; dg = &group->g.determ; @@ -1379,13 +1381,11 @@ static void NewSpriteGroup(byte *buf, int len) groupid = grf_load_word(&buf); if (HASBIT(groupid, 15)) { dg->ranges[i].group = NewCallBackResultSpriteGroup(groupid); - dg->ranges[i].group->ref_count++; } else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) { grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid); dg->ranges[i].group = NULL; } else { dg->ranges[i].group = _cur_grffile->spritegroups[groupid]; - dg->ranges[i].group->ref_count++; } dg->ranges[i].low = grf_load_byte(&buf); @@ -1395,19 +1395,14 @@ static void NewSpriteGroup(byte *buf, int len) groupid = grf_load_word(&buf); if (HASBIT(groupid, 15)) { dg->default_group = NewCallBackResultSpriteGroup(groupid); - dg->default_group->ref_count++; } else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) { grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid); dg->default_group = NULL; } else { dg->default_group = _cur_grffile->spritegroups[groupid]; - 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; } else if (numloaded == 0x80 || numloaded == 0x83) { @@ -1421,7 +1416,7 @@ static void NewSpriteGroup(byte *buf, int len) len -= 4; check_length(len, 6, "NewSpriteGroup 0x80/0x83"); - group = calloc(1, sizeof(*group)); + group = AllocateSpriteGroup(); group->type = SGT_RANDOMIZED; rg = &group->g.random; @@ -1444,20 +1439,15 @@ static void NewSpriteGroup(byte *buf, int len) if (HASBIT(groupid, 15)) { rg->groups[i] = NewCallBackResultSpriteGroup(groupid); - rg->groups[i]->ref_count++; } else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) { grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid); rg->groups[i] = NULL; } else { rg->groups[i] = _cur_grffile->spritegroups[groupid]; - rg->groups[i]->ref_count++; } } - if (_cur_grffile->spritegroups[setid] != NULL) - UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]); _cur_grffile->spritegroups[setid] = group; - group->ref_count++; return; } @@ -1480,7 +1470,7 @@ static void NewSpriteGroup(byte *buf, int len) if (_cur_grffile->first_spriteset == 0) _cur_grffile->first_spriteset = _cur_grffile->spriteset_start; - group = calloc(1, sizeof(*group)); + group = AllocateSpriteGroup(); group->type = SGT_REAL; rg = &group->g.real; @@ -1503,7 +1493,6 @@ static void NewSpriteGroup(byte *buf, int len) } else { rg->loaded[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set); } - rg->loaded[i]->ref_count++; DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i] = %u (subset %u)", i, rg->loaded[i]->g.result.result, spriteset_id); } @@ -1514,14 +1503,10 @@ static void NewSpriteGroup(byte *buf, int len) } else { rg->loading[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set); } - rg->loading[i]->ref_count++; 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++; } /* Action 0x03 */ @@ -1593,7 +1578,6 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len) } stat->spritegroup[1] = _cur_grffile->spritegroups[groupid]; - stat->spritegroup[1]->ref_count++; } } @@ -1612,7 +1596,6 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len) StationSpec *stat = &_cur_grffile->stations[stid]; stat->spritegroup[0] = _cur_grffile->spritegroups[groupid]; - stat->spritegroup[0]->ref_count++; stat->grfid = _cur_grffile->grfid; stat->localidx = stid; SetCustomStation(stat); @@ -2372,46 +2355,16 @@ static void InitializeGRFSpecial(void) | (1 << 0x10); /* autoreplace */ } -/** - * 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; -} - static void ResetCustomStations(void) { GRFFile *file; uint i; - CargoID c; 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; // TODO: Release renderdata, platforms and layouts - - // Release this stations sprite groups. - for (c = 0; c < NUM_GLOBAL_CID; c++) { - if (file->stations[i].spritegroup[c] != NULL) - UnloadSpriteGroup(&file->stations[i].spritegroup[c]); - } } /* Free and reset the station data */ @@ -2467,6 +2420,8 @@ static void ResetNewGRFData(void) // Add engine type to engine data. This is needed for the refit precalculation. AddTypeToEngines(); + + InitializeSpriteGroupPool(); } /** Reset all NewGRFData that was used only while processing data */ @@ -2480,6 +2435,11 @@ static void ClearTemporaryNewGRFData(void) l = l2; } _cur_grffile->label = NULL; + + /* Clear the list of spritegroups */ + free(_cur_grffile->spritegroups); + _cur_grffile->spritegroups = NULL; + _cur_grffile->spritegroups_count = 0; } static void InitNewGRFFile(const char* filename, int sprite_offset) @@ -2680,11 +2640,6 @@ 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); } |