Как получить Unicode глифа, используя freetype? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать freetype для перечисления глифов (имя и юникод) в файле шрифта.

Для получения имени я использую FT_Get_Glyph_Name. Но как я могу получить значение Юникода глифа?

Я новичок ie в глифе и шрифте.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Не все глифы в шрифте обязательно будут иметь кодовую точку Unicode. В текстовом отображении OpenType существует отображение am: n между последовательностями символов Unicode и последовательностями глифов. Если вас интересует связь между кодовыми точками Unicode и глифами, то наиболее разумно было бы использовать отображение из кодовых точек Unicode в глиф по умолчанию , который содержится в таблице шрифтов cmap.

Дополнительные сведения см. В разделе OpenType spe c: расширенные типографские данные c Расширения - макет OpenType .

Что касается глифа имен , у каждого глифа может быть имя, независимо от того, отображено ли оно из кодовой точки в таблице 'cmap' или нет. Имена глифов содержатся в таблице «post». Но не все шрифты обязательно включают имена глифов. Например, шрифт CJK вряд ли будет включать имена глифов.

0 голосов
/ 10 марта 2020

Можно ожидать, что 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.

...