Example #1
0
        public void Parses_Implicit_Line_Command_After_Move(string pathData)
        {
            var pathGeometry = new PathGeometry();

            using (var context = new PathGeometryContext(pathGeometry))
                using (var parser = new PathMarkupParser(context))
                {
                    parser.Parse(pathData);

                    var figure = pathGeometry.Figures[0];

                    var segment = figure.Segments[0];

                    Assert.IsType <LineSegment>(segment);

                    var lineSegment = (LineSegment)segment;

                    Assert.Equal(new Point(10, 10), lineSegment.Point);

                    figure = pathGeometry.Figures[1];

                    segment = figure.Segments[0];

                    Assert.IsType <LineSegment>(segment);

                    lineSegment = (LineSegment)segment;

                    Assert.Equal(new Point(20, 20), lineSegment.Point);
                }
        }
Example #2
0
 public void Throws_InvalidDataException_On_None_Defined_Command(string pathData)
 {
     var pathGeometry = new PathGeometry();
     using (var context = new PathGeometryContext(pathGeometry))
     using (var parser = new PathMarkupParser(context))
     {
         Assert.Throws<InvalidDataException>(() => parser.Parse(pathData));
     }
 }
Example #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pg"></param>
        /// <param name="dx"></param>
        /// <param name="dy"></param>
        /// <returns></returns>
        public IPathGeometry ToPathGeometry(AM.PathGeometry pg, double dx, double dy)
        {
            var factory = _serviceProvider.GetService <IFactory>();

            var geometry = factory.CreatePathGeometry(
                ImmutableArray.Create <IPathFigure>(),
                pg.FillRule == AM.FillRule.EvenOdd ? FillRule.EvenOdd : FillRule.Nonzero);

            var context = new PathGeometryContext(factory, geometry);

            foreach (var pf in pg.Figures)
            {
                context.BeginFigure(
                    factory.CreatePointShape(pf.StartPoint.X + dx, pf.StartPoint.Y + dy),
                    pf.IsFilled,
                    pf.IsClosed);

                foreach (var segment in pf.Segments)
                {
                    if (segment is AM.ArcSegment arcSegment)
                    {
                        context.ArcTo(
                            factory.CreatePointShape(arcSegment.Point.X + dx, arcSegment.Point.Y + dy),
                            factory.CreatePathSize(arcSegment.Size.Width, arcSegment.Size.Height),
                            arcSegment.RotationAngle,
                            arcSegment.IsLargeArc,
                            arcSegment.SweepDirection == AM.SweepDirection.Clockwise ? SweepDirection.Clockwise : SweepDirection.Counterclockwise);
                    }
                    else if (segment is AM.BezierSegment cubicBezierSegment)
                    {
                        context.CubicBezierTo(
                            factory.CreatePointShape(cubicBezierSegment.Point1.X + dx, cubicBezierSegment.Point1.Y + dy),
                            factory.CreatePointShape(cubicBezierSegment.Point2.X + dx, cubicBezierSegment.Point2.Y + dy),
                            factory.CreatePointShape(cubicBezierSegment.Point3.X + dx, cubicBezierSegment.Point3.Y + dy));
                    }
                    else if (segment is AM.LineSegment lineSegment)
                    {
                        context.LineTo(
                            factory.CreatePointShape(lineSegment.Point.X + dx, lineSegment.Point.Y + dy));
                    }
                    else if (segment is AM.QuadraticBezierSegment quadraticBezierSegment)
                    {
                        context.QuadraticBezierTo(
                            factory.CreatePointShape(quadraticBezierSegment.Point1.X + dx, quadraticBezierSegment.Point1.Y + dy),
                            factory.CreatePointShape(quadraticBezierSegment.Point2.X + dx, quadraticBezierSegment.Point2.Y + dy));
                    }
                    else
                    {
                        throw new NotSupportedException("Not supported segment type: " + segment.GetType());
                    }
                }
            }

            return(geometry);
        }
Example #4
0
        public void Parses_FillMode_Before_Move()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("F 1M0,0");

                Assert.Equal(FillRule.NonZero, pathGeometry.FillRule);
            }
        }
