]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/cfb/cfbpush8.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / cfb / cfbpush8.c
diff --git a/Xserver/programs/Xserver/cfb/cfbpush8.c b/Xserver/programs/Xserver/cfb/cfbpush8.c
new file mode 100644 (file)
index 0000000..646699b
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Push Pixels for 8 bit displays.
+ */
+
+/*
+
+Copyright (c) 1989  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+/* $XConsortium: cfbpush8.c,v 5.14 94/04/17 20:28:58 dpw Exp $ */
+
+#if PSZ == 8
+
+#include       "X.h"
+#include       "Xmd.h"
+#include       "Xproto.h"
+#include       "gcstruct.h"
+#include       "windowstr.h"
+#include       "scrnintstr.h"
+#include       "pixmapstr.h"
+#include       "regionstr.h"
+#include       "cfb.h"
+#include       "cfbmskbits.h"
+#include       "cfb8bit.h"
+#define MFB_CONSTS_ONLY
+#include       "maskbits.h"
+
+void
+cfbPushPixels8 (pGC, pBitmap, pDrawable, dx, dy, xOrg, yOrg)
+    GCPtr      pGC;
+    PixmapPtr  pBitmap;
+    DrawablePtr        pDrawable;
+    int                dx, dy, xOrg, yOrg;
+{
+    register unsigned long   *src, *dst;
+    register unsigned long   pixel;
+    register unsigned long   c, bits;
+    unsigned long   *pdstLine, *psrcLine;
+    unsigned long   *pdstBase;
+    int                    srcWidth;
+    int                    dstWidth;
+    int                    xoff;
+    int                    nBitmapLongs, nPixmapLongs;
+    int                    nBitmapTmp, nPixmapTmp;
+    unsigned long   rightMask;
+    BoxRec         bbox;
+    cfbPrivGCPtr    devPriv;
+
+    bbox.x1 = xOrg;
+    bbox.y1 = yOrg;
+    bbox.x2 = bbox.x1 + dx;
+    bbox.y2 = bbox.y1 + dy;
+    devPriv = cfbGetGCPrivate(pGC);
+    
+    switch (RECT_IN_REGION(pGC->pScreen, devPriv->pCompositeClip, &bbox))
+    {
+      case rgnPART:
+       mfbPushPixels(pGC, pBitmap, pDrawable, dx, dy, xOrg, yOrg);
+      case rgnOUT:
+       return;
+    }
+
+    cfbGetLongWidthAndPointer (pDrawable, dstWidth, pdstBase)
+
+    psrcLine = (unsigned long *) pBitmap->devPrivate.ptr;
+    srcWidth = (int) pBitmap->devKind >> PWSH;
+    
+    pixel = devPriv->xor;
+    xoff = xOrg & PIM;
+    nBitmapLongs = (dx + xoff) >> MFB_PWSH;
+    nPixmapLongs = (dx + PGSZB + xoff) >> PWSH;
+
+    rightMask = ~cfb8BitLenMasks[((dx + xoff) & MFB_PIM)];
+
+    pdstLine = pdstBase + (yOrg * dstWidth) + (xOrg >> PWSH);
+
+    while (dy--)
+    {
+       c = 0;
+       nPixmapTmp = nPixmapLongs;
+       nBitmapTmp = nBitmapLongs;
+       src = psrcLine;
+       dst = pdstLine;
+       while (nBitmapTmp--)
+       {
+           bits = *src++;
+           c |= BitRight (bits, xoff);
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+           nPixmapTmp -= 8;
+           c = 0;
+           if (xoff)
+               c = BitLeft (bits, PGSZ - xoff);
+       }
+       if (BitLeft (rightMask, xoff))
+           c |= BitRight (*src, xoff);
+       c &= rightMask;
+       switch (nPixmapTmp) {
+       case 8:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 7:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 6:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 5:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 4:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 3:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 2:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 1:
+           WriteBitGroup(dst, pixel, GetBitGroup(c));
+           NextBitGroup(c);
+           dst++;
+       case 0:
+           break;
+       }
+       pdstLine += dstWidth;
+       psrcLine += srcWidth;
+    }
+}
+
+#endif