|
|
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: mfbtile.c,v 1.5 87/09/11 07:48:49 toddb Exp $ */ ! 25: #include "X.h" ! 26: ! 27: #include "windowstr.h" ! 28: #include "regionstr.h" ! 29: #include "pixmapstr.h" ! 30: #include "scrnintstr.h" ! 31: ! 32: #include "mfb.h" ! 33: #include "maskbits.h" ! 34: ! 35: /* ! 36: this code could be called by the paint window background stuff, ! 37: too; there would be some speed hit because of the different ! 38: parameters and the need to check for a rop when filling ! 39: with a tile. ! 40: ! 41: the boxes are already translated. ! 42: ! 43: NOTE: ! 44: iy = ++iy < tileHeight ? iy : 0 ! 45: is equivalent to iy%= tileheight, and saves a division. ! 46: */ ! 47: ! 48: /* ! 49: tile area with a 32 bit wide pixmap ! 50: */ ! 51: void ! 52: mfbTileArea32(pDraw, nbox, pbox, alu, ptile) ! 53: DrawablePtr pDraw; ! 54: int nbox; ! 55: BoxPtr pbox; ! 56: int alu; ! 57: PixmapPtr ptile; ! 58: { ! 59: register unsigned int *psrc; ! 60: /* pointer to bits in tile, if needed */ ! 61: int tileHeight; /* height of the tile */ ! 62: register unsigned int srcpix; ! 63: ! 64: int nlwidth; /* width in longwords of the drawable */ ! 65: int w; /* width of current box */ ! 66: register int h; /* height of current box */ ! 67: int startmask; ! 68: int endmask; /* masks for reggedy bits at either end of line */ ! 69: int nlwMiddle; /* number of longwords between sides of boxes */ ! 70: register int nlwExtra; ! 71: /* to get from right of box to left of next span */ ! 72: ! 73: register int nlw; /* loop version of nlwMiddle */ ! 74: register unsigned int *p; /* pointer to bits we're writing */ ! 75: int iy; /* index of current scanline in tile */ ! 76: ! 77: ! 78: unsigned int *pbits; /* pointer to start of drawable */ ! 79: ! 80: if (pDraw->type == DRAWABLE_WINDOW) ! 81: { ! 82: pbits = (unsigned int *) ! 83: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devPrivate); ! 84: nlwidth = (int) ! 85: (((PixmapPtr)(pDraw->pScreen->devPrivate))->devKind) >> 2; ! 86: } ! 87: else ! 88: { ! 89: pbits = (unsigned int *)(((PixmapPtr)pDraw)->devPrivate); ! 90: nlwidth = (int)(((PixmapPtr)pDraw)->devKind) >> 2; ! 91: } ! 92: ! 93: tileHeight = ptile->height; ! 94: psrc = (unsigned int *)(ptile->devPrivate); ! 95: ! 96: while (nbox--) ! 97: { ! 98: w = pbox->x2 - pbox->x1; ! 99: h = pbox->y2 - pbox->y1; ! 100: iy = pbox->y1 % tileHeight; ! 101: p = pbits + (pbox->y1 * nlwidth) + (pbox->x1 >> 5); ! 102: ! 103: if ( ((pbox->x1 & 0x1f) + w) < 32) ! 104: { ! 105: maskpartialbits(pbox->x1, w, startmask); ! 106: nlwExtra = nlwidth; ! 107: while (h--) ! 108: { ! 109: srcpix = psrc[iy]; ! 110: iy = ++iy < tileHeight ? iy : 0; ! 111: *p = (*p & ~startmask) | ! 112: (DoRop(alu, srcpix, *p) & startmask); ! 113: p += nlwExtra; ! 114: } ! 115: } ! 116: else ! 117: { ! 118: maskbits(pbox->x1, w, startmask, endmask, nlwMiddle); ! 119: nlwExtra = nlwidth - nlwMiddle; ! 120: ! 121: if (startmask && endmask) ! 122: { ! 123: nlwExtra -= 1; ! 124: while (h--) ! 125: { ! 126: srcpix = psrc[iy]; ! 127: iy = ++iy < tileHeight ? iy : 0; ! 128: nlw = nlwMiddle; ! 129: *p = (*p & ~startmask) | ! 130: (DoRop(alu, srcpix, *p) & startmask); ! 131: p++; ! 132: while (nlw--) ! 133: { ! 134: *p = DoRop(alu, srcpix, *p); ! 135: p++; ! 136: } ! 137: *p = (*p & ~endmask) | ! 138: (DoRop(alu, srcpix, *p) & endmask); ! 139: p += nlwExtra; ! 140: } ! 141: } ! 142: else if (startmask && !endmask) ! 143: { ! 144: nlwExtra -= 1; ! 145: while (h--) ! 146: { ! 147: srcpix = psrc[iy]; ! 148: iy = ++iy < tileHeight ? iy : 0; ! 149: nlw = nlwMiddle; ! 150: *p = (*p & ~startmask) | ! 151: (DoRop(alu, srcpix, *p) & startmask); ! 152: p++; ! 153: while (nlw--) ! 154: { ! 155: *p = DoRop(alu, srcpix, *p); ! 156: p++; ! 157: } ! 158: p += nlwExtra; ! 159: } ! 160: } ! 161: else if (!startmask && endmask) ! 162: { ! 163: while (h--) ! 164: { ! 165: srcpix = psrc[iy]; ! 166: iy = ++iy < tileHeight ? iy : 0; ! 167: nlw = nlwMiddle; ! 168: while (nlw--) ! 169: { ! 170: *p = DoRop(alu, srcpix, *p); ! 171: p++; ! 172: } ! 173: *p = (*p & ~endmask) | ! 174: (DoRop(alu, srcpix, *p) & endmask); ! 175: p += nlwExtra; ! 176: } ! 177: } ! 178: else /* no ragged bits at either end */ ! 179: { ! 180: while (h--) ! 181: { ! 182: srcpix = psrc[iy]; ! 183: iy = ++iy < tileHeight ? iy : 0; ! 184: nlw = nlwMiddle; ! 185: while (nlw--) ! 186: { ! 187: *p = DoRop(alu, srcpix, *p); ! 188: p++; ! 189: } ! 190: p += nlwExtra; ! 191: } ! 192: } ! 193: } ! 194: pbox++; ! 195: } ! 196: } ! 197:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.