03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCopyright 1988, 1998 The Open Group
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncPermission to use, copy, modify, distribute, and sell this software and its
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation for any purpose is hereby granted without fee, provided that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncthe above copyright notice appear in all copies and that both that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynccopyright notice and this permission notice appear in supporting
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncThe above copyright notice and this permission notice shall be included
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncin all copies or substantial portions of the Software.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOTHER DEALINGS IN THE SOFTWARE.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncExcept as contained in this notice, the name of The Open Group shall
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncnot be used in advertising or otherwise to promote the sale, use or
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncother dealings in this Software without prior written authorization
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncfrom The Open Group.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync*/
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* Author: Keith Packard, MIT X Consortium */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include "mispans.h"
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include "mifpoly.h" /* for ICEIL */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Polygon edge description for integer wide-line routines
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _PolyEdge {
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int height; /* number of scanlines to process */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int x; /* starting x coordinate */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int stepx; /* fixed integral dx */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int signdx; /* variable dx sign */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int e; /* initial error term */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int dy;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int dx;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync} PolyEdgeRec, *PolyEdgePtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define SQSECANT 108.856472512142 /* 1/sin^2(11/2) - miter limit constant */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * types for general polygon routines
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _PolyVertex {
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync double x, y;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync} PolyVertexRec, *PolyVertexPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _PolySlope {
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int dx, dy;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync double k; /* x0 * dy - y0 * dx */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync} PolySlopeRec, *PolySlopePtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Line face description for caps/joins
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _LineFace {
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync double xa, ya;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int dx, dy;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int x, y;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync double k;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync} LineFaceRec, *LineFacePtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * macros for polygon fillers
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MILINESETPIXEL(pDrawable, pGC, pixel, oldPixel) { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync oldPixel = pGC->fgPixel; \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (pixel != oldPixel) { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ChangeGCVal gcval; \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync gcval.val = pixel; \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ChangeGC (NullClient, pGC, GCForeground, &gcval); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ValidateGC (pDrawable, pGC); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MILINERESETPIXEL(pDrawable, pGC, pixel, oldPixel) { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (pixel != oldPixel) { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ChangeGCVal gcval; \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync gcval.val = oldPixel; \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ChangeGC (NullClient, pGC, GCForeground, &gcval); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ValidateGC (pDrawable, pGC); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT void miRoundJoinClip(LineFacePtr /*pLeft */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync LineFacePtr /*pRight */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolyEdgePtr /*edge1 */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolyEdgePtr /*edge2 */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int * /*y1 */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int * /*y2 */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Bool * /*left1 */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Bool * /*left2 */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync );
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT int miRoundCapClip(LineFacePtr /*face */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Bool /*isInt */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolyEdgePtr /*edge */ ,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync Bool * /*leftEdge */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync );
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT int miPolyBuildEdge(double x0, double y0, double k, int dx,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int dy, int xi, int yi, int left,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolyEdgePtr edge);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT int miPolyBuildPoly(PolyVertexPtr vertices,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolySlopePtr slopes, int count, int xi,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int yi, PolyEdgePtr left,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PolyEdgePtr right, int *pnleft,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int *pnright, int *h);