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: