2016-07-01 8 views
1

У меня есть системный шрифт под названием MyriadHebrew-Regular.otfHarfBuzz выбора местного слэш символ в файле шрифта

Я использовал «слэш» символ (код 47), но потом я заметил, что один, который используется Adobe After Эффекты немного разные. Затем я проверил шрифт в программе FontCreator и обнаружил, что можно использовать по умолчанию char (47), или его локализованную версию (отображается как слэш 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 (локальный, как в After Effects 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); 

............................

+0

Как это AALT глиф, все еще нужно, чтобы локализованный язык «он» установлен? Или он не зависит от используемого языка? – usr2564301