阿拉伯语"加入" Freetype中的文本

时间:2018-03-05 11:57:23

标签: fonts freetype arabic-support

我们使用Freetype将单个字符渲染到纹理图集,然后从此纹理渲染到屏幕。但是,当我们渲染阿拉伯语时,角色不应该按原样加入。它们看起来都像个别角色,彼此相邻。如果我们将相同的字符放入记事本中,例如它们会连接起来,但是如果我们在每个阿拉伯字符之间放置一个空格,它们就会分开并再次看起来像我们的渲染。如果在记事本中我们删除了空格,则删除空格的任一侧的字符"更改"并加入到一起。很明显,放在一起的字符组合会改变它们的显示方式。

那么,我们怎样才能用freetype实现阿拉伯语中的联合词?我们可以打印整个"字"到使用Freetype的位图,它会自动调整字形以连接在一起,或者是否有某种转换我们可以应用于utf8字符列表,将它们转换为新的utf8字符,当它们彼此相邻时会加入?

由于

肖恩

2 个答案:

答案 0 :(得分:1)

确实有可能简化阿拉伯文本呈现的实现。

首先,您需要将UTF8文本拆分为Unicode字符。欲获得更多信息: https://en.wikipedia.org/wiki/UTF-8

一旦有了Unicode序列,就需要确定显示顺序。对于简单的阿拉伯文字,您可以假定它是从右到左,当您遇到从左到右的文字或数字时,需要切换方向。字符的方向取决于其Bidi类,该类是Unicode数据库的 UnicodeData.txt 中的第5列: https://www.unicode.org/reports/tr44/

通用的Bidi算法并非易事,特别是因为例如可以插入Unicode字符以嵌入从左到右的文本。在那里详细解释了所有内容: http://www.unicode.org/reports/tr9/

然后,对于阿拉伯文本,您需要确定连字。字母根据它们的连接类型连接在一起,这在 ArabicShaping.txt (在Unicode数据库中)的第3列中定义。例如,如果您在类型R(右连接)的字母的右边有一个类型L(左连接)的字母,那么它们将结合在一起。

算法很简单:对于每个阿拉伯字母,确定其连接类型。如果可以加入,请尝试在左右两侧寻找一个字母,并检查它们的加入类型是否互补。

请注意,它们可能是不是阿拉伯字母的字符。如果在 ArabicShaping.txt 中未提及字符,则前面提到的Bidi类可以帮助您确定字符的联接类型。如果Bidi类为NSM(非间距标记),或者常规类为Cf,则联接类型为T(透明),否则为U(非联接)。

在左右检查时,请跳过T型字符,直到找到另一种类型或到达文本末尾为止。请注意,如果实施Bidi算法,则需要在Bidi隔离的结尾处停止。

一旦知道角色是否加入,就可以确定其表示形式:首字母,中间字母,最终字母,孤立字母。在 UnicodeData.txt 中,为其搜索代码点。与此显示(第6列)相对应的字符(第1列)。例如,“ 067B”显示为字符FB54。因此,您可以替换它。

Lam后面跟Alef是一个特例。在这种情况下,字符将合并在一起。例如,“ 0644 0622”显示为字符FEF5。请注意,它们之间可能会遇到非空格标记。如果您不处理它们,则可以将其丢弃。否则,您可以保留信息以备后用。

在此阶段,您可以将Unicode字符数组转换回UTF8字符串,并使用FreeType进行绘制。请注意,非空格标记将无法正确放置。为此,您需要分别绘制每个字符并确定标记的位置。

答案 1 :(得分:0)

for example here中描述了Freetype起作用的整个过程(字形渲染)。如您所见,它绝非简单。

在Freetype之上有一个(几个)库,目的是使该过程“简单”,或至少使它们“更简单”; ,但是它们在更高的抽象水平上工作,所以您可能需要改变您的范例。 Harfbuzz就是这样的一个项目,与Freetype紧密相关。