LINUX.ORG.RU

libresvg 0.1 — новая альтернатива librsvg

 , , ,


4

7

libresvg 0.1 представляет собой первый экспериментальный выпуск новой библиотеки для отрисовки (рендеринга) SVG.

Основная цель проекта — заменить librsvg и QtSvg, и стать альтернативой Inkscape для тех, кто использует его для конвертирования SVG в PNG.

В текущей версии новая библиотека уже превосходит QtSvg, но не дотягивает до librsvg по возможностям (нет filter, clipPath, mask, marker, pattern). Тем не менее, поддержка стандарта в libresvg намного лучше, из-за чего базовые элементы, такие как path, gradients, shapes, text, поддерживаются лучше (у librsvg множество ошибок отрисовки).

Основные отличия от librsvg:

  • Возможность использовать несколько бекэндов (сейчас реализованы Qt и cairo). librsvg привязан к cairo и glib, из-за чего использовать его вне Linux — проблематично.
  • В отличии от librsvg, в libresvg стадии разбора и отрисовки полностью разделены, что позволяет легко добавлять новые бекэнды. Также это позволяет реализовать множество алгоритмов препроцессинга и валидации SVG, что, в свою очередь, позволяет избежать большого количества ошибок отрисовки.
  • Полная поддержка градиентов. rsvg не умеет наследовать атрибуты, проверять атрибуты на корректность, не поддерживает градиенты без дочерних или с одним дочерним элементом (swatches).
  • Хорошая поддержка отрисовки текста. rsvg не понимает xml:space, text-decoration, не всегда верно отрисовывает многострочный текст, плохо поддерживает tspan.
  • Поддержка CSS намного лучше, но полной поддержки всё ещё нет.

В разделе Releases можно скачать демо-приложение для оценки отрисовки для тех, кто не хочет собирать библиотку из исходников. Также в архиве находится консольное приложение для конвертации, альтернатива rsvg-convert.

Так как это первый релиз, то принимается любая критика и предложения по дальнейшему развитию проекта.

>>> Подробности

★★★★★

Проверено: Shaman007 ()

Интересно.

Запили, пожалуйста, тег для софтины, обязательно подпишусь.

Также созывается andreyu. Как ты смотришь на то, чтобы запилить поддержку SVG через сабж? :3

r3lgar ★★★★★ ()

А для текста Harfbuzz + Pango?

AP ★★★★★ ()

А, ну и предсказуемый вопрос: svgcleaner-gui её будет использовать? Я смутно припоминаю, что ты вроде как оторвал рендеринг сравнения до/после из-за косяков QtSvg.

И чтоб теперь уже три раза не вставать: когда планируешь браться за SVG 2? Там новый WG опять собирается вышвыривать из стандарта всё, у чего нет двух реализаций в софте.

AP ★★★★★ ()
Последнее исправление: AP (всего исправлений: 1)

О, вот у меня тут страдалец с rsvg спрашивает:

for instance I wanted to be able to extract the SVG icons from a single SVG file. But librsvg fucks on many of the icons because it fails processing the view coordinates in many edge(-no-so-edgy) cases. Like from memory, when there was a single point path or weird stuff like this. (which is useless path, but that should not fuck up the coordinate computation; you unfortunately cannot control all the weird little stuff in SVG files created in a GUI, like Inkscape)

Это для гимповых иконок. Текущий скрипт, использующий rsvg для извлечения, некоторые иконки у него не отрабатывает.

AP ★★★★★ ()
Последнее исправление: AP (всего исправлений: 1)
Ответ на: комментарий от AP

Планирую, но к версии 0.3, не раньше. То есть когда обгоню по фичам rsvg и ink. Смысла от сравнения криво срендернных привьюшек - мало. А тащить хром - бред.

Svg2 даже в планах нет. Во-первых, стандарта ещё нет. Во-вторых, для многих фич нужна поддержка самим бекендом. Я же, сам по себе, ничего не рисую, лишь дёргаю апи.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Во-вторых, для многих фич нужна поддержка самим бекендом.

А, логично :)

AP ★★★★★ ()
Ответ на: комментарий от AP

Поддержка спрайтов будет в следующей версии. Пока никак.

Тут проблема в том, что в отличии от того же rsvg, я создаю два dom. Первый - это дерево исходного svg, которое я сильно перекраиваю. Второе - это внутреннее представление svg, которое содержит только, что нужно для отрисовки. То есть от оригинальной структуры файла ничего не остаётся. А для отрисовки по id мне, как-то, придется оставлять нужные куски.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Ясно. Короче, общественность заинтересована, поскольку её задрало нежелание авторов rsvg фиксить баги и применять готовые патчи.

AP ★★★★★ ()

libresvg 0.1

А что стало решающим для первого релиза?

В текущей версии новая библиотека уже превосходит QtSvg

