From: CSRG Date: Sun, 29 Dec 1991 11:14:48 +0000 (-0800) Subject: BSD 4_4_Lite2 development X-Git-Tag: BSD-4_4_Lite2~2479 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/1ff7fd65d8ed122f3625fe5b39c66cc3c4136a67 BSD 4_4_Lite2 development Work on file usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c Synthesized-from: CSRG/cd3/4.4BSD-Lite2 --- 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 index 0000000000..2b5b6c485d --- /dev/null +++ b/usr/src/contrib/X11R5-hp300/mit/server/ddx/hpbsd/mfb/mfbgetsp.c @@ -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++; + } +} +