summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2005-10-04 20:58:10 +0000
committerpeter1138 <peter1138@openttd.org>2005-10-04 20:58:10 +0000
commitf614b8611440519f42b0a5b2209fd2588b5b2a60 (patch)
tree3408008b6e4a19ccc27a823700b8189491c617d7
parent4879e04986197627ec316307cbdb8709665541d8 (diff)
downloadopenttd-f614b8611440519f42b0a5b2209fd2588b5b2a60.tar.xz
(svn r3016) -NewGRF: Implement the start of reference counting for sprite groups. This will allow unloading.
-rw-r--r--engine.c2
-rw-r--r--newgrf.c14
-rw-r--r--sprite.h1
3 files changed, 15 insertions, 2 deletions
diff --git a/engine.c b/engine.c
index 71b55b64c..2668e9271 100644
--- a/engine.c
+++ b/engine.c
@@ -266,6 +266,7 @@ void SetWagonOverrideSprites(EngineID engine, SpriteGroup *group, byte *train_id
* to prevent leaks. But first we need to refcount the SpriteGroup.
* --pasky */
wo->group = group;
+ group->ref_count++;
wo->trains = trains;
wo->train_id = malloc(trains);
memcpy(wo->train_id, train_id, trains);
@@ -306,6 +307,7 @@ void SetCustomEngineSprites(EngineID engine, byte cargo, SpriteGroup *group)
* to prevent leaks. But first we need to refcount the SpriteGroup.
* --pasky */
engine_custom_sprites[engine][cargo] = group;
+ group->ref_count++;
}
typedef SpriteGroup *(*resolve_callback)(const SpriteGroup *spritegroup,
diff --git a/newgrf.c b/newgrf.c
index ef4fa1f3f..9bbeea5c2 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -1374,6 +1374,7 @@ 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) {
/* This doesn't exist for us. */
grf_load_word(&buf); // skip range
@@ -1383,6 +1384,7 @@ static void NewSpriteGroup(byte *buf, int len)
/* XXX: If multiple surreal sets attach a surreal
* set this way, we are in trouble. */
dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
+ dg->ranges[i].group->ref_count++;
}
dg->ranges[i].low = grf_load_byte(&buf);
@@ -1400,8 +1402,10 @@ static void NewSpriteGroup(byte *buf, int len)
} else {
dg->default_group = _cur_grffile->spritegroups[groupid];
}
+ dg->default_group->ref_count++;
_cur_grffile->spritegroups[setid] = group;
+ group->ref_count++;
return;
} else if (numloaded == 0x80 || numloaded == 0x83) {
@@ -1438,19 +1442,20 @@ 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) {
/* This doesn't exist for us. */
i--;
rg->num_groups--;
continue;
} else {
- /* XXX: If multiple surreal sets attach a surreal
- * set this way, we are in trouble. */
rg->groups[i] = _cur_grffile->spritegroups[groupid];
+ rg->groups[i]->ref_count++;
}
}
_cur_grffile->spritegroups[setid] = group;
+ group->ref_count++;
return;
}
@@ -1499,6 +1504,7 @@ 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);
}
@@ -1509,10 +1515,12 @@ 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);
}
_cur_grffile->spritegroups[setid] = group;
+ group->ref_count++;
}
/* Action 0x03 */
@@ -1584,6 +1592,7 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len)
}
stat->spritegroup[1] = _cur_grffile->spritegroups[groupid];
+ stat->spritegroup[1]->ref_count++;
}
}
@@ -1602,6 +1611,7 @@ 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;
SetCustomStation(stid, stat);
stat->sclass = STAT_CLASS_NONE;
diff --git a/sprite.h b/sprite.h
index 2e1938cac..785a6af1a 100644
--- a/sprite.h
+++ b/sprite.h
@@ -129,6 +129,7 @@ typedef enum SpriteGroupType {
struct SpriteGroup {
SpriteGroupType type;
+ byte ref_count;
union {
RealSpriteGroup real;