f0ab104f070bc7f569404826fea1828ed985638cvboxsync/************************************************************
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncCopyright 1989, 1998 The Open Group
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncPermission to use, copy, modify, distribute, and sell this software and its
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdocumentation for any purpose is hereby granted without fee, provided that
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncthe above copyright notice appear in all copies and that both that
f0ab104f070bc7f569404826fea1828ed985638cvboxsynccopyright notice and this permission notice appear in supporting
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdocumentation.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncThe above copyright notice and this permission notice shall be included in
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncall copies or substantial portions of the Software.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncExcept as contained in this notice, the name of The Open Group shall not be
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncused in advertising or otherwise to promote the sale, use or other dealings
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncin this Software without prior written authorization from The Open Group.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync********************************************************/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#ifndef __MIFILLARC_H__
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define __MIFILLARC_H__
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define FULLCIRCLE (360 * 64)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _miFillArc {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int xorg, yorg;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int y;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int dx, dy;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int e;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int ym, yk, xm, xk;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} miFillArcRec;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/* could use 64-bit integers */
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _miFillArcD {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int xorg, yorg;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int y;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int dx, dy;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync double e;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync double ym, yk, xm, xk;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} miFillArcDRec;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miFillArcEmpty(arc) (!(arc)->angle2 || \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync !(arc)->width || !(arc)->height || \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync (((arc)->width == 1) && ((arc)->height & 1)))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miCanFillArc(arc) (((arc)->width == (arc)->height) || \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync (((arc)->width <= 800) && ((arc)->height <= 800)))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIFILLARCSETUP() \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync x = 0; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y = info.y; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e = info.e; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xk = info.xk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xm = info.xm; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync yk = info.yk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ym = info.ym; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync dx = info.dx; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync dy = info.dy; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xorg = info.xorg; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync yorg = info.yorg
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIFILLARCSTEP(slw) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e += yk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (e >= 0) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync { \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync x++; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xk -= xm; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e += xk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync } \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y--; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync yk -= ym; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync slw = (x << 1) + dx; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if ((e == xk) && (slw > 1)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync slw--
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIFILLCIRCSTEP(slw) MIFILLARCSTEP(slw)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIFILLELLSTEP(slw) MIFILLARCSTEP(slw)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miFillArcLower(slw) (((y + dy) != 0) && ((slw > 1) || (e != xk)))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _miSliceEdge {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int x;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int stepx;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int deltax;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int e;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int dy;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int dx;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} miSliceEdgeRec, *miSliceEdgePtr;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _miArcSlice {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync miSliceEdgeRec edge1, edge2;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int min_top_y, max_top_y;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int min_bot_y, max_bot_y;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Bool edge1_top, edge2_top;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Bool flip_top, flip_bot;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} miArcSliceRec;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIARCSLICESTEP(edge) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync edge.x -= edge.stepx; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync edge.e -= edge.dx; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (edge.e <= 0) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync { \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync edge.x -= edge.deltax; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync edge.e += edge.dy; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miFillSliceUpper(slice) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ((y >= slice.min_top_y) && (y <= slice.max_top_y))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miFillSliceLower(slice) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ((y >= slice.min_bot_y) && (y <= slice.max_bot_y))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIARCSLICEUPPER(xl,xr,slice,slw) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xl = xorg - x; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xr = xl + slw - 1; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (slice.edge1_top && (slice.edge1.x < xr)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xr = slice.edge1.x; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (slice.edge2_top && (slice.edge2.x > xl)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xl = slice.edge2.x;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIARCSLICELOWER(xl,xr,slice,slw) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xl = xorg - x; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xr = xl + slw - 1; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (!slice.edge1_top && (slice.edge1.x > xl)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xl = slice.edge1.x; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (!slice.edge2_top && (slice.edge2.x < xr)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xr = slice.edge2.x;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIWIDEARCSETUP(x,y,dy,slw,e,xk,xm,yk,ym) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync x = 0; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y = slw >> 1; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync yk = y << 3; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xm = 8; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ym = 8; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (dy) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync { \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xk = 0; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (slw & 1) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e = -1; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync else \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e = -(y << 2) - 2; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync } \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync else \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync { \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync y++; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync yk += 4; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xk = -4; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (slw & 1) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e = -(y << 2) - 3; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync else \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync e = - (y << 3); \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync }
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define MIFILLINARCSTEP(slw) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ine += inyk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync while (ine >= 0) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync { \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync inx++; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync inxk -= inxm; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ine += inxk; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync } \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync iny--; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync inyk -= inym; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync slw = (inx << 1) + dx; \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if ((ine == inxk) && (slw > 1)) \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync slw--
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define miFillInArcLower(slw) (((iny + dy) != 0) && \
f0ab104f070bc7f569404826fea1828ed985638cvboxsync ((slw > 1) || (ine != inxk)))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void miFillArcSetup(
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xArc * /*arc*/,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync miFillArcRec * /*info*/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void miFillArcSliceSetup(
f0ab104f070bc7f569404826fea1828ed985638cvboxsync xArc * /*arc*/,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync miArcSliceRec * /*slice*/,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync GCPtr /*pGC*/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif /* __MIFILLARC_H__ */