void Draw(ref DrawVarsPart0 dv,
ref DrawVarsPart1 dv1,
ref DrawVarsPart2 dv2,
ref LineParameters curr,
ref LineParameters next,
int start,
int end)
{
int i;
for (i = start; i < end; i++)
{
if (m_line_join == OutlineJoin.Round)
{
dv2.xb1 = curr.x1 + (curr.y2 - curr.y1);
dv2.yb1 = curr.y1 - (curr.x2 - curr.x1);
dv2.xb2 = curr.x2 + (curr.y2 - curr.y1);
dv2.yb2 = curr.y2 - (curr.x2 - curr.x1);
}
switch (dv.flags)
{
case 0: m_ren.Line3(curr, dv2.xb1, dv2.yb1, dv2.xb2, dv2.yb2); break;
case 1: m_ren.Line2(curr, dv2.xb2, dv2.yb2); break;
case 2: m_ren.Line1(curr, dv2.xb1, dv2.yb1); break;
case 3: m_ren.Line0(curr); break;
}
if (m_line_join == OutlineJoin.Round && (dv.flags & 2) == 0)
{
m_ren.Pie(curr.x2, curr.y2,
curr.x2 + (curr.y2 - curr.y1),
curr.y2 - (curr.x2 - curr.x1),
curr.x2 + (next.y2 - next.y1),
curr.y2 - (next.x2 - next.x1));
}
dv1.x1 = dv1.x2;
dv1.y1 = dv1.y2;
dv.lcurr = dv.lnext;
dv.lnext = m_src_vertices[dv.idx].len;
++dv.idx;
if (dv.idx >= m_src_vertices.Count)
{
dv.idx = 0;
}
dv1.x2 = m_src_vertices[dv.idx].x;
dv1.y2 = m_src_vertices[dv.idx].y;
curr = next;
next = new LineParameters(dv1.x1, dv1.y1, dv1.x2, dv1.y2, dv.lnext);
dv2.xb1 = dv2.xb2;
dv2.yb1 = dv2.yb2;
switch (m_line_join)
{
case OutlineJoin.NoJoin:
dv.flags = 3;
break;
case OutlineJoin.Mitter:
dv.flags >>= 1;
dv.flags |= (curr.DiagonalQuadrant ==
next.DiagonalQuadrant ? 1 : 0);
if ((dv.flags & 2) == 0)
{
LineAA.Bisectrix(curr, next, out dv2.xb2, out dv2.yb2);
}
break;
case OutlineJoin.Round:
dv.flags >>= 1;
dv.flags |= (((curr.DiagonalQuadrant ==
next.DiagonalQuadrant) ? 1 : 0) << 1);
break;
case OutlineJoin.AccurateJoin:
dv.flags = 0;
LineAA.Bisectrix(curr, next, out dv2.xb2, out dv2.yb2);
break;
}
}
}