Mercurial > hg > openttd
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;