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