Example #5
0
        public void Should_Parse(string pathData)
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse(pathData);

                Assert.True(true);
            }
        }
Example #6
0
        /// <summary>
        /// Parses the specified path data to a <see cref="PathGeometry"/>.
        /// </summary>
        /// <param name="pathData">The s.</param>
        /// <returns></returns>
        public static new PathGeometry Parse(string pathData)
        {
            var pathGeometry = new PathGeometry();

            using (var context = new PathGeometryContext(pathGeometry))
                using (var parser = new PathMarkupParser(context))
                {
                    parser.Parse(pathData);
                }

            return(pathGeometry);
        }
Example #7
0
        public void Parses_Close()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("M0 0L10 10z");

                var figure = pathGeometry.Figures[0];

                Assert.True(figure.IsClosed);
            }
        }
Example #8
0
        public void Parses_Move()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("M10 10");

                var figure = pathGeometry.Figures[0];

                Assert.Equal(new Point(10, 10), figure.StartPoint);
            }
        }
        public void BeginFigure_Adds_New_Figure()
        {
            var geometry = new PathGeometry();
            var target   = new PathGeometryContext(geometry);

            Assert.Empty(geometry.Figures);

            target.BeginFigure(new PointShape());
            Assert.NotNull(geometry.Figures[0]);
            Assert.True(geometry.Figures[0].IsFilled);
            Assert.True(geometry.Figures[0].IsClosed);

            target.SetClosedState(false);
            Assert.False(geometry.Figures[0].IsClosed);
        }
        public void CubicBezierTo_Adds_New_CubicBezierSegment()
        {
            var geometry = new PathGeometry();
            var target   = new PathGeometryContext(geometry);

            target.BeginFigure(new PointShape());
            Assert.Empty(geometry.Figures[0].Segments);

            target.CubicBezierTo(new PointShape(), new PointShape(), new PointShape());

            var segment = geometry.Figures[0].Segments[0];

            Assert.IsType <CubicBezierSegment>(segment);
            Assert.True(segment.IsStroked);
            Assert.True(segment.IsSmoothJoin);
        }
        public void PolyQuadraticBezierTo_Adds_New_XPolyQuadraticBezierSegment()
        {
            var geometry = new PathGeometry();
            var target   = new PathGeometryContext(geometry);

            target.BeginFigure(new PointShape());
            Assert.Empty(geometry.Figures[0].Segments);

            target.PolyQuadraticBezierTo(ImmutableArray.Create <PointShape>(new PointShape(), new PointShape(), new PointShape()));

            var segment = geometry.Figures[0].Segments[0];

            Assert.IsType <PolyQuadraticBezierSegment>(segment);
            Assert.True(segment.IsStroked);
            Assert.True(segment.IsSmoothJoin);
        }
Example #12
0
        public void ArcTo_Adds_New_ArcSegment()
        {
            var geometry = _factory.CreatePathGeometry();
            var target   = new PathGeometryContext(_factory, geometry);

            target.BeginFigure(_factory.CreatePointShape());
            Assert.Empty(geometry.Figures[0].Segments);

            target.ArcTo(_factory.CreatePointShape(), _factory.CreatePathSize());

            var segment = geometry.Figures[0].Segments[0];

            Assert.IsType <ArcSegment>(segment);
            Assert.True(segment.IsStroked);
            Assert.True(segment.IsSmoothJoin);
        }
Example #13
0
        public void PolyLineTo_Adds_New_XPolyLineSegment()
        {
            var geometry = _factory.CreatePathGeometry();
            var target   = new PathGeometryContext(_factory, geometry);

            target.BeginFigure(_factory.CreatePointShape());
            Assert.Empty(geometry.Figures[0].Segments);

            target.PolyLineTo(ImmutableArray.Create <IPointShape>(_factory.CreatePointShape(), _factory.CreatePointShape(), _factory.CreatePointShape()));

            var segment = geometry.Figures[0].Segments[0];

            Assert.IsType <PolyLineSegment>(segment);
            Assert.True(segment.IsStroked);
            Assert.True(segment.IsSmoothJoin);
        }
