2016-11-22 7 views
3

Я пишу простой рендеринга растрового шрифта для OpenGL, и я бы хотел отобразить и Unicode. Однако во многих шрифтах некоторые символы отсутствуют и отображаются как квадраты. Поэтому они теряют пространство в моей текстуре, и я хочу избавиться от них. Есть ли функция WinAPI для определения того, будет ли определенный символ отображаться как квадрат tofu с использованием определенного шрифта?В Windows, как определить, отображается ли символ Юникода как квадрат (тофу)?

Я использую GDI, я делаю закадрового растрового изображения с помощью CreateDIBSection, а затем получить шрифт с помощью CreateFontIndirect и визуализации глифы использованием ExtTextOutW.

До сих пор я думал об обнаружении тофу в растрированной форме (путем сравнения пикселей), который работает, но я думаю, что это не очень приятно. Это также требует, чтобы я получил некоторый символ Юникода, которого данный шрифт точно не имеет, чтобы получить «шаблон» для сравнения. Наверное, я рано или поздно попаду в беду.

+1

Задайте [GetFontUnicodeRanges()] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd144887 (v ​​= vs.85) .aspx)? –

+0

@AlexK. поддерживает ли это символы, отличные от BMP? Структура WCRANGE не резервирует суррогатные пары ... – andlabs

+0

Как вы готовите текстуры? GDI? GDI +? DirectWrite? Ручная обработка файлов TTF/OTF? – andlabs

ответ

2

Мне нужно было сделать что-то подобное для реализации моего собственного связывания шрифтов и замены шрифта при создании карт глифов для 3D-рендеринга. Я использовал Uniscribe для преобразования строки символов в строку индексов глифов в шрифт. Затем я использовал ScriptGetFontProperties, чтобы получить свойство wgDefault для шрифта и сравнил значение с каждым из индексов глифов.

Чистый GDI эквивалент было бы использовать что-то вроде GetCharacterPlacement для преобразования текста в глиф индексы (а затем использовать ExtTextOut с ETO_GLYPH_INDEX), но я не думаю, что делает все ключевые формирование и изменение порядка, что Uniscribe бы , Для начала, я не думаю, что это будет работать для чего-либо, кроме BMP.

Вы не хотите графически соответствовать отсутствующему символьному символу, потому что это не всегда квадрат. Например, в некоторых шрифтах это черный бриллиант с вопросительным знаком.