Перейти к содержанию
    

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да, 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 на это как бы намекает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, mantech said:

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

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

 

9 minutes ago, mantech said:

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, mantech said:

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

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

 

6 minutes ago, mantech said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, mantech said:

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, mantech said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...