|
|
1.1 root 1: /* $Header: region.h,v 11.8 87/09/03 17:20:11 newman 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:
26: #include "Xlibint.h"
27:
28: typedef struct {
29: short x1, x2, y1, y2;
30: } Box, BOX, BoxRec, *BoxPtr;
31:
32: typedef struct {
33: short x, y, width, height;
34: }RECTANGLE, RectangleRec, *RectanglePtr;
35:
36: #define TRUE 1
37: #define FALSE 0
38: #define MAXSHORT 32767
39: #define MINSHORT -MAXSHORT
40: #ifndef MAX
41: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
42: #endif
43: #ifndef MIN
44: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
45: #endif
46:
47:
48: /*
49: * clip region
50: */
51:
52: typedef struct _XRegion {
53: short size;
54: short numRects;
55: BOX *rects;
56: BOX extents;
57: } REGION;
58:
59: /* Xutil.h contains the declaration:
60: * typedef struct _XRegion *Region;
61: */
62:
63: /* 1 if two BOXs overlap.
64: * 0 if two BOXs do not overlap.
65: * Remember, x2 and y2 are not in the region
66: */
67: #define EXTENTCHECK(r1, r2) \
68: (! ( ((r1)->x2 <= (r2)->x1)) || \
69: ( ((r1)->x1 >= (r2)->x2)) || \
70: ( ((r1)->y2 <= (r2)->y1)) || \
71: ( ((r1)->y1 >= (r2)->y2)) )
72:
73: /*
74: * update region extents
75: */
76: #define EXTENTS(r,idRect){\
77: if((r)->x1 < (idRect)->extents.x1)\
78: (idRect)->extents.x1 = (r)->x1;\
79: if((r)->y1 < (idRect)->extents.y1)\
80: (idRect)->extents.y1 = (r)->y1;\
81: if((r)->x2 > (idRect)->extents.x2)\
82: (idRect)->extents.x2 = (r)->x2;\
83: if((r)->y2 > (idRect)->extents.y2)\
84: (idRect)->extents.y2 = (r)->y2;\
85: }
86:
87: /*
88: * Check to see if there is enough memory in the present region.
89: */
90: #define MEMCHECK(reg, rect, firstrect){\
91: if ((reg)->numRects >= ((reg)->size - 1)){\
92: (firstrect) = (BOX *) Xrealloc \
93: ((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\
94: if ((firstrect) == 0)\
95: return(0);\
96: (reg)->size *= 2;\
97: (rect) = &(firstrect)[(reg)->numRects];\
98: }\
99: }
100:
101: /* this routine checks to see if the previous rectangle is the same
102: * or subsumes the new rectangle to add.
103: */
104:
105: #define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
106: (!(((Reg)->numRects > 0)&&\
107: ((R-1)->y1 == (Ry1)) &&\
108: ((R-1)->y2 == (Ry2)) &&\
109: ((R-1)->x1 <= (Rx1)) &&\
110: ((R-1)->x2 >= (Rx2))))
111:
112: /* add a rectangle to the given Region */
113: #define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
114: if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
115: CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
116: (r)->x1 = (rx1);\
117: (r)->y1 = (ry1);\
118: (r)->x2 = (rx2);\
119: (r)->y2 = (ry2);\
120: EXTENTS((r), (reg));\
121: (reg)->numRects++;\
122: (r)++;\
123: }\
124: }
125:
126:
127:
128: /* add a rectangle to the given Region */
129: #define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
130: if ((rx1 < rx2) && (ry1 < ry2) &&\
131: CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
132: (r)->x1 = (rx1);\
133: (r)->y1 = (ry1);\
134: (r)->x2 = (rx2);\
135: (r)->y2 = (ry2);\
136: (reg)->numRects++;\
137: (r)++;\
138: }\
139: }
140:
141: #define EMPTY_REGION(pReg) pReg->numRects = 0
142:
143: #define REGION_NOT_EMPTY(pReg) pReg->numRects
144:
145: #define INBOX(r, x, y) \
146: ( ( ((r).x2 >= x)) && \
147: ( ((r).x1 <= x)) && \
148: ( ((r).y2 >= y)) && \
149: ( ((r).y1 <= y)) )
150:
151: /*
152: * number of points to buffer before sending them off
153: * to scanlines() : Must be an even number
154: */
155: #define NUMPTSTOBUFFER 200
156:
157: /*
158: * used to allocate buffers for points and link
159: * the buffers together
160: */
161: typedef struct _POINTBLOCK {
162: XPoint pts[NUMPTSTOBUFFER];
163: struct _POINTBLOCK *next;
164: } POINTBLOCK;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.