summaryrefslogtreecommitdiff
path: root/xserver/fb/fbtile.c
diff options
context:
space:
mode:
Diffstat (limited to 'xserver/fb/fbtile.c')
-rw-r--r--xserver/fb/fbtile.c250
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);
}