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