Browse Source

Merge pull request #3054 from donandren/issues/3053

Attempt to fix path geometry parsing issue
pull/3065/head
Nikita Tsukanov 7 years ago
committed by GitHub
parent
commit
42b2247445
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      src/Avalonia.Visuals/Media/PathMarkupParser.cs
  2. 29
      tests/Avalonia.Visuals.UnitTests/Media/PathMarkupParserTests.cs

15
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();
}
}
}

29
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<LineSegment>(segment);
@ -235,5 +233,30 @@ namespace Avalonia.Visuals.UnitTests.Media
Assert.Throws<InvalidDataException>(() => 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);
}
}
}
}

Loading…
Cancel
Save