双向和垂直文本
双向文本
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()
。
下面是混合方向文本的示例(以逻辑顺序显示)
(要复制的文本为:abאב12αβ )
Pango 根据运行的方向重新排列文本
垂直文本
Pango 不仅能够完成垂直文本布局,还可以正确处理混合了垂直和非垂直文本的情况。本部分介绍用于设置垂直文本参数所使用的类型。
这种实现方式是通过重力的概念。重力告诉字形哪个方向是向下,因此普通拉丁文本的重力是朝南。重力值为朝东表示字形将逆时针旋转 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
。