Спецификация пути SVG: moveTo и неявная lineTo

Я пытаюсь написать небольшой парсер / нормализатор пути SVG и получил последнюю проблему со спецификацией:

Насколько я понял, большинство команд поддерживают дополнительные неявные команды, и когда они делают это и находятся в относительном режиме, "текущая точка" будет обновляться после последней неявной команды, а не между ними.

Но команда "moveTo" является чем-то особенным и допускает неявные команды "lineTo". Хотя команда "lineTo" сама обновляет "текущую точку" только после последней неявной команды:

Нарисуйте линию от текущей точки до заданной координаты (x,y), которая станет новой текущей точкой. L (верхний регистр) указывает, что абсолютные координаты будут следовать; l (нижний регистр) указывает, что будут следовать относительные координаты. Количество пар координат можно указать для рисования ломаной линии. В конце команды новой текущей точке присваивается последний предоставленный набор координат.

Я не уверен, что делает "moveTo" с дополнительным "lineTo". Выдержка из SVG Path Spec:

Начать новый подпуть с заданной (x,y) координаты. М (верхний регистр) указывает, что абсолютные координаты будут следовать; m (нижний регистр) указывает, что будут следовать относительные координаты. Если за moveto следуют несколько пар координат, последующие пары обрабатываются как неявные команды lineto. Следовательно, неявные команды lineto будут относительными, если moveto относительны, и абсолютными, если moveto абсолютны. Если относительное перемещение (m) появляется в качестве первого элемента пути, то оно рассматривается как пара абсолютных координат. В этом случае последующие пары координат обрабатываются как относительные, даже если начальный шаг перехода интерпретируется как абсолютный переход.

Особенно последнее предложение сбивает с толку.

И что еще хуже, в SVGTiny Path Spec они написали еще одно описание, а почти все остальное тоже самое:

Новый подпуть по заданной (x,y) координате должен быть запущен. Это также должно установить новую текущую точку по заданной координате. Если относительный "moveto" (m) появляется как первый элемент "пути", то он должен рассматриваться как пара абсолютных координат. Если за "moveto" следуют несколько пар координат, последующие пары должны рассматриваться как неявные команды "lineto".

Означает ли это, что "текущая точка" обновляется между (что было бы несовместимо со всем остальным), или это было просто двусмысленное описание, которое они исправляли в более новых версиях?

1 ответ

Решение

Ну, все это кажется мне совершенно ясным.

Вот иллюстрация двух режимов, используемых для рисования двух квадратных (100px × 100px) прямоугольников. Первый использует абсолютные координаты, а второй использует относительные координаты. Как указывается в спецификации, если первая координата указана в нижнем регистре "m", то она обрабатывается как абсолютная координата, но все следующие за ней координаты считаются относительными.

<svg widtn="250" height="140" viewBox="0 0 250 140">
  <g fill="none" stroke-width="5">
    <!-- 1. Move with implicit LineTo (absolute) -->
    <path d="M10,10 110,10 110,110 10,110z" stroke="blue" />
    <!-- 2. Move with implicit LineTo (relative) -->
    <path d="m120,10 100,0 0,100 -100,0z" stroke="red" />
    </g>
  </svg>

Другие вопросы по тегам