Можно ожидать, что FT_CharMap
будет содержать эту информацию:
[...] Текущий активный charmap доступен как face->charmap
.
, но, к сожалению, он определяет только кодирование (Unicode, MacRoman, Shift-JIS et c.). Очевидно, что поиск кода выполняется в другом месте - и .notdef
просто возвращается, когда этот символ в конце концов недоступен.
Поиск в одном из моих собственных рендереров OpenType на основе FreeType который сообщает «по имени», где это возможно, я нашел в последовательности инициализации некоторый код, в котором хранится имя глифа, если он есть, и Unicode в другом. Но этот код был основан на наличии глифа names .
Подумав еще: вы можете протестировать каждый возможный код Unicode codepoint и посмотреть, вернется ли он 0
(.notdef
) или действительный индекс глифа. Поэтому инициализируйте пустую таблицу для всех возможных глифов и заполняйте Unicode каждого из них только в том случае, если следующая подпрограмма найдет его.
Для шрифта умеренно современного типа вам нужно проверить только Unicode U + FFFF; для чего-то вроде тяжелого китайского шрифта (до U + 2F9F4 для Heiti S C) или Emoji (до U + 1FA95 для Segoe UI Emoji) вам понадобится довольно большой массив. (Получение этого максимального числа из шрифта - совершенно другая история, увы. Решение, что делать, зависит от того, для чего вы хотите его использовать.)
printf ("num glyphs: %u\n", face->num_glyphs);
for (code=1; code<=0xFFFF; code++)
{
glyph_index = FT_Get_Char_Index(face, code);
/* 0 = .notdef */
if (glyph_index)
{
printf ("%d -> %04X\n", glyph_index, code);
}
}
Этот короткий фрагмент C выводит на печать таблица перевода из индекса глифа шрифта в соответствующий Unicode. Имейте в виду, что (1) не всем глифам в шрифте необходимо иметь Unicode, связанный с ними. У некоторых шрифтов есть тонны «лишних» глифов, которые будут использоваться в заменах OpenType (таких как альтернативные дизайны и пользовательские лигатуры) или других целях (таких как вышеупомянутый Emoji Segoe UI; он содержит цветовые маски для всех своих эмодзи). И (2) некоторые глифы могут быть связаны с несколькими символами Юникода. Например, рисунок глифа для A
может использоваться как латинская заглавная буква A, так и греческая заглавная буква Alpha.