Exemplo n.º 1
0
 public override void AddBezier(IPoint2F p1,
                                IPoint2F p2,
                                IPoint2F p3,
                                IPoint2F p4)
 {
     Path.AddBezier(Pf(p1), Pf(p2), Pf(p3), Pf(p4));
 }
 public SvgQuadraticCurveSegment(IPoint2F start,
                                 IPoint2F controlPoint,
                                 IPoint2F end)
     : base(start, end)
 {
     ControlPoint = controlPoint;
 }
        public override void AddBezier(IPoint2F p1,
                                       IPoint2F p2,
                                       IPoint2F p3,
                                       IPoint2F p4)
        {
            if (TryAddConnectingPoint(p1.X, p1.Y, PathPointType.Bezier3))
            {
                if (_points.Count > 1)
                {
                    //System.Diagnostics.Debug.WriteLine("path.Close();");
                    Path.Close();
                }

                //System.Diagnostics.Debug.WriteLine("path.MoveTo(" + R4(p1.X) + "f, " + R4(p1.Y) + "f);");
                Path.MoveTo(p1.X, p1.Y);
            }

            //System.Diagnostics.Debug.WriteLine("path.CubicTo(" + p2.X + "f," + p2.Y + "f," + p3.X + "f," +
            //p3.Y + "f, " + p4.X + "f, " + p4.Y + "f);");
            Path.CubicTo(p2.X, p2.Y, p3.X, p3.Y, p4.X, p4.Y);


            AddPoint(p2, PathPointType.Bezier3);
            AddPoint(p3, PathPointType.Bezier3);
            AddPoint(p4, PathPointType.Bezier3);
        }
Exemplo n.º 4
0
 public SvgCubicCurveSegment(IPoint2F start,
                             IPoint2F firstControlPoint,
                             IPoint2F secondControlPoint,
                             IPoint2F end)
     : base(start, end)
 {
     FirstControlPoint  = firstControlPoint;
     SecondControlPoint = secondControlPoint;
 }
