# HG changeset patch # User smatz # Date 1213315204 0 # Node ID 66145f71ebb9c5439b4e4132244b8d3b22b3af28 # Parent 10533a7545b6b7c003b6cba3b701a3a9a5c40e0b (svn r13502) -Fix (r11212): drawing of zoomed out partial sprites could cause deadlocks or crashes diff -r 10533a7545b6 -r 66145f71ebb9 src/gfx.cpp --- a/src/gfx.cpp Thu Jun 12 22:29:42 2008 +0000 +++ b/src/gfx.cpp Fri Jun 13 00:00:04 2008 +0000 @@ -689,7 +689,7 @@ } } -static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub) +static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub) { const DrawPixelInfo *dpi = _cur_dpi; Blitter::BlitterParams bp; @@ -715,8 +715,8 @@ bp.height = UnScaleByZoom(sprite->height - clip_top - clip_bottom, dpi->zoom); bp.top = 0; bp.left = 0; - bp.skip_left = UnScaleByZoom(clip_left, dpi->zoom); - bp.skip_top = UnScaleByZoom(clip_top, dpi->zoom); + bp.skip_left = UnScaleByZoomLower(clip_left, dpi->zoom); + bp.skip_top = UnScaleByZoomLower(clip_top, dpi->zoom); x += ScaleByZoom(bp.skip_left, dpi->zoom); y += ScaleByZoom(bp.skip_top, dpi->zoom); @@ -767,6 +767,9 @@ if (bp.width <= 0) return; } + assert(bp.skip_left + bp.width <= UnScaleByZoom(sprite->width, dpi->zoom)); + assert(bp.skip_top + bp.height <= UnScaleByZoom(sprite->height, dpi->zoom)); + BlitterFactoryBase::GetCurrentBlitter()->Draw(&bp, mode, dpi->zoom); }