Changeset - r17415:1b91cbc411f9
[Not reviewed]
master
0 5 0
yexo - 13 years ago 2011-03-03 21:24:03
yexo@openttd.org
(svn r22175) -Fix: [NewGRF] memory leak if a station newgrf contains prop 09 twice for the same station id
5 files changed with 33 insertions and 12 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -1199,7 +1199,6 @@ static ChangeInfoResult StationChangeInf
 
			case 0x09: // Define sprite layout
 
				statspec->tiles = buf->ReadExtendedByte();
 
				statspec->renderdata = CallocT<DrawTileSprites>(statspec->tiles);
 
				statspec->copied_renderdata = false;
 

	
 
				for (uint t = 0; t < statspec->tiles; t++) {
 
					DrawTileSprites *dts = &statspec->renderdata[t];
 
@@ -1208,7 +1207,12 @@ static ChangeInfoResult StationChangeInf
 
					dts->seq = NULL;
 
					dts->ground.sprite = buf->ReadWord();
 
					dts->ground.pal = buf->ReadWord();
 
					if (dts->ground.sprite == 0) continue;
 
					if (dts->ground.sprite == 0 && dts->ground.pal == 0) {
 
						extern const DrawTileSprites _station_display_datas_rail[8];
 
						dts->ground = _station_display_datas_rail[t % 8].ground;
 
						dts->seq = CopyDrawTileSeqStruct(_station_display_datas_rail[t % 8].seq);
 
						continue;
 
					}
 
					if (HasBit(dts->ground.pal, 15)) {
 
						/* Use sprite from Action 1 */
 
						ClrBit(dts->ground.pal, 15);
 
@@ -1254,8 +1258,11 @@ static ChangeInfoResult StationChangeInf
 
				}
 

	
 
				statspec->tiles = srcstatspec->tiles;
 
				statspec->renderdata = srcstatspec->renderdata;
 
				statspec->copied_renderdata = true;
 
				statspec->renderdata = MallocT<DrawTileSprites>(statspec->tiles);
 
				for (uint t = 0; t < statspec->tiles; t++) {
 
					statspec->renderdata[t].ground = srcstatspec->renderdata[t].ground;
 
					statspec->renderdata[t].seq = CopyDrawTileSeqStruct(srcstatspec->renderdata[t].seq);
 
				}
 
				break;
 
			}
 

	
 
@@ -7050,13 +7057,10 @@ static void ResetCustomStations()
 
			if (stations[i] == NULL) continue;
 
			StationSpec *statspec = stations[i];
 

	
 
			/* Release renderdata, if it wasn't copied from another custom station spec  */
 
			if (!statspec->copied_renderdata) {
 
				for (uint t = 0; t < statspec->tiles; t++) {
 
					free((void*)statspec->renderdata[t].seq);
 
				}
 
				free(statspec->renderdata);
 
			for (uint t = 0; t < statspec->tiles; t++) {
 
				free((void*)statspec->renderdata[t].seq);
 
			}
 
			free(statspec->renderdata);
 

	
 
			/* Release platforms and layouts */
 
			if (!statspec->copied_layouts) {
src/newgrf_station.h
Show inline comments
 
@@ -78,7 +78,6 @@ struct StationSpec {
 
	 */
 
	uint tiles;
 
	DrawTileSprites *renderdata; ///< Array of tile layouts.
 
	bool copied_renderdata;
 

	
 
	/**
 
	 * Cargo threshold for choosing between little and lots of cargo
src/sprite.cpp
Show inline comments
 
@@ -14,6 +14,8 @@
 
#include "viewport_func.h"
 
#include "landscape.h"
 
#include "spritecache.h"
 
#include "core/alloc_func.hpp"
 
#include "core/mem_func.hpp"
 

	
 

	
 
/**
 
@@ -108,3 +110,17 @@ void DrawCommonTileSeqInGUI(int x, int y
 
		}
 
	}
 
}
 

	
 
/** Create a copy of an existing DrawTileSeqStruct array. */
 
const DrawTileSeqStruct *CopyDrawTileSeqStruct(const DrawTileSeqStruct *dtss)
 
{
 
	const DrawTileSeqStruct *element;
 

	
 
	size_t count = 1; // 1 for the terminator
 
	foreach_draw_tile_seq(element, dtss) count++;
 

	
 
	DrawTileSeqStruct *copy = MallocT<DrawTileSeqStruct>(count);
 
	MemCpyT(copy, dtss, count);
 

	
 
	return copy;
 
}
src/sprite.h
Show inline comments
 
@@ -52,6 +52,8 @@ struct DrawTileSeqStruct {
 
	}
 
};
 

	
 
const DrawTileSeqStruct *CopyDrawTileSeqStruct(const DrawTileSeqStruct *dtss);
 

	
 
/** Ground palette sprite of a tile, together with its child sprites */
 
struct DrawTileSprites {
 
	PalSpriteID ground;           ///< Palette and sprite for the ground
src/table/station_land.h
Show inline comments
 
@@ -791,7 +791,7 @@ static const DrawTileSeqStruct _station_
 
#define TILE_SPRITE_LINE(img, dtss) { {img, PAL_NONE}, dtss },
 
#define TILE_SPRITE_NULL() { {0, 0}, NULL },
 

	
 
static const DrawTileSprites _station_display_datas_rail[] = {
 
extern const DrawTileSprites _station_display_datas_rail[] = {
 
	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_0)
 
	TILE_SPRITE_LINE(SPR_RAIL_TRACK_Y,               _station_display_datas_1)
 
	TILE_SPRITE_LINE(SPR_RAIL_TRACK_X,               _station_display_datas_2)
0 comments (0 inline, 0 general)