189 lines
5.8 KiB
C
189 lines
5.8 KiB
C
/* $Xorg: region.h,v 1.4 2001/02/09 02:03:40 xorgcvs Exp $ */
|
|
/************************************************************************
|
|
|
|
Copyright 1987, 1998 The Open Group
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
the above copyright notice appear in all copies and that both that
|
|
copyright notice and this permission notice appear in supporting
|
|
documentation.
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
in this Software without prior written authorization from The Open Group.
|
|
|
|
|
|
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
|
|
All Rights Reserved
|
|
|
|
Permission to use, copy, modify, and distribute this software and its
|
|
documentation for any purpose and without fee is hereby granted,
|
|
provided that the above copyright notice appear in all copies and that
|
|
both that copyright notice and this permission notice appear in
|
|
supporting documentation, and that the name of Digital not be
|
|
used in advertising or publicity pertaining to distribution of the
|
|
software without specific, written prior permission.
|
|
|
|
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
SOFTWARE.
|
|
|
|
************************************************************************/
|
|
|
|
#ifndef _XREGION_H
|
|
#define _XREGION_H
|
|
|
|
typedef struct {
|
|
short x1, x2, y1, y2;
|
|
} Box, BOX, BoxRec, *BoxPtr;
|
|
|
|
typedef struct {
|
|
short x, y, width, height;
|
|
}RECTANGLE, RectangleRec, *RectanglePtr;
|
|
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
#ifndef MAX
|
|
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
|
#endif
|
|
#ifndef MIN
|
|
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
|
#endif
|
|
|
|
|
|
/*
|
|
* clip region
|
|
*/
|
|
|
|
typedef struct _XRegion {
|
|
long size;
|
|
long numRects;
|
|
BOX *rects;
|
|
BOX extents;
|
|
} REGION;
|
|
|
|
/* Xutil.h contains the declaration:
|
|
* typedef struct _XRegion *Region;
|
|
*/
|
|
|
|
/* 1 if two BOXs overlap.
|
|
* 0 if two BOXs do not overlap.
|
|
* Remember, x2 and y2 are not in the region
|
|
*/
|
|
#define EXTENTCHECK(r1, r2) \
|
|
((r1)->x2 > (r2)->x1 && \
|
|
(r1)->x1 < (r2)->x2 && \
|
|
(r1)->y2 > (r2)->y1 && \
|
|
(r1)->y1 < (r2)->y2)
|
|
|
|
/*
|
|
* update region extents
|
|
*/
|
|
#define EXTENTS(r,idRect){\
|
|
if((r)->x1 < (idRect)->extents.x1)\
|
|
(idRect)->extents.x1 = (r)->x1;\
|
|
if((r)->y1 < (idRect)->extents.y1)\
|
|
(idRect)->extents.y1 = (r)->y1;\
|
|
if((r)->x2 > (idRect)->extents.x2)\
|
|
(idRect)->extents.x2 = (r)->x2;\
|
|
if((r)->y2 > (idRect)->extents.y2)\
|
|
(idRect)->extents.y2 = (r)->y2;\
|
|
}
|
|
|
|
/*
|
|
* Check to see if there is enough memory in the present region.
|
|
*/
|
|
#define MEMCHECK(reg, rect, firstrect){\
|
|
if ((reg)->numRects >= ((reg)->size - 1)){\
|
|
(firstrect) = (BOX *) Xrealloc \
|
|
((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\
|
|
if ((firstrect) == 0)\
|
|
return(0);\
|
|
(reg)->size *= 2;\
|
|
(rect) = &(firstrect)[(reg)->numRects];\
|
|
}\
|
|
}
|
|
|
|
/* this routine checks to see if the previous rectangle is the same
|
|
* or subsumes the new rectangle to add.
|
|
*/
|
|
|
|
#define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
|
|
(!(((Reg)->numRects > 0)&&\
|
|
((R-1)->y1 == (Ry1)) &&\
|
|
((R-1)->y2 == (Ry2)) &&\
|
|
((R-1)->x1 <= (Rx1)) &&\
|
|
((R-1)->x2 >= (Rx2))))
|
|
|
|
/* add a rectangle to the given Region */
|
|
#define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
|
|
if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
|
|
CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
|
(r)->x1 = (rx1);\
|
|
(r)->y1 = (ry1);\
|
|
(r)->x2 = (rx2);\
|
|
(r)->y2 = (ry2);\
|
|
EXTENTS((r), (reg));\
|
|
(reg)->numRects++;\
|
|
(r)++;\
|
|
}\
|
|
}
|
|
|
|
|
|
|
|
/* add a rectangle to the given Region */
|
|
#define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
|
|
if ((rx1 < rx2) && (ry1 < ry2) &&\
|
|
CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
|
|
(r)->x1 = (rx1);\
|
|
(r)->y1 = (ry1);\
|
|
(r)->x2 = (rx2);\
|
|
(r)->y2 = (ry2);\
|
|
(reg)->numRects++;\
|
|
(r)++;\
|
|
}\
|
|
}
|
|
|
|
#define EMPTY_REGION(pReg) pReg->numRects = 0
|
|
|
|
#define REGION_NOT_EMPTY(pReg) pReg->numRects
|
|
|
|
#define INBOX(r, x, y) \
|
|
( ( ((r).x2 > x)) && \
|
|
( ((r).x1 <= x)) && \
|
|
( ((r).y2 > y)) && \
|
|
( ((r).y1 <= y)) )
|
|
|
|
/*
|
|
* number of points to buffer before sending them off
|
|
* to scanlines() : Must be an even number
|
|
*/
|
|
#define NUMPTSTOBUFFER 200
|
|
|
|
/*
|
|
* used to allocate buffers for points and link
|
|
* the buffers together
|
|
*/
|
|
typedef struct _POINTBLOCK {
|
|
XPoint pts[NUMPTSTOBUFFER];
|
|
struct _POINTBLOCK *next;
|
|
} POINTBLOCK;
|
|
|
|
#endif
|