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