diff --git a/src/Avalonia.Visuals/Media/PathMarkupParser.cs b/src/Avalonia.Visuals/Media/PathMarkupParser.cs index 8852883dcc..e8f149df11 100644 --- a/src/Avalonia.Visuals/Media/PathMarkupParser.cs +++ b/src/Avalonia.Visuals/Media/PathMarkupParser.cs @@ -32,6 +32,7 @@ namespace Avalonia.Media private IGeometryContext _geometryContext; private Point _currentPoint; + private Point? _beginFigurePoint; private Point? _previousControlPoint; private bool _isOpen; private bool _isDisposed; @@ -180,6 +181,8 @@ namespace Avalonia.Media _geometryContext.BeginFigure(_currentPoint); + _beginFigurePoint = _currentPoint; + _isOpen = true; } @@ -212,6 +215,12 @@ namespace Avalonia.Media if (_isOpen) { _geometryContext.EndFigure(true); + + if (_beginFigurePoint != null) + { + _currentPoint = _beginFigurePoint.Value; + _beginFigurePoint = null; + } } _previousControlPoint = null; @@ -233,12 +242,6 @@ namespace Avalonia.Media { span = ReadSeparator(span); AddLine(ref span, relative); - - if (!relative) - { - _currentPoint = currentPoint; - CreateFigure(); - } } } diff --git a/tests/Avalonia.Visuals.UnitTests/Media/PathMarkupParserTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/PathMarkupParserTests.cs index 5570378063..e1475dce80 100644 --- a/tests/Avalonia.Visuals.UnitTests/Media/PathMarkupParserTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Media/PathMarkupParserTests.cs @@ -100,9 +100,7 @@ namespace Avalonia.Visuals.UnitTests.Media Assert.Equal(new Point(10, 10), lineSegment.Point); - figure = pathGeometry.Figures[1]; - - segment = figure.Segments[0]; + segment = figure.Segments[1]; Assert.IsType(segment); @@ -235,5 +233,30 @@ namespace Avalonia.Visuals.UnitTests.Media Assert.Throws(() => parser.Parse(pathData)); } } + + [Fact] + 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); + } + } } }