Changeset - r9511:e930c639a475
[Not reviewed]
master
0 1 0
smatz - 16 years ago 2008-06-13 00:00:04
smatz@openttd.org
(svn r13502) -Fix (r11212): drawing of zoomed out partial sprites could cause deadlocks or crashes
1 file changed with 6 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/gfx.cpp
Show inline comments
 
@@ -686,13 +686,13 @@ void DrawSprite(SpriteID img, SpriteID p
 
		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_COLOUR_REMAP, sub);
 
	} else {
 
		GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_NORMAL, sub);
 
	}
 
}
 

	
 
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;
 

	
 
	/* Amount of pixels to clip from the source sprite */
 
	int clip_left   = (sub != NULL ? max(0,                   -sprite->x_offs + sub->left       ) : 0);
 
@@ -712,14 +712,14 @@ static inline void GfxMainBlitter(const 
 
	bp.sprite_width = sprite->width;
 
	bp.sprite_height = sprite->height;
 
	bp.width = UnScaleByZoom(sprite->width - clip_left - clip_right, dpi->zoom);
 
	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);
 

	
 
	bp.dst = dpi->dst_ptr;
 
	bp.pitch = dpi->pitch;
 
@@ -764,12 +764,15 @@ static inline void GfxMainBlitter(const 
 
	x += ScaleByZoom(bp.width, dpi->zoom) - dpi->width;
 
	if (x > 0) {
 
		bp.width -= UnScaleByZoom(x, dpi->zoom);
 
		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);
 
}
 

	
 
void DoPaletteAnimations();
 

	
 
void GfxInitPalettes()
0 comments (0 inline, 0 general)