Example #14
0
        public void Parses_Scientific_Notation_Double()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("M -1.01725E-005 -1.01725e-005");

                var figure = pathGeometry.Figures[0];

                Assert.Equal(
                    new Point(
                        double.Parse("-1.01725E-005", NumberStyles.Float, CultureInfo.InvariantCulture),
                        double.Parse("-1.01725E-005", NumberStyles.Float, CultureInfo.InvariantCulture)),
                    figure.StartPoint);
            }
        }
Example #15
0
        /// <summary>
        /// Parse a mini-language string representation of the <see cref="PathGeometry"/>.
        /// </summary>
        /// <remarks>
        /// The path geometry syntax may start with a "wsp*Fwsp*(0|1)" which indicate the winding mode (F0 is EvenOdd while F1 is NonZero).
        /// </remarks>
        /// <param name="source">The string with geometry data.</param>
        /// <returns>The new instance of the <see cref="PathGeometry"/> class.</returns>
        public static PathGeometry Parse(string source)
        {
            var fillRule = FillRule.EvenOdd;
            var geometry = PathGeometry.Create(ImmutableArray.Create <PathFigure>(), fillRule);

            if (source != null)
            {
                int curIndex = 0;
                while ((curIndex < source.Length) && Char.IsWhiteSpace(source, curIndex))
                {
                    curIndex++;
                }

                if (curIndex < source.Length)
                {
                    if (source[curIndex] == 'F')
                    {
                        curIndex++;

                        while ((curIndex < source.Length) && Char.IsWhiteSpace(source, curIndex))
                        {
                            curIndex++;
                        }

                        if ((curIndex == source.Length) || ((source[curIndex] != '0') && (source[curIndex] != '1')))
                        {
                            throw new FormatException("Illegal token.");
                        }

                        fillRule = source[curIndex] == '0' ? FillRule.EvenOdd : FillRule.Nonzero;
                        curIndex++;
                    }
                }

                var parser  = new SvgToPathGeometryParser();
                var context = new PathGeometryContext(geometry);

                parser.Parse(context, source, curIndex);
            }

            geometry.FillRule = fillRule;

            return(geometry);
        }
Example #16
0
        public void Parses_Line()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("M0 0L10 10");

                var figure = pathGeometry.Figures[0];

                var segment = figure.Segments[0];

                Assert.IsType<LineSegment>(segment);

                var lineSegment = (LineSegment)segment;

                Assert.Equal(new Point(10, 10), lineSegment.Point);
            }
        }
Example #17
0
        public void Should_Parse_Flags_Without_Separator()
        {
            var pathGeometry = new PathGeometry();

            using (var context = new PathGeometryContext(pathGeometry))
                using (var parser = new PathMarkupParser(context))
                {
                    parser.Parse("a.898.898 0 01.27.188");

                    var figure = pathGeometry.Figures[0];

                    var segments = figure.Segments;

                    Assert.NotNull(segments);

                    Assert.Equal(1, segments.Count);

                    var arcSegment = segments[0];

                    Assert.IsType <ArcSegment>(arcSegment);
                }
        }
Example #18
0
        public void CloseFigure_Should_Move_CurrentPoint_To_CreateFigurePoint()
        {
            var pathGeometry = new PathGeometry();
            using (var context = new PathGeometryContext(pathGeometry))
            using (var parser = new PathMarkupParser(context))
            {
                parser.Parse("M10,10L100,100Z m10,10");

                Assert.Equal(2, pathGeometry.Figures.Count);

                var figure = pathGeometry.Figures[0];

                Assert.Equal(new Point(10, 10), figure.StartPoint);

                Assert.Equal(true, figure.IsClosed);

                Assert.Equal(new Point(100, 100), ((LineSegment)figure.Segments[0]).Point);

                figure = pathGeometry.Figures[1];

                Assert.Equal(new Point(20, 20), figure.StartPoint);
            }
        }
        public void Inherits_From_XGeometryContext()
        {
            var target = new PathGeometryContext(new PathGeometry());

            Assert.True(target is GeometryContext);
        }
