From 28ddfe802e5d45db32df047174e9f3a03f8aee18 Mon Sep 17 00:00:00 2001 From: Damjan Jovanovic Date: Sat, 11 Aug 2007 10:46:08 +0200 Subject: [PATCH] winex11.drv: Correctly handle overlapping source and destination regions on the same DIB when copying DIBs client-side. --- dlls/winex11.drv/bitblt.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index 06c6ba160f2..996319e75a7 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -1623,9 +1623,18 @@ static BOOL X11DRV_ClientSideDIBCopy( X11DRV_PDEVICE *physDevSrc, INT xSrc, INT dstRowOffset = -dstDib.dsBm.bmWidthBytes; } + /* Handle overlapping regions on the same DIB */ + if (physDevSrc == physDevDst && ySrc < yDst) + { + srcPtr += srcRowOffset * (height - 1); + srcRowOffset = -srcRowOffset; + dstPtr += dstRowOffset * (height - 1); + dstRowOffset = -dstRowOffset; + } + for (y = yDst; y < yDst + height; ++y) { - memcpy(dstPtr, srcPtr, bytesToCopy); + memmove(dstPtr, srcPtr, bytesToCopy); srcPtr += srcRowOffset; dstPtr += dstRowOffset; } -- 2.11.4.GIT