static void Close(IPathRender output, PathRenderFeatures features, PointF cur, PointF start) { if ((features & PathRenderFeatures.Close) != 0) { output.Close(cur); } else { output.Line(cur, start); } }
static void Cubic(IPathRender output, PathRenderFeatures features, PointF cur, PointF c1, PointF c2, PointF pt, float resolution) { if ((features & PathRenderFeatures.Cubic) != 0) { output.Cubic(cur, c1, c2, pt); return; } if ((features & PathRenderFeatures.Quad) != 0) { CubicToQuad(output, cur, c1, c2, pt, resolution); } else { CubicToLine(output, cur, c1, c2, pt, 0.025); } }
public static void Render(GraphicsPath path, IPathRender render, PathRenderFeatures features) { Render(path, render, features, DefaultResolution); }
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; } } } } } }