1/* $Xorg: region.h,v 1.4 2001/02/09 02:03:40 xorgcvs Exp $ */
2/************************************************************************
3
4Copyright 1987, 1998  The Open Group
5
6Permission to use, copy, modify, distribute, and sell this software and its
7documentation for any purpose is hereby granted without fee, provided that
8the above copyright notice appear in all copies and that both that
9copyright notice and this permission notice appear in supporting
10documentation.
11
12The above copyright notice and this permission notice shall be included in
13all copies or substantial portions of the Software.
14
15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of The Open Group shall not be
23used in advertising or otherwise to promote the sale, use or other dealings
24in this Software without prior written authorization from The Open Group.
25
26
27Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
28
29                        All Rights Reserved
30
31Permission to use, copy, modify, and distribute this software and its
32documentation for any purpose and without fee is hereby granted,
33provided that the above copyright notice appear in all copies and that
34both that copyright notice and this permission notice appear in
35supporting documentation, and that the name of Digital not be
36used in advertising or publicity pertaining to distribution of the
37software without specific, written prior permission.
38
39DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
40ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
41DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
42ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
43WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
44ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
45SOFTWARE.
46
47************************************************************************/
48
49#ifndef __REGION_SUPPORT_H
50#define __REGION_SUPPORT_H
51
52#include <Region.h>
53
54class BRegion::Support {
55 public:
56	static	int					XUnionRegion(const BRegion* reg1,
57									const BRegion* reg2, BRegion* newReg);
58
59	static	int					XIntersectRegion(const BRegion* reg1,
60									const BRegion* reg2, BRegion* newReg);
61
62	static	int					XSubtractRegion(const BRegion* regM,
63									const BRegion* regS, BRegion* regD);
64
65	static	int					XXorRegion(const BRegion* sra,
66									const BRegion* srb, BRegion* dr);
67
68	static	bool				XPointInRegion(const BRegion* region,
69									int x, int y);
70
71	enum {
72		RectangleOut = 0,
73		RectanglePart = 1,
74		RectangleIn = 2
75	};
76
77	static	int					XRectInRegion(const BRegion* region,
78									const clipping_rect& rect);
79
80 private:
81	static	BRegion*			CreateRegion();
82	static	void				DestroyRegion(BRegion* r);
83
84	static	void				XOffsetRegion(BRegion* pRegion, int x, int y);
85
86	static	void				miSetExtents(BRegion* pReg);
87	static	int					miIntersectO(BRegion* pReg,
88									clipping_rect* r1, clipping_rect* r1End,
89									clipping_rect* r2, clipping_rect* r2End,
90									int top, int bottom);
91	static	void				miRegionCopy(BRegion* dstrgn, const BRegion* rgn);
92	static	int					miCoalesce(BRegion* pReg,
93									int prevStart, int curStart);
94	static	int					miUnionNonO(BRegion* pReg, clipping_rect*	r,
95									clipping_rect* rEnd, int top, int bottom);
96	static	int					miUnionO(BRegion*	pReg,
97									clipping_rect* r1, clipping_rect* r1End,
98									clipping_rect* r2, clipping_rect* r2End,
99									int	top, int bottom);
100	static	int					miSubtractO(BRegion* pReg,
101									clipping_rect* r1, clipping_rect* r1End,
102									clipping_rect* r2, clipping_rect* r2End,
103									int top, int bottom);
104	static	int					miSubtractNonO1(BRegion* pReg,
105									clipping_rect* r, clipping_rect* rEnd,
106									int top, int bottom);
107
108
109
110	typedef	int (*overlapProcp)(
111		BRegion* pReg,
112		clipping_rect* r1,
113		clipping_rect* r1End,
114		clipping_rect* r2,
115		clipping_rect* r2End,
116		int top,
117		int bottom);
118
119	typedef int (*nonOverlapProcp)(
120		BRegion* pReg,
121		clipping_rect* r,
122		clipping_rect* rEnd,
123		int top,
124		int bottom);
125
126	static	void				miRegionOp(BRegion* newReg,
127									const BRegion* reg1, const BRegion* reg2,
128    int (*overlapFunc)(
129        BRegion*     pReg,
130        clipping_rect*     r1,
131        clipping_rect*              r1End,
132        clipping_rect*     r2,
133        clipping_rect*              r2End,
134        int               top,
135        int               bottom),
136    int (*nonOverlap1Func)(
137        BRegion*     pReg,
138        clipping_rect*     r,
139        clipping_rect*              rEnd,
140        int      top,
141        int      bottom),
142
143    int (*nonOverlap2Func)(
144        BRegion*     pReg,
145        clipping_rect*     r,
146        clipping_rect*              rEnd,
147        int      top,
148        int      bottom));
149
150};
151
152#endif // __REGION_SUPPORT_H
153