/*
* Motif
*
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*
* HISTORY
*/
/* $XConsortium: RegionI.h /main/10 1995/07/13 17:47:08 drk $ */
/* (c) Copyright 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
/* (c) Copyright 1987, 1989, 1990 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
/* (c) Copyright 1987, 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY */
/* (c) Copyright 1988 MICROSOFT CORPORATION */
#ifndef _XmRegionI_h
#define _XmRegionI_h
#include <Xm/XmP.h>
#ifdef __cplusplus
extern "C" {
#endif
#define ISEMPTY(r) ((r)->numRects == 0)
/* 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) = (XmRegionBox *) XtRealloc \
((char *)(firstrect), \
(unsigned) (2*(sizeof(XmRegionBox))*((reg)->size)));\
if ((firstrect) == 0)\
return;\
(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 XmRegion */
#define ADDRECT(reg, r, fr, rx1, ry1, rx2, ry2){\
if (((rx1) < (rx2)) && ((ry1) < (ry2)) && \
CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
if ((reg)->numRects == (reg)->size){\
if (!(reg)->size) (reg)->size = 1;\
else (reg)->size += (reg)->numRects;\
(reg)->rects = (XmRegionBox *) realloc((reg)->rects,\
sizeof(XmRegionBox) *\
(reg)->size);\
fr = REGION_BOXPTR(reg);\
r = fr + (reg)->numRects;\
}\
(r)->x1 = (rx1);\
(r)->y1 = (ry1);\
(r)->x2 = (rx2);\
(r)->y2 = (ry2);\
EXTENTS((r), (reg));\
(reg)->numRects++;\
(r)++;\
}\
}
/* add a rectangle to the given XmRegion */
#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 INBOX(r, x, y) \
( ( ((r).x2 >= x)) && \
( ((r).x1 <= x)) && \
( ((r).y2 >= y)) && \
( ((r).y1 <= y)) )
/*
* used by _XmRegionDrawShadow
*/
#define TL_OPEN (1 << 0)
#define BL_OPEN (1 << 1)
#define TR_OPEN (1 << 2)
#define BR_OPEN (1 << 3)
#define TL_MATCH (1 << 4)
#define BL_MATCH (1 << 5)
#define TR_MATCH (1 << 6)
#define BR_MATCH (1 << 7)
/*
* The following macro were ported from the X server include file regionstr.h
*/
#define REGION_BOXPTR(reg) ((XmRegionBox *)((reg)->rects))
/******** Private Function Declarations for Region.c ********/
extern XmRegion _XmRegionCreate( void ) ;
extern XmRegion _XmRegionCreateSize(
long size) ;
extern void _XmRegionComputeExtents(
XmRegion r) ;
extern void _XmRegionGetExtents(
XmRegion r,
XRectangle *rect) ;
extern void _XmRegionUnionRectWithRegion(
XRectangle *rect,
XmRegion source,
XmRegion dest) ;
extern void _XmRegionIntersectRectWithRegion(
XRectangle *rect,
XmRegion source,
XmRegion dest) ;
extern long _XmRegionGetNumRectangles(
XmRegion r) ;
extern void _XmRegionGetRectangles(
XmRegion r,
XRectangle **rects,
long *nrects) ;
extern void _XmRegionSetGCRegion(
Display *dpy,
GC gc,
int x_origin,
int y_origin,
XmRegion r) ;
extern void _XmRegionDestroy(
XmRegion r) ;
extern void _XmRegionOffset(
XmRegion pRegion,
int x,
int y) ;
extern void _XmRegionIntersect(
XmRegion reg1,
XmRegion reg2,
XmRegion newReg) ;
extern void _XmRegionUnion(
XmRegion reg1,
XmRegion reg2,
XmRegion newReg) ;
extern void _XmRegionSubtract(
XmRegion regM,
XmRegion regS,
XmRegion regD) ;
extern Boolean _XmRegionIsEmpty(
XmRegion r) ;
extern Boolean _XmRegionEqual(
XmRegion r1,
XmRegion r2) ;
extern Boolean _XmRegionPointInRegion(
XmRegion pRegion,
int x,
int y) ;
extern void _XmRegionClear(
XmRegion r ) ;
extern void _XmRegionShrink(
XmRegion r,
int dx,
int dy) ;
extern void _XmRegionDrawShadow(
Display *display,
Drawable d,
GC top_gc,
GC bottom_gc,
XmRegion region,
#if NeedWidePrototypes
int border_thick,
int shadow_thick,
#else
Dimension border_thick,
Dimension shadow_thick,
#endif /* NeedWidePrototypes */
unsigned int shadow_type ) ;
extern XmRegion _XmRegionFromImage(
XImage *image );
/******** End Private Function Declarations ********/
#ifdef __cplusplus
} /* Close scope of 'extern "C"' declaration which encloses file. */
#endif
#endif /* _XmRegionI_h */
/* DON'T ADD STUFF AFTER THIS #endif */