Change log: Fix screen corruption when source and destination are the same surface and areas are the same size. Tony Lambregts tony_lambregts@telusplanet.net
Index: dib.c =================================================================== RCS file: /home/wine/wine/dlls/ddraw/dsurface/dib.c,v retrieving revision 1.11 diff -u -r1.11 dib.c --- dib.c 28 Jun 2002 17:32:25 -0000 1.11 +++ dib.c 2 Jul 2002 23:53:43 -0000 @@ -351,6 +351,9 @@ int bpp, srcheight, srcwidth, dstheight, dstwidth, width; int x, y; LPBYTE dbuf, sbuf; + BOOL SameSurface = FALSE; + + if (src == iface) SameSurface = TRUE; TRACE("(%p)->(%p,%p,%p,%08lx,%p)\n", This,rdst,src,rsrc,dwFlags,lpbltfx); @@ -475,6 +478,17 @@ xinc = (srcwidth << 16) / dstwidth; yinc = (srcheight << 16) / dstheight; + if (SameSurface) + { + static BOOL WarnSurface = FALSE; + if (!WarnSurface) + { + FIXME("\tSame source and destination could cause display problems\n"); + WarnSurface = TRUE; + } + } + + if (!dwFlags) { /* No effects, we can cheat here */ if (dstwidth == srcwidth) { @@ -482,11 +496,24 @@ /* No stretching in either direction. This needs to be as * fast as possible */ sbuf = sbase; - for (y = 0; y < dstheight; y++) { - memcpy(dbuf, sbuf, width); - sbuf += sdesc.u1.lPitch; - dbuf += ddesc.u1.lPitch; - } + if ((SameSurface) && (sbuf <= dbuf)) { + + sbuf += (sdesc.u1.lPitch*dstheight); + dbuf += (ddesc.u1.lPitch*dstheight); + + for (y = 0; y < dstheight; y++) { + sbuf -= sdesc.u1.lPitch; + dbuf -= ddesc.u1.lPitch; + memmove(dbuf, sbuf, width); + } + } else { + for (y = 0; y < dstheight; y++) { + memmove(dbuf, sbuf, width); + sbuf += sdesc.u1.lPitch; + dbuf += ddesc.u1.lPitch; + } + } + } else { /* Stretching in Y direction only */ for (y = sy = 0; y < dstheight; y++, sy += yinc) {