У меня есть строка и массив, который содержит каждый символ формата строки: цвет и шрифт. Теперь я использую библиотеку XFT для рисования этой строки char-by-char, используя соответствующий цвет и шрифт (функция XftDrawStringUtf8). Но этот подход медленный.
Я думал о сканировании строки и рисовании фрагментов в одном и том же формате сразу. Но этот подход в некоторых обстоятельствах (если каждый символ имеет разный формат) может быть даже медленнее, чем подход «символ за символом».
Кроме того, я где-то читал, что рисование строки char с помощью char не является хорошим подходом с типографской точки зрения. Кое-что о кернинге.
Есть ли более быстрый и лучший способ использования библиотеки XFT? Или с помощью другой библиотеки?
Вы можете использовать расширение Render с запросами CreateGlyphSet / CompositeGlyphs.
GlyphSet — это массив прямоугольных растровых изображений со смещением. С помощью запроса CompositeGlyphs вы можете отрисовать в одном запросе (один сетевой пакет в одну сторону) довольно много: он принимает массив «элементов глифсета», который представляет собой «массив идентификаторов символов» + смещение от конца последнего символа в «массиве идентификаторов». ИЛИ идентификатор другого глифсета для использования. Вы можете настроить пары кернинга, разбив входную строку на подстроки в точке, где кернинг не равен нулю. Цвета немного сложнее, один из способов — использовать исходное изображение (RenderCompositeGlyphs использует визуализированный текст в качестве маски), предварительно окрашенное прямоугольниками нужного цвета.
На практике, особенно если вам нужно поддерживать сложные сценарии (например, арабский), я бы предложил отрисовывать все на растровом изображении на стороне клиента с помощью некоторой высокоуровневой библиотеки (Pango / Cairo) и переносить полученное изображение в свой чертеж.
Если вы просто исследуете возможные ограничения, другой подход в дополнение к расширению Render — попытаться отрендерить все, используя GPU с вершинными и фрагментными шейдерами (взгляните на glyphy проект. Также хороший источник информации о рендеринге текста в целом на Бехдад Исфахбод страница)