changeset 11254:1fc427264719 draft

(svn r15603) -Fix [FS#2696]: crash when using an extraordinarily large sprite as cursor.
author rubidium <rubidium@openttd.org>
date Tue, 03 Mar 2009 20:33:57 +0000
parents 9fab57572a91
children 7cc3c9bfa047
files src/core/alloc_type.hpp src/gfx.cpp
diffstat 2 files changed, 13 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/alloc_type.hpp
+++ b/src/core/alloc_type.hpp
@@ -123,6 +123,15 @@
 		}
 		return this->buffer;
 	}
+
+	/**
+	 * Get the currently allocated buffer.
+	 * @return the buffer
+	 */
+	FORCEINLINE const T *GetBuffer() const
+	{
+		return this->buffer;
+	}
 };
 
 /**
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -52,7 +52,7 @@
 
 FontSize _cur_fontsize;
 static FontSize _last_fontsize;
-static uint8 _cursor_backup[64 * 64 * 4];
+static ReusableBuffer<uint8> _cursor_backup;
 
 /**
  * The rect for repaint.
@@ -1288,7 +1288,7 @@
 	if (_cursor.visible) {
 		Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
 		_cursor.visible = false;
-		blitter->CopyFromBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), _cursor_backup, _cursor.draw_size.x, _cursor.draw_size.y);
+		blitter->CopyFromBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), _cursor_backup.GetBuffer(), _cursor.draw_size.x, _cursor.draw_size.y);
 		_video_driver->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
 	}
 }
@@ -1337,10 +1337,10 @@
 	_cursor.draw_pos.y = y;
 	_cursor.draw_size.y = h;
 
-	assert(blitter->BufferSize(w, h) < (int)sizeof(_cursor_backup));
+	uint8 *buffer = _cursor_backup.Allocate(blitter->BufferSize(w, h));
 
 	/* Make backup of stuff below cursor */
-	blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), _cursor_backup, _cursor.draw_size.x, _cursor.draw_size.y);
+	blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), buffer, _cursor.draw_size.x, _cursor.draw_size.y);
 
 	/* Draw cursor on screen */
 	_cur_dpi = &_screen;