# HG changeset patch # User rubidium # Date 2009-03-03 20:33:57 # Node ID 3a4ef570bee2ace35b322daba9dc31004f3c6768 # Parent 2c32f6c048c3ff5c190056e580c3c527159860f3 (svn r15603) -Fix [FS#2696]: crash when using an extraordinarily large sprite as cursor. diff --git a/src/core/alloc_type.hpp b/src/core/alloc_type.hpp --- a/src/core/alloc_type.hpp +++ b/src/core/alloc_type.hpp @@ -123,6 +123,15 @@ public: } return this->buffer; } + + /** + * Get the currently allocated buffer. + * @return the buffer + */ + FORCEINLINE const T *GetBuffer() const + { + return this->buffer; + } }; /** diff --git a/src/gfx.cpp b/src/gfx.cpp --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -52,7 +52,7 @@ static int ReallyDoDrawString(const char FontSize _cur_fontsize; static FontSize _last_fontsize; -static uint8 _cursor_backup[64 * 64 * 4]; +static ReusableBuffer _cursor_backup; /** * The rect for repaint. @@ -1288,7 +1288,7 @@ void UndrawMouseCursor() 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 @@ void DrawMouseCursor() _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;