LINUX.ORG.RU

Современный «конвеер» вывода текста и растеризация шрифтов

 , , ,


0

2

Привет всем. Хотелось бы получить общее понимание того, как выводится текст на экран в современных ОС. Речь пойдет о векторных шрифтах, например TrueType формата ttf.

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

Главный вопрос: растеризация происходит на CPU или GPU? В том и другом случае как вычисленный растр будет добираться до нужной позиции в окне приложения на экране?(связано ли как-то дело с контекстом для OpenGL)

Напишу, что знаю. Шрифт делится на отдельные глифы - изображения каждого символа, заданные векторной графикой (путями) и байткодом специальной виртуальной машины, вносящим правки в процесс растеризации.

Глифы растеризуются в кусок текстуры, содержащей непосредственно цвет в одноканальном формате (самый простой способ вывести символы) либо дистанцию от центра пикселя до ближайшей линии глифа (более сложный способ signed distance field font rendering, который взамен сложности даёт хорошее качество глифа при его массштабировании; именно этот способ используется в Qt и других качественных библиотеках).

Кусочки текстуры для каждого глифа складываются в одну большую текстуру, чтобы реже переключать состояние OpenGL. При рендеринге из текстуры с дистанциями придётся использовать фрагментный шейдер.

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

quiet_readonly ★★★★ ()

Это слово пишется так: «конвейер». Конвейер, Карл!

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

Конвейер) Бывает, когда какие-то слова очень редко использую в письме.

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

То есть как минимум на Qt, рендеринг текста происходит с помощью OpenGL?

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

Современный конвейер это библиотека Xft. Она использует библиотеку fontconfig для поиска шрифтовых файлов, библиотеку freetype для растеризации векторных шрифтов, и расширение протокола X11 под названием XRENDER для рендеринга растеризованных глифов в окно X11.

iliyap ★★★★ ()

Растеризация проводится на CPU через freetype: выбирается символ конкретного размера и выводится в битмап, также из шрифта берутся всякие отступы, кернинг. Полученный битмап можно вывести разными способами, в т.ч. запихнуть в opengl-текстуру

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

Да, у Qt это основной бекенд.

Разве? QtWidgets'ы вроде до сих пор на xcb/xlib, без OpenGL. То что вы расписали, справедливо для QtQuick/QML.

EXL ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.