public static void CubicToLine(IPathRender output, PointF cur, PointF c1, PointF c2, PointF pt, double resolution) { int k = 0; int l = 0; var tempSet = new ControlSet[64]; var controlSet = new ControlSet[64]; tempSet[l++] = new ControlSet(cur, c1, c2, pt); while (l > 0) { var control1 = tempSet[--l]; double b = control1.CalcBreadth(resolution); if (b > resolution) { var control3 = control1.Bisect(); tempSet[l++] = control1; tempSet[l++] = control3; } else { controlSet[k++] = control1; } } while (k > 0) { var control2 = controlSet[--k]; var p = control2.getPoint(); output.Line(cur, p); cur = p; } }
static void Close(IPathRender output, PathRenderFeatures features, PointF cur, PointF start) { if ((features & PathRenderFeatures.Close) != 0) { output.Close(cur); } else { output.Line(cur, start); } }
public static void Render(GraphicsPath path, IPathRender render, PathRenderFeatures features, float resolution) { int n = path.PointCount; if (n > 0) { var bezier = new PointF[3]; int bezierIdx = 0; var points = path.PathPoints; var types = path.PathTypes; var start = PointF.Empty; var cur = PointF.Empty; for (int i = 0; i < n; ++i) { var type = (PathPointType)types[i]; var pointType = (PathPointType)((int)type & (int)PathPointType.PathTypeMask); var pt = points[i]; if (type == PathPointType.Start) { render.Move(cur, pt); start = cur = pt; } else if (type == PathPointType.CloseSubpath) { Close(render, features, cur, start); cur = start; } else if (type == PathPointType.PathMarker) { } else if (pointType == PathPointType.Line) { if (i == 0) { render.Move(cur, pt); start = pt; } else { render.Line(cur, pt); } cur = pt; if (((int)type & (int)PathPointType.CloseSubpath) != 0) { Close(render, features, cur, start); cur = start; } } else if (pointType == PathPointType.Bezier || pointType == PathPointType.Bezier3) { bezier[bezierIdx++] = pt; if (bezierIdx == 3) { Cubic(render, features, cur, bezier[0], bezier[1], pt, resolution); cur = pt; bezierIdx = 0; if (((int)type & (int)PathPointType.CloseSubpath) != 0) { Close(render, features, cur, start); cur = start; } } } } } }