BSD 4_4_Lite2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 29 Dec 1991 11:14:48 +0000 (03:14 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 29 Dec 1991 11:14:48 +0000 (03:14 -0800)
Work on file usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c

Synthesized-from: CSRG/cd3/4.4BSD-Lite2

usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c [new file with mode: 0644]

diff --git a/usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c b/usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c
new file mode 100644 (file)
index 0000000..2b5b6c4
--- /dev/null
@@ -0,0 +1,137 @@
+/* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XConsortium: mfbgetsp.c,v 5.5 89/09/14 16:26:46 rws Exp $ */
+#include "X.h"
+#include "Xmd.h"
+
+#include "misc.h"
+#include "region.h"
+#include "gc.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "scrnintstr.h"
+
+#include "mfb.h"
+#include "maskbits.h"
+
+#include "servermd.h"
+
+/* GetSpans -- for each span, gets bits from drawable starting at ppt[i]
+ * and continuing for pwidth[i] bits
+ * Each scanline returned will be server scanline padded, i.e., it will come
+ * out to an integral number of words.
+ */
+/*ARGSUSED*/
+void
+mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart)
+    DrawablePtr                pDrawable;      /* drawable from which to get bits */
+    int                        wMax;           /* largest value of all *pwidths */
+    register DDXPointPtr ppt;          /* points to start copying from */
+    int                        *pwidth;        /* list of number of bits to copy */
+    int                        nspans;         /* number of scanlines to copy */
+    unsigned int       *pdstStart;     /* where to put the bits */
+{
+    register unsigned int      *pdst;  /* where to put the bits */
+    register unsigned int      *psrc;  /* where to get the bits */
+    register unsigned int      tmpSrc; /* scratch buffer for bits */
+    unsigned int               *psrcBase;      /* start of src bitmap */
+    int                        widthSrc;       /* width of pixmap in bytes */
+    register DDXPointPtr pptLast;      /* one past last point to get */
+    int                xEnd;           /* last pixel to copy from */
+    register int       nstart; 
+    int                        nend; 
+    int                        srcStartOver; 
+    int                        startmask, endmask, nlMiddle, nl, srcBit;
+    int                        w;
+  
+    pptLast = ppt + nspans;
+
+    if (pDrawable->type == DRAWABLE_WINDOW)
+    {
+       psrcBase = (unsigned int *) getPrivScreenPtr(pDrawable->pScreen)->bits;
+       widthSrc = (int) getPrivScreenPtr(pDrawable->pScreen)->stride;
+    }
+    else
+    {
+       psrcBase = (unsigned int *) getPrivPixmapPtr(pDrawable)->bits;
+       widthSrc = (int) getPrivPixmapPtr(pDrawable)->stride;
+    }
+    pdst = pdstStart;
+
+    while(ppt < pptLast)
+    {
+       xEnd = min(ppt->x + *pwidth, widthSrc << 3);
+       pwidth++;
+       psrc = psrcBase + (ppt->y * (widthSrc >> 2)) + (ppt->x >> 5); 
+       w = xEnd - ppt->x;
+       srcBit = ppt->x & 0x1f;
+
+       if (srcBit + w <= 32) 
+       { 
+           getandputbits0(psrc, srcBit, w, pdst);
+           pdst++;
+       } 
+       else 
+       { 
+
+           maskbits(ppt->x, w, startmask, endmask, nlMiddle);
+           if (startmask) 
+               nstart = 32 - srcBit; 
+           else 
+               nstart = 0; 
+           if (endmask) 
+               nend = xEnd & 0x1f; 
+           srcStartOver = srcBit + nstart > 31;
+           if (startmask) 
+           { 
+               getandputbits0(psrc, srcBit, nstart, pdst);
+               if(srcStartOver)
+                   psrc++;
+           } 
+           nl = nlMiddle; 
+#ifdef FASTPUTBITS
+           Duff(nl, putbits(*psrc, nstart, 32, pdst); psrc++; pdst++;);
+#else
+           while (nl--) 
+           { 
+               tmpSrc = *psrc;
+               putbits(tmpSrc, nstart, 32, pdst);
+               psrc++;
+               pdst++;
+           } 
+#endif
+           if (endmask) 
+           { 
+               putbits(*psrc, nstart, nend, pdst);
+               if(nstart + nend > 32)
+                   pdst++;
+           } 
+           if (startmask || endmask)
+               pdst++; 
+       } 
+        ppt++;
+    }
+}
+