|
|
1.1 ! root 1: /*********************************************************** ! 2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ! 3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts. ! 4: ! 5: All Rights Reserved ! 6: ! 7: Permission to use, copy, modify, and distribute this software and its ! 8: documentation for any purpose and without fee is hereby granted, ! 9: provided that the above copyright notice appear in all copies and that ! 10: both that copyright notice and this permission notice appear in ! 11: supporting documentation, and that the names of Digital or MIT not be ! 12: used in advertising or publicity pertaining to distribution of the ! 13: software without specific, written prior permission. ! 14: ! 15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 21: SOFTWARE. ! 22: ! 23: ******************************************************************/ ! 24: /* $Header: mfbgetsp.c,v 1.17 87/09/07 19:08:27 toddb Exp $ */ ! 25: #include "X.h" ! 26: #include "Xmd.h" ! 27: ! 28: #include "misc.h" ! 29: #include "region.h" ! 30: #include "gc.h" ! 31: #include "windowstr.h" ! 32: #include "pixmapstr.h" ! 33: #include "scrnintstr.h" ! 34: ! 35: #include "mfb.h" ! 36: #include "maskbits.h" ! 37: ! 38: #include "servermd.h" ! 39: ! 40: /* GetSpans -- for each span, gets bits from drawable starting at ppt[i] ! 41: * and continuing for pwidth[i] bits ! 42: * Each scanline returned will be server scanline padded, i.e., it will come ! 43: * out to an integral number of words. ! 44: */ ! 45: unsigned int * ! 46: mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans) ! 47: DrawablePtr pDrawable; /* drawable from which to get bits */ ! 48: int wMax; /* largest value of all *pwidths */ ! 49: register DDXPointPtr ppt; /* points to start copying from */ ! 50: int *pwidth; /* list of number of bits to copy */ ! 51: int nspans; /* number of scanlines to copy */ ! 52: { ! 53: register unsigned int *pdst; /* where to put the bits */ ! 54: register unsigned int *psrc; /* where to get the bits */ ! 55: register unsigned int tmpSrc; /* scratch buffer for bits */ ! 56: unsigned int *psrcBase; /* start of src bitmap */ ! 57: int widthSrc; /* width of pixmap in bytes */ ! 58: register DDXPointPtr pptLast; /* one past last point to get */ ! 59: int xEnd; /* last pixel to copy from */ ! 60: register int nstart; ! 61: int nend; ! 62: int srcStartOver; ! 63: int startmask, endmask, nlMiddle, nl, srcBit; ! 64: int w; ! 65: unsigned int *pdstStart; ! 66: unsigned int *pdstNext; ! 67: ! 68: ! 69: pptLast = ppt + nspans; ! 70: ! 71: if (pDrawable->type == DRAWABLE_WINDOW) ! 72: { ! 73: psrcBase = (unsigned int *) ! 74: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate); ! 75: widthSrc = (int) ! 76: ((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind; ! 77: } ! 78: else ! 79: { ! 80: psrcBase = (unsigned int *)(((PixmapPtr)pDrawable)->devPrivate); ! 81: widthSrc = (int)(((PixmapPtr)pDrawable)->devKind); ! 82: } ! 83: pdstStart = (unsigned int *)Xalloc(nspans * PixmapBytePad(wMax, 1)); ! 84: pdst = pdstStart; ! 85: ! 86: while(ppt < pptLast) ! 87: { ! 88: xEnd = min(ppt->x + *pwidth, widthSrc << 3); ! 89: pwidth++; ! 90: psrc = psrcBase + (ppt->y * (widthSrc >> 2)) + (ppt->x >> 5); ! 91: w = xEnd - ppt->x; ! 92: srcBit = ppt->x & 0x1f; ! 93: /* This shouldn't be needed */ ! 94: pdstNext = pdst + PixmapWidthInPadUnits(w, 1); ! 95: ! 96: if (srcBit + w <= 32) ! 97: { ! 98: getbits(psrc, srcBit, w, tmpSrc); ! 99: putbits(tmpSrc, 0, w, pdst); ! 100: pdst++; ! 101: } ! 102: else ! 103: { ! 104: ! 105: maskbits(ppt->x, w, startmask, endmask, nlMiddle); ! 106: if (startmask) ! 107: nstart = 32 - srcBit; ! 108: else ! 109: nstart = 0; ! 110: if (endmask) ! 111: nend = xEnd & 0x1f; ! 112: srcStartOver = srcBit + nstart > 31; ! 113: if (startmask) ! 114: { ! 115: getbits(psrc, srcBit, nstart, tmpSrc); ! 116: putbits(tmpSrc, 0, nstart, pdst); ! 117: if(srcStartOver) ! 118: psrc++; ! 119: } ! 120: nl = nlMiddle; ! 121: while (nl--) ! 122: { ! 123: tmpSrc = *psrc; ! 124: putbits(tmpSrc, nstart, 32, pdst); ! 125: psrc++; ! 126: pdst++; ! 127: } ! 128: if (endmask) ! 129: { ! 130: getbits(psrc, 0, nend, tmpSrc); ! 131: putbits(tmpSrc, nstart, nend, pdst); ! 132: if(nstart + nend > 32) ! 133: pdst++; ! 134: } ! 135: pdst++; ! 136: while(pdst < pdstNext) ! 137: { ! 138: *pdst++ = 0; ! 139: } ! 140: } ! 141: ppt++; ! 142: } ! 143: return(pdstStart); ! 144: } ! 145:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.