Beispiel #1
0
 static void Close(IPathRender output, PathRenderFeatures features, PointF cur, PointF start)
 {
     if ((features & PathRenderFeatures.Close) != 0)
     {
         output.Close(cur);
     }
     else
     {
         output.Line(cur, start);
     }
 }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 public static void Render(GraphicsPath path, IPathRender render, PathRenderFeatures features)
 {
     Render(path, render, features, DefaultResolution);
 }
Beispiel #4
0
        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;
                            }
                        }
                    }
                }
            }
        }