]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/cfb/cfb8cppl.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / cfb / cfb8cppl.c
diff --git a/Xserver/programs/Xserver/cfb/cfb8cppl.c b/Xserver/programs/Xserver/cfb/cfb8cppl.c
new file mode 100644 (file)
index 0000000..0b5a9e6
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * $XConsortium: cfb8cppl.c,v 1.15 94/04/17 20:28:41 dpw Exp $
+ *
+Copyright (c) 1990  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.
+ *
+ * Author:  Keith Packard, MIT X Consortium
+ */
+
+#if PSZ == 8
+#include "X.h"
+#include "Xmd.h"
+#include "gcstruct.h"
+#include "window.h"
+#include "pixmapstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "cfb.h"
+#undef   PSZ /* for maskbits.h */
+#include "maskbits.h"
+#include "mergerop.h"
+
+#if BITMAP_BIT_ORDER == MSBFirst
+#define LeftMost    (MFB_PPW-1)
+#define StepBit(bit, inc)  ((bit) -= (inc))
+#else
+#define LeftMost    0
+#define StepBit(bit, inc)  ((bit) += (inc))
+#endif
+
+#define GetBits(psrc, nBits, curBit, bitPos, bits) {\
+    bits = 0; \
+    while (nBits--) \
+    { \
+       bits |= (PixelType)(((*psrc++ >> bitPos) & 1)) << curBit; \
+       StepBit (curBit, 1); \
+    } \
+}
+
+void
+cfbCopyImagePlane (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc, planemask)
+    DrawablePtr pSrcDrawable;
+    DrawablePtr pDstDrawable;
+    int        rop;
+    RegionPtr prgnDst;
+    DDXPointPtr pptSrc;
+    unsigned long planemask;
+{
+    cfbCopyPlane8to1 (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc,
+                     (unsigned long) ~0L, planemask);
+}
+
+void
+cfbCopyPlane8to1 (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc, planemask, bitPlane)
+    DrawablePtr pSrcDrawable;
+    DrawablePtr pDstDrawable;
+    int        rop;
+    RegionPtr prgnDst;
+    DDXPointPtr pptSrc;
+    unsigned long planemask;
+    unsigned long   bitPlane;
+{
+    int                            srcx, srcy, dstx, dsty, width, height;
+    unsigned char          *psrcBase;
+    PixelType              *pdstBase;
+    int                            widthSrc, widthDst;
+    unsigned char          *psrcLine;
+    PixelType              *pdstLine;
+    register unsigned char  *psrc;
+    register int           i;
+    register int           curBit;
+    register int           bitPos;
+    register unsigned long  bits;
+    register PixelType     *pdst;
+    PixelType              startmask, endmask;
+    int                            niStart, niEnd;
+    int                            bitStart, bitEnd;
+    int                            nl, nlMiddle;
+    int                            nbox;
+    BoxPtr                 pbox;
+    MROP_DECLARE()
+
+    if (!(planemask & 1))
+       return;
+
+    if (rop != GXcopy)
+       MROP_INITIALIZE (rop, planemask);
+
+    cfbGetByteWidthAndPointer (pSrcDrawable, widthSrc, psrcBase)
+
+    mfbGetPixelWidthAndPointer (pDstDrawable, widthDst, pdstBase)
+
+    bitPos = ffs (bitPlane) - 1;
+
+    nbox = REGION_NUM_RECTS(prgnDst);
+    pbox = REGION_RECTS(prgnDst);
+    while (nbox--)
+    {
+       dstx = pbox->x1;
+       dsty = pbox->y1;
+       srcx = pptSrc->x;
+       srcy = pptSrc->y;
+       width = pbox->x2 - pbox->x1;
+       height = pbox->y2 - pbox->y1;
+       pbox++;
+       pptSrc++;
+       psrcLine = psrcBase + srcy * widthSrc + srcx;
+       pdstLine = mfbScanline(pdstBase, dstx, dsty, widthDst);
+       dstx &= MFB_PIM;
+       if (dstx + width <= MFB_PPW)
+       {
+           maskpartialbits(dstx, width, startmask);
+           nlMiddle = 0;
+           endmask = 0;
+       }
+       else
+       {
+           maskbits (dstx, width, startmask, endmask, nlMiddle);
+       }
+       if (startmask)
+       {
+           niStart = min(MFB_PPW - dstx, width);
+           bitStart = LeftMost;
+           StepBit (bitStart, dstx);
+       }
+       if (endmask)
+       {
+           niEnd = (dstx + width) & MFB_PIM;
+           bitEnd = LeftMost;
+       }
+       if (rop == GXcopy)
+       {
+           while (height--)
+           {
+               psrc = psrcLine;
+               pdst = pdstLine;
+               psrcLine += widthSrc;
+               mfbScanlineInc(pdstLine, widthDst);
+               if (startmask)
+               {
+                   i = niStart;
+                   curBit = bitStart;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst = *pdst & ~startmask | bits;
+                   pdst++;
+               }
+               nl = nlMiddle;
+               while (nl--)
+               {
+                   i = MFB_PPW;
+                   curBit = LeftMost;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst++ = bits;
+               }
+               if (endmask)
+               {
+                   i = niEnd;
+                   curBit = bitEnd;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst = *pdst & ~endmask | bits;
+               }
+           }
+       }
+       else
+       {
+           while (height--)
+           {
+               psrc = psrcLine;
+               pdst = pdstLine;
+               psrcLine += widthSrc;
+               mfbScanlineInc(pdstLine, widthDst);
+               if (startmask)
+               {
+                   i = niStart;
+                   curBit = bitStart;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst = MROP_MASK(bits, *pdst, startmask);
+                   pdst++;
+               }
+               nl = nlMiddle;
+               while (nl--)
+               {
+                   i = MFB_PPW;
+                   curBit = LeftMost;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst = MROP_SOLID(bits, *pdst);
+                   pdst++;
+               }
+               if (endmask)
+               {
+                   i = niEnd;
+                   curBit = bitEnd;
+                   GetBits (psrc, i, curBit, bitPos, bits);
+                   *pdst = MROP_MASK (bits, *pdst, endmask);
+               }
+           }
+       }
+    }
+}
+
+#endif