GetCharABCWidthsFloat работает для большинства UNICODE, кроме символов CJKV - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь отобразить серию символов UNICODE в таблицу спрайтов.Все это работает довольно хорошо для большинства символов, в том числе кириллических.

Однако при использовании GetCharABCWidthsFloat с определенными символами CJKV параметр ABCFLOAT::abcfB обеспечивает значение ниже ожидаемого.Он не учитывает поднятия или свесы, что является точной целью азбуки:

Интервал B - это ширина нарисованной части глифа символа.

Источник: ABCFLOAT |Документы Microsoft

Как видите, все символы не перекрываются слева направо, кроме последних нескольких символов:

Tight

Я справляюсь с этим, создавая настраиваемую опцию заполнения, чтобы обрабатывать такие случаи, но это раздувает остальные символы и, следовательно, требует большей поверхности:

Loose

Используется шрифт Arial.Для символа ABC возвращает (2, 10, 2), что соответствует сумме с шагом в 14 пикселей, тогда как на самом деле необходимо 17 пикселей.

Я использую TextOut для фактической визуализацииГлифы, но мне интересно, есть ли кто-то, кто испытал это и придумал универсальное решение.

Использование таких функций, как GetTextExtentPoint32W или DrawTextEx, чтобы получить прямоугольник, не позволяет получить точный символразмещение, в котором и заключается весь смысл азбуки.А некоторые не упомянутые функции работают только со шрифтами TrueType.

Я спрашиваю, переходят ли определенные символы на другой шрифт при определенных условиях, что приводит к неточным результатам.Если это так, есть ли способ определить, недоступен ли символ для шрифта, зная, что Windows делает автоматически, чтобы я мог воспроизвести поведение?То есть есть какой-то способ определить, когда символ должен использовать другой шрифт, и способ определить, каким должен быть этот шрифт?

Я уже давно сталкиваюсь с этой проблемой, поэтомуЛюбой, кто имеет опыт работы с этими API, будет очень рад!

1 Ответ

0 голосов
/ 31 января 2019

Из документации по GetCharABCWidthsFloat :

Ширина ABC символа по умолчанию используется для символов вне диапазона текущего выбранного шрифта.

Arial содержит много символов, включая кириллицу, но не содержит иероглифов CJKV.Другие вызовы, связанные с текстом, могут создать у вас ложное впечатление, что они содержат эти символы (через механизм шрифтов по умолчанию / резервный).

Перед использованием (возможно, перед получением) ABCFLOAT, вы должны сначала проверить, что символыВы хотите, чтобы метрики находились в пределах диапазона текущего выбранного шрифта.

...