Blame gdk/gdkregion-generic.h

Packit 98cdb6
/* $TOG: region.h /main/9 1998/02/06 17:50:30 kaleb $ */
Packit 98cdb6
/************************************************************************
Packit 98cdb6
Packit 98cdb6
Copyright 1987, 1998  The Open Group
Packit 98cdb6
Packit 98cdb6
All Rights Reserved.
Packit 98cdb6
Packit 98cdb6
The above copyright notice and this permission notice shall be included in
Packit 98cdb6
all copies or substantial portions of the Software.
Packit 98cdb6
Packit 98cdb6
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit 98cdb6
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit 98cdb6
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit 98cdb6
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit 98cdb6
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit 98cdb6
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 98cdb6
Packit 98cdb6
Except as contained in this notice, the name of The Open Group shall not be
Packit 98cdb6
used in advertising or otherwise to promote the sale, use or other dealings
Packit 98cdb6
in this Software without prior written authorization from The Open Group.
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
Packit 98cdb6
Packit 98cdb6
                        All Rights Reserved
Packit 98cdb6
Packit 98cdb6
Permission to use, copy, modify, and distribute this software and its 
Packit 98cdb6
documentation for any purpose and without fee is hereby granted, 
Packit 98cdb6
provided that the above copyright notice appear in all copies and that
Packit 98cdb6
both that copyright notice and this permission notice appear in 
Packit 98cdb6
supporting documentation, and that the name of Digital not be
Packit 98cdb6
used in advertising or publicity pertaining to distribution of the
Packit 98cdb6
software without specific, written prior permission.  
Packit 98cdb6
Packit 98cdb6
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit 98cdb6
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit 98cdb6
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit 98cdb6
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 98cdb6
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit 98cdb6
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit 98cdb6
SOFTWARE.
Packit 98cdb6
Packit 98cdb6
************************************************************************/
Packit 98cdb6
Packit 98cdb6
#ifndef __GDK_REGION_GENERIC_H__
Packit 98cdb6
#define __GDK_REGION_GENERIC_H__
Packit 98cdb6
Packit 98cdb6
typedef GdkSegment GdkRegionBox;
Packit 98cdb6
Packit 98cdb6
/* 
Packit 98cdb6
 *   clip region
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
struct _GdkRegion
Packit 98cdb6
{
Packit 98cdb6
  long size;
Packit 98cdb6
  long numRects;
Packit 98cdb6
  GdkRegionBox *rects;
Packit 98cdb6
  GdkRegionBox extents;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
/*  1 if two BOXs overlap.
Packit 98cdb6
 *  0 if two BOXs do not overlap.
Packit 98cdb6
 *  Remember, x2 and y2 are not in the region 
Packit 98cdb6
 */
Packit 98cdb6
#define EXTENTCHECK(r1, r2) \
Packit 98cdb6
	((r1)->x2 > (r2)->x1 && \
Packit 98cdb6
	 (r1)->x1 < (r2)->x2 && \
Packit 98cdb6
	 (r1)->y2 > (r2)->y1 && \
Packit 98cdb6
	 (r1)->y1 < (r2)->y2)
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 *  update region extents
Packit 98cdb6
 */
Packit 98cdb6
#define EXTENTS(r,idRect){\
Packit 98cdb6
            if((r)->x1 < (idRect)->extents.x1)\
Packit 98cdb6
              (idRect)->extents.x1 = (r)->x1;\
Packit 98cdb6
            if((r)->y1 < (idRect)->extents.y1)\
Packit 98cdb6
              (idRect)->extents.y1 = (r)->y1;\
Packit 98cdb6
            if((r)->x2 > (idRect)->extents.x2)\
Packit 98cdb6
              (idRect)->extents.x2 = (r)->x2;\
Packit 98cdb6
            if((r)->y2 > (idRect)->extents.y2)\
Packit 98cdb6
              (idRect)->extents.y2 = (r)->y2;\
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
#define GROWREGION(reg, nRects) {  					   \
Packit 98cdb6
	  if ((nRects) == 0) {						   \
Packit 98cdb6
            if ((reg)->rects != &(reg)->extents) {			   \
Packit 98cdb6
	      g_free ((reg)->rects);					   \
Packit 98cdb6
              (reg)->rects = &(reg)->extents;				   \
Packit 98cdb6
	    }								   \
Packit 98cdb6
	  }  								   \