Это?

gag ★★★★★ ()
Ответ на: комментарий от gag

Ну нужно же с чего-то начинать. Тем более все оставшиеся фичи требуют уйму времени. Или мне нужно было релизить только после того, как я реализую весь стандарт?

RazrFalcon ★★★★★ ()

Говорю

cargo build --release --features=«qt-backend cairo-backend»

Он мне в конце:

Finished release [optimized] target(s) in 208.88 secs

Дальше:

$ sudo cargo install
[sudo] пароль для username:
error: no packages found with binaries or examples

Впервые пользуюсь cargo. Что я делаю не так?

Лог целиком:

https://paste.gnome.org/p3m9sciwv

cargo 0.23.0
rustc 1.22.1

Что ещё показать?

AP ★★★★★ ()

О кстати. Так поддержка текста у тебя есть или нет? На github написано «excluding fonts support».

tailgunner ★★★★★ ()

Посмотри отредактированный текст.

tailgunner ★★★★★ ()
Ответ на: комментарий от AP

cargo install для бинарей, а в корне только либа.

cd tools/rendersvg
cargo install --release --features="qt-backend cairo-backend"

RazrFalcon ★★★★★ ()
Ответ на: комментарий от tailgunner

fonts - это встроенные шрифты. Их никто не умеет, фактически. Даже лиса с хромом.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Или мне нужно было релизить только после того, как я реализую весь стандарт?

Не-не, как раз хорошо, а то со всем стандартом можно и не дождаться.

gag ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Да, сработало. А демонстрационное приложение на Qt, которое щас ищет -lresvg, имеется смысл пытаться заставить собраться, или вся работа перенесена в libresvg-qt?

AP ★★★★★ ()

А насколько реально к этой библиотеке слепить бэкенд который будет SVG в ZPL рендерить?

а то есть старая задумка печатать наклейки на термопринтере из svg шаблона, была даже реализация которая делала svg(template)->svg(result)->pdf->zpl(какие конвертеры были) но работало отвратительно.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от AP

когда пробовал - отвратительная встраиваемость и редкостная падучесть. Плюс эта софтина не ориентирована на печать на термопринтере, только подготовка для печати на обычном. Как минимум - нет экспорта в *PL.

У меня задача максимум - выкинуть bartender на производстве.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

А ты фичреквест не постил? Правда, Джим всё на Qt переписывает последние 4 года, ХЗ сколько у него времени на это.

AP ★★★★★ ()
Ответ на: комментарий от AP

Даже не думал. Моя задача сильно отличается от того под что делается glabels. Общего разве что визуальная подготовка макета.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Что такое ZPL? В теории можно, ибо препроцессор отдельно от рендера.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Zebra Programming Language. если очень обобщать - это такой недо-postscript заточенный для принтеров этикеток. В итоге стал стандартом де-факто для большинства термопринтеров любых производителей.

Dark_SavanT ★★★★★ ()

Оно умеет в 16bpc градиенты? Или в их нормальный дитеринг на 8bpc.

ChALkeR ★★★★★ ()
Ответ на: комментарий от ChALkeR

Эти вопросы к cairo/qt. resvg - прокси между svg файлом и 2d либой.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от AP

libresvg-qt - это биндинги к Qt.

То есть demo прога выглядит как: demo -> resvg -> resvg-qt -> qt

А зачем его собирать, если оно уже собрано? just for fun? В целом всё нужно делать по инструкции (doc/build.md).

RazrFalcon ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Можете привести пример исходного svg и что нужно получить в итоге. Попробую сделать демо.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от AP

А можно пример, где они не хотят что-то принимать? Изначальная цель переписать на rust старые, а затем добавлять новые фичи.

NoNameNoNumber ()
Ответ на: комментарий от RazrFalcon

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

мне это не горит совсем, но если доберусь, то позволит выкинуть нахрен виртуалку с виндой и bartender и избавиться от неплохого такого пласта головной боли.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от ChALkeR

Градиенты и битмапы — как бы разные вещи.

AP ★★★★★ ()
Ответ на: комментарий от NoNameNoNumber

Последний раз когда я смотрел rust версию - там был свой парсер svg, что выдаёт сишника с потрохами, ибо на тот момент svgparser уже был, и причин его не использовать я не вижу.

То есть у них очень странное переписывание, как минимум потому, что для парсинга по-прежнему используется libxml2.

RazrFalcon ★★★★★ ()
Последнее исправление: RazrFalcon (всего исправлений: 1)

Отрисовка через opengl.

anonymous ()
Ответ на: комментарий от AP

extract the SVG icons from a single SVG file. But librsvg fucks on many of the icons

Чувак удивится, когда узнает, как отрисовываются иконки в Inkscape.

you unfortunately cannot control all the weird little stuff

К доктору пробовал обращаться?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.