Exemplo n.º 5
0
        //private static //IEnumerable<SvgPathSegment>
        //    void CreatePathSegments(Char command,
        //                            SvgPathSegmentList segments,
        //                            CoordinateParserState state,
        //                            ReadOnlySpan<Char> chars)
        //{
        //    var isRelative = Char.IsLower(command);
        //    // http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation

        //    switch (command)
        //    {
        //        case 'M': // moveto
        //        case 'm': // relative moveto
        //        {
        //            if (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
        //            {
        //                var mov = new SvgMoveToSegment(
        //                    ToAbsolute(coords0, coords1, segments, isRelative));

        //                segments.Add(mov);
        //                //yield return mov;
        //            }

        //            while (CoordinateParser.TryGetFloat(out coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out coords1, ref chars, ref state))
        //            {
        //                var line = new SvgLineSegment(segments.Last.End,
        //                    ToAbsolute(coords0, coords1, segments, isRelative));

        //                segments.Add(line);

        //                //yield return line;
        //            }
        //        }
        //            break;
        //        case 'A': // elliptical arc
        //        case 'a': // relative elliptical arc
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
        //                   && CoordinateParser.TryGetBool(out var size, ref chars, ref state)
        //                   && CoordinateParser.TryGetBool(out var sweep, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state))
        //            {
        //                // A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y

        //                var arc = new SvgArcSegment(
        //                    segments.Last.End,
        //                    coords0,
        //                    coords1,
        //                    coords2,
        //                    size ? SvgArcSize.Large : SvgArcSize.Small,
        //                    sweep ? SvgArcSweep.Positive : SvgArcSweep.Negative,
        //                    ToAbsolute(coords3, coords4, segments, isRelative));

        //                segments.Add(arc);

        //                //yield return arc;
        //            }
        //        }
        //            break;
        //        case 'L': // lineto
        //        case 'l': // relative lineto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
        //            {
        //                var line = new SvgLineSegment(
        //                    segments.Last.End,
        //                    ToAbsolute(coords0, coords1, segments, isRelative));

        //                segments.Add(line);
        //                //yield return line;
        //            }
        //        }
        //            break;
        //        case 'H': // horizontal lineto
        //        case 'h': // relative horizontal lineto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state))
        //            {
        //                var line = new SvgLineSegment(
        //                    segments.Last.End,
        //                    ToAbsolute(coords0, segments.Last.End.Y, segments, isRelative, false));

        //                segments.Add(line);

        //                //yield return line;
        //            }
        //        }
        //            break;
        //        case 'V': // vertical lineto
        //        case 'v': // relative vertical lineto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state))
        //            {
        //                var line = new SvgLineSegment(
        //                    segments.Last.End,
        //                    ToAbsolute(segments.Last.End.X, coords0, segments, false, isRelative));

        //                segments.Add(line);
        //                //yield return line;
        //            }
        //        }
        //            break;
        //        case 'Q': // quadratic bézier curveto
        //        case 'q': // relative quadratic bézier curveto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state))
        //            {
        //                var quad = new SvgQuadraticCurveSegment(
        //                    segments.Last.End,
        //                    ToAbsolute(coords0, coords1, segments, isRelative),
        //                    ToAbsolute(coords2, coords3, segments, isRelative));

        //                segments.Add(quad);
        //                //yield return quad;
        //            }
        //        }
        //            break;
        //        case 'T': // shorthand/smooth quadratic bézier curveto
        //        case 't': // relative shorthand/smooth quadratic bézier curveto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
        //            {
        //                var lastQuadCurve = segments.Last as SvgQuadraticCurveSegment;
        //                var controlPoint = lastQuadCurve != null
        //                    ? Reflect(lastQuadCurve.ControlPoint, segments.Last.End)
        //                    : segments.Last.End;

        //                var quad = new SvgQuadraticCurveSegment(
        //                    segments.Last.End,
        //                    controlPoint,
        //                    ToAbsolute(coords0, coords1, segments, isRelative));

        //                segments.Add(quad);
        //                //yield return quad;
        //            }
        //        }
        //            break;
        //        case 'C': // curveto
        //        case 'c': // relative curveto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords5, ref chars, ref state))
        //            {
        //                var cube = new SvgCubicCurveSegment(
        //                    segments.Last.End,
        //                    ToAbsolute(coords0, coords1, segments, isRelative),
        //                    ToAbsolute(coords2, coords3, segments, isRelative),
        //                    ToAbsolute(coords4, coords5, segments, isRelative));

        //                segments.Add(cube);
        //                //yield return cube;
        //            }
        //        }
        //            break;
        //        case 'S': // shorthand/smooth curveto
        //        case 's': // relative shorthand/smooth curveto
        //        {
        //            while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
        //                   && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state))
        //            {
        //                var lastCubicCurve = segments.Last as SvgCubicCurveSegment;
        //                var controlPoint = lastCubicCurve != null
        //                    ? Reflect(lastCubicCurve.SecondControlPoint, segments.Last.End)
        //                    : segments.Last.End;

        //                var cube = new SvgCubicCurveSegment(
        //                    segments.Last.End,
        //                    controlPoint,
        //                    ToAbsolute(coords0, coords1, segments, isRelative),
        //                    ToAbsolute(coords2, coords3, segments, isRelative));

        //                segments.Add(cube);
        //                //yield return cube;
        //            }
        //        }
        //            break;
        //        case 'Z': // closepath
        //        case 'z': // relative closepath
        //        {
        //            var bye = new SvgClosePathSegment();
        //            segments.Add(bye);
        //            //yield return bye;
        //        }
        //            break;
        //    }
        //}

        private static IPoint2F Reflect(IPoint2F point,
                                        IPoint2F mirror)
        {
            var dx = Math.Abs(mirror.X - point.X);
            var dy = Math.Abs(mirror.Y - point.Y);

            var x = mirror.X + (mirror.X >= point.X ? dx : -dx);
            var y = mirror.Y + (mirror.Y >= point.Y ? dy : -dy);

            return(new ValuePoint2F(x, y));
        }
Exemplo n.º 6
0
 public SvgArcSegment(IPoint2F start,
                      Single radiusX,
                      Single radiusY,
                      Single angle,
                      SvgArcSize size,
                      SvgArcSweep sweep,
                      IPoint2F end)
     : base(start, end)
 {
     RadiusX = Math.Abs(radiusX);
     RadiusY = Math.Abs(radiusY);
     Angle   = angle;
     Sweep   = sweep;
     Size    = size;
 }
Exemplo n.º 7
0
 public abstract void AddBezier(IPoint2F p1,
                                IPoint2F p2,
                                IPoint2F p3,
                                IPoint2F p4);
 private void AddPoint(IPoint2F p,
                       PathPointType pointType)
 {
     _points.Add(p);
     _pointTypes.Add(pointType);
 }
 public static String ToSvgString(this IPoint2F p)
 {
     return(p.X.ToSvgString() + " " + p.Y.ToSvgString());
 }
Exemplo n.º 10
0
 public SvgMoveToSegment(IPoint2F moveTo)
     : base(moveTo, moveTo)
 {
 }
Exemplo n.º 11
0
 public SvgLineSegment(IPoint2F start,
                       IPoint2F end)
     : base(start, end)
 {
 }
Exemplo n.º 12
0
 public Boolean Equals(IPoint2F other)
 {
     return(Equals(other.X, X) && Equals(other.Y, Y));
 }
Exemplo n.º 13
0
 private static PointF Pf(IPoint2F pf) => new(pf.X, pf.Y);
Exemplo n.º 14
0
 protected SvgPathSegment(IPoint2F start,
                          IPoint2F end)
 {
     Start = start;
     End   = end;
 }