Packit 98cdb6
	  else if ((reg)->rects == &(reg)->extents) {                      \
Packit 98cdb6
            (reg)->rects = g_new (GdkRegionBox, (nRects));		   \
Packit 98cdb6
            (reg)->rects[0] = (reg)->extents;                              \
Packit 98cdb6
          }                                                                \
Packit 98cdb6
          else                                                             \
Packit 98cdb6
            (reg)->rects = g_renew (GdkRegionBox, (reg)->rects, (nRects)); \
Packit 98cdb6
	  (reg)->size = (nRects);                                          \
Packit 98cdb6
       }				 
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 *   Check to see if there is enough memory in the present region.
Packit 98cdb6
 */
Packit 98cdb6
#define MEMCHECK(reg, rect, firstrect){					  	 \
Packit 98cdb6
        if ((reg)->numRects >= ((reg)->size - 1)) {			 	 \
Packit 98cdb6
          GROWREGION(reg,2*(reg)->size);                                         \
Packit 98cdb6
          (rect) = &(firstrect)[(reg)->numRects];				 \
Packit 98cdb6
         }									 \
Packit 98cdb6
       }
Packit 98cdb6
Packit 98cdb6
/*  this routine checks to see if the previous rectangle is the same
Packit 98cdb6
 *  or subsumes the new rectangle to add.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
Packit 98cdb6
               (!(((Reg)->numRects > 0)&&\
Packit 98cdb6
                  ((R-1)->y1 == (Ry1)) &&\
Packit 98cdb6
                  ((R-1)->y2 == (Ry2)) &&\
Packit 98cdb6
                  ((R-1)->x1 <= (Rx1)) &&\
Packit 98cdb6
                  ((R-1)->x2 >= (Rx2))))
Packit 98cdb6
Packit 98cdb6
/*  add a rectangle to the given Region */
Packit 98cdb6
#define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
Packit 98cdb6
    if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
Packit 98cdb6
        CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
Packit 98cdb6
              (r)->x1 = (rx1);\
Packit 98cdb6
              (r)->y1 = (ry1);\
Packit 98cdb6
              (r)->x2 = (rx2);\
Packit 98cdb6
              (r)->y2 = (ry2);\
Packit 98cdb6
              EXTENTS((r), (reg));\
Packit 98cdb6
              (reg)->numRects++;\
Packit 98cdb6
              (r)++;\
Packit 98cdb6
            }\
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
/*  add a rectangle to the given Region */
Packit 98cdb6
#define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
Packit 98cdb6
            if ((rx1 < rx2) && (ry1 < ry2) &&\
Packit 98cdb6
                CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
Packit 98cdb6
              (r)->x1 = (rx1);\
Packit 98cdb6
              (r)->y1 = (ry1);\
Packit 98cdb6
              (r)->x2 = (rx2);\
Packit 98cdb6
              (r)->y2 = (ry2);\
Packit 98cdb6
              (reg)->numRects++;\
Packit 98cdb6
              (r)++;\
Packit 98cdb6
            }\
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
#define EMPTY_REGION(pReg) pReg->numRects = 0
Packit 98cdb6
Packit 98cdb6
#define REGION_NOT_EMPTY(pReg) pReg->numRects
Packit 98cdb6
Packit 98cdb6
#define INBOX(r, x, y) \
Packit 98cdb6
      ( ( ((r).x2 >  x)) && \
Packit 98cdb6
        ( ((r).x1 <= x)) && \
Packit 98cdb6
        ( ((r).y2 >  y)) && \
Packit 98cdb6
        ( ((r).y1 <= y)) )
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * number of points to buffer before sending them off
Packit 98cdb6
 * to scanlines() :  Must be an even number
Packit 98cdb6
 */
Packit 98cdb6
#define NUMPTSTOBUFFER 200
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * used to allocate buffers for points and link
Packit 98cdb6
 * the buffers together
Packit 98cdb6
 */
Packit 98cdb6
typedef struct _POINTBLOCK {
Packit 98cdb6
  GdkPoint pts[NUMPTSTOBUFFER];
Packit 98cdb6
  struct _POINTBLOCK *next;
Packit 98cdb6
} POINTBLOCK;
Packit 98cdb6
Packit 98cdb6
#endif /* __GDK_REGION_GENERIC_H__ */