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