Jump to content
    

растеризация ttf-шрифтов на Си

Приветствую. Возможно данная тема поднималась уже тут когда-то, но сходу что-то путное не нашел.

Задача состоит в том, чтобы использовать для печати текста шрифты TrueType, вместо самопальных, растеризованных на компе и сохраненных в виде растровой матрицы. Так-то оно работает нормально, но в последнее время люди стали очень щепетильные ко всяким красявостям, и замена шрифтов на лету(без программ перекодировки и пр.) становится напряжным делом. Поэтому решил добавить функционал реалтайм растеризации непосредственно из .ttf файла.

Сходу нашел только это https://blog2k.ru/archives/3530

Может есть что-то более легковесное?

Share this post


Link to post
Share on other sites

да, freetype тащить идея так себе.

https://github.com/nothings/stb/blob/master/stb_truetype.h

как промежуточный вариант, на компе можно распарсить ttf тем же freetype или стандартными виндовыми средствами, выдрать координаты вершин для каждого символа, и потом рендерить уже этот "свой" векторный шрифт, заодно даже Безье можно линейными отрезками resampling сделать, чтобы рендер упростить.

От дополнительного конвертера в ПК это конечно не спасёт, но хоть весить будет не как растр и проблем с масштабированием не будет.

  HFONT f = CreateFontA(1000, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY, FF_DONTCARE, "arial");
  SelectObject(hdc, f);
  BeginPath(hdc);
  TextOutA(hdc, 0, 0, "съешь ещё этих мягких французских булок", ???);
  EndPath(hdc);
  DeleteObject(f);
  pc = GetPath(hdc, 0, 0, 0);
  points = malloc(sizeof(POINT)*pc);
  types = malloc(sizeof(BYTE)*pc);
  GetPath(hdc, &points[0], &types[0], pc);
  ReleaseDC(0, hdc);

Честный парсер ttf выглядит как-то страшно, туда столько всего напихано. Размер библиотеки freetype на это как бы намекает.

Share this post


Link to post
Share on other sites

3 часа назад, _pv сказал:

От дополнительного конвертера в ПК это конечно не спасёт, но хоть весить будет не как растр и проблем с масштабированием не будет.

Да это как-раз не проблема, памяти полно, а вот от компа как-раз бы и избавится, ибо поправить несколько циферок в конфиг-файле куда проще, чем запускать всякие конвертеры, парсеры и пр... Очень уж смахивает на линуксовый мазахизм, большинство с этим связываться в принципе не желает...

Масштабирование, к тому же динамическое не нужно, размеры шрифта фиксированные и их не много (Это формы ГУЯ, у меня не графический редактор :biggrin:)

Идея вообще такая - при создании формы гуя, выбирается необходимый размер и тип шрифта, эти параметры записываются в конфиг, вместе с именем шрифта ttf. Затем, при запуске системы происходит растеризация нужного шрифта и используемых размеров в память, а потом уже программа печатает на экране, как обычный растровый шрифт. Ну потрачу я при старте секунды 2 на растеризацию, да и фиг с ним, зато удобно при проектировании и смене шрифтов...

Edited by mantech

Share this post


Link to post
Share on other sites

6 minutes ago, mantech said:

Очень уж смахивает на линуксовый мазахизм,

:lol2: Нет, мазохизм - это ваши мучения, вместо -lfreetype

 

9 minutes ago, mantech said:

размеры шрифта фиксированные и их не много

Так растеризуйте все сразу и упакуйте LZMA - возможно, дешевле выйдет.

 

Share this post


Link to post
Share on other sites

15 минут назад, aaarrr сказал:

мазохизм - это ваши мучения, вместо -lfreetype

А это-то тут причем, не спорю, под линуксом наверно проще подключить готовую либу, чем портировать ее потроха на контроллер, там другого мазохизма полно...

16 минут назад, aaarrr сказал:

Так растеризуйте все сразу и упакуйте LZMA - возможно, дешевле выйдет.

Так в этом и вопрос, как растеризовать стандартный шрифт в контроллере, а не на ПК...

Share this post


Link to post
Share on other sites

5 minutes ago, mantech said:

там другого мазохизма полно...

Так только кажется.

 

6 minutes ago, mantech said:

Так в этом и вопрос, как растеризовать стандартный шрифт в контроллере, а не на ПК...

На ПК имел в виду растеризовать. Если шрифтов и размеров не очень много, вполне вероятно, что набор растеризованных и упакованных займет в итоге меньше, чем freetype + кучка ttf'ов.

Share this post


Link to post
Share on other sites

Только что, aaarrr сказал:

На ПК имел в виду растеризовать. Если шрифтов и размеров не очень много, вполне вероятно, что набор растеризованных и упакованных займет в итоге меньше, чем freetype + кучка ttf'ов.

Ладно, видимо мой посыл непонятен, постораюсь объяснить со стороны простого юзера...

Вот естьу юзера автомат, с красивыми картинками, но через полгода ему они надоедают и он звонит в поддержку, типа картинки надоели - хочу новые, как изменить сами картинки - понятно, идешь к дизайнеру, говоришь, "хочу вот это только с перламутровыми пуговицами", дизайнер рисует нужные gif, jpeg, png... И дело в шляпе, юзер переписывает на своем ноуте, телефоне, неважно на чем, новые картинки поверх старых и радуется еще полгода... А вот со шрифтами гораздо сложнее - "вот моя жена сказала, что этот шрифт с завитушками выглядит красивее"... И началось, даешь юзеру мануал, где написано... Возьмите свой шрифт, установите конвертер, запустите... загрузите, выберите размеры, кодовую страницу, потом добавьте, еще размер... Потом сохраните в файл, затем запустите парсер, в командной строке задайте параметры, имя источника, получателя... 

Вот это я сравнивал с линуксовым мазохизмом.

Вообщем после этого юзер долго думает и говорит "а попроще чего-то нет?"... И я согласен, проходить такой квест особо нет желания, даже меня иногда напрягает, куда проще сказать, открой ини-файл, найди там "старыйшрифт.ttf" и замени его на "шрифтсзавитушками.ttf"и будет тебе счастье, а если размер другой нужен, то поправь еще эти 4 циферки...

 

13 минут назад, aaarrr сказал:

что набор растеризованных и упакованных займет в итоге меньше, чем freetype + кучка ttf'ов.

Да я могу выделить под растр 2мегабайта, да хоть 4, есть место и упаковывать даже ничего не надо...

Share this post


Link to post
Share on other sites

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

 

Думаю, лучше задействовать libfreetype полностью (в смысле, без попыток что-то вычленить/переписать).

Share this post


Link to post
Share on other sites

5 minutes ago, mantech said:

Вообщем после этого юзер долго думает и говорит "а попроще чего-то нет?"... И я согласен, проходить такой квест особо нет желания, даже меня иногда напрягает, куда проще сказать, открой ини-файл, найди там "старыйшрифт.ttf" и замени его на "шрифтсзавитушками.ttf"и будет тебе счастье, а если размер другой нужен, то поправь еще эти 4 циферки...

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

 

 

Share this post


Link to post
Share on other sites

4 минуты назад, _pv сказал:

aaarrr пытается донести что можно заранее отрендерить всевозможные атласы "старыйшрифт.png", "шрифтсзавитушками.png", и пусть пользователь

Во первых это немало работы, кто ее будет делать непонятно... Во вторых я не знаю, что хотят юзеры, тут очень хорошо подходит фраза "на вкус и цвет фломастеры разные", конвертировать все великое множество шритов, да еще и с разными размерами - это бред, ИМХО.

А что не так с ФС? Обычная СД карта, с фат32, пусть пишет, ну сотрет что-нить или нарушит, система в кирпич не превратится, это не планшет с несъемным НАНДом... Нужные файлы шифрованы, проверяются по КС, что попало туда не впиндюрить...

Edited by mantech

Share this post


Link to post
Share on other sites

40 minutes ago, mantech said:

Во первых это немало работы, кто ее будет делать непонятно... Во вторых я не знаю, что хотят юзеры, тут очень хорошо подходит фраза "на вкус и цвет фломастеры разные", конвертировать все великое множество шритов, да еще и с разными размерами - это бред, ИМХО.

ну так соберите freetype, и посмотрите сколько отрендеренных шрифтов в этот же объём влезет. а для разных размеров есть SDF.

ну или stb_truetype, он куда скромнее freetype должен быть, меньше/проще имхо не найти.

нормальных шрифтов на самом деле не сказать чтоб великое множество, вон всякие читалки вроде kindle имеют десяток на выбор, при том что это читалка, и пользователь 100% времени непосредственно в эти буковки пялится, а вовсе не какой-то GUI и три надписи на кнопочках.

Share this post


Link to post
Share on other sites

6 часов назад, _pv сказал:

ну или stb_truetype, он куда скромнее freetype должен быть, меньше/проще имхо не найти.

Интересный вариант, только я чет не понял, весь код в хидере что-ли воткнут? Оригинально)))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...