VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/x11include/xorg-server-1.12.0/regionstr.h@ 43310

Last change on this file since 43310 was 40349, checked in by vboxsync, 13 years ago

Additions/xorg: support X.Org Server 1.12.

  • Property svn:eol-style set to native
File size: 10.2 KB
Line 
1/***********************************************************
2
3Copyright 1987, 1998 The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25
26Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
27
28 All Rights Reserved
29
30Permission to use, copy, modify, and distribute this software and its
31documentation for any purpose and without fee is hereby granted,
32provided that the above copyright notice appear in all copies and that
33both that copyright notice and this permission notice appear in
34supporting documentation, and that the name of Digital not be
35used in advertising or publicity pertaining to distribution of the
36software without specific, written prior permission.
37
38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44SOFTWARE.
45
46******************************************************************/
47
48#ifndef REGIONSTRUCT_H
49#define REGIONSTRUCT_H
50
51typedef struct pixman_region16 RegionRec, *RegionPtr;
52
53#include "miscstruct.h"
54
55/* Return values from RectIn() */
56
57#define rgnOUT 0
58#define rgnIN 1
59#define rgnPART 2
60
61#define NullRegion ((RegionPtr)0)
62
63/*
64 * clip region
65 */
66
67typedef struct pixman_region16_data RegDataRec, *RegDataPtr;
68
69extern _X_EXPORT BoxRec RegionEmptyBox;
70extern _X_EXPORT RegDataRec RegionEmptyData;
71extern _X_EXPORT RegDataRec RegionBrokenData;
72static inline Bool RegionNil(RegionPtr reg) {
73 return ((reg)->data && !(reg)->data->numRects);
74}
75
76/* not a region */
77
78static inline Bool RegionNar(RegionPtr reg) {
79 return ((reg)->data == &RegionBrokenData);
80}
81
82static inline int RegionNumRects(RegionPtr reg) {
83 return ((reg)->data ? (reg)->data->numRects : 1);
84}
85
86static inline int RegionSize(RegionPtr reg) {
87 return ((reg)->data ? (reg)->data->size : 0);
88}
89
90static inline BoxPtr RegionRects(RegionPtr reg) {
91 return ((reg)->data ? (BoxPtr)((reg)->data + 1) : &(reg)->extents);
92}
93
94static inline BoxPtr RegionBoxptr(RegionPtr reg) {
95 return ((BoxPtr)((reg)->data + 1));
96}
97
98static inline BoxPtr RegionBox(RegionPtr reg, int i) {
99 return (&RegionBoxptr(reg)[i]);
100}
101
102static inline BoxPtr RegionTop(RegionPtr reg) {
103 return RegionBox(reg, (reg)->data->numRects);
104}
105
106static inline BoxPtr RegionEnd(RegionPtr reg) {
107 return RegionBox(reg, (reg)->data->numRects - 1);
108}
109
110static inline size_t RegionSizeof(int n) {
111 return (sizeof(RegDataRec) + ((n) * sizeof(BoxRec)));
112}
113
114static inline void RegionInit(RegionPtr _pReg, BoxPtr _rect, int _size)
115{
116 if ((_rect) != NULL)
117 {
118 (_pReg)->extents = *(_rect);
119 (_pReg)->data = (RegDataPtr)NULL;
120 }
121 else
122 {
123 (_pReg)->extents = RegionEmptyBox;
124 if (((_size) > 1) && ((_pReg)->data =
125 (RegDataPtr)malloc(RegionSizeof(_size))))
126 {
127 (_pReg)->data->size = (_size);
128 (_pReg)->data->numRects = 0;
129 }
130 else
131 (_pReg)->data = &RegionEmptyData;
132 }
133}
134
135static inline Bool RegionInitBoxes(RegionPtr pReg, BoxPtr boxes, int nBoxes)
136{
137 return pixman_region_init_rects (pReg, boxes, nBoxes);
138}
139
140static inline void RegionUninit(RegionPtr _pReg)
141{
142 if ((_pReg)->data && (_pReg)->data->size) {
143 free((_pReg)->data);
144 (_pReg)->data = NULL;
145 }
146}
147
148static inline void RegionReset(RegionPtr _pReg, BoxPtr _pBox)
149{
150 (_pReg)->extents = *(_pBox);
151 RegionUninit(_pReg);
152 (_pReg)->data = (RegDataPtr)NULL;
153}
154
155static inline Bool RegionNotEmpty(RegionPtr _pReg) {
156 return !RegionNil(_pReg);
157}
158
159static inline Bool RegionBroken(RegionPtr _pReg) {
160 return RegionNar(_pReg);
161}
162
163static inline void RegionEmpty(RegionPtr _pReg)
164{
165 RegionUninit(_pReg);
166 (_pReg)->extents.x2 = (_pReg)->extents.x1;
167 (_pReg)->extents.y2 = (_pReg)->extents.y1;
168 (_pReg)->data = &RegionEmptyData;
169}
170
171static inline BoxPtr RegionExtents(RegionPtr _pReg)
172{
173 return (&(_pReg)->extents);
174}
175
176static inline void RegionNull(RegionPtr _pReg)
177{
178 (_pReg)->extents = RegionEmptyBox;
179 (_pReg)->data = &RegionEmptyData;
180}
181
182extern _X_EXPORT void InitRegions(void);
183
184extern _X_EXPORT RegionPtr RegionCreate(
185 BoxPtr /*rect*/,
186 int /*size*/);
187
188extern _X_EXPORT void RegionDestroy(
189 RegionPtr /*pReg*/);
190
191static inline Bool
192RegionCopy(RegionPtr dst, RegionPtr src)
193{
194 return pixman_region_copy (dst, src);
195}
196
197static inline Bool
198RegionIntersect(
199 RegionPtr newReg, /* destination Region */
200 RegionPtr reg1,
201 RegionPtr reg2 /* source regions */
202 )
203{
204 return pixman_region_intersect (newReg, reg1, reg2);
205}
206
207static inline Bool
208RegionUnion(
209 RegionPtr newReg, /* destination Region */
210 RegionPtr reg1,
211 RegionPtr reg2 /* source regions */
212 )
213{
214 return pixman_region_union (newReg, reg1, reg2);
215}
216
217extern _X_EXPORT Bool RegionAppend(
218 RegionPtr /*dstrgn*/,
219 RegionPtr /*rgn*/);
220
221extern _X_EXPORT Bool RegionValidate(
222 RegionPtr /*badreg*/,
223 Bool * /*pOverlap*/);
224
225extern _X_EXPORT RegionPtr RegionFromRects(
226 int /*nrects*/,
227 xRectanglePtr /*prect*/,
228 int /*ctype*/);
229
230/*-
231 *-----------------------------------------------------------------------
232 * Subtract --
233 * Subtract regS from regM and leave the result in regD.
234 * S stands for subtrahend, M for minuend and D for difference.
235 *
236 * Results:
237 * TRUE if successful.
238 *
239 * Side Effects:
240 * regD is overwritten.
241 *
242 *-----------------------------------------------------------------------
243 */
244static inline Bool
245RegionSubtract(RegionPtr regD, RegionPtr regM, RegionPtr regS)
246{
247 return pixman_region_subtract (regD, regM, regS);
248}
249
250/*-
251 *-----------------------------------------------------------------------
252 * Inverse --
253 * Take a region and a box and return a region that is everything
254 * in the box but not in the region. The careful reader will note
255 * that this is the same as subtracting the region from the box...
256 *
257 * Results:
258 * TRUE.
259 *
260 * Side Effects:
261 * newReg is overwritten.
262 *
263 *-----------------------------------------------------------------------
264 */
265
266static inline Bool
267RegionInverse(
268 RegionPtr newReg, /* Destination region */
269 RegionPtr reg1, /* Region to invert */
270 BoxPtr invRect /* Bounding box for inversion */
271 )
272{
273 return pixman_region_inverse (newReg, reg1, invRect);
274}
275
276static inline int
277RegionContainsRect(RegionPtr region, BoxPtr prect)
278{
279 return pixman_region_contains_rectangle (region, prect);
280}
281
282/* TranslateRegion(pReg, x, y)
283 translates in place
284*/
285
286static inline void
287RegionTranslate(RegionPtr pReg, int x, int y)
288{
289 pixman_region_translate (pReg, x, y);
290}
291
292extern _X_EXPORT Bool RegionBreak(
293 RegionPtr /*pReg*/);
294
295static inline Bool
296RegionContainsPoint(
297 RegionPtr pReg,
298 int x,
299 int y,
300 BoxPtr box /* "return" value */
301 )
302{
303 return pixman_region_contains_point (pReg, x, y, box);
304}
305
306static inline Bool
307RegionEqual(RegionPtr reg1, RegionPtr reg2)
308{
309 return pixman_region_equal (reg1, reg2);
310}
311
312extern _X_EXPORT Bool RegionRectAlloc(
313 RegionPtr /*pRgn*/,
314 int /*n*/
315);
316
317#ifdef DEBUG
318extern _X_EXPORT Bool RegionIsValid(
319 RegionPtr /*prgn*/
320);
321#endif
322
323extern _X_EXPORT void RegionPrint(
324 RegionPtr /*pReg*/);
325
326#define INCLUDE_LEGACY_REGION_DEFINES
327#ifdef INCLUDE_LEGACY_REGION_DEFINES
328
329#define REGION_NIL RegionNil
330#define REGION_NAR RegionNar
331#define REGION_NUM_RECTS RegionNumRects
332#define REGION_SIZE RegionSize
333#define REGION_RECTS RegionRects
334#define REGION_BOXPTR RegionBoxptr
335#define REGION_BOX RegionBox
336#define REGION_TOP RegionTop
337#define REGION_END RegionEnd
338#define REGION_SZOF RegionSizeof
339#define BITMAP_TO_REGION BitmapToRegion
340#define REGION_CREATE(pScreen, r, s) RegionCreate(r,s)
341#define REGION_COPY(pScreen, d, r) RegionCopy(d, r)
342#define REGION_DESTROY(pScreen, r) RegionDestroy(r)
343#define REGION_INTERSECT(pScreen, res, r1, r2) RegionIntersect(res, r1, r2)
344#define REGION_UNION(pScreen, res, r1, r2) RegionUnion(res, r1, r2)
345#define REGION_SUBTRACT(pScreen, res, r1, r2) RegionSubtract(res, r1, r2)
346#define REGION_INVERSE(pScreen, n, r, b) RegionInverse(n, r, b)
347#define REGION_TRANSLATE(pScreen, r, x, y) RegionTranslate(r, x, y)
348#define RECT_IN_REGION(pScreen, r, b) RegionContainsRect(r, b)
349#define POINT_IN_REGION(pScreen, r, x, y, b) RegionContainsPoint(r, x, y, b)
350#define REGION_EQUAL(pScreen, r1, r2) RegionEqual(r1, r2)
351#define REGION_APPEND(pScreen, d, r) RegionAppend(d, r)
352#define REGION_VALIDATE(pScreen, r, o) RegionValidate(r, o)
353#define RECTS_TO_REGION(pScreen, n, r, c) RegionFromRects(n, r, c)
354#define REGION_BREAK(pScreen, r) RegionBreak(r)
355#define REGION_INIT(pScreen, r, b, s) RegionInit(r, b, s)
356#define REGION_UNINIT(pScreen, r) RegionUninit(r)
357#define REGION_RESET(pScreen, r, b) RegionReset(r, b)
358#define REGION_NOTEMPTY(pScreen, r) RegionNotEmpty(r)
359#define REGION_BROKEN(pScreen, r) RegionBroken(r)
360#define REGION_EMPTY(pScreen, r) RegionEmpty(r)
361#define REGION_EXTENTS(pScreen, r) RegionExtents(r)
362#define REGION_NULL(pScreen, r) RegionNull(r)
363
364#endif /* INCLUDE_LEGACY_REGION_DEFINES */
365#endif /* REGIONSTRUCT_H */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette