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; } } }