目录
一、使用场景
二、语言背景
三、环境搭建
四、程序结构
五、代码
一、使用场景
公司一直以点阵屏显示为业务。最近希望替换原有的点阵字库,转用FreeType渲染矢量字形,且需要支持阿拉伯语。验证可行性阶段因为python的各种库用起来相当舒服,所以就先用Python进行验证,通过后再转C++实现。
二、语言背景
阿拉伯语与常规语言不同,它属于复杂文本语言。它有以下3个特点:
1.阅读顺序从右往左
2.字符在词前中后有不同写法
3.带有修饰符号
这里非常感谢建国雄心大哥的文章。推荐大家对于阿拉伯文如果不理解可以去他的博客看看。
http://blog.sina.com.cn/s/articlelist_1569506881_0_1.html
因为阿拉伯文有以上特点,所以不能单纯的一个字符一个字符的读取并渲染,在对字符串渲染之前需要经过一次特殊处理,转成正确的Unicode码串后再使用FreeTyoe对转换后的Unicode码串进行渲染。
三、环境搭建
这里需要用到3个Python库
1.numpy
引用原因:方便对点阵数组的操作, 而且Freetype好像也用到了
安装命令:pip install numpy
2.freetype-py
引用原因:矢量字体渲染模块
安装命令:pip install freetype-py
3.matplotlib
引用原因:显示渲染结果,如果需要在别的地方显示,可以不需要
安装命令:pip install matplotlib
四、程序结构
首先,对多语言的渲染大致分为两个模块,解析模块和渲染模块。解析模块用于处理原始Unicode码;渲染模块根据Unicode码取字模并合成点阵数组。
流程大致如下:原始字符串 -> 解析模块 -> 处理后Unicode码串 -> 渲染模块 -> 点阵数组 -> 显示。
这里的解析模块本人是自己写,但是推荐使用HarfBuzz。
这里放个用matplotlib显示的效果
五、 代码
解析模块
class ArabicText(object):
# first, last, middle, alone
__arabic_Positions=[[ 0xfe80, 0xfe80, 0xfe80, 0xfe80], #0x621
[ 0xfe82, 0xfe81, 0xfe82, 0xfe81],
[ 0xfe84, 0xfe83, 0xfe84, 0xfe83],
[ 0xfe86, 0xfe85, 0xfe86, 0xfe85],
[ 0xfe88, 0xfe87, 0xfe88, 0xfe87],
[ 0xfe8a, 0xfe8b, 0xfe8c, 0xfe89],
[ 0xfe8e, 0xfe8d, 0xfe8e, 0xfe8d],
[ 0xfe90, 0xfe91, 0xfe92, 0xfe8f],
[ 0xfe94, 0xfe93, 0xfe94, 0xfe93],
[ 0xfe96, 0xfe97, 0xfe98, 0xfe95],
[ 0xfe9a, 0xfe9b, 0xfe9c, 0xfe99],
[ 0xfe9e, 0xfe9f, 0xfea0, 0xfe9d],
[ 0xfea2, 0xfea3, 0xfea4, 0xfea1],
[ 0xfea6, 0xfea7, 0xfea8, 0xfea5],
[ 0xfeaa, 0xfea9, 0xfeaa, 0xfea9],
[ 0xfeac, 0xfeab, 0xfeac, 0xfeab],
[ 0xfeae, 0xfead, 0xfeae, 0xfead],
[ 0xfeb0, 0xfeaf, 0xfeb0, 0xfeaf],
[ 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb1],
[ 0xfeb6, 0x