Damjan Jovanovic : winex11.drv: Fix copying top-down/bottom-up DIBs.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Nov 10 05:43:51 CST 2006


Module: wine
Branch: master
Commit: c6fa30a2cf0677dcb1bb83e4bee1639e30933a9c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c6fa30a2cf0677dcb1bb83e4bee1639e30933a9c

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Fri Nov 10 07:58:08 2006 +0200

winex11.drv: Fix copying top-down/bottom-up DIBs.

---

 dlls/winex11.drv/bitblt.c |   34 +++++++++++++++++++++++++---------
 1 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index 73c6231..c1746fc 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1535,6 +1535,7 @@ static BOOL X11DRV_ClientSideDIBCopy( X1
 {
     DIBSECTION srcDib, dstDib;
     BYTE *srcPtr, *dstPtr;
+    INT srcRowOffset, dstRowOffset;
     INT bytesPerPixel;
     INT bytesToCopy;
     INT y;
@@ -1574,11 +1575,6 @@ static BOOL X11DRV_ClientSideDIBCopy( X1
       FIXME("potential optimization: client-side compressed DIB copy\n");
       return FALSE;
     }
-    if (srcDib.dsBmih.biHeight < 0 || dstDib.dsBmih.biHeight < 0)
-    {
-      FIXME("potential optimization: client-side bottom-up DIB copy\n");
-      return FALSE;
-    }
 
     switch (dstDib.dsBm.bmBitsPixel)
     {
@@ -1599,14 +1595,34 @@ static BOOL X11DRV_ClientSideDIBCopy( X1
 
     bytesToCopy = width * bytesPerPixel;
 
-    srcPtr = &physDevSrc->bitmap->base[ySrc*srcDib.dsBm.bmWidthBytes + xSrc*bytesPerPixel];
-    dstPtr = &physDevDst->bitmap->base[yDst*dstDib.dsBm.bmWidthBytes + xDst*bytesPerPixel];
+    if (srcDib.dsBmih.biHeight < 0)
+    {
+      srcPtr = &physDevSrc->bitmap->base[ySrc*srcDib.dsBm.bmWidthBytes + xSrc*bytesPerPixel];
+      srcRowOffset = srcDib.dsBm.bmWidthBytes;
+    }
+    else
+    {
+      srcPtr = &physDevSrc->bitmap->base[(srcDib.dsBm.bmWidth-ySrc-1)*srcDib.dsBm.bmWidthBytes
+        + xSrc*bytesPerPixel];
+      srcRowOffset = -srcDib.dsBm.bmWidthBytes;
+    }
+    if (dstDib.dsBmih.biHeight < 0)
+    {
+      dstPtr = &physDevDst->bitmap->base[yDst*dstDib.dsBm.bmWidthBytes + xDst*bytesPerPixel];
+      dstRowOffset = dstDib.dsBm.bmWidthBytes;
+    }
+    else
+    {
+      dstPtr = &physDevDst->bitmap->base[(dstDib.dsBm.bmWidth-yDst-1)*dstDib.dsBm.bmWidthBytes
+        + xDst*bytesPerPixel];
+      dstRowOffset = -dstDib.dsBm.bmWidthBytes;
+    }
 
     for (y = yDst; y < yDst + height; ++y)
     {
       memcpy(dstPtr, srcPtr, bytesToCopy);
-      srcPtr += srcDib.dsBm.bmWidthBytes;
-      dstPtr += dstDib.dsBm.bmWidthBytes;
+      srcPtr += srcRowOffset;
+      dstPtr += dstRowOffset;
     }
 
     return TRUE;




More information about the wine-cvs mailing list