Changeset - r14151:b74c66bf771d
[Not reviewed]
master
0 7 0
peter1138 - 14 years ago 2010-01-04 02:32:36
peter1138@openttd.org
(svn r18709) -Fix (r10227,FS#3464): Animation buffer for 32bpp-anim blitter was only validated during sprite blitting, other drawing operations didn't check it. Initial startup and window resize could therefore lead to crash.
7 files changed with 30 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/blitter/32bpp_anim.cpp
Show inline comments
 
@@ -202,14 +202,6 @@ void Blitter_32bppAnim::Draw(Blitter::Bl
 
		return;
 
	}
 

	
 
	if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
 
		/* The size of the screen changed; we can assume we can wipe all data from our buffer */
 
		free(this->anim_buf);
 
		this->anim_buf = CallocT<uint8>(_screen.width * _screen.height);
 
		this->anim_buf_width = _screen.width;
 
		this->anim_buf_height = _screen.height;
 
	}
 

	
 
	switch (mode) {
 
		default: NOT_REACHED();
 
		case BM_NORMAL:       Draw<BM_NORMAL>      (bp, zoom); return;
 
@@ -448,3 +440,14 @@ Blitter::PaletteAnimation Blitter_32bppA
 
{
 
	return Blitter::PALETTE_ANIMATION_BLITTER;
 
}
 

	
 
void Blitter_32bppAnim::PostResize()
 
{
 
	if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
 
		/* The size of the screen changed; we can assume we can wipe all data from our buffer */
 
		free(this->anim_buf);
 
		this->anim_buf = CallocT<uint8>(_screen.width * _screen.height);
 
		this->anim_buf_width = _screen.width;
 
		this->anim_buf_height = _screen.height;
 
	}
 
}
src/blitter/32bpp_anim.hpp
Show inline comments
 
@@ -42,6 +42,7 @@ public:
 

	
 
	/* virtual */ const char *GetName() { return "32bpp-anim"; }
 
	/* virtual */ int GetBytesPerPixel() { return 5; }
 
	/* virtual */ void PostResize();
 

	
 
	template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
 
};
src/blitter/base.hpp
Show inline comments
 
@@ -200,6 +200,11 @@ public:
 
	 */
 
	virtual int GetBytesPerPixel() = 0;
 

	
 
	/**
 
	 * Post resize event
 
	 */
 
	virtual void PostResize() { };
 

	
 
	virtual ~Blitter() { }
 
};
 

	
src/video/allegro_v.cpp
Show inline comments
 
@@ -221,6 +221,8 @@ static bool CreateMainSurface(uint w, ui
 
	_cursor.pos.x = mouse_x;
 
	_cursor.pos.y = mouse_y;
 

	
 
	BlitterFactoryBase::GetCurrentBlitter()->PostResize();
 

	
 
	InitPalette();
 

	
 
	char caption[32];
src/video/cocoa/cocoa_v.mm
Show inline comments
 
@@ -197,6 +197,8 @@ void QZ_GameSizeChanged()
 
	_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
 
	_fullscreen = _cocoa_subdriver->IsFullscreen();
 

	
 
	BlitterFactoryBase::GetCurrentBlitter()->PostResize();
 

	
 
	GameSizeChanged();
 
}
 

	
src/video/sdl_v.cpp
Show inline comments
 
@@ -251,6 +251,9 @@ static bool CreateMainSurface(uint w, ui
 
	_screen.pitch = newscreen->pitch / (bpp / 8);
 
	_screen.dst_ptr = newscreen->pixels;
 
	_sdl_screen = newscreen;
 

	
 
	BlitterFactoryBase::GetCurrentBlitter()->PostResize();
 

	
 
	InitPalette();
 

	
 
	snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
src/video/win32_v.cpp
Show inline comments
 
@@ -160,6 +160,9 @@ static void ClientSizeChanged(int w, int
 
		/* mark all palette colors dirty */
 
		_pal_first_dirty = 0;
 
		_pal_count_dirty = 256;
 

	
 
		BlitterFactoryBase::GetCurrentBlitter()->PostResize();
 

	
 
		GameSizeChanged();
 

	
 
		/* redraw screen */
 
@@ -302,6 +305,9 @@ static bool MakeWindow(bool full_screen)
 
			ShowWindow(_wnd.main_wnd, showstyle);
 
		}
 
	}
 

	
 
	BlitterFactoryBase::GetCurrentBlitter()->PostResize();
 

	
 
	GameSizeChanged(); // invalidate all windows, force redraw
 
	return true; // the request succedded
 
}
0 comments (0 inline, 0 general)