Changeset - r2490:4a9082968d2a
[Not reviewed]
master
0 3 0
peter1138 - 19 years ago 2005-10-04 20:58:10
peter1138@openttd.org
(svn r3016) -NewGRF: Implement the start of reference counting for sprite groups. This will allow unloading.
3 files changed with 15 insertions and 2 deletions:
0 comments (0 inline, 0 general)
engine.c
Show inline comments
 
@@ -266,6 +266,7 @@ void SetWagonOverrideSprites(EngineID en
 
	 * 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 eng
 
	 * 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,
newgrf.c
Show inline comments
 
@@ -1374,6 +1374,7 @@ static void NewSpriteGroup(byte *buf, in
 
			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, in
 
			/* 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, in
 
		} 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, in
 

	
 
			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, in
 
		} 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, in
 
		} 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_SpriteGroupMappin
 
				}
 

	
 
				stat->spritegroup[1] = _cur_grffile->spritegroups[groupid];
 
				stat->spritegroup[1]->ref_count++;
 
			}
 
		}
 

	
 
@@ -1602,6 +1611,7 @@ static void NewVehicle_SpriteGroupMappin
 
				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;
sprite.h
Show inline comments
 
@@ -129,6 +129,7 @@ typedef enum SpriteGroupType {
 

	
 
struct SpriteGroup {
 
	SpriteGroupType type;
 
	byte ref_count;
 

	
 
	union {
 
		RealSpriteGroup real;
0 comments (0 inline, 0 general)