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