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