Uniscribe Kerning
На работе мне было поручено улучшить отрисовку текста в нашем приложении, чтобы лучше поддерживать кернинг символов. Наше приложение генерирует изображения, которые появляются на телевидении, поэтому качество изображения имеет первостепенное значение. Поэтому даже небольшие улучшения внешнего вида любого вывода, который мы генерируем, очень полезны.
Наш текущий текстовый движок реализован с использованием Uniscribe, что кажется идеальным решением. Как упомянуто здесь, он поддерживает лигатурную замену контекстно-зависимым способом со сложными сценариями. Он также обрабатывает языки справа налево и BiDi. Это все важно, так как мы должны уметь отлично отображать арабский / курсивный языки.
Поэтому кажется довольно странным, что Uniscribe не выводит информацию о кернинге глифов. Я приложил скриншот, чтобы продемонстрировать проблему.
http://www.aliparr.net/kerning.jpg
Мое приложение работает так же, как блокнот, в котором каждый глиф выглядит моноширинным. Обратите внимание на то, как в Photoshop CS2 мост в верхней части буквы "T" приятно нависает над "e". Я хочу воссоздать это.
Я знаю о других API, таких как Pango/Freetype, но кажется, что это довольно тяжеловесное решение, включающее все это только для того, чтобы выполнить последний 1% этой задачи, если Uniscribe так хорош во всем остальном.
Я пропускаю шаг, используя Uniscribe? Каково лучшее решение для этого? Может ли Freetype экспортировать информацию о кернинге легким способом, чтобы я мог интегрировать ее с существующим решением Uniscribe?
Nb Нам нужно работать только на Windows - переносимость платформы, к счастью, не является проблемой, о которой мне нужно беспокоиться прямо сейчас.
Ура заранее!
3 ответа
Вы можете вручную реализовать кернинг с помощью Uniscribe.
Я сделал это вручную, создав const int *piJustify
аргумент ScriptTextOut.
// Initially the justification is simply a copy of the advance array
int* piJustify = (int *)malloc(pcGlyphs);
memcpy(piJustify, piAdvance, pcGlyphs);
// Apply kerning to each glyph
for (size_t i = 0; i < pcGlyphs; i++) {
if (psva[i].fClusterStart) {
// Only add kerning to the first glyph in each cluster
piJustify[i] += myKerning;
}
}
Это предполагает, что вы уже вызвали ScriptItemize, ScriptShape и ScriptPlace для pcGlyphs
, piAdvance
а также psva
,
По умолчанию ScriptShape/ScriptPlace применяет кернинг, если выбранный шрифт поддерживает его. Однако, если вы хотите включить / выключить его, вы должны использовать OpenType Api's uniscribe.
Если вы работаете в Windows XP, я считаю, что вы должны включить следующее в региональных параметрах панели управления:
- Установите файлы для сложных скриптов и языков с написанием справа налево (включая тайский)
- Установить файлы для восточноазиатских языков
для Uniscribe кернинга на работу.