Comments 12
Неуверен, но вроде бы, в шрифтах есть информация, какие пары букв следует расположить ближе, какие дальше, назвается это кернинг, соотвественно печать букв по отдельности и серией может отличаться визуально.
0
Пока просматривал статью было ощущение «миллион лет до нашей эры». Я даже не про Delphi, а про выбор качественной отрисовки шрифта, которая, как мне показалось, всегда делается системой, только разные прокладки используются. Разве сейчас все, кто хотят использовать хорошую отрисовку шрифта не используют FreeType?
-1
Статья не про качество шрифта, а качество масштабирования. Я не знаю, как с помощью FreeType обеспечить плавное масштабирование текста. Т.е. как сделать так, чтоб отношение высоты текста к его ширине при масштабировании было константой? Если для этого нужно использовать какие-то дополнительные вычисления, то чем FreeType лучше? Если нельзя это сделать одной функцией, как в GDI+, то тем более – какое отношение к теме статьи имеет FreeType?
На этом ресурсе принято обмениваться опытом, знаниями. Можно ли увидеть пример использования FreeType для плавного масштабирования текста?
На этом ресурсе принято обмениваться опытом, знаниями. Можно ли увидеть пример использования FreeType для плавного масштабирования текста?
+1
Интересно, что, например, Microsoft Word не слишком старается правильно масштабировать текст на экране. При стандартном размере 100% ещё есть какая-то надежда, что то, что мы видим на экране будет выглядеть точно так же на печати. А если уменьшить или увеличить масштаб, то строчки съезжают примерно как в первых вариантах.
+1
А почему просто не доставать глифы и умножать на матрицу со scale/rotate/tranlate? Или отдавать, Freetype готовую матрицу аля FT_Glyph_Transform(glyph, matrix, 0)?
0
Возможно я ошибаюсь, но FreeType предназначен для растеризации шрифта. В задачи FreeType не входит «рисование» строк. И уж совсем не задача FreeType, так это «плавное масштабирование текста».
Подготовка:
Алгоритм в общем виде:
FreeType для вывода строки
Это все без учета главной цели: чтобы при любом масштабе отношение высоты строки к ее ширине всегда должно быть константой. Т.е. «продергиваний» ширины строки быть не должно. Плюс еще вычисления.
В статье хотелось описать несколько подходов к плавному масштабу, когда овчинка все еще стоит выделки, не увлекаясь кодом исключительно ради кода.
Честно говоря, ни связи, ни выгод между FreeType и темой статьи не вижу. Опять же, возможно я ошибаюсь, и все можно сделать во FreeType также просто, красиво и быстро, как в GDI+, но пока таким знанием я не владею.
Подготовка:
- Ищем, качаем, ставим freetype-2.x.x-x-setup;
- Или копируем dll с конфигом в папку с проектом. Обычно заказчика очень «радуют» необоснованные дополнительные библиотеки.;
- Или пишем для своего проекта дистрибутив, который разместит FreeType где-то подальше от любопытных глаз, что тоже очень радует заказчика, который любит portable версии.
Алгоритм в общем виде:
- Получили FT_Face для нужного шрифта;
- Установили размер;
- Идем в цикле по каждому символу строки;
- Получаем glyph по каждому символу;
- Получаем кернинг;
- Подсчитываем, где он должен быть выведен, с учетом кернинга и специфических параметров символа (про плавный масштаб пока вообще забыли);
- Попиксельно выводим в нечто промежуточное;
- Освободили все глифы и структуры, выделенные под расчетные дела;
- Освободили фейс;
- Нечто промежуточное выводим в также посчитанную позицию рабочего контекста.
FreeType для вывода строки
Это все без учета главной цели: чтобы при любом масштабе отношение высоты строки к ее ширине всегда должно быть константой. Т.е. «продергиваний» ширины строки быть не должно. Плюс еще вычисления.
В статье хотелось описать несколько подходов к плавному масштабу, когда овчинка все еще стоит выделки, не увлекаясь кодом исключительно ради кода.
А почему просто не доставать глифы и умножать на матрицу со scale/rotate/tranlate— просто не получится, т.к. все равно придется много считать, и тратить массу машинного времени на вывод строки.
Честно говоря, ни связи, ни выгод между FreeType и темой статьи не вижу. Опять же, возможно я ошибаюсь, и все можно сделать во FreeType также просто, красиво и быстро, как в GDI+, но пока таким знанием я не владею.
+1
Напишу, хоть и через 4 года
с помощью GDI тоже можно получить растеризацию шрифта в безье-линиях.
создать Path для текста с большим шрифтом
получить кривые через GetPath
отмасштабировать как нужно
вывести через тот же Path например
0
С помощью FreeType, кстати, тоже можно получить векторные данные, вот пример, который делает SVG из глифа: https://freetype.org/freetype2/docs/tutorial/example5.cpp
0
Only those users with full accounts are able to leave comments. Log in, please.
Плавное масштабирование текста