Fonts 阿拉伯文“;“联合起来”;自由字体文本

Fonts 阿拉伯文“;“联合起来”;自由字体文本,fonts,freetype,arabic-support,Fonts,Freetype,Arabic Support,我们使用Freetype将单个角色渲染到纹理图集,然后从该纹理渲染到屏幕。然而,当我们渲染阿拉伯语时,字符并没有像它们应该的那样连接起来。它们看起来都像单独的角色,彼此相邻。例如,如果我们把相同的字符放进记事本,它们会连接起来,但是如果我们在每个阿拉伯字符之间留一个空格,它们会分开,看起来就像我们的渲染一样。如果在记事本中删除空格,则删除空格两侧的字符将“更改”并连接在一起。很明显,放在一起的字符组合会改变它们的外观 那么,我们如何实现阿拉伯文中的单词与freetype的连接呢?我们是否可以使用

我们使用Freetype将单个角色渲染到纹理图集,然后从该纹理渲染到屏幕。然而,当我们渲染阿拉伯语时,字符并没有像它们应该的那样连接起来。它们看起来都像单独的角色,彼此相邻。例如,如果我们把相同的字符放进记事本,它们会连接起来,但是如果我们在每个阿拉伯字符之间留一个空格,它们会分开,看起来就像我们的渲染一样。如果在记事本中删除空格,则删除空格两侧的字符将“更改”并连接在一起。很明显,放在一起的字符组合会改变它们的外观

那么,我们如何实现阿拉伯文中的单词与freetype的连接呢?我们是否可以使用Freetype将整个“单词”打印到位图中,它会自动调整字形以连接在一起,或者我们是否可以对utf8字符列表进行某种转换,将它们转换为新的utf8字符,这些字符在彼此相邻时会连接在一起

谢谢


Shaun

描述了Freetype工作级别(字形渲染)的整个过程。正如你所看到的,它一点也不简单


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

确实可以简化阿拉伯语文本呈现的实现

首先,需要将UTF8文本拆分为Unicode字符。有关更多信息:

获得Unicode序列后,需要确定显示顺序。对于简单的阿拉伯语文本,您可以假设它是从右向左的,当您遇到从左向右的文本或数字时,您需要切换方向。字符的方向取决于其Bidi类,即Unicode数据库UnicodeData.txt中的第5列:

通用Bidi算法并不简单,特别是因为可以插入Unicode字符以嵌入从左到右的文本。所有这些都在这里详细解释:

之后,对于阿拉伯语文本,需要确定连字。字母根据其连接类型连接在一起,该类型在ArabicsShaping.txt(Unicode数据库)的第3列中定义。例如,如果在R型字母(右连接)的右侧有一个L型字母(左连接),则它们将连接在一起

算法很简单:对于每个阿拉伯字母,确定其连接类型。如果它可以连接,那么试着寻找左边和右边的字母,并检查它们的连接类型是否是互补的

请注意,它们可能是非阿拉伯字母的字符。如果ArabicsShaping.txt中没有提到,前面提到的Bidi类可以帮助您确定角色的连接类型。如果Bidi类为NSM(非间距标记)或通用类为Cf,则连接类型为T(透明),否则为U(非连接)

选中“右”和“左”时,跳过T类型的字符,直到找到另一种类型或到达文本末尾。请注意,如果实现Bidi算法,则需要在Bidi隔离结束时停止

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

有一个特殊的情况下,林其次是亚历夫。在本例中,字符合并在一起。例如,“0644 0622”显示为字符FEF5。请注意,您可能会在两者之间遇到非间距标记。如果你不处理它们,你可以丢弃它们。否则,您可以保留这些信息供以后使用


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

我发现,每个字符都有不同的版本,无论是在单词的开头/中间/结尾,还是单独的字符。有道理。似乎甚至有utf8代码分配给这些。这是伟大的,因为我们的字体引擎通过这些utf8代码缓存代码。所以,我真正需要的是根据初始字符及其在单词中的位置,将每个字符转换为每个新字符的代码。我发现一些代码,似乎有所有的信息-我可以建立这个-但。。。是否有一个简单的freetype调用来将初始字符转换为新字符?