双向和垂直文本

双向文本

Pango 自动支持双向文本(阿拉伯语和希伯来语等)。但是,一些应用程序需要一些帮助来正确处理双向文本。

可以使用 PangoDirection 类型与 pango_context_set_base_dir() 配合,指导 Pango 识别文本方向,虽然在大多数情况下 Pango 会自动正确检测。对于需要更直接控制文本双向设置的应用程序,Pango 提供了 API,如 pango_unichar_direction()pango_find_base_dir()pango_get_mirror_char()pango_bidi_type_for_unichar()

下面是混合方向文本的示例(以逻辑顺序显示)

mixed-direction text, logical order

(要复制的文本为:abאב12αβ )

Pango 根据运行的方向重新排列文本

mixed-direction text, visual order

垂直文本

Pango 不仅能够完成垂直文本布局,还可以正确处理混合了垂直和非垂直文本的情况。本部分介绍用于设置垂直文本参数所使用的类型。

gravity west, rotated 90 degrees 这种实现方式是通过重力的概念。重力告诉字形哪个方向是向下,因此普通拉丁文本的重力是朝南。重力值为朝东表示字形将逆时针旋转 90 度。所以,要呈现垂直文本,需要设置重力并使用现有的矩阵机制旋转布局。这样做有巨大的优势,即适用于 PangoLayout 的大多数算法无需任何更改,因为假设行沿 X 方向运行且沿 Y 方向堆叠,即使对于垂直文本布局也是如此。

这是一个将重力设置为朝西并旋转 90 度的英语文本示例

应用程序通常只需要设置 PangoContext 中使用的基本重力,然后让 Pango 决定分配给每段文本的重力。这样可以自动处理带有混合脚本的文本。一种非常常见的用法是使用 pango_context_set_base_gravity() 将上下文基本重力设置为自动,然后正常旋转布局。Pango 会确保亚洲语言采用正确的形式,而其他脚本会正常旋转。

在布局中设置重力的正确方式是在使用 pango_context_set_base_gravity() 与其关联的上下文中设置。可以使用 pango_layout_get_context() 访问布局的上下文。可以使用 pango_context_get_base_gravity() 访问上下文的当前设置的基本重力,使用 pango_context_get_gravity() 访问其解析重力。解析重力通常与基本重力相同,只是如果将基本重力设置为 PANGO_GRAVITY_AUTO,则解析重力将取决于上下文上设置的当前矩阵,并使用 pango_gravity_get_for_matrix() 来派生。

接下来,应用程序可能需要在上下文中设置重力提示。一个 PangoGravityHint 指示不同脚本应如何对设置的基本重力做出反应。

字体描述也有一个重力属性,可以使用 pango_font_description_set_gravity() 设置,并可以使用 pango_font_description_get_gravity() 访问。

最后,也可以使用 pango_attr_gravity_new()pango_attr_gravity_hint_new() 为重力和重力提示创建 PangoAttributes