|
|
1.1 ! root 1: /* $Header: regionstr.h,v 1.1 87/09/11 07:50:10 toddb Exp $ */ ! 2: /*********************************************************** ! 3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ! 4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts. ! 5: ! 6: All Rights Reserved ! 7: ! 8: Permission to use, copy, modify, and distribute this software and its ! 9: documentation for any purpose and without fee is hereby granted, ! 10: provided that the above copyright notice appear in all copies and that ! 11: both that copyright notice and this permission notice appear in ! 12: supporting documentation, and that the names of Digital or MIT not be ! 13: used in advertising or publicity pertaining to distribution of the ! 14: software without specific, written prior permission. ! 15: ! 16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 22: SOFTWARE. ! 23: ! 24: ******************************************************************/ ! 25: #ifndef REGIONSTRUCT_H ! 26: #define REGIONSTRUCT_H ! 27: ! 28: #include "region.h" ! 29: #include "miscstruct.h" ! 30: /* ! 31: * clip region ! 32: */ ! 33: ! 34: typedef struct _Region { ! 35: short size; ! 36: short numRects; ! 37: BoxPtr rects; ! 38: BoxRec extents; ! 39: } RegionRec; ! 40: ! 41: /* ! 42: * Check to see if there is enough memory in the present region. ! 43: */ ! 44: #define MEMCHECK(reg, rect, firstrect){\ ! 45: if ((reg)->numRects >= ((reg)->size - 1)){\ ! 46: (firstrect) = (BoxPtr) Xrealloc \ ! 47: ((firstrect), (2 * (sizeof(BoxRec)) * ((reg)->size)));\ ! 48: (reg)->size *= 2;\ ! 49: (rect) = &(firstrect)[(reg)->numRects];\ ! 50: }\ ! 51: } ! 52: ! 53: /* this routine checks to see if the previous rectangle is the same ! 54: * or subsumes the new rectangle to add. ! 55: */ ! 56: ! 57: #define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\ ! 58: (!(((Reg)->numRects > 0)&&\ ! 59: ((R-1)->y1 == (Ry1)) &&\ ! 60: ((R-1)->y2 == (Ry2)) &&\ ! 61: ((R-1)->x1 <= (Rx1)) &&\ ! 62: ((R-1)->x2 >= (Rx2)))) ! 63: ! 64: /* add a rectangle to the given Region */ ! 65: #define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\ ! 66: if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\ ! 67: CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\ ! 68: (r)->x1 = (rx1);\ ! 69: (r)->y1 = (ry1);\ ! 70: (r)->x2 = (rx2);\ ! 71: (r)->y2 = (ry2);\ ! 72: EXTENTS((r), (reg));\ ! 73: (reg)->numRects++;\ ! 74: (r)++;\ ! 75: }\ ! 76: } ! 77: ! 78: ! 79: /* ! 80: * update region extents ! 81: */ ! 82: #define EXTENTS(r,idRect){\ ! 83: if((r)->x1 < (idRect)->extents.x1)\ ! 84: (idRect)->extents.x1 = (r)->x1;\ ! 85: if((r)->y1 < (idRect)->extents.y1)\ ! 86: (idRect)->extents.y1 = (r)->y1;\ ! 87: if((r)->x2 > (idRect)->extents.x2)\ ! 88: (idRect)->extents.x2 = (r)->x2;\ ! 89: if((r)->y2 > (idRect)->extents.y2)\ ! 90: (idRect)->extents.y2 = (r)->y2;\ ! 91: } ! 92: ! 93: ! 94: #define EMPTY_REGION(pReg) (pReg->numRects = 0) ! 95: ! 96: #define REGION_NOT_EMPTY(pReg) (pReg->numRects) ! 97: ! 98: extern RegionPtr miRegionCreate(); ! 99: extern void miprintRects(); ! 100: extern void miRegionCopy(); ! 101: extern int miInverse(); ! 102: extern int miIntersect(); ! 103: extern int miUnion(); ! 104: extern int miSubtract(); ! 105: extern int miRectIn(); ! 106: extern void miTranslateRegion(); ! 107: extern void miRegionDestroy(); ! 108: extern void miRegionReset(); ! 109: extern Bool miPointInRegion(); ! 110: ! 111: #endif /* REGIONSTRUCT_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.