Какой самый быстрый способ нарисовать цветную строку с помощью библиотеки XFT?

#c #graphics #rendering #xlib #xorg

#c #графика #рендеринг #xlib #xorg

Вопрос:

У меня есть строка и массив, которые содержат все символы строкового формата: цвет и шрифт. Теперь я использую библиотеку XFT для рисования этой строки по символам, используя соответствующий цвет и шрифт (функция XftDrawStringUtf8). Но этот подход медленный.

Я подумал о сканировании строки и одновременном рисовании фрагментов в том же формате. Но этот подход в некоторых случаях (если каждый символ имеет разный формат) может быть даже медленнее, чем подход «по символам».

Кроме того, я где-то читал, что рисование строки по символам не является хорошим подходом с типографской точки зрения. Кое-что о кернинге.

Есть ли более быстрый и лучший способ с использованием библиотеки XFT? Или использовать другую библиотеку?

Ответ №1:

Вы можете использовать расширение рендеринга с запросами CreateGlyphSet / CompositeGlyphs.

GlyphSet — это массив прямоугольных растровых изображений со смещениями. Используя запрос CompositeGlyphs, вы можете довольно много отображать в одном запросе (одним сетевым пакетом в одну сторону): для использования требуется массив «элементов набора символов», который представляет собой «массив идентификаторов символов» смещение от конца последнего символа в «массив идентификаторов» ИЛИ идентификатор другого набора символов. Вы можете настроить пары кернингов, разделив входную строку на подстроки в точке, где кернинг не равен нулю. Цвета немного сложнее, одним из способов было бы использовать исходное изображение (RenderCompositeGlyphs использует визуализированный текст в качестве маски), предварительно раскрашенное прямоугольниками нужного вам цвета.

На практике, особенно если вам нужно поддерживать сложные скрипты (например, арабский), я бы посоветовал отображать все на стороне клиента в пикселях с помощью какой-либо высокоуровневой библиотеки (Pango / Cairo) и передавать полученное изображение в ваш drawable

Если вы просто изучаете возможные ограничения, другой подход в дополнение к расширению рендеринга заключается в попытке рендеринга всего, используя графический процессор с вершинными и фрагментными шейдерами (взгляните на проект glyphy. Также хороший источник информации о рендеринге текста в целом на странице Behdad Esfahbod)

Комментарии:

1. Вы имеете в виду использование библиотеки xrender или прямую связь с XServer?

2. Расширение XRender — любой клиент, который вы хотите (xrender, xcb-render, python-xib-render, node-x11 и т. Д.)