From 9eed36cc4f8877fa5dbb2e4053112adba327d6bf Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 26 May 2008 21:07:49 +0000 Subject: Use memmove when source and destination sprite areas overlap in drawSprite() svn-id: r32305 --- engines/gob/driver_vga.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'engines/gob/driver_vga.cpp') diff --git a/engines/gob/driver_vga.cpp b/engines/gob/driver_vga.cpp index c4861ca146..f68ce47783 100644 --- a/engines/gob/driver_vga.cpp +++ b/engines/gob/driver_vga.cpp @@ -109,10 +109,16 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest, int16 width = MIN((right - left) + 1, (int) dest->getWidth()); int16 height = MIN((bottom - top) + 1, (int) dest->getHeight()); + if ((width < 1) || (height < 1)) + return; + byte *srcPos = source->getVidMem() + (top * source->getWidth()) + left; byte *destPos = dest->getVidMem() + (y * dest->getWidth()) + x; + uint32 size = width * height; + if (transp) { + while (height--) { for (int16 i = 0; i < width; ++i) { if (srcPos[i]) @@ -122,13 +128,26 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest, srcPos += source->getWidth(); destPos += dest->getWidth(); } + + } else if (((srcPos >= destPos) && (srcPos <= (destPos + size))) || + ((destPos >= srcPos) && (destPos <= (srcPos + size)))) { + + while (height--) { + memmove(destPos, srcPos, width); + + srcPos += source->getWidth(); + destPos += dest->getWidth(); + } + } else { + while (height--) { memcpy(destPos, srcPos, width); srcPos += source->getWidth(); destPos += dest->getWidth(); } + } } -- cgit v1.2.3