diff --git a/src/glimpse/svg.py b/src/glimpse/svg.py index 3c5aff99..a964de23 100644 --- a/src/glimpse/svg.py +++ b/src/glimpse/svg.py @@ -679,7 +679,11 @@ def _from_path(cls, d: str = "") -> "Points": # moveTo: m (dx,dy)+ | lineTo: l (dx,dy)+ | curveTo: T (dx,dy)+ elif cmd in ("m", "l", "t"): for dx, dy in _chunks(params, 2): - xy.append((xy[-1][0] + dx, xy[-1][1] + dy)) + if not xy: + # Treat first point as absolute + xy.append((dx, dy)) + else: + xy.append((xy[-1][0] + dx, xy[-1][1] + dy)) # lineTo: H (x)+ elif cmd == "H": for (x,) in _chunks(params, 1): diff --git a/tests/test_svg.py b/tests/test_svg.py index f234205f..58b67730 100644 --- a/tests/test_svg.py +++ b/tests/test_svg.py @@ -105,14 +105,15 @@ def test_parses_path_commands( ) -> None: """Parses all possible path commands.""" xo, yo = 1, 2 - # Uppercase - fp = io.StringIO(f"") - coords = glimpse.svg.read(fp) - assert coords["path"][1] == (dxy[0] or xo, dxy[1] or yo) - # Lowercase - fp = io.StringIO(f"") - coords = glimpse.svg.read(fp) - assert coords["path"][1] == (xo + dxy[0], yo + dxy[1]) + for start in ("M", "m"): + # Uppercase command + fp = io.StringIO(f"") + coords = glimpse.svg.read(fp) + assert coords["path"][1] == (dxy[0] or xo, dxy[1] or yo) + # Lowercase command + fp = io.StringIO(f"") + coords = glimpse.svg.read(fp) + assert coords["path"][1] == (xo + dxy[0], yo + dxy[1]) def test_errors_for_invalid_path_command() -> None: