LINUX.ORG.RU

Чем отрендерить строку текста в буфер?

 , ,


0

2

https://github.com/puzrin/lbprint

Мне надо рендерить строки текста в черно-белый битмап, чтобы печатать на принтере этикеток. Сейчас это делается через пакет canvas, но он уже заманал тем что с новыми нодами время от времени перестает работать.

Есть желание чего-нибудь собрать c emscripten конкретно для рендеринга текста. Опыт сборки FreeType имеется. Но есть проблема - фритайп только про рендеринг единичных глифов, а мне надо именно строку, с кернингом и т.п. Есть всякие Harfbuzz, Pango, FreeBidi, но я в этом совсем не рублю.

Посоветуйте, куда копать. Надо рендерить просто строку текста (на любом языке), без переносов. Чтобы на вход засунуть юникод, а на выходе получить битмап и параметры фонта (где baseline и т.п., чтобы правильно несколько строк расположить).

Может есть уже готовые снипеты под мои нужды?

★★★★★

Так на freetype, вроде, это делается десятком строк кода. Или ты принципиально не хочешь вручную?

Puzan ★★★★★ ()

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

Не совсем верно, вот тут уже лет 20 живут рабочие примеры https://www.freetype.org/freetype2/docs/tutorial/step1.html

Единственно что там неудобно, то что перед рендером надо б из размеров боксов прикинуть размер битмапы, куда бы точно всё влезло.

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

Фритайп хавает кертинг только из таблицы kern, а многие фонты уже съехали в GPOS. По крайней мере год назад было так. И в доке они сами пишут, что для layout management нужны внешние библиотеки.

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

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

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

На фритайпе в десять строк кода ты сделаешь только helloworld. А с продвинутыми фонтами и каким-нибудь арабским это все навернется.

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

На фритайпе в десять строк кода ты сделаешь только helloworld

Ну хз. Лет 10-11 назад делал драйвер для печати на термопринтер с использованием freetype. Арабский, правда, не печатал, но русский и разновидности латинского нормально выводились. Код бы только найти.

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

Нет смысла. Я представляю о чем пишу. Мне надо чтобы рендерился любой фонт, а не один специально выбранный. То что делал ты - сильно частный случай по нынешним меркам.

https://github.com/lvgl/lv_font_conv/blob/master/lib/collect_font_data.js - вот пример, где пришлось костылять потому что голый фритайп кернинг не всегда видит.

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

не один специально выбранный

Справедливости ради: шрифты были разные. Но я тебя понял.

Puzan ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей