diff options
author | Ben Byer <bbyer@bbyer.local> | 2007-11-22 04:54:21 -0800 |
---|---|---|
committer | Ben Byer <bbyer@bbyer.local> | 2007-11-22 04:54:21 -0800 |
commit | 3f857e129df7ce492191e0c51b8e53eaf6179366 (patch) | |
tree | a3308b371ae1b9849e58b9ce4f7926ead23c8628 /miext | |
parent | e27579dfff0ba68057f2c2411286e8d6e57eedf9 (diff) |
Pulling fixes from fbBlt to rlBlt
Diffstat (limited to 'miext')
-rw-r--r-- | miext/rootless/accel/rlBlt.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/miext/rootless/accel/rlBlt.c b/miext/rootless/accel/rlBlt.c index d1e765836..973304626 100644 --- a/miext/rootless/accel/rlBlt.c +++ b/miext/rootless/accel/rlBlt.c @@ -31,10 +31,22 @@ #include <dix-config.h> #endif +#include <string.h> #include "fb.h" #include "rootlessCommon.h" #include "rlAccel.h" +#define InitializeShifts(sx,dx,ls,rs) { \ + if (sx != dx) { \ + if (sx > dx) { \ + ls = sx - dx; \ + rs = FB_UNIT - ls; \ + } else { \ + rs = dx - sx; \ + ls = FB_UNIT - rs; \ + } \ + } \ +} void rlBlt (FbBits *srcLine, @@ -73,6 +85,29 @@ rlBlt (FbBits *srcLine, return; } #endif + + if (alu == GXcopy && pm == FB_ALLONES && !reverse && + !(srcX & 7) && !(dstX & 7) && !(width & 7)) { + int i; + CARD8 *src = (CARD8 *) srcLine; + CARD8 *dst = (CARD8 *) dstLine; + + srcStride *= sizeof(FbBits); + dstStride *= sizeof(FbBits); + width >>= 3; + src += (srcX >> 3); + dst += (dstX >> 3); + + if (!upsidedown) + for (i = 0; i < height; i++) + memcpy(dst + i * dstStride, src + i * srcStride, width); + else + for (i = height - 1; i >= 0; i--) + memcpy(dst + i * dstStride, src + i * srcStride, width); + + return; + } + FbInitializeMergeRop(alu, pm); destInvarient = FbDestInvarientMergeRop(); if (upsidedown) @@ -324,9 +359,12 @@ rlBlt (FbBits *srcLine, bits1 = *src++; if (startmask) { - bits = FbScrLeft(bits1, leftShift); - bits1 = *src++; - bits |= FbScrRight(bits1, rightShift); + bits = FbScrLeft(bits1, leftShift); + if (FbScrLeft(startmask, rightShift)) + { + bits1 = *src++; + bits |= FbScrRight(bits1, rightShift); + } FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask); dst++; } |