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