LINUX.ORG.RU

resvg 0.7 — библиотека отрисовки SVG

 , ,


1

4

Вышел новый, значительный релиз библиотеки для растеризации SVG - resvg.

Основные изменения:

  • Полностью новая реализация отрисовки текста:
    • Почти весь стек от символа до кривой Безье теперь реализован на Rust: подбор шрифтов (font matching and fallback), парсинг TrueType, расстановка кластеров глифов по правилам SVG (SVG text layout). Исключением является шейпинг (text shaping), для которого используется HarfBuzz.
    • Текст теперь будет конвертироваться в кривые Безье до рендеринга. То есть бекенд отрисовки теперь не обязан поддерживать текст.
    • Поддержка двунаправленного текста (BIDI reordering). Пример.
    • Поддержка textPath. Пример 1, пример 2.
    • Поддержка writing-mode (вертикальный текст). Пример.
    • Корректная поддержка word-spacing и letter-spacing. Пример.
  • Новый, экспериментальный бекенд - Raqote (отдельное спасибо jrmuizel). Raqote - это графическая 2D библиотека, написанная на Rust. Она находится в начальной стадии разработки, при этом её возможностей уже достаточно для использования в resvg. Основным её преимуществом является то, что resvg теперь можно собрать ровно с одной не-Rust зависимостью - HarfBuzz.
  • Поддержка shape-rendering, text-rendering и image-rendering.
  • Ускорена отрисовка растровых изображений.
  • Общее количество тестов достигло 1112-х. Количество успешно пройденных тестов у Inkscape и librsvg упало за 75%.
  • Множество мелких исправлений и улучшений.

Результаты тестирования. Сравнительная таблица.

>>> Репозиторий

★★★★★

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

Как раз заглядывал к тебе в код пару месяцев назад в поисках примера, как в расте текст рендерить, а то шрифтолиба в расте сильно мутная, непонятно как узать. Ничего рисующего буковки не нашел. Стало быть нужно заглянуть еще разок?

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

Я буквы и не рисую. Я рисую «кривые».

Если нужно рисовать глифы, то или rusttype (чисто раст) или font-kit (враппер над системными либами). Для текста - harfbuzz. Пока никак иначе.

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

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

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

Но без понимания всякой там каллиграфии и шрифтостроения сложно вникать, особенно если доки слабые.

Тогда никак.

Справедливости ради, для C/C++ тоже ничего толкового нет. Или системные либы или фреймворки.

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

Общее количество тестов достигло 1112-х. Количество успешно пройденных тестов у Inkscape и librsvg упало за 75%.

Что думают по этому поводу разработчики Inkscape и librsvg? Они сами-то знают, что их софт не на 100% поддерживает спецификацию? Делаются какие-то движения для исправления ситуации?

Lorovec ()

Каждый раз, когда вижу новости о проекте, возникают вопросы:

  • Юзаешь ли ты это сам где-нибудь в качестве библиотеки?
  • Откуда у тебя вообще интерес к SVG?
  • Проект изначально был самоцелью, или ты просто начал с его помощью тренировать скил разработки на Rust?
WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Да ладно, видал я коды, которые подписывают каллбек на рендеринг. Вот только то, что творится в rusttype выглядит позабористее, чем сишные экзамплы, и описания там никакого, просто немного странного кода и всё.

q0tw4 ★★★ ()
Ответ на: комментарий от WitcherGeralt
  1. Нет. Разве что в виде плагина для explorer/dolphin.
  2. Пути сошлись. Давно это было.
  3. Целью проекта было написать лучшую реализацию SVG. И мне это удалось. На начало разработки я уже пару лет как писал на Rust.
RazrFalcon ★★★★★ ()
Ответ на: комментарий от mord0d

закапывать librsvg

Зачем?!

Почти все растовые проекты - это обвертки вокруг сишных либ. resvg - байдинги вокруг qt, cairo, gdk-pixbuf.

самые скачиваемые либы раста - libc, lazy_static, bitflags, ЧТО КАКГБЫ НАМЕКАЭ, на положение дел в расте.

