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