mikew@wyse.wyse.com (Mike Wexler) (02/01/89)
Submitted-by: spaf@purdue.edu (Gene Spafford) Posting-number: Volume 3, Issue 5 Archive-name: p2speedups/part03 # Purdue/Purdue+ patches, part 3 of 4 # Shar archive. Give the following as input to /bin/sh # Packed Sun Jan 22 19:39:54 EST 1989 by spaf@uther.cs.purdue.edu # # This archive contains: # mfbbitblt.c.patch # mfbbres.c.patch # mfbfillsp.c.patch # mfbgetsp.c.patch # mfbpolypnt.c.patch # mfbwindow.c.patch # # echo x - mfbbitblt.c.patch sed 's/^X//' >mfbbitblt.c.patch <<'*-*-END-of-mfbbitblt.c.patch-*-*' X*** /tmp/,RCSt1a00705 Fri Jan 20 21:38:40 1989 X--- ./ddx/mfb/mfbbitblt.c Fri Jan 20 17:02:58 1989 X*************** X*** 1,3 **** X--- 1,4 ---- X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 51,57 **** X go do the multiple rectangle copies X do graphics exposures X */ X! X RegionPtr X mfbCopyArea(pSrcDrawable, pDstDrawable, X pGC, srcx, srcy, width, height, dstx, dsty) X--- 52,76 ---- X go do the multiple rectangle copies X do graphics exposures X */ X! /* #ifdef PURDUE!!!! X! ** Optimized for drawing pixmaps into windows, especially when drawing into X! ** unobscured windows. Calls to the general-purpose region code were X! ** replaced with rectangle-to-rectangle clipping comparisions. This is X! ** possible, since the pixmap is a single rectangle. In an unobscured X! ** window, the destination clip is also a single rectangle, and region X! ** code can be avoided entirely. This is a big savings, since the region X! ** code uses XAlloc() and makes many function calls. X! ** X! ** In addition, if source is a pixmap, there is no need to call the X! ** expensive miHandleExposures() routine. Instead, we simply return NULL. X! ** X! ** Previously, drawing a pixmap into an unobscured window executed at least X! ** 8 XAlloc()'s, 30 function calls, and hundreds of lines of code. X! ** X! ** Now, the same operation requires no XAlloc()'s, no region function calls, X! ** and much less overhead. Nice for drawing lots of small pixmaps. X! */ X! X RegionPtr X mfbCopyArea(pSrcDrawable, pDstDrawable, X pGC, srcx, srcy, width, height, dstx, dsty) X*************** X*** 62,68 **** X--- 81,89 ---- X int width, height; X int dstx, dsty; X { X+ #ifndef PURDUE X BoxRec srcBox; X+ #endif PURDUE X RegionPtr prgnSrcClip; /* may be a new region, or just a copy */ X int realSrcClip = 0; /* non-0 if we've created a src clip */ X X*************** X*** 76,81 **** X--- 97,109 ---- X xRectangle origSource; X DDXPointRec origDest; X X+ #ifdef PURDUE X+ RegionRec fastRegion; /* special region for clipping to 1 box */ X+ BoxRec fastBox; X+ int fastClip = 0; /* for fast clipping with pixmap source */ X+ int fastExpose = 0; /* for fast exposures with pixmap source */ X+ #endif PURDUE X+ X origSource.x = srcx; X origSource.y = srcy; X origSource.width = width; X*************** X*** 93,98 **** X--- 121,127 ---- X prgnSrcClip = ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip; X } X else X+ #ifndef PURDUE X { X BoxRec box; X X*************** X*** 104,109 **** X--- 133,163 ---- X prgnSrcClip = (*pGC->pScreen->RegionCreate)(&box, 1); X realSrcClip = 1; X } X+ #else PURDUE X+ { X+ /* Pixmap sources generate simple exposure events */ X+ fastExpose = 1; X+ X+ /* Pixmap is just one clipping rectangle so we can avoid X+ allocating a full-blown region. */ X+ fastClip = 1; X+ X+ fastBox.x1 = srcx; X+ fastBox.y1 = srcy; X+ fastBox.x2 = srcx + width; X+ fastBox.y2 = srcy + height; X+ X+ /* Left and top are already clipped, so clip right and bottom */ X+ if (fastBox.x2 > ((PixmapPtr)pSrcDrawable)->width) X+ fastBox.x2 = ((PixmapPtr)pSrcDrawable)->width; X+ if (fastBox.y2 > ((PixmapPtr)pSrcDrawable)->height) X+ fastBox.y2 = ((PixmapPtr)pSrcDrawable)->height; X+ X+ /* Initialize the fast region */ X+ fastRegion.numRects = 1; X+ fastRegion.rects = &fastBox; X+ } X+ #endif PURDUE X } X else X { X*************** X*** 128,146 **** X } X } X X! srcBox.x1 = srcx; X! srcBox.y1 = srcy; X! srcBox.x2 = srcx + width; X! srcBox.y2 = srcy + height; X X! prgnDst = (*pGC->pScreen->RegionCreate)(&srcBox, 1); X! (*pGC->pScreen->Intersect)(prgnDst, prgnDst, prgnSrcClip); X! X if (pDstDrawable->type == DRAWABLE_WINDOW) X { X if (!((WindowPtr)pDstDrawable)->realized) X { X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return NULL; X--- 182,211 ---- X } X } X X! #ifdef PURDUE X! /* Don't create a source region if we are doing a fast clip */ X! if (!fastClip) X! #endif PURDUE X! { X! BoxRec srcBox; X X! srcBox.x1 = srcx; X! srcBox.y1 = srcy; X! srcBox.x2 = srcx + width; X! srcBox.y2 = srcy + height; X! X! prgnDst = (*pGC->pScreen->RegionCreate)(&srcBox, 1); X! (*pGC->pScreen->Intersect)(prgnDst, prgnDst, prgnSrcClip); X! } X! X if (pDstDrawable->type == DRAWABLE_WINDOW) X { X if (!((WindowPtr)pDstDrawable)->realized) X { X! #ifdef PURDUE X! if (!fastClip) X! #endif X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return NULL; X*************** X*** 152,169 **** X dx = srcx - dstx; X dy = srcy - dsty; X X /* clip the shape of the dst to the destination composite clip */ X (*pGC->pScreen->TranslateRegion)(prgnDst, -dx, -dy); X (*pGC->pScreen->Intersect)(prgnDst, X! prgnDst, X! ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip); X X if (prgnDst->numRects) X { X if(!(pptSrc = (DDXPointPtr)ALLOCATE_LOCAL( prgnDst->numRects * X sizeof(DDXPointRec)))) X { X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return NULL; X--- 217,292 ---- X dx = srcx - dstx; X dy = srcy - dsty; X X+ #ifndef PURDUE X /* clip the shape of the dst to the destination composite clip */ X (*pGC->pScreen->TranslateRegion)(prgnDst, -dx, -dy); X (*pGC->pScreen->Intersect)(prgnDst, X! prgnDst, X! ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip); X X+ #else PURDUE X+ /* Translate and clip the dst to the destination composite clip */ X+ if (fastClip) X+ { X+ /* Translate the region directly */ X+ fastBox.x1 -= dx; X+ fastBox.x2 -= dx; X+ fastBox.y1 -= dy; X+ fastBox.y2 -= dy; X+ X+ /* If the destination composite clip is one rectangle we can X+ do the clip directly. Otherwise we have to create a full X+ blown region and call intersect */ X+ if (((mfbPrivGC *)(pGC->devPriv))->pCompositeClip->numRects == 1) X+ { X+ BoxPtr pBox = ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip->rects; X+ X+ if (fastBox.x1 < pBox->x1) fastBox.x1 = pBox->x1; X+ if (fastBox.x2 > pBox->x2) fastBox.x2 = pBox->x2; X+ if (fastBox.y1 < pBox->y1) fastBox.y1 = pBox->y1; X+ if (fastBox.y2 > pBox->y2) fastBox.y2 = pBox->y2; X+ X+ /* Check to see if the region is empty */ X+ if (fastBox.x1 >= fastBox.x2 || fastBox.y1 >= fastBox.y2) X+ fastRegion.numRects = 0; X+ X+ /* Use the fast region for all future computation. X+ The following code insures that RegionDestroy is not X+ called on it. */ X+ prgnDst = &fastRegion; X+ } X+ else X+ { X+ /* We must turn off fastClip now, since we must create X+ a full blown region. It is intersected with the X+ composite clip below. */ X+ fastClip = 0; X+ prgnDst = (*pGC->pScreen->RegionCreate)(&fastBox,1); X+ } X+ } X+ else X+ { X+ (*pGC->pScreen->TranslateRegion)(prgnDst, -dx, -dy); X+ } X+ X+ if (!fastClip) X+ { X+ (*pGC->pScreen->Intersect)(prgnDst, X+ prgnDst, X+ ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip); X+ } X+ #endif PURDUE X+ X+ /* Do bit blitting */ X if (prgnDst->numRects) X { X if(!(pptSrc = (DDXPointPtr)ALLOCATE_LOCAL( prgnDst->numRects * X sizeof(DDXPointRec)))) X { X! #ifdef PURDUE X! if (!fastClip) X! #endif PURDUE X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return NULL; X*************** X*** 182,195 **** X } X X prgnExposed = NULL; X! if (((mfbPrivGC *)(pGC->devPriv))->fExpose) X! prgnExposed = X! miHandleExposures(pSrcDrawable, pDstDrawable, pGC, X! origSource.x, origSource.y, X! origSource.width, origSource.height, X! origDest.x, origDest.y, 0); X! X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return prgnExposed; X--- 305,327 ---- X } X X prgnExposed = NULL; X! if (((mfbPrivGC *)(pGC->devPriv))->fExpose) { X! #ifdef PURDUE X! /* Pixmap sources generate a NoExposed (we return NULL to do this) */ X! if (!fastExpose) X! #endif PURDUE X! prgnExposed = X! miHandleExposures(pSrcDrawable, pDstDrawable, pGC, X! origSource.x, origSource.y, X! origSource.width, origSource.height, X! origDest.x, origDest.y, 0); X! } X! #ifdef PURDUE X! X! /* Destroy any created regions */ X! if (!fastClip) X! #endif PURDUE X! (*pGC->pScreen->RegionDestroy)(prgnDst); X if (realSrcClip) X (*pGC->pScreen->RegionDestroy)(prgnSrcClip); X return prgnExposed; X*************** X*** 243,248 **** X--- 375,382 ---- X } \ X } X X+ #ifndef PURDUE X+ X #define longRop(alu,from,to,count) \ X { \ X switch (count & 7) { \ X*************** X*** 267,273 **** X } \ X } X X- X #define getunalignedword(psrc, x, dst) \ X { \ X int m; \ X--- 401,406 ---- X*************** X*** 276,281 **** X--- 409,437 ---- X (SCRRIGHT(*((psrc)+1), m) & starttab[m]); \ X } X X+ #else /* PURDUE */ X+ #define longRop(alu,from,to,count) \ X+ while (count--) \ X+ { \ X+ DoRop(*to, alu, *from++, *to); to++; \ X+ } X+ X+ #ifdef FASTGETBITS X+ #define getunalignedword(psrc, x, dst) { \ X+ register int _tmp; \ X+ FASTGETBITS(psrc, x, 32, _tmp); \ X+ dst = _tmp; \ X+ } X+ #else X+ #define getunalignedword(psrc, x, dst) \ X+ { \ X+ dst = (SCRLEFT((unsigned) *(psrc), (x))) | \ X+ (SCRRIGHT((unsigned) *((psrc)+1), 32-(x))); \ X+ } X+ #endif /* FASTGETBITS */ X+ X+ #endif /* PURDUE */ X+ X mfbDoBitblt(pSrcDrawable, pDstDrawable, alu, prgnDst, pptSrc) X DrawablePtr pSrcDrawable; X DrawablePtr pDstDrawable; X*************** X*** 491,498 **** X--- 647,658 ---- X X while(h--) X { X+ #ifndef PURDUE X getbits(psrc, srcBit, w, tmpSrc) X putbits(tmpSrc, dstBit, w, pdst) X+ #else X+ getandputbits(psrc, srcBit, dstBit, w, pdst) X+ #endif /* PURDUE */ X pdst += widthDst; X psrc += widthSrc; X } X*************** X*** 524,531 **** X--- 684,696 ---- X X if (startmask) X { X+ #ifndef PURDUE X getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc) X putbits(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst) X+ #else X+ getandputbits(psrc, (pptSrc->x & 0x1f), X+ (pbox->x1 & 0x1f), nstart, pdst) X+ #endif /* PURDUE */ X pdst++; X if (srcStartOver) X psrc++; X*************** X*** 552,559 **** X--- 717,728 ---- X X if (endmask) X { X+ #ifndef PURDUE X getbits(psrc, xoffSrc, nend, tmpSrc) X putbits(tmpSrc, 0, nend, pdst) X+ #else X+ getandputbits0(psrc, xoffSrc, nend, pdst); X+ #endif /* PURDUE */ X } X X pdstLine += widthDst; X*************** X*** 577,588 **** X--- 746,766 ---- X X if (endmask) X { X+ #ifndef PURDUE X getbits(psrc, xoffSrc, nend, tmpSrc) X putbits(tmpSrc, 0, nend, pdst) X+ #else X+ getandputbits0(psrc, xoffSrc, nend, pdst); X+ #endif X } X X+ #ifndef PURDUE X nl = nlMiddle + 1; X while (--nl) X+ #else X+ nl = nlMiddle; X+ while (nl--) X+ #endif /* PURDUE */ X { X --psrc; X getunalignedword (psrc, xoffSrc, *--pdst) X*************** X*** 593,600 **** X--- 771,782 ---- X if (srcStartOver) X --psrc; X --pdst; X+ #ifndef PURDUE X getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc) X putbits(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst) X+ #else X+ getandputbits(psrc, (pptSrc->x & 0x1f), (pbox->x1 & 0x1f), nstart, pdst) X+ #endif /* PURDUE */ X } X X pdstLine += widthDst; X*************** X*** 639,646 **** X--- 821,832 ---- X X while(h--) X { X+ #ifndef PURDUE X getbits(psrc, srcBit, w, tmpSrc) X putbitsrop(tmpSrc, dstBit, w, pdst, alu) X+ #else X+ getandputrop(psrc, srcBit, dstBit, w, pdst, alu) X+ #endif /* PURDUE */ X pdst += widthDst; X psrc += widthSrc; X } X*************** X*** 672,680 **** X--- 858,871 ---- X X if (startmask) X { X+ #ifndef PURDUE X getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc) X putbitsrop(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst, X alu) X+ #else X+ getandputrop(psrc, (pptSrc->x & 0x1f), X+ (pbox->x1 & 0x1f), nstart, pdst, alu) X+ #endif /* PURDUE */ X pdst++; X if (srcStartOver) X psrc++; X*************** X*** 694,700 **** X--- 885,896 ---- X while (--nl) X { X getunalignedword (psrc, xoffSrc, tmpSrc) X+ #ifndef PURDUE X *pdst++ = DoRop (alu, tmpSrc, *pdst); X+ #else X+ DoRop (*pdst, alu, tmpSrc, *pdst); X+ pdst++; X+ #endif X psrc++; X } X } X*************** X*** 701,708 **** X--- 897,908 ---- X X if (endmask) X { X+ #ifndef PURDUE X getbits(psrc, xoffSrc, nend, tmpSrc) X putbitsrop(tmpSrc, 0, nend, pdst, alu) X+ #else X+ getandputrop0(psrc, xoffSrc, nend, pdst, alu); X+ #endif /* PURDUE */ X } X X pdstLine += widthDst; X*************** X*** 726,733 **** X--- 926,937 ---- X X if (endmask) X { X+ #ifndef PURDUE X getbits(psrc, xoffSrc, nend, tmpSrc) X putbitsrop(tmpSrc, 0, nend, pdst, alu) X+ #else X+ getandputrop0(psrc, xoffSrc, nend, pdst, alu); X+ #endif /* PURDUE */ X } X X nl = nlMiddle + 1; X*************** X*** 736,742 **** X--- 940,950 ---- X --psrc; X --pdst; X getunalignedword(psrc, xoffSrc, tmpSrc) X+ #ifndef PURDUE X *pdst = DoRop(alu, tmpSrc, *pdst); X+ #else X+ DoRop(*pdst, alu, tmpSrc, *pdst); X+ #endif /* PURDUE */ X } X X if (startmask) X*************** X*** 744,752 **** X--- 952,965 ---- X if (srcStartOver) X --psrc; X --pdst; X+ #ifndef PURDUE X getbits(psrc, (pptSrc->x & 0x1f), nstart, tmpSrc) X putbitsrop(tmpSrc, (pbox->x1 & 0x1f), nstart, pdst, X alu) X+ #else X+ getandputrop(psrc, (pptSrc->x & 0x1f), X+ (pbox->x1 & 0x1f), nstart, pdst, alu) X+ #endif /* PURDUE */ X } X X pdstLine += widthDst; *-*-END-of-mfbbitblt.c.patch-*-* echo x - mfbbres.c.patch sed 's/^X//' >mfbbres.c.patch <<'*-*-END-of-mfbbres.c.patch-*-*' X*** /tmp/,RCSt1a01536 Wed Jan 18 23:15:06 1989 X--- ddx/mfb/mfbbres.c Tue Jan 17 23:39:13 1989 X*************** X*** 1,3 **** X--- 1,4 ---- X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 34,40 **** X--- 35,47 ---- X X mfbBresS(rop, addrl, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len) X int rop; /* a reduced rasterop */ X+ X+ #ifdef PURDUE X+ unsigned int *addrl; /* pointer to base of bitmap */ X+ #else X register int *addrl; /* pointer to base of bitmap */ X+ #endif X+ X int nlwidth; /* width in longwords of bitmap */ X int signdx, signdy; /* signs of directions */ X int axis; /* major axis (Y_AXIS or X_AXIS) */ X*************** X*** 42,50 **** X--- 49,79 ---- X register int e; /* error accumulator */ X register int e1; /* bresenham increments */ X int e2; X+ X+ #ifdef PURDUE X+ unsigned int len; /* length of line */ X+ #else X register int len; /* length of line */ X+ #endif X+ X { X X+ #ifdef PURDUE X+ register int yinc; /* increment to next scanline, in bytes */ X+ register unsigned char *addrb; /* bitmask long pointer X+ * cast to char pointer */ X+ register unsigned int bit; /* current bit being set/cleared/etc. */ X+ unsigned int leftbit = mask[0]; /* leftmost bit to process in new word */ X+ unsigned int rightbit = mask[31]; /* rightmost bit to process in new word */ X+ X+ register int e3 = e2-e1; X+ X+ /* point to longword containing first point */ X+ addrb = (unsigned char *)(addrl + (y1 * nlwidth) + (x1 >> 5)); X+ yinc = signdy * nlwidth * 4; /* 4 == sizeof(int) */ X+ e = e-e1; /* to make looping easier */ X+ bit = mask[x1 & 31]; X+ #else X register int yinc; /* increment to next scanline */ X register int addrb; /* bitmask */ X X*************** X*** 52,57 **** X--- 81,87 ---- X addrl = addrl + (y1 * nlwidth) + (x1 >> 5); X addrb = x1&0x1f; X yinc = signdy * nlwidth; X+ #endif X X if (rop == RROP_BLACK) X { X*************** X*** 59,64 **** X--- 89,108 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb &= ~bit; X+ e += e1; X+ if (e >= 0) X+ { X+ addrb += yinc; X+ e += e3; X+ } X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ } X+ #else X while(len--) X { X *addrl &= rmask[addrb]; X*************** X*** 76,84 **** X--- 120,143 ---- X } X addrb++; X } X+ #endif X } X else X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb &= ~bit; X+ e += e1; X+ if (e >= 0) X+ { X+ addrb += yinc; X+ e += e3; X+ } X+ bit = SCRLEFT(bit,1); X+ if (!bit) { bit = rightbit;addrb -= 4; } X+ } X+ #else X while(len--) X { X *addrl &= rmask[addrb]; X*************** X*** 96,101 **** X--- 155,161 ---- X } X addrb--; X } X+ #endif X } X } /* if X_AXIS */ X else X*************** X*** 102,107 **** X--- 162,181 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb &= ~bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl &= rmask[addrb]; X*************** X*** 119,127 **** X--- 193,216 ---- X } X addrl += yinc; X } X+ #endif X } X else X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb &= ~bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRLEFT(bit,1); X+ if (!bit) { bit = rightbit;addrb -= 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl &= rmask[addrb]; X*************** X*** 139,144 **** X--- 228,234 ---- X } X addrl += yinc; X } X+ #endif X } X } /* else Y_AXIS */ X } X*************** X*** 148,153 **** X--- 238,257 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb |= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ addrb += yinc; X+ e += e3; X+ } X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ } X+ #else X while(len--) X { X *addrl |= mask[addrb]; X*************** X*** 165,174 **** X } X addrb++; X } X } X else X { X! while(len--) X { X *addrl |= mask[addrb]; X if (e <= 0) X--- 269,293 ---- X } X addrb++; X } X+ #endif X } X else X { X! #ifdef PURDUE X! while(len--) X! { X! *(unsigned long *)addrb |= bit; X! e += e1; X! if (e >= 0) X! { X! addrb += yinc; X! e += e3; X! } X! bit = SCRLEFT(bit,1); X! if (!bit) { bit = rightbit;addrb -= 4; } X! } X! #else X! while(len--) X { X *addrl |= mask[addrb]; X if (e <= 0) X*************** X*** 185,190 **** X--- 304,310 ---- X } X addrb--; X } X+ #endif X } X } /* if X_AXIS */ X else X*************** X*** 191,196 **** X--- 311,330 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb |= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl |= mask[addrb]; X*************** X*** 208,216 **** X--- 342,365 ---- X } X addrl += yinc; X } X+ #endif X } X else X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb |= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRLEFT(bit,1); X+ if (!bit) { bit = rightbit;addrb -= 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl |= mask[addrb]; X*************** X*** 228,233 **** X--- 377,383 ---- X } X addrl += yinc; X } X+ #endif X } X } /* else Y_AXIS */ X } X*************** X*** 237,242 **** X--- 387,406 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb ^= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ addrb += yinc; X+ e += e3; X+ } X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ } X+ #else X while(len--) X { X *addrl ^= mask[addrb]; X*************** X*** 254,262 **** X--- 418,441 ---- X } X addrb++; X } X+ #endif X } X else X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb ^= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ addrb += yinc; X+ e += e3; X+ } X+ bit = SCRLEFT(bit,1); X+ if (!bit) { bit = rightbit;addrb -= 4; } X+ } X+ #else X while(len--) X { X *addrl ^= mask[addrb]; X*************** X*** 274,279 **** X--- 453,459 ---- X } X addrb--; X } X+ #endif X } X } /* if X_AXIS */ X else X*************** X*** 280,285 **** X--- 460,479 ---- X { X if (signdx > 0) X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb ^= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRRIGHT(bit,1); X+ if (!bit) { bit = leftbit;addrb += 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl ^= mask[addrb]; X*************** X*** 297,305 **** X--- 491,514 ---- X } X addrl += yinc; X } X+ #endif X } X else X { X+ #ifdef PURDUE X+ while(len--) X+ { X+ *(unsigned long *)addrb ^= bit; X+ e += e1; X+ if (e >= 0) X+ { X+ bit = SCRLEFT(bit,1); X+ if (!bit) { bit = rightbit;addrb -= 4; } X+ e += e3; X+ } X+ addrb += yinc; X+ } X+ #else X while(len--) X { X *addrl ^= mask[addrb]; X*************** X*** 317,322 **** X--- 526,532 ---- X } X addrl += yinc; X } X+ #endif X } X } /* else Y_AXIS */ X } *-*-END-of-mfbbres.c.patch-*-* echo x - mfbfillsp.c.patch sed 's/^X//' >mfbfillsp.c.patch <<'*-*-END-of-mfbfillsp.c.patch-*-*' X*** /tmp/,RCSt1a00702 Fri Jan 20 21:38:34 1989 X--- ./ddx/mfb/mfbfillsp.c Fri Jan 20 17:05:40 1989 X*************** X*** 1,3 **** X--- 1,4 ---- X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 123,130 **** X--- 124,135 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ &= ~startmask; X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ = 0x0; X+ #else X+ Duff (nlmiddle, *addrl++ = 0x0); X+ #endif X if (endmask) X *addrl &= ~endmask; X } X*************** X*** 207,214 **** X--- 212,223 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ |= startmask; X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ = 0xffffffff; X+ #else X+ Duff (nlmiddle, *addrl++ = 0xffffffff); X+ #endif X if (endmask) X *addrl |= endmask; X } X*************** X*** 291,298 **** X--- 300,311 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ ^= startmask; X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ ^= 0xffffffff; X+ #else X+ Duff (nlmiddle, *addrl++ ^= 0xffffffff); X+ #endif /* PURDUE */ X if (endmask) X *addrl ^= endmask; X } X*************** X*** 382,389 **** X--- 395,406 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ |= (src & startmask); X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ |= src; X+ #else X+ Duff (nlmiddle, *addrl++ |= src); X+ #endif /* PURDUE */ X if (endmask) X *addrl |= (src & endmask); X } X*************** X*** 472,479 **** X--- 489,500 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ &= ~(src & startmask); X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ &= ~src; X+ #else X+ Duff (nlmiddle, *addrl++ &= ~src); X+ #endif /* PURDUE */ X if (endmask) X *addrl &= ~(src & endmask); X } X*************** X*** 562,569 **** X--- 583,594 ---- X maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); X if (startmask) X *addrl++ ^= (src & startmask); X+ #ifndef PURDUE X while (nlmiddle--) X *addrl++ ^= src; X+ #else X+ Duff(nlmiddle, *addrl++ ^= src); X+ #endif /* PURDUE */ X if (endmask) X *addrl ^= (src & endmask); X } X*************** X*** 852,859 **** X--- 877,888 ---- X */ X w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_UNIT); X endinc = rem / BITMAP_SCANLINE_UNIT; X+ #ifndef PURDUE X getbits(psrc + endinc, rem & 0x1f, w, tmpSrc); X putbitsrop(tmpSrc, (x & 0x1f), w, pdst, rop); X+ #else X+ getandputrop((psrc+endinc), (rem&0x1f), (x & 0x1f), w, pdst, rop); X+ #endif X if((x & 0x1f) + w >= 0x20) X pdst++; X } X*************** X*** 860,867 **** X--- 889,900 ---- X else if(((x & 0x1f) + w) < 32) X { X /* doing < 32 bits is easy, and worth special-casing */ X+ #ifndef PURDUE X getbits(psrc, 0, w, tmpSrc); X putbitsrop(tmpSrc, x & 0x1f, w, pdst, rop); X+ #else X+ putbitsrop(*psrc, x & 0x1f, w, pdst, rop); X+ #endif X } X else X { X*************** X*** 883,890 **** X--- 916,927 ---- X X if(startmask) X { X+ #ifndef PURDUE X getbits(psrc, 0, nstart, tmpSrc); X putbitsrop(tmpSrc, (x & 0x1f), nstart, pdst, rop); X+ #else X+ putbitsrop(*psrc, (x & 0x1f), nstart, pdst, rop); X+ #endif /* PURDUE */ X pdst++; X if(srcStartOver) X psrc++; X*************** X*** 892,906 **** X--- 929,951 ---- X X while(nlMiddle--) X { X+ #ifndef PURDUE X getbits(psrc, nstart, 32, tmpSrc); X *pdst = DoRop(rop, tmpSrc, *pdst); X+ #else /* PURDUE */ X+ getandputrop0(psrc, nstart, 32, pdst, rop); X+ #endif /* PURDUE */ X pdst++; X psrc++; X } X if(endmask) X { X+ #ifndef PURDUE X getbits(psrc, nstart, nend, tmpSrc); X putbitsrop(tmpSrc, 0, nend, pdst, rop); X+ #else X+ getandputrop0(psrc, nstart, nend, pdst, rop); X+ #endif /* PURDUE */ X } X } X x += w; X*************** X*** 1013,1020 **** X */ X w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_UNIT); X endinc = rem / BITMAP_SCANLINE_UNIT; X getbits(psrc + endinc, rem & 0x1f, w, tmpSrc); X! putbitsrrop(tmpSrc, (x & 0x1f), w, pdst, rop); X if((x & 0x1f) + w >= 0x20) X pdst++; X } X--- 1058,1070 ---- X */ X w = min(min(tileWidth - rem, width), BITMAP_SCANLINE_UNIT); X endinc = rem / BITMAP_SCANLINE_UNIT; X+ #ifndef PURDUE X getbits(psrc + endinc, rem & 0x1f, w, tmpSrc); X! putbitsrop(tmpSrc, (x & 0x1f), w, pdst, rop); X! #else X! getandputrop((psrc + endinc), (rem & 0x1f), (x & 0x1f), X! w, pdst, rop) X! #endif X if((x & 0x1f) + w >= 0x20) X pdst++; X } X*************** X*** 1022,1029 **** X--- 1072,1083 ---- X else if(((x & 0x1f) + w) < 32) X { X /* doing < 32 bits is easy, and worth special-casing */ X+ #ifndef PURDUE X getbits(psrc, 0, w, tmpSrc); X putbitsrrop(tmpSrc, x & 0x1f, w, pdst, rop); X+ #else X+ putbitsrrop(*psrc, x & 0x1f, w, pdst, rop); X+ #endif /* PURDUE */ X } X else X { X*************** X*** 1045,1052 **** X--- 1099,1110 ---- X X if(startmask) X { X+ #ifndef PURDUE X getbits(psrc, 0, nstart, tmpSrc); X putbitsrrop(tmpSrc, (x & 0x1f), nstart, pdst, rop); X+ #else X+ putbitsrrop(*psrc, (x & 0x1f), nstart, pdst, rop); X+ #endif X pdst++; X if(srcStartOver) X psrc++; X*************** X*** 1054,1068 **** X--- 1112,1134 ---- X X while(nlMiddle--) X { X+ #ifndef PURDUE X getbits(psrc, nstart, 32, tmpSrc); X *pdst = DoRRop(rop, tmpSrc, *pdst); X+ #else X+ getandputrrop0(psrc, nstart, 32, pdst, rop); X+ #endif X pdst++; X psrc++; X } X if(endmask) X { X+ #ifndef PURDUE X getbits(psrc, nstart, nend, tmpSrc); X putbitsrrop(tmpSrc, 0, nend, pdst, rop); X+ #else X+ getandputrrop0(psrc, nstart, nend, pdst, rop); X+ #endif /* PURDUE */ X } X } X x += w; *-*-END-of-mfbfillsp.c.patch-*-* echo x - mfbgetsp.c.patch sed 's/^X//' >mfbgetsp.c.patch <<'*-*-END-of-mfbgetsp.c.patch-*-*' X*** /tmp/,RCSt1a01554 Wed Jan 18 23:15:20 1989 X--- ddx/mfb/mfbgetsp.c Tue Jan 17 23:39:29 1989 X*************** X*** 1,3 **** X--- 1,4 ---- X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 110,117 **** X--- 111,122 ---- X X if (srcBit + w <= 32) X { X+ #ifndef PURDUE X getbits(psrc, srcBit, w, tmpSrc); X putbits(tmpSrc, 0, w, pdst); X+ #else X+ getandputbits0(psrc, srcBit, w, pdst); X+ #endif /* PURDUE */ X pdst++; X } X else X*************** X*** 127,138 **** X--- 132,150 ---- X srcStartOver = srcBit + nstart > 31; X if (startmask) X { X+ #ifndef PURDUE X getbits(psrc, srcBit, nstart, tmpSrc); X putbits(tmpSrc, 0, nstart, pdst); X+ #else X+ getandputbits0(psrc, srcBit, nstart, pdst); X+ #endif /* PURDUE */ X if(srcStartOver) X psrc++; X } X nl = nlMiddle; X+ #if defined(PURDUE) && defined(FASTPUTBITS) X+ Duff(nl, putbits(*psrc, nstart, 32, pdst); psrc++; pdst++;); X+ #else X while (nl--) X { X tmpSrc = *psrc; X*************** X*** 140,149 **** X--- 152,166 ---- X psrc++; X pdst++; X } X+ #endif X if (endmask) X { X+ #ifndef PURDUE X getbits(psrc, 0, nend, tmpSrc); X putbits(tmpSrc, nstart, nend, pdst); X+ #else X+ putbits(*psrc, nstart, nend, pdst); X+ #endif /* PURDUE */ X if(nstart + nend > 32) X pdst++; X } *-*-END-of-mfbgetsp.c.patch-*-* echo x - mfbpolypnt.c.patch sed 's/^X//' >mfbpolypnt.c.patch <<'*-*-END-of-mfbpolypnt.c.patch-*-*' X*** /tmp/,RCSt1a01574 Wed Jan 18 23:15:33 1989 X--- ddx/mfb/mfbpolypnt.c Tue Jan 17 23:39:46 1989 X*************** X*** 1,3 **** X--- 1,4 ---- X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 102,112 **** X--- 103,117 ---- X nptTmp = npt; X if (mode == CoordModeOrigin) X { X+ #ifndef PURDUE X while(nptTmp--) X { X ppt->x += xorg; X ppt++->y += yorg; X } X+ #else X+ Duff(nptTmp, ppt->x += xorg; ppt++->y += yorg ); X+ #endif X } X else X { X*************** X*** 113,118 **** X--- 118,124 ---- X ppt->x += xorg; X ppt->y += yorg; X nptTmp--; X+ #ifndef PURDUE X while(nptTmp--) X { X ppt++; X*************** X*** 119,124 **** X--- 125,133 ---- X ppt->x += (ppt-1)->x; X ppt->y += (ppt-1)->y; X } X+ #else X+ Duff(nptTmp, ppt++; ppt->x += (ppt-1)->x; ppt->y += (ppt-1)->y); X+ #endif X } X X ppt = pptInit; *-*-END-of-mfbpolypnt.c.patch-*-* echo x - mfbwindow.c.patch sed 's/^X//' >mfbwindow.c.patch <<'*-*-END-of-mfbwindow.c.patch-*-*' X*** /tmp/,RCSt1a01591 Wed Jan 18 23:15:43 1989 X--- ddx/mfb/mfbwindow.c Tue Jan 17 23:39:59 1989 X*************** X*** 1,4 **** X--- 1,5 ---- X /* $XConsortium: mfbwindow.c,v 1.10 88/10/20 20:02:34 keith Exp $ */ X+ /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */ X /*********************************************************** X Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, X and the Massachusetts Institute of Technology, Cambridge, Massachusetts. X*************** X*** 190,200 **** X--- 191,206 ---- X return; X ppt = pptSrc; X X+ #ifndef PURDUE X for (i=0; i<nbox; i++, ppt++, pbox++) X { X ppt->x = pbox->x1 + dx; X ppt->y = pbox->y1 + dy; X } X+ #else X+ i = nbox; X+ Duff(i, ppt->x = pbox->x1 + dx; ppt->y = pbox->y1 + dy; ppt++; pbox++); X+ #endif /* PURDUE */ X X mfbDoBitblt(pwinRoot, pwinRoot, GXcopy, prgnDst, pptSrc); X DEALLOCATE_LOCAL(pptSrc); *-*-END-of-mfbwindow.c.patch-*-* exit -- Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330 Moderator of comp.sources.x