Blame gdk/gdkregion-generic.h

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