|
|
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: ! 25: #include "X.h" ! 26: #include "Xmd.h" ! 27: #include "servermd.h" ! 28: ! 29: #include "misc.h" ! 30: #include "region.h" ! 31: #include "gc.h" ! 32: #include "windowstr.h" ! 33: #include "pixmapstr.h" ! 34: #include "scrnintstr.h" ! 35: ! 36: #include "cfb.h" ! 37: #include "cfbmskbits.h" ! 38: ! 39: /* GetSpans -- for each span, gets bits from drawable starting at ppt[i] ! 40: * and continuing for pwidth[i] bits ! 41: * Each scanline returned will be server scanline padded, i.e., it will come ! 42: * out to an integral number of words. ! 43: */ ! 44: unsigned int * ! 45: cfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans) ! 46: DrawablePtr pDrawable; /* drawable from which to get bits */ ! 47: int wMax; /* largest value of all *pwidths */ ! 48: register DDXPointPtr ppt; /* points to start copying from */ ! 49: int *pwidth; /* list of number of bits to copy */ ! 50: int nspans; /* number of scanlines to copy */ ! 51: { ! 52: register unsigned int *pdst; /* where to put the bits */ ! 53: register unsigned int *psrc; /* where to get the bits */ ! 54: register unsigned int tmpSrc; /* scratch buffer for bits */ ! 55: unsigned int *psrcBase; /* start of src bitmap */ ! 56: int widthSrc; /* width of pixmap in bytes */ ! 57: register DDXPointPtr pptLast; /* one past last point to get */ ! 58: int xEnd; /* last pixel to copy from */ ! 59: register int nstart; ! 60: int nend; ! 61: int srcStartOver; ! 62: int startmask, endmask, nlMiddle, nl, srcBit; ! 63: int w; ! 64: unsigned int *pdstStart; ! 65: unsigned int *pdstNext; ! 66: ! 67: switch (pDrawable->depth) { ! 68: case 1: ! 69: return (mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans)); ! 70: case 8: ! 71: break; ! 72: default: ! 73: FatalError("cfbGetSpans: invalid depth\n"); ! 74: } ! 75: pptLast = ppt + nspans; ! 76: ! 77: if (pDrawable->type == DRAWABLE_WINDOW) ! 78: { ! 79: psrcBase = (unsigned int *) ! 80: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate); ! 81: widthSrc = (int) ! 82: ((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind; ! 83: ! 84: /* translation should be done by caller of this subroutine ! 85: pptT = ppt; ! 86: while(pptT < pptLast) ! 87: { ! 88: pptT->x += ((WindowPtr)pDrawable)->absCorner.x; ! 89: pptT->y += ((WindowPtr)pDrawable)->absCorner.y; ! 90: pptT++; ! 91: } ! 92: */ ! 93: } ! 94: else ! 95: { ! 96: psrcBase = (unsigned int *)(((PixmapPtr)pDrawable)->devPrivate); ! 97: widthSrc = (int)(((PixmapPtr)pDrawable)->devKind); ! 98: } ! 99: pdstStart = (unsigned int *)Xalloc(nspans * PixmapBytePad(wMax, PSZ)); ! 100: pdst = pdstStart; ! 101: ! 102: while(ppt < pptLast) ! 103: { ! 104: xEnd = min(ppt->x + *pwidth, widthSrc << (PWSH-2) ); ! 105: psrc = psrcBase + (ppt->y * (widthSrc >> 2)) + (ppt->x >> PWSH); ! 106: w = xEnd - ppt->x; ! 107: srcBit = ppt->x & PIM; ! 108: /* This shouldn't be needed */ ! 109: pdstNext = pdst + PixmapWidthInPadUnits(w, PSZ); ! 110: ! 111: if (srcBit + w <= PPW) ! 112: { ! 113: getbits(psrc, srcBit, w, tmpSrc); ! 114: /*XXX*/ putbits(tmpSrc, 0, w, pdst, -1); ! 115: pdst++; ! 116: } ! 117: else ! 118: { ! 119: ! 120: maskbits(ppt->x, w, startmask, endmask, nlMiddle); ! 121: if (startmask) ! 122: nstart = PPW - srcBit; ! 123: else ! 124: nstart = 0; ! 125: if (endmask) ! 126: nend = xEnd & PIM; ! 127: srcStartOver = srcBit + nstart > PLST; ! 128: if (startmask) ! 129: { ! 130: getbits(psrc, srcBit, nstart, tmpSrc); ! 131: /*XXX*/ putbits(tmpSrc, 0, nstart, pdst, -1); ! 132: if(srcStartOver) ! 133: psrc++; ! 134: } ! 135: nl = nlMiddle; ! 136: while (nl--) ! 137: { ! 138: tmpSrc = *psrc; ! 139: /*XXX*/ putbits(tmpSrc, nstart, PPW, pdst, -1); ! 140: psrc++; ! 141: pdst++; ! 142: } ! 143: if (endmask) ! 144: { ! 145: getbits(psrc, 0, nend, tmpSrc); ! 146: /*XXX*/ putbits(tmpSrc, nstart, nend, pdst, -1); ! 147: if(nstart + nend >= PPW) ! 148: pdst++; ! 149: } ! 150: #ifdef notdef ! 151: pdst++; ! 152: while(pdst < pdstNext) ! 153: { ! 154: *pdst++ = 0; ! 155: } ! 156: #else ! 157: pdst = pdstNext; ! 158: #endif notdef ! 159: } ! 160: ppt++; ! 161: } ! 162: return(pdstStart); ! 163: } ! 164:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.