Harfbuzz выделение локальной косой черты в файле шрифта
У меня есть системный шрифт MyriadHebrew-Regular.otf
Я использовал char "slash" (код 47), но потом заметил, что тот, который используется в Adobe After Effects, немного отличается. Затем я проверил шрифт в программе FontCreator и обнаружил, что можно использовать char по умолчанию (47), или его локализованная версия (выглядит как slash.1), которая находится в конце карты глифа шрифта. Индекс глифа равен 587. Поэтому я пытался получить доступ к локализованному глифу с помощью Harfbuzz:
.......
hb_buffer_t *m_hb_buffer = NULL;
hb_font_t *m_hb_font = NULL;
std::wstring str = L"שתץףך /";
const wchar_t* text = str.data();
hb_buffer_t *m_hb_buffer = hb_buffer_create();
hb_buffer_set_direction(m_hb_buffer, HB_DIRECTION_RTL);
hb_buffer_set_script(m_hb_buffer, HB_SCRIPT_HEBREW);
hb_buffer_set_language(m_hb_buffer, hb_language_from_string("he", 2));
hb_buffer_add_utf16(m_hb_buffer, (uint16_t*)text, -1, 0, -1);
hb_feature_t ft;
hb_feature_from_string("locl",-1, &ft); // ft.tag = 1819239276; ft.value = 1
hb_shape(m_hb_font, m_hb_buffer,&ft, 1);
hb_glyph_info_t *m_info = hb_buffer_get_glyph_infos(m_hb_buffer, NULL);
FT_UInt glyph_index = m_info[0].codepoint; // glyph_index = 400 instead of localized glyph_index=587
.......
В этом коде я ожидал, что glyph_index = 587 (локальный, как в последействии Adobe), но вместо этого он все еще равен 400 (стандартный).
Любая помощь будет оценена.
1 ответ
Для решения этой проблемы требуется дополнительная функция "aalt", которая позволяет делать замену:
..............................
hb_feature_t ft[2];
hb_feature_from_string("aalt", -1, &ft[0]);
hb_feature_from_string("loca",-1, &ft[1]);
hb_shape(m_hb_font, m_hb_buffer,(const hb_feature_t*)&ft[0], 2);
............................