Я пытаюсь отобразить серию символов UNICODE в таблицу спрайтов.Все это работает довольно хорошо для большинства символов, в том числе кириллических.
Однако при использовании GetCharABCWidthsFloat
с определенными символами CJKV параметр ABCFLOAT::abcfB
обеспечивает значение ниже ожидаемого.Он не учитывает поднятия или свесы, что является точной целью азбуки:
Интервал B - это ширина нарисованной части глифа символа.
Источник: ABCFLOAT |Документы Microsoft
Как видите, все символы не перекрываются слева направо, кроме последних нескольких символов:
Я справляюсь с этим, создавая настраиваемую опцию заполнения, чтобы обрабатывать такие случаи, но это раздувает остальные символы и, следовательно, требует большей поверхности:
Используется шрифт Arial.Для символа 美
ABC возвращает (2, 10, 2), что соответствует сумме с шагом в 14 пикселей, тогда как на самом деле необходимо 17 пикселей.
Я использую TextOut
для фактической визуализацииГлифы, но мне интересно, есть ли кто-то, кто испытал это и придумал универсальное решение.
Использование таких функций, как GetTextExtentPoint32W
или DrawTextEx
, чтобы получить прямоугольник, не позволяет получить точный символразмещение, в котором и заключается весь смысл азбуки.А некоторые не упомянутые функции работают только со шрифтами TrueType.
Я спрашиваю, переходят ли определенные символы на другой шрифт при определенных условиях, что приводит к неточным результатам.Если это так, есть ли способ определить, недоступен ли символ для шрифта, зная, что Windows делает автоматически, чтобы я мог воспроизвести поведение?То есть есть какой-то способ определить, когда символ должен использовать другой шрифт, и способ определить, каким должен быть этот шрифт?
Я уже давно сталкиваюсь с этой проблемой, поэтомуЛюбой, кто имеет опыт работы с этими API, будет очень рад!