mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-14 04:31:09 +00:00
d558d49c14
svn path=/trunk/; revision=17608
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__ */
|