Example #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pg"></param>
        /// <param name="dx"></param>
        /// <param name="dy"></param>
        /// <returns></returns>
        public static Path.PathGeometry ToPathGeometry(this System.Windows.Media.PathGeometry pg, double dx, double dy)
        {
            var geometry = Path.PathGeometry.Create(
                ImmutableArray.Create <Path.PathFigure>(),
                pg.FillRule == System.Windows.Media.FillRule.EvenOdd ? Path.FillRule.EvenOdd : Path.FillRule.Nonzero);

            var context = new PathGeometryContext(geometry);

            foreach (var pf in pg.Figures)
            {
                context.BeginFigure(
                    PointShape.Create(pf.StartPoint.X + dx, pf.StartPoint.Y + dy),
                    pf.IsFilled,
                    pf.IsClosed);

                foreach (var segment in pf.Segments)
                {
                    if (segment is ArcSegment)
                    {
                        var arcSegment = segment as ArcSegment;
                        context.ArcTo(
                            PointShape.Create(arcSegment.Point.X + dx, arcSegment.Point.Y + dy),
                            PathSize.Create(arcSegment.Size.Width, arcSegment.Size.Height),
                            arcSegment.RotationAngle,
                            arcSegment.IsLargeArc,
                            arcSegment.SweepDirection == System.Windows.Media.SweepDirection.Clockwise ? Path.SweepDirection.Clockwise : Path.SweepDirection.Counterclockwise,
                            arcSegment.IsStroked,
                            arcSegment.IsSmoothJoin);
                    }
                    else if (segment is BezierSegment)
                    {
                        var cubicBezierSegment = segment as BezierSegment;
                        context.CubicBezierTo(
                            PointShape.Create(cubicBezierSegment.Point1.X + dx, cubicBezierSegment.Point1.Y + dy),
                            PointShape.Create(cubicBezierSegment.Point2.X + dx, cubicBezierSegment.Point2.Y + dy),
                            PointShape.Create(cubicBezierSegment.Point3.X + dx, cubicBezierSegment.Point3.Y + dy),
                            cubicBezierSegment.IsStroked,
                            cubicBezierSegment.IsSmoothJoin);
                    }
                    else if (segment is LineSegment)
                    {
                        var lineSegment = segment as LineSegment;
                        context.LineTo(
                            PointShape.Create(lineSegment.Point.X + dx, lineSegment.Point.Y + dy),
                            lineSegment.IsStroked,
                            lineSegment.IsSmoothJoin);
                    }
                    else if (segment is PolyBezierSegment)
                    {
                        var polyCubicBezierSegment = segment as PolyBezierSegment;
                        context.PolyCubicBezierTo(
                            ToPointShapes(polyCubicBezierSegment.Points, dx, dy),
                            polyCubicBezierSegment.IsStroked,
                            polyCubicBezierSegment.IsSmoothJoin);
                    }
                    else if (segment is PolyLineSegment)
                    {
                        var polyLineSegment = segment as PolyLineSegment;
                        context.PolyLineTo(
                            ToPointShapes(polyLineSegment.Points, dx, dy),
                            polyLineSegment.IsStroked,
                            polyLineSegment.IsSmoothJoin);
                    }
                    else if (segment is PolyQuadraticBezierSegment)
                    {
                        var polyQuadraticSegment = segment as PolyQuadraticBezierSegment;
                        context.PolyQuadraticBezierTo(
                            ToPointShapes(polyQuadraticSegment.Points, dx, dy),
                            polyQuadraticSegment.IsStroked,
                            polyQuadraticSegment.IsSmoothJoin);
                    }
                    else if (segment is QuadraticBezierSegment)
                    {
                        var quadraticBezierSegment = segment as QuadraticBezierSegment;
                        context.QuadraticBezierTo(
                            PointShape.Create(quadraticBezierSegment.Point1.X + dx, quadraticBezierSegment.Point1.Y + dy),
                            PointShape.Create(quadraticBezierSegment.Point2.X + dx, quadraticBezierSegment.Point2.Y + dy),
                            quadraticBezierSegment.IsStroked,
                            quadraticBezierSegment.IsSmoothJoin);
                    }
                    else
                    {
                        throw new NotSupportedException("Not supported segment type: " + segment.GetType());
                    }
                }
            }

            return(geometry);
        }