diff options
Diffstat (limited to 'xserver/fb/fbtile.c')
-rw-r--r-- | xserver/fb/fbtile.c | 250 |
1 files changed, 105 insertions, 145 deletions
diff --git a/xserver/fb/fbtile.c b/xserver/fb/fbtile.c index 0d0cfe174..785c5f0e4 100644 --- a/xserver/fb/fbtile.c +++ b/xserver/fb/fbtile.c @@ -1,6 +1,4 @@ /* - * Id: fbtile.c,v 1.1 1999/11/02 03:54:45 keithp Exp $ - * * Copyright © 1998 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its @@ -34,170 +32,132 @@ */ void -fbEvenTile (FbBits *dst, - FbStride dstStride, - int dstX, - - int width, - int height, - - FbBits *tile, - int tileHeight, - - int alu, - FbBits pm, - int xRot, - int yRot) +fbEvenTile(FbBits * dst, + FbStride dstStride, + int dstX, + int width, + int height, + FbBits * tile, + FbStride tileStride, + int tileHeight, int alu, FbBits pm, int xRot, int yRot) { - FbBits *t, *tileEnd, bits; - FbBits startmask, endmask; - FbBits and, xor; - int n, nmiddle; - int tileX, tileY; - int rot; - int startbyte, endbyte; + FbBits *t, *tileEnd, bits; + FbBits startmask, endmask; + FbBits and, xor; + int n, nmiddle; + int tileX, tileY; + int rot; + int startbyte, endbyte; dst += dstX >> FB_SHIFT; dstX &= FB_MASK; FbMaskBitsBytes(dstX, width, FbDestInvarientRop(alu, pm), - startmask, startbyte, nmiddle, endmask, endbyte); + startmask, startbyte, nmiddle, endmask, endbyte); if (startmask) - dstStride--; + dstStride--; dstStride -= nmiddle; - + /* * Compute tile start scanline and rotation parameters */ - tileEnd = tile + tileHeight; - modulus (- yRot, tileHeight, tileY); - t = tile + tileY; - modulus (- xRot, FB_UNIT, tileX); + tileEnd = tile + tileHeight * tileStride; + modulus(-yRot, tileHeight, tileY); + t = tile + tileY * tileStride; + modulus(-xRot, FB_UNIT, tileX); rot = tileX; - - while (height--) - { - - /* - * Pick up bits for this scanline - */ - bits = *t++; - if (t == tileEnd) t = tile; - bits = FbRotLeft(bits,rot); - and = fbAnd(alu,bits,pm); - xor = fbXor(alu,bits,pm); - - if (startmask) - { - FbDoLeftMaskByteRRop(dst, startbyte, startmask, and, xor); - dst++; - } - n = nmiddle; - if (!and) - while (n--) - *dst++ = xor; - else - while (n--) - { - *dst = FbDoRRop (*dst, and, xor); - dst++; - } - if (endmask) - FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor); - dst += dstStride; + + while (height--) { + + /* + * Pick up bits for this scanline + */ + bits = READ(t); + t += tileStride; + if (t >= tileEnd) + t = tile; + bits = FbRotLeft(bits, rot); + and = fbAnd(alu, bits, pm); + xor = fbXor(alu, bits, pm); + + if (startmask) { + FbDoLeftMaskByteRRop(dst, startbyte, startmask, and, xor); + dst++; + } + n = nmiddle; + if (!and) + while (n--) + WRITE(dst++, xor); + else + while (n--) { + WRITE(dst, FbDoRRop(READ(dst), and, xor)); + dst++; + } + if (endmask) + FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor); + dst += dstStride; } } - -void -fbOddTile(FbBits *dst, - FbStride dstStride, - int dstX, - int width, - int height, - - FbBits *tile, - FbStride tileStride, - int tileWidth, - int tileHeight, - - int alu, - FbBits pm, - int bpp, - - int xRot, - int yRot) +void +fbOddTile(FbBits * dst, + FbStride dstStride, + int dstX, + int width, + int height, + FbBits * tile, + FbStride tileStride, + int tileWidth, + int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot) { - int tileX, tileY; - int widthTmp; - int h, w; - int x, y; + int tileX, tileY; + int widthTmp; + int h, w; + int x, y; - modulus (- yRot, tileHeight, tileY); + modulus(-yRot, tileHeight, tileY); y = 0; - while (height) - { - h = tileHeight - tileY; - if (h > height) - h = height; - height -= h; - widthTmp = width; - x = dstX; - modulus (dstX - xRot, tileWidth, tileX); - while (widthTmp) - { - w = tileWidth - tileX; - if (w > widthTmp) - w = widthTmp; - widthTmp -= w; - fbBlt (tile + tileY * tileStride, - tileStride, - tileX, - - dst + y * dstStride, - dstStride, - x, - - w, h, - alu, - pm, - bpp, - - FALSE, - FALSE); - x += w; - tileX = 0; - } - y += h; - tileY = 0; + while (height) { + h = tileHeight - tileY; + if (h > height) + h = height; + height -= h; + widthTmp = width; + x = dstX; + modulus(dstX - xRot, tileWidth, tileX); + while (widthTmp) { + w = tileWidth - tileX; + if (w > widthTmp) + w = widthTmp; + widthTmp -= w; + fbBlt(tile + tileY * tileStride, + tileStride, + tileX, + dst + y * dstStride, + dstStride, x, w, h, alu, pm, bpp, FALSE, FALSE); + x += w; + tileX = 0; + } + y += h; + tileY = 0; } } void -fbTile (FbBits *dst, - FbStride dstStride, - int dstX, - - int width, - int height, - - FbBits *tile, - FbStride tileStride, - int tileWidth, - int tileHeight, - - int alu, - FbBits pm, - int bpp, - - int xRot, - int yRot) +fbTile(FbBits * dst, + FbStride dstStride, + int dstX, + int width, + int height, + FbBits * tile, + FbStride tileStride, + int tileWidth, + int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot) { - if (FbEvenTile (tileWidth)) - fbEvenTile (dst, dstStride, dstX, width, height, - tile, tileHeight, - alu, pm, xRot, yRot); + if (FbEvenTile(tileWidth)) + fbEvenTile(dst, dstStride, dstX, width, height, + tile, tileStride, tileHeight, alu, pm, xRot, yRot); else - fbOddTile (dst, dstStride, dstX, width, height, - tile, tileStride, tileWidth, tileHeight, - alu, pm, bpp, xRot, yRot); + fbOddTile(dst, dstStride, dstX, width, height, + tile, tileStride, tileWidth, tileHeight, + alu, pm, bpp, xRot, yRot); } |