#include "mispans.h"
#include "mifpoly.h"
typedef struct _SpanData {
SpanGroup fgGroup, bgGroup;
} SpanDataRec, *SpanDataPtr;
#define AppendSpanGroup(pGC, pixel, spanPtr, spanData) { \
SpanGroup *group, *othergroup = NULL; \
if (pixel == pGC->fgPixel) \
{ \
group = &spanData->fgGroup; \
if (pGC->lineStyle == LineDoubleDash) \
othergroup = &spanData->bgGroup; \
} \
else \
{ \
group = &spanData->bgGroup; \
othergroup = &spanData->fgGroup; \
} \
miAppendSpans (group, othergroup, spanPtr); \
}
typedef struct _PolyEdge {
int height;
int x;
int stepx;
int signdx;
int e;
int dy;
int dx;
} PolyEdgeRec, *PolyEdgePtr;
#define SQSECANT 108.856472512142
typedef struct _PolyVertex {
double x, y;
} PolyVertexRec, *PolyVertexPtr;
typedef struct _PolySlope {
int dx, dy;
double k;
} PolySlopeRec, *PolySlopePtr;
typedef struct _LineFace {
double xa, ya;
int dx, dy;
int x, y;
double k;
} LineFaceRec, *LineFacePtr;
#define MIPOLYRELOADLEFT if (!left_height && left_count) { \
left_height = left->height; \
left_x = left->x; \
left_stepx = left->stepx; \
left_signdx = left->signdx; \
left_e = left->e; \
left_dy = left->dy; \
left_dx = left->dx; \
--left_count; \
++left; \
}
#define MIPOLYRELOADRIGHT if (!right_height && right_count) { \
right_height = right->height; \
right_x = right->x; \
right_stepx = right->stepx; \
right_signdx = right->signdx; \
right_e = right->e; \
right_dy = right->dy; \
right_dx = right->dx; \
--right_count; \
++right; \
}
#define MIPOLYSTEPLEFT left_x += left_stepx; \
left_e += left_dx; \
if (left_e > 0) \
{ \
left_x += left_signdx; \
left_e -= left_dy; \
}
#define MIPOLYSTEPRIGHT right_x += right_stepx; \
right_e += right_dx; \
if (right_e > 0) \
{ \
right_x += right_signdx; \
right_e -= right_dy; \
}
#define MILINESETPIXEL(pDrawable, pGC, pixel, oldPixel) { \
oldPixel = pGC->fgPixel; \
if (pixel != oldPixel) { \
DoChangeGC (pGC, GCForeground, (XID *) &pixel, FALSE); \
ValidateGC (pDrawable, pGC); \
} \
}
#define MILINERESETPIXEL(pDrawable, pGC, pixel, oldPixel) { \
if (pixel != oldPixel) { \
DoChangeGC (pGC, GCForeground, (XID *) &oldPixel, FALSE); \
ValidateGC (pDrawable, pGC); \
} \
}
extern void miRoundJoinClip(
LineFacePtr ,
LineFacePtr ,
PolyEdgePtr ,
PolyEdgePtr ,
int * ,
int * ,
Bool * ,
Bool *
);
extern int miRoundCapClip(
LineFacePtr ,
Bool ,
PolyEdgePtr ,
Bool *
);
extern int miPolyBuildEdge(double x0, double y0, double k, int dx, int dy,
int xi, int yi, int left, PolyEdgePtr edge);
extern int miPolyBuildPoly(PolyVertexPtr vertices, PolySlopePtr slopes,
int count, int xi, int yi, PolyEdgePtr left,
PolyEdgePtr right, int *pnleft, int *pnright,
int *h);