changeset 9925:5e65e72a278a draft

(svn r14080) -Fix (r14052): assert triggered when drawing chat window with 32bpp-anim blitter (backup buffer was too small)
author glx <glx@openttd.org>
date Fri, 15 Aug 2008 22:06:58 +0000
parents 35b1647d0db4
children 085a064b934c
files src/blitter/32bpp_anim.hpp src/blitter/32bpp_base.hpp src/blitter/8bpp_base.hpp src/blitter/base.hpp src/blitter/null.hpp src/network/network_chat_gui.cpp
diffstat 6 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/blitter/32bpp_anim.hpp
+++ b/src/blitter/32bpp_anim.hpp
@@ -34,6 +34,7 @@
 	/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
 
 	/* virtual */ const char *GetName() { return "32bpp-anim"; }
+	/* virtual */ int GetBytesPerPixel() { return 5; }
 
 	template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
 };
--- a/src/blitter/32bpp_base.hpp
+++ b/src/blitter/32bpp_base.hpp
@@ -26,6 +26,7 @@
 	/* virtual */ int BufferSize(int width, int height);
 	/* virtual */ void PaletteAnimate(uint start, uint count);
 	/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
+	/* virtual */ int GetBytesPerPixel() { return 4; }
 
 	/**
 	 * Compose a colour based on RGB values.
--- a/src/blitter/8bpp_base.hpp
+++ b/src/blitter/8bpp_base.hpp
@@ -25,6 +25,7 @@
 	/* virtual */ int BufferSize(int width, int height);
 	/* virtual */ void PaletteAnimate(uint start, uint count);
 	/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
+	/* virtual */ int GetBytesPerPixel() { return 1; }
 };
 
 #endif /* BLITTER_8BPP_BASE_HPP */
--- a/src/blitter/base.hpp
+++ b/src/blitter/base.hpp
@@ -183,10 +183,15 @@
 	virtual Blitter::PaletteAnimation UsePaletteAnimation() = 0;
 
 	/**
-	 * Get the naem of the blitter, the same as the Factory-instance returns.
+	 * Get the name of the blitter, the same as the Factory-instance returns.
 	 */
 	virtual const char *GetName() = 0;
 
+	/**
+	 * Get how many bytes are needed to store a pixel.
+	 */
+	virtual int GetBytesPerPixel() = 0;
+
 	virtual ~Blitter() { }
 };
 
--- a/src/blitter/null.hpp
+++ b/src/blitter/null.hpp
@@ -28,6 +28,7 @@
 	/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation() { return Blitter::PALETTE_ANIMATION_NONE; };
 
 	/* virtual */ const char *GetName() { return "null"; }
+	/* virtual */ int GetBytesPerPixel() { return 0; }
 };
 
 class FBlitter_Null: public BlitterFactory<FBlitter_Null> {
--- a/src/network/network_chat_gui.cpp
+++ b/src/network/network_chat_gui.cpp
@@ -119,7 +119,7 @@
 	_chatmsg_box.y      = 30;
 	_chatmsg_box.width  = _settings_client.gui.network_chat_box_width;
 	_chatmsg_box.height = _settings_client.gui.network_chat_box_height * NETWORK_CHAT_LINE_HEIGHT;
-	_chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * sizeof(uint32));
+	_chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * BlitterFactoryBase::GetCurrentBlitter()->GetBytesPerPixel());
 
 	for (uint i = 0; i < MAX_CHAT_MESSAGES; i++) {
 		_chatmsg_list[i].message[0] = '\0';
@@ -224,7 +224,7 @@
 	}
 	if (width <= 0 || height <= 0) return;
 
-	assert(blitter->BufferSize(width, height) < (int)(_chatmsg_box.width * _chatmsg_box.height * sizeof(uint32)));
+	assert(blitter->BufferSize(width, height) <= (int)(_chatmsg_box.width * _chatmsg_box.height * blitter->GetBytesPerPixel()));
 
 	/* Make a copy of the screen as it is before painting (for undraw) */
 	blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, x, y), _chatmessage_backup, width, height);