Говорю это как человек сам юзающий ржавчинау и написавший кучу строчек кода уровня не hello world.

Т.е. раст уже сам себ закопал давным давно.

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

при чём тут раст

Я не язык ругаю, а бедность сообщества. Язык забавный, такому любителю извращений как я - самое оно. Особенно когда в конце понимаешь, что после того как всё таки удовлетворил компилятор, код во всех смыслах стал лучше. Вот только не хватает ему рабочих рук на crates.io ой не хватает. А да, я же грозился собрать свой синтаксический анализатор для ИДЕ, совсем уж завалило меня планами...

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

resvg - байдинги вокруг qt, cairo, gdk-pixbuf.

4.2 язабан

Говорю это как человек сам юзающий ржавчинау и написавший кучу строчек кода уровня не hello world.

Тупняк 3000

Ничего, что librsvg тоже на rust?

RazrFalcon ★★★★★ ()

в кривые Бизъе до рендеринга

Бедный Пьер. Как только не извращали его фамилию.

Rust

Не могу простить создателям сего реально удобного языка let-нотацию и «современные» упрощалки токенов вроде function -> fn.

DzenPython ()
Ответ на: комментарий от baist

Почти все растовые проекты - это обвертки вокруг сишных либ

Предлагаешь переписать их на Rust?

libc, lazy_static, bitflags

Как связаны libc и lazy_static, bitflags?

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

Предлагаешь переписать их на Rust?

Тогда зачем нужен этот язык?

Как связаны libc и lazy_static, bitflags?

Это связка означает что ты пишешь на старом Си, а раст тут чисто название. И тот факт что это самые самые топовые либы говорит что раст потерпел крах. потому что люди продолжают писать на Си, а все эти вкусности - они нафиг не нужен.

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

самые скачиваемые либы раста - libc, lazy_static, bitflags, ЧТО КАКГБЫ НАМЕКАЭ, на положение дел в расте.

Используют напрямую что ли или скачивают через косвенные зависимости, идущие от других пакетов (крейтов)?

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

Ничего, что librsvg тоже на rust?

Ничего что это все обвертки вокруг сишных библиотек где перманентно юзается ключевое слово unsafe более сто раз?

Если ключевое слово unsafe встречается в раст коде более 40 раз - это не раст, это си но с красивым синтаксисом.

4.2 язабан

в любой ситуации бань опонента, если его мнение не совпадает с твоим.

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

Разве на этом вашем расте принципиально нельзя писать stand-alone библиотеки с реализациями чего-то, как на си?

Можно, но программистам лень. А выдавать это за 100% Rust не лень. Любой серьезный проект превращает Rust в скриптовую тонкую прокладку, выполняющую роль передатчика между сишными библиотеками где выполняется большая часть полезной нагрузки.

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

Ничего, что librsvg тоже на rust?

librsvg существует с 2001-го года. Лишь недавно, с октября 2016-го, её начали портировать на rust. И всего несколько месяцев назад, якобы, завершили этот процесс (для основной библиотеки).

Не знаю, насколько библиотека от этого выиграла. А вот насколько проиграла - очевидно. В Debian на сборочной машине binet для архитектуры amd64 можно проследить следующее:

|    дата    |  версия   | время сборки, мин | место на диске |
|------------|-----------|-------------------|----------------|
| 20.12.2017 | 2.40.20-1 |         2         |      27,04 МБ  |
|  1.04.2018 | 2.42.3-1  |         6         |     387,81 МБ  |
| 29.08.2018 | 2.44.1-1  |        10         |     782,98 МБ  |
|  2.11.2018 | 2.44.8-1  |        13         |   1,3 ГБ       |

(Жаль, что нет инфы касательно потребности в оперативке.)

Время сборки увеличилось более чем в 6 раз, необходимое место на диске в 50 раз. И это менее чем за год. По сравнению с 16-ю годами Си до прихода rust.

Разве что производители железа могут быть в восторге.

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

Ну вот уж последнее, о чем нужно беспокоиться так это о скорости сборки.

Ты же релиз не собираешь с -O0? А хруст компилер позже оптимизируют в этом плане.

anonymous ()