mirror of https://github.com/OpenTTD/OpenTTD
(svn r15603) -Fix [FS#2696]: crash when using an extraordinarily large sprite as cursor.
parent
07df0d05dc
commit
b55ed2e668
|
@ -123,6 +123,15 @@ public:
|
||||||
}
|
}
|
||||||
return this->buffer;
|
return this->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the currently allocated buffer.
|
||||||
|
* @return the buffer
|
||||||
|
*/
|
||||||
|
FORCEINLINE const T *GetBuffer() const
|
||||||
|
{
|
||||||
|
return this->buffer;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -52,7 +52,7 @@ static int ReallyDoDrawString(const char *string, int x, int y, TextColour colou
|
||||||
|
|
||||||
FontSize _cur_fontsize;
|
FontSize _cur_fontsize;
|
||||||
static FontSize _last_fontsize;
|
static FontSize _last_fontsize;
|
||||||
static uint8 _cursor_backup[64 * 64 * 4];
|
static ReusableBuffer<uint8> _cursor_backup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The rect for repaint.
|
* The rect for repaint.
|
||||||
|
@ -1288,7 +1288,7 @@ void UndrawMouseCursor()
|
||||||
if (_cursor.visible) {
|
if (_cursor.visible) {
|
||||||
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
|
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
|
||||||
_cursor.visible = false;
|
_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);
|
_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_pos.y = y;
|
||||||
_cursor.draw_size.y = h;
|
_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 */
|
/* 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 */
|
/* Draw cursor on screen */
|
||||||
_cur_dpi = &_screen;
|
_cur_dpi = &_screen;
|
||||||
|
|
Loading…
Reference in New Issue