Blame lib/Xm/RegionI.h

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 */