|
|
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: mfbfillrct.c,v 1.32 87/09/08 15:32:46 drewry Locked $ */ ! 25: #include "X.h" ! 26: #include "Xprotostr.h" ! 27: #include "pixmapstr.h" ! 28: #include "gcstruct.h" ! 29: #include "windowstr.h" ! 30: #include "miscstruct.h" ! 31: #include "regionstr.h" ! 32: #include "scrnintstr.h" ! 33: ! 34: #include "mfb.h" ! 35: #include "maskbits.h" ! 36: ! 37: #define MODEQ(a, b) ((a) %= (b)) ! 38: void mfbPaintOddSize(); ! 39: ! 40: /* ! 41: filled rectangles. ! 42: translate the rectangles, clip them, and call the ! 43: helper function in the GC. ! 44: */ ! 45: ! 46: void ! 47: mfbPolyFillRect(pDrawable, pGC, nrectFill, prectInit) ! 48: DrawablePtr pDrawable; ! 49: GCPtr pGC; ! 50: int nrectFill; /* number of rectangles to fill */ ! 51: xRectangle *prectInit; /* Pointer to first rectangle to fill */ ! 52: { ! 53: int xorg, yorg; ! 54: register int n; /* spare counter */ ! 55: xRectangle *prect; /* temporary */ ! 56: RegionPtr prgnClip; ! 57: register BoxPtr pbox; /* used to clip with */ ! 58: register BoxPtr pboxClipped; ! 59: BoxPtr pboxClippedBase; ! 60: ! 61: int alu; ! 62: void (* pfn) (); ! 63: PixmapPtr ppix; ! 64: ! 65: alu = ((mfbPrivGC *)(pGC->devPriv))->ropFillArea; ! 66: pfn = ((mfbPrivGC *)(pGC->devPriv))->FillArea; ! 67: ppix = *( ((mfbPrivGC *)(pGC->devPriv))->ppPixmap); ! 68: prgnClip = ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip; ! 69: ! 70: pboxClippedBase = (BoxPtr)ALLOCATE_LOCAL(prgnClip->numRects * ! 71: sizeof(BoxRec)); ! 72: ! 73: if (!pboxClippedBase) ! 74: return; ! 75: ! 76: prect = prectInit; ! 77: if (pDrawable->type == DRAWABLE_WINDOW) ! 78: { ! 79: xorg = ((WindowPtr)pDrawable)->absCorner.x; ! 80: yorg = ((WindowPtr)pDrawable)->absCorner.y; ! 81: prect = prectInit; ! 82: n = nrectFill; ! 83: while(n--) ! 84: { ! 85: prect->x += xorg; ! 86: prect->y += yorg; ! 87: prect++; ! 88: } ! 89: } ! 90: ! 91: prect = prectInit; ! 92: while (nrectFill--) ! 93: { ! 94: BoxRec box; ! 95: ! 96: if (prect->width <= 0 || prect->height <= 0) ! 97: { ! 98: prect++; ! 99: continue; ! 100: } ! 101: box.x1 = prect->x; ! 102: box.y1 = prect->y; ! 103: box.x2 = box.x1 + prect->width; ! 104: box.y2 = box.y1 + prect->height; ! 105: prect++; ! 106: ! 107: switch((*pGC->pScreen->RectIn)(prgnClip, &box)) ! 108: { ! 109: case rgnOUT: ! 110: break; ! 111: case rgnIN: ! 112: (*pfn)(pDrawable, 1, &box, alu, ppix); ! 113: break; ! 114: case rgnPART: ! 115: pboxClipped = pboxClippedBase; ! 116: pbox = prgnClip->rects; ! 117: n = prgnClip->numRects; ! 118: ! 119: /* clip the rectangle to each box in the clip region ! 120: this is logically equivalent to calling Intersect() ! 121: */ ! 122: while(n--) ! 123: { ! 124: pboxClipped->x1 = max(box.x1, pbox->x1); ! 125: pboxClipped->y1 = max(box.y1, pbox->y1); ! 126: pboxClipped->x2 = min(box.x2, pbox->x2); ! 127: pboxClipped->y2 = min(box.y2, pbox->y2); ! 128: pbox++; ! 129: ! 130: /* see if clipping left anything */ ! 131: if(pboxClipped->x1 < pboxClipped->x2 && ! 132: pboxClipped->y1 < pboxClipped->y2) ! 133: { ! 134: pboxClipped++; ! 135: } ! 136: } ! 137: (*pfn)(pDrawable, pboxClipped-pboxClippedBase, ! 138: pboxClippedBase, alu, ppix); ! 139: break; ! 140: } ! 141: } ! 142: DEALLOCATE_LOCAL(pboxClippedBase); ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.