1 | /* $Xorg: region.h,v 1.4 2001/02/09 02:03:40 xorgcvs Exp $ */
|
---|
2 | /************************************************************************
|
---|
3 |
|
---|
4 | Copyright 1987, 1998 The Open Group
|
---|
5 |
|
---|
6 | Permission to use, copy, modify, distribute, and sell this software and its
|
---|
7 | documentation for any purpose is hereby granted without fee, provided that
|
---|
8 | the above copyright notice appear in all copies and that both that
|
---|
9 | copyright notice and this permission notice appear in supporting
|
---|
10 | documentation.
|
---|
11 |
|
---|
12 | The above copyright notice and this permission notice shall be included in
|
---|
13 | all copies or substantial portions of the Software.
|
---|
14 |
|
---|
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
---|
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
---|
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
---|
18 | OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
---|
19 | AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
---|
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
---|
21 |
|
---|
22 | Except as contained in this notice, the name of The Open Group shall not be
|
---|
23 | used in advertising or otherwise to promote the sale, use or other dealings
|
---|
24 | in this Software without prior written authorization from The Open Group.
|
---|
25 |
|
---|
26 |
|
---|
27 | Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
---|
28 |
|
---|
29 | All Rights Reserved
|
---|
30 |
|
---|
31 | Permission to use, copy, modify, and distribute this software and its
|
---|
32 | documentation for any purpose and without fee is hereby granted,
|
---|
33 | provided that the above copyright notice appear in all copies and that
|
---|
34 | both that copyright notice and this permission notice appear in
|
---|
35 | supporting documentation, and that the name of Digital not be
|
---|
36 | used in advertising or publicity pertaining to distribution of the
|
---|
37 | software without specific, written prior permission.
|
---|
38 |
|
---|
39 | DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
---|
40 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
---|
41 | DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
---|
42 | ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
---|
43 | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
---|
44 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
---|
45 | SOFTWARE.
|
---|
46 |
|
---|
47 | ************************************************************************/
|
---|
48 |
|
---|
49 | #ifndef _XREGION_H
|
---|
50 | #define _XREGION_H
|
---|
51 |
|
---|
52 | typedef struct {
|
---|
53 | short x1, x2, y1, y2;
|
---|
54 | } Box, BOX, BoxRec, *BoxPtr;
|
---|
55 |
|
---|
56 | typedef struct {
|
---|
57 | short x, y, width, height;
|
---|
58 | }RECTANGLE, RectangleRec, *RectanglePtr;
|
---|
59 |
|
---|
60 | #define TRUE 1
|
---|
61 | #define FALSE 0
|
---|
62 | #define MAXSHORT 32767
|
---|
63 | #define MINSHORT -MAXSHORT
|
---|
64 | #ifndef MAX
|
---|
65 | #define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
---|
66 | #endif
|
---|
67 | #ifndef MIN
|
---|
68 | #define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
---|
69 | #endif
|
---|
70 |
|
---|
71 |
|
---|
72 | /*
|
---|
73 | * clip region
|
---|
74 | */
|
---|
75 |
|
---|
76 | typedef struct _XRegion {
|
---|
77 | long size;
|
---|
78 | long numRects;
|
---|
79 | BOX *rects;
|
---|
80 | BOX extents;
|
---|
81 | } REGION;
|
---|
82 |
|
---|
83 | /* Xutil.h contains the declaration:
|
---|
84 | * typedef struct _XRegion *Region;
|
---|
85 | */
|
---|
86 |
|
---|
87 | /* 1 if two BOXs overlap.
|
---|
88 | * 0 if two BOXs do not overlap.
|
---|
89 | * Remember, x2 and y2 are not in the region
|
---|
90 | */
|
---|
91 | #define EXTENTCHECK(r1, r2) \
|
---|
92 | ((r1)->x2 > (r2)->x1 && \
|
---|
93 | (r1)->x1 < (r2)->x2 && \
|
---|
94 | (r1)->y2 > (r2)->y1 && \
|
---|
95 | (r1)->y1 < (r2)->y2)
|
---|
96 |
|
---|
97 | /*
|
---|
98 | * update region extents
|
---|
99 | */
|
---|
100 | #define EXTENTS(r,idRect){\
|
---|
101 | if((r)->x1 < (idRect)->extents.x1)\
|
---|
102 | (idRect)->extents.x1 = (r)->x1;\
|
---|
103 | if((r)->y1 < (idRect)->extents.y1)\
|
---|
104 | (idRect)->extents.y1 = (r)->y1;\
|
---|
105 | if((r)->x2 > (idRect)->extents.x2)\
|
---|
106 | (idRect)->extents.x2 = (r)->x2;\
|
---|
107 | if((r)->y2 > (idRect)->extents.y2)\
|
---|
108 | (idRect)->extents.y2 = (r)->y2;\
|
---|
109 | }
|
---|
110 |
|
---|
111 | /*
|
---|
112 | * Check to see if there is enough memory in the present region.
|
---|
113 | */
|
---|
114 | #define MEMCHECK(reg, rect, firstrect){\
|
---|
115 | if ((reg)->numRects >= ((reg)->size - 1)){\
|
---|
116 | (firstrect) = (BOX *) Xrealloc \
|
---|
117 | ((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\
|
---|
118 | if ((firstrect) == 0)\
|
---|
119 | return(0);\
|
---|
120 | (reg)->size *= 2;\
|
---|
121 | (rect) = &(firstrect)[(reg)->numRects];\
|
---|
122 | }\
|
---|
123 | }
|
---|
124 |
|
---|
125 | /* this routine checks to see if the previous rectangle is the same
|
---|
126 | * or subsumes the new rectangle to add.
|
---|
127 | */
|
---|
128 |
|
---|
129 | #define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
|
---|
130 | (!(((Reg)->numRects > 0)&&\
|
---|
131 | ((R-1)->y1 == (Ry1)) &&\
|
---|
132 | ((R-1)->y2 == (Ry2)) &&\
|
---|
133 | ((R-1)->x1 <= (Rx1)) &&\
|
---|
134 | ((R-1)->x2 >= (Rx2))))
|
---|
135 |
|
---|
136 | /* add a rectangle to the given Region */
|
---|
137 | #define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
|
---|
138 | if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
|
---|
139 | CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
---|
140 | (r)->x1 = (rx1);\
|
---|
141 | (r)->y1 = (ry1);\
|
---|
142 | (r)->x2 = (rx2);\
|
---|
143 | (r)->y2 = (ry2);\
|
---|
144 | EXTENTS((r), (reg));\
|
---|
145 | (reg)->numRects++;\
|
---|
146 | (r)++;\
|
---|
147 | }\
|
---|
148 | }
|
---|
149 |
|
---|
150 |
|
---|
151 |
|
---|
152 | /* add a rectangle to the given Region */
|
---|
153 | #define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
|
---|
154 | if ((rx1 < rx2) && (ry1 < ry2) &&\
|
---|
155 | CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
---|
156 | (r)->x1 = (rx1);\
|
---|
157 | (r)->y1 = (ry1);\
|
---|
158 | (r)->x2 = (rx2);\
|
---|
159 | (r)->y2 = (ry2);\
|
---|
160 | (reg)->numRects++;\
|
---|
161 | (r)++;\
|
---|
162 | }\
|
---|
163 | }
|
---|
164 |
|
---|
165 | #define EMPTY_REGION(pReg) pReg->numRects = 0
|
---|
166 |
|
---|
167 | #define REGION_NOT_EMPTY(pReg) pReg->numRects
|
---|
168 |
|
---|
169 | #define INBOX(r, x, y) \
|
---|
170 | ( ( ((r).x2 > x)) && \
|
---|
171 | ( ((r).x1 <= x)) && \
|
---|
172 | ( ((r).y2 > y)) && \
|
---|
173 | ( ((r).y1 <= y)) )
|
---|
174 |
|
---|
175 | /*
|
---|
176 | * number of points to buffer before sending them off
|
---|
177 | * to scanlines() : Must be an even number
|
---|
178 | */
|
---|
179 | #define NUMPTSTOBUFFER 200
|
---|
180 |
|
---|
181 | /*
|
---|
182 | * used to allocate buffers for points and link
|
---|
183 | * the buffers together
|
---|
184 | */
|
---|
185 | typedef struct _POINTBLOCK {
|
---|
186 | XPoint pts[NUMPTSTOBUFFER];
|
---|
187 | struct _POINTBLOCK *next;
|
---|
188 | } POINTBLOCK;
|
---|
189 |
|
---|
190 | #endif
|
---|