Harfbuzz 在字体文件中选择本地斜线字符

Posted

技术标签:

【中文标题】Harfbuzz 在字体文件中选择本地斜线字符【英文标题】:Harfbuzz selection local slash char in font file 【发布时间】:2016-11-03 11:48:41 【问题描述】:

我有一个名为 MyriadHebrew-Regular.otf 的系统字体

我使用的是“斜线”字符(代码 47),但后来我注意到那个 Adobe After Effects 使用的有点不同。然后我检查了 FontCreator程序中的字体,发现可以使用default 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(本地的,如 Adob​​e 后效),但它仍然是 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);

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

【讨论】:

由于这是一个 AALT 字形,是否还需要设置本地化语言 he?还是独立于使用的语言?

以上是关于Harfbuzz 在字体文件中选择本地斜线字符的主要内容,如果未能解决你的问题,请参考以下文章

通过 Harfbuzz 和 FreeType 在文本编辑器中显示混合复杂脚本

去掉点阵字体中的斜线

icu4c opentype harfbuzz 的区别

CSS中带斜线的字体大小

Chrome 103支持使用本地字体,纯前端导出PDF优化

Chrome 103支持使用本地字体,纯前端导出PDF优化