X11DRV_UnlockDIBSection( physDevSrc, FALSE );
caused the DC to be labeled as "InSync" without committing the changes resulting from the bitblt.
This fixes bug 885.
Changelog:
If bit/stretchblt source and destination DCs are the same,
make sure the changes are committed before unlocking.
Index: graphics/x11drv/bitblt.c =================================================================== RCS file: /home/wine/wine/graphics/x11drv/bitblt.c,v retrieving revision 1.44 diff -u -r1.44 bitblt.c --- graphics/x11drv/bitblt.c 25 Jun 2002 23:29:51 -0000 1.44 +++ graphics/x11drv/bitblt.c 5 Jan 2003 20:50:15 -0000 @@ -1608,13 +1608,15 @@ } X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod, FALSE ); - X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE ); + if (physDevDst != physDevSrc) + X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE ); result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, width, height, physDevSrc, xSrc, ySrc, width, height, rop ); END: - X11DRV_UnlockDIBSection( physDevSrc, FALSE ); + if (physDevDst != physDevSrc) + X11DRV_UnlockDIBSection( physDevSrc, FALSE ); X11DRV_UnlockDIBSection( physDevDst, TRUE ); return result; @@ -1632,12 +1634,14 @@ BOOL result; X11DRV_LockDIBSection( physDevDst, DIB_Status_GdiMod, FALSE ); - X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE ); + if (physDevDst != physDevSrc) + X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod, FALSE ); result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, widthDst, heightDst, physDevSrc, xSrc, ySrc, widthSrc, heightSrc, rop ); - X11DRV_UnlockDIBSection( physDevSrc, FALSE ); + if (physDevDst != physDevSrc) + X11DRV_UnlockDIBSection( physDevSrc, FALSE ); X11DRV_UnlockDIBSection( physDevDst, TRUE ); return result; }