我之前写过关于 GTK 中字体处理的文章。 这篇文章将重点介绍如何在你的应用程序中使用更高级的字体(和字体选择器)功能。
查找字体
文件选择器最突出的终端用户功能当然是你可以使用搜索条目按名称搜索字体
一个更隐藏的功能是你可以通过各种标准过滤列表。一个标准是仅显示等宽字体,另一个是仅显示涵盖特定语言的字体
这里需要注意的一个小细节是,GTK 会自动更改预览文本以匹配你正在筛选的语言。
少即是多
字体选择器返回一个PangoFontDescription,其中包含所选字体的完整详细信息:字体系列、样式、大小等。如果你的应用程序只需要字体系列,那么让用户选择样式和大小,却最终忽略它们,这会让人感到困惑。
如果你的应用程序是这种情况,你可以使用 gtk_font_chooser_set_level() 和 GtkFontChooserLevel 标志来指示 GTK 你需要的字体详细信息
typedef enum { GTK_FONT_CHOOSER_LEVEL_FAMILY = 0, GTK_FONT_CHOOSER_LEVEL_STYLE = 1 << 0, GTK_FONT_CHOOSER_LEVEL_SIZE = 1 << 1, GTK_FONT_CHOOSER_LEVEL_VARIATIONS = 1 << 2, GTK_FONT_CHOOSER_LEVEL_FEATURES = 1 << 3 } GtkFontChooserLevel;
例如,之后
gtk_font_chooser_set_level (chooser, GTK_FONT_CHOOSER_LEVEL_FAMILY);
字体选择器如下所示
深入深渊
现代字体是复杂的野兽,并且表面之下隐藏着许多东西。如果告诉 GTK 字体选择器,它可以使许多字体功能可用。
首先,存在字体变体。这些允许你连续改变字体的特征(只要这些特征作为变体轴公开)。
典型的变体轴是字体的粗细、宽度和倾斜度,但也可以有其他轴(例如本例中的光学尺寸)。
所选的变体是字体选择器返回的 PangoFontDescription 的一部分,应用程序无需执行任何额外的工作即可应用它们。像往常一样使用字体描述即可。
要在 GTK 文件选择器中启用字体变体支持,请使用 GTK_FONT_CHOOSER_LEVEL_VARIATIONS 标志
level = level | GTK_FONT_CHOOSER_LEVEL_VARIATIONS; gtk_font_chooser_set_level (chooser, level);
更多功能
字体不仅包含字形轮廓,还包含许多其他数据,这些数据可以在渲染这些字形时以各种方式应用。这包括传统的字距调整和连字等数据,还包括诸如可选的字形形状或定位变体,甚至调色板等内容。借助OpenType 功能,用户可以启用其中的许多功能。
这是一个用于字形形状变体的 OpenType 功能的示例
当从左向右移动时,此处切换的功能称为ss12。值得庆幸的是,该字体还提供了更具意义的名称“单层 g”。
此示例显示了frac功能对分数显示的影响。
在 GTK 字体选择器中,OpenType 功能与变体显示在同一页面上。如你所见,它们可能相当多
请注意,Pango 将 OpenType 功能视为与字体本身分离的。它们不是字体描述的一部分,而是必须通过PangoAttributes 或通过 Pango 标记应用于文本。
要应用来自 GTK 字体选择器的选定字体功能,请调用 gtk_font_chooser_get_font_features () 并将返回的字符串传递给 pango_attr_font_features_new()。
要在 GTK 文件选择器中启用 OpenType 功能支持,请使用 GTK_FONT_CHOOSER_LEVEL_FEATURES 标志
level = level | GTK_FONT_CHOOSER_LEVEL_FEATURES; gtk_font_chooser_set_level (chooser, level);
总结
总而言之,你可以使用 GtkFontChooser 的级别属性来影响你向应用程序用户提供的字体选择粒度。如果你在其中包含字体功能,请不要忘记使用 PangoAttributes 或标记应用选定的功能。
所有这一切都得益于 harfbuzz 为我们提供了一个跨平台的字体及其所有功能的 API。否则这是不可能的。值得指出的是,这是通过直接访问 harfbuzz 对象完成的,而不是将所有 harfbuzz API 包装在 Pango 中。