Skip to content

Commit 906e0cc

Browse files
workgroupengineeringmaxkatz6
authored andcommitted
fix(Geometries): Relative line drawing (#14013)
* test: Add invalid draw test * fix: Geometry parsing * test: Refactoring the test for address `h` and `v` command * fix: Parser of `h` command * fix: parser `v` command * test: Add case `M50,50z l -5,-5` * test: Add PathMarkupParserTests * test: Removed render tests
1 parent 366a935 commit 906e0cc

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/Avalonia.Base/Media/PathMarkupParser.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ private void AddLine(ref ReadOnlySpan<char> span, bool relative)
259259
{
260260
ThrowIfDisposed();
261261

262-
_currentPoint = relative
262+
var next = relative
263263
? ReadRelativePoint(ref span, _currentPoint)
264264
: ReadPoint(ref span);
265265

@@ -268,14 +268,15 @@ private void AddLine(ref ReadOnlySpan<char> span, bool relative)
268268
CreateFigure();
269269
}
270270

271-
_geometryContext.LineTo(_currentPoint);
271+
_geometryContext.LineTo(next);
272+
_currentPoint = next;
272273
}
273274

274275
private void AddHorizontalLine(ref ReadOnlySpan<char> span, bool relative)
275276
{
276277
ThrowIfDisposed();
277278

278-
_currentPoint = relative
279+
var next = relative
279280
? new Point(_currentPoint.X + ReadDouble(ref span), _currentPoint.Y)
280281
: _currentPoint.WithX(ReadDouble(ref span));
281282

@@ -284,14 +285,15 @@ private void AddHorizontalLine(ref ReadOnlySpan<char> span, bool relative)
284285
CreateFigure();
285286
}
286287

287-
_geometryContext.LineTo(_currentPoint);
288+
_geometryContext.LineTo(next);
289+
_currentPoint = next;
288290
}
289291

290292
private void AddVerticalLine(ref ReadOnlySpan<char> span, bool relative)
291293
{
292294
ThrowIfDisposed();
293295

294-
_currentPoint = relative
296+
var next = relative
295297
? new Point(_currentPoint.X, _currentPoint.Y + ReadDouble(ref span))
296298
: _currentPoint.WithY(ReadDouble(ref span));
297299

@@ -300,7 +302,8 @@ private void AddVerticalLine(ref ReadOnlySpan<char> span, bool relative)
300302
CreateFigure();
301303
}
302304

303-
_geometryContext.LineTo(_currentPoint);
305+
_geometryContext.LineTo(next);
306+
_currentPoint = next;
304307
}
305308

306309
private void AddCubicBezierCurve(ref ReadOnlySpan<char> span, bool relative)

tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,5 +319,24 @@ public void Should_Parse_Flags_Without_Separator()
319319
Assert.IsType<ArcSegment>(arcSegment);
320320
}
321321
}
322+
323+
[Fact]
324+
public void Should_Handle_StartPoint_After_Empty_Figure()
325+
{
326+
var pathGeometry = new PathGeometry();
327+
using var context = new PathGeometryContext(pathGeometry);
328+
using var parser = new PathMarkupParser(context);
329+
parser.Parse("M50,50z l -5,-5");
330+
331+
Assert.Equal(2, pathGeometry.Figures.Count);
332+
333+
var firstFigure = pathGeometry.Figures[0];
334+
335+
Assert.Equal(new Point(50, 50), firstFigure.StartPoint);
336+
337+
var secondFigure = pathGeometry.Figures[1];
338+
339+
Assert.Equal(new Point(50, 50), secondFigure.StartPoint);
340+
}
322341
}
323342
}

0 commit comments

Comments
 (0)