xref: /plan9-contrib/sys/src/cmd/gs/src/gsrect.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1997, 1998, 1999 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsrect.h,v 1.5 2002/06/16 08:45:42 lpd Exp $ */
187dd7cddfSDavid du Colombier /* Rectangle utilities */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gsrect_INCLUDED
217dd7cddfSDavid du Colombier #  define gsrect_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "gxfixed.h"
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier /* Check whether one rectangle is included entirely within another. */
267dd7cddfSDavid du Colombier #define rect_within(inner, outer)\
277dd7cddfSDavid du Colombier   ((inner).q.y <= (outer).q.y && (inner).q.x <= (outer).q.x &&\
287dd7cddfSDavid du Colombier    (inner).p.y >= (outer).p.y && (inner).p.x >= (outer).p.x)
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier /*
317dd7cddfSDavid du Colombier  * Intersect two rectangles, replacing the first.  The result may be
327dd7cddfSDavid du Colombier  * anomalous (q < p) if the intersection is empty.
337dd7cddfSDavid du Colombier  */
347dd7cddfSDavid du Colombier #define rect_intersect(to, from)\
357dd7cddfSDavid du Colombier   BEGIN\
367dd7cddfSDavid du Colombier     if ((from).p.x > (to).p.x) (to).p.x = (from).p.x;\
377dd7cddfSDavid du Colombier     if ((from).q.x < (to).q.x) (to).q.x = (from).q.x;\
387dd7cddfSDavid du Colombier     if ((from).p.y > (to).p.y) (to).p.y = (from).p.y;\
397dd7cddfSDavid du Colombier     if ((from).q.y < (to).q.y) (to).q.y = (from).q.y;\
407dd7cddfSDavid du Colombier   END
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier /*
437dd7cddfSDavid du Colombier  * Merge two rectangles, replacing the first.  The result may be
447dd7cddfSDavid du Colombier  * anomalous (q < p) if the first rectangle was anomalous.
457dd7cddfSDavid du Colombier  */
467dd7cddfSDavid du Colombier #define rect_merge(to, from)\
477dd7cddfSDavid du Colombier   BEGIN\
487dd7cddfSDavid du Colombier     if ((from).p.x < (to).p.x) (to).p.x = (from).p.x;\
497dd7cddfSDavid du Colombier     if ((from).q.x > (to).q.x) (to).q.x = (from).q.x;\
507dd7cddfSDavid du Colombier     if ((from).p.y < (to).p.y) (to).p.y = (from).p.y;\
517dd7cddfSDavid du Colombier     if ((from).q.y > (to).q.y) (to).q.y = (from).q.y;\
527dd7cddfSDavid du Colombier   END
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier /*
557dd7cddfSDavid du Colombier  * Calculate the difference of two rectangles, a list of up to 4 rectangles.
567dd7cddfSDavid du Colombier  * Return the number of rectangles in the list, and set the first rectangle
577dd7cddfSDavid du Colombier  * to the intersection.  The resulting first rectangle is guaranteed not to
587dd7cddfSDavid du Colombier  * be anomalous (q < p) iff it was not anomalous originally.
597dd7cddfSDavid du Colombier  *
607dd7cddfSDavid du Colombier  * Note that unlike the macros above, we need different versions of this
617dd7cddfSDavid du Colombier  * depending on the data type of the individual values: we'll only implement
627dd7cddfSDavid du Colombier  * the variations that we need.
637dd7cddfSDavid du Colombier  */
64*593dc095SDavid du Colombier int int_rect_difference(gs_int_rect * outer, const gs_int_rect * inner,
65*593dc095SDavid du Colombier 			gs_int_rect * diffs /*[4] */ );
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier /*
687dd7cddfSDavid du Colombier  * Check whether a parallelogram is a rectangle.
697dd7cddfSDavid du Colombier  */
707dd7cddfSDavid du Colombier #define PARALLELOGRAM_IS_RECT(ax, ay, bx, by)\
717dd7cddfSDavid du Colombier   ( ((ax) | (by)) == 0 || ((bx) | (ay)) == 0 )
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier /*
747dd7cddfSDavid du Colombier  * Convert a rectangular parallelogram to a rectangle, carefully following
757dd7cddfSDavid du Colombier  * the center-of-pixel rule in all cases.
767dd7cddfSDavid du Colombier  */
777dd7cddfSDavid du Colombier #define INT_RECT_FROM_PARALLELOGRAM(prect, px, py, ax, ay, bx, by)\
787dd7cddfSDavid du Colombier   BEGIN\
797dd7cddfSDavid du Colombier     int px_ = fixed2int_pixround(px);\
807dd7cddfSDavid du Colombier     int py_ = fixed2int_pixround(py);\
817dd7cddfSDavid du Colombier     int qx_ = fixed2int_pixround((px) + (ax) + (bx));  /* only one is non-zero */\
827dd7cddfSDavid du Colombier     int qy_ = fixed2int_pixround((py) + (ay) + (by));  /* ditto */\
837dd7cddfSDavid du Colombier \
847dd7cddfSDavid du Colombier     if (qx_ < px_)\
857dd7cddfSDavid du Colombier       (prect)->p.x = qx_, (prect)->q.x = px_;\
867dd7cddfSDavid du Colombier     else\
877dd7cddfSDavid du Colombier       (prect)->p.x = px_, (prect)->q.x = qx_;\
887dd7cddfSDavid du Colombier     if (qy_ < py_)\
897dd7cddfSDavid du Colombier       (prect)->p.y = qy_, (prect)->q.y = py_;\
907dd7cddfSDavid du Colombier     else\
917dd7cddfSDavid du Colombier       (prect)->p.y = py_, (prect)->q.y = qy_;\
927dd7cddfSDavid du Colombier   END
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier #endif /* gsrect_INCLUDED */
95