Uniscribe Kerning - PullRequest
       41

Uniscribe Kerning

4 голосов
/ 05 августа 2009

На работе мне было поручено улучшить отрисовку текста в нашем приложении, чтобы лучше поддерживать кернинг символов. Наше приложение генерирует изображения, которые появляются на телевидении, поэтому качество изображения имеет первостепенное значение. Поэтому даже небольшие улучшения внешнего вида любого генерируемого нами вывода очень полезны.

Наш текущий текстовый движок реализован с использованием Uniscribe, что кажется идеальным решением. Как уже упоминалось здесь , он поддерживает подстановку лигатур контекстно-зависимым способом со сложными сценариями. Он также обрабатывает языки справа налево и BiDi. Это все важно, так как мы должны уметь отлично отображать арабский / курсивный языки.

Поэтому кажется довольно странным, что Uniscribe не выводит информацию о кернинге глифов. Я приложил скриншот, чтобы продемонстрировать проблему.

альтернативный текст http://www.aliparr.net/kerning.jpg

Мое приложение работает так же, как блокнот, в котором каждый глиф выглядит моноширинным. Обратите внимание, что в Photoshop CS2 мост в верхней части буквы «T» приятно нависает над «e». Я хочу воссоздать это.

Мне известны другие API, такие как Pango / Freetype, но кажется довольно тяжелым решением включить все это, чтобы выполнить последний 1% этой задачи, если Uniscribe так хорош во всем остальном.

Я пропустил шаг, используя Uniscribe? Каково лучшее решение для этого? Может ли Freetype экспортировать информацию о кернинге легким способом, чтобы я мог интегрировать ее с существующим решением Uniscribe?

N.b. Нам нужно работать только на Windows - к счастью, переносимость платформы - это не та проблема, о которой мне нужно беспокоиться прямо сейчас.

Ура заранее!

Ответы [ 3 ]

1 голос
/ 27 декабря 2013

Вы можете вручную реализовать кернинг с помощью 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.

0 голосов
/ 30 октября 2014

По умолчанию ScriptShape / ScriptPlace применяет кернинг, если выбранный шрифт поддерживает его. Однако, если вы хотите включить / выключить его, вы должны использовать OpenType Api's uniscribe.

0 голосов
/ 21 ноября 2009

Если вы работаете в Windows XP, я считаю, что вы должны включить следующее в региональных параметрах панели управления:

  • Установка файлов для сложных скриптов и языков с написанием справа налево (включая тайский)
  • Установка файлов для восточноазиатских языков

для Uniscribe кернинга для работы.

...