Module: wine Branch: master Commit: c6fa30a2cf0677dcb1bb83e4bee1639e30933a9c URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6fa30a2cf0677dcb1bb83e4be...
Author: Damjan Jovanovic damjan.jov@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;