阿拉伯字符显示的修复方法及装置转让专利

申请号 : CN201010148651.7

文献号 : CN101814286B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 徐佳宏朱吕亮李攀

申请人 : 深圳市茁壮网络股份有限公司

摘要 :

本发明公开了一种阿拉伯字符显示的修复方法及装置,针对字库返回的字符进行修复,其中的方法包括以下步骤:获取基准字符及其字型位图;根据基准字符与待修复字符的位图属性,确定需要修复的行;根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复。可见,本发明方案是基于单个字符的字型位图的修复,而不是基于字符组合情况来修复的,简化了单元测试的用例数量,提供了修复方案的可行性;另外,采用字库中存在的基准字符,保证了修复视觉上字型风格的一致性。

权利要求 :

1.一种阿拉伯字符显示的修复方法,针对字库返回的字符进行修复,其特征在于,包括:获取基准字符及其字型位图;

根据基准字符与待修复字符的位图属性,确定需要修复的行;

根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复;

其中,所述采用所述基准字符的位图对待修复字符的位图逐行进行修复的具体过程为:对需要修复的行进行逐列检查,在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。

2.根据权利要求1所述方法,其特征在于,若所述待修复的字符的变体类型为字尾或字中,则实现修复的流程如下:步骤1:设置变量col为最右侧对应的列,col缺省值为待修复字符的位图宽度width;

步骤2:设置修复标识flag为假;

步骤3:获取当前列位于rowstart-1、rowstart、rowend、rowend-1四行的四个像素点,分别存入变量p1、p2、p3、p4,其中,rowstart、rowend分别表示修复起始行和终止行;

步骤4:如果p1、p2、p3、p4全为0,则执行步骤6;

步骤5:如果p2>p1且p3>p4,设置修复标志flag为真,否则,跳到步骤8;

步骤6:col减1;

步骤7:如果col不小于0,跳转到步骤1;

步骤8:结束对列的检查;

步骤9:如果flag为真,则从col列向右开始利用基准字符进行修复。

3.根据权利要求1所述方法,其特征在于,若所述待修复的字符的变体类型为字首或字中,则实现修复的流程如下:步骤1:设置变量col为最左侧对应的列,col缺省值为0;

步骤2:设置修复标识flag为假;

步骤3:获取当前列位于rowstart-1、rowstart、rowend、rowend-1四行的四个像素点,分别存入变量p1、p2、p3、p4,其中,rowstart、rowend分别表示修复起始行和终止行;

步骤4:如果p1、p2、p3、p4全为0,则执行步骤6;

步骤5:如果p2>p1且p3>p4,设置修复标志flag为真,否则,跳到步骤8;

步骤6:col加1;

步骤7:如果col不大于待修复字符的位图宽度width,跳转到步骤1;

步骤8:结束对列的检查;

步骤9:如果flag为真,则从col列向右开始利用基准字符进行修复。

4.根据权利要求1所述方法,其特征在于,所述根据基准字符与待修复字符的位图属性确定需要修复的行的具体过程为:获取基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离;

根据基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离确定出需要修复的起始行和终止行;其中,所述起始行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离;

所述终止行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离+基准字符的位图高度-1。

5.根据权利要求1所述方法,其特征在于,所述基准字符为0x0640。

6.一种阿拉伯字符显示的修复装置,针对字库返回的字符进行修复,其特征在于,包括:基准字符获取单元,用于获取基准字符及其字型位图;

修复行确定单元,用于根据基准字符与待修复字符的位图属性,确定需要修复的行;

修复执行单元,用于根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复;

其中,所述修复执行单元包括:变体类型确定子单元,用于确定待修复字符的变体类型;

行-列位置确定子单元,用于根据所述变体类型,对需要修复的行进行逐列检查,确定需要修复的行-列位置;

具体修复子单元,用于在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。

7.根据权利要求6所述装置,其特征在于,所述修复行确定单元具体包括:位图属性获取子单元,用于获取基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离;

修复行计算子单元,根据基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离确定出需要修复的起始行和终止行;

其中,

所述起始行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离;

所述终止行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离+基准字符的位图高度-1。

8.根据权利要求6所述装置,其特征在于,所述基准字符获取单元获取的基准字符为

0x0640。

说明书 :

阿拉伯字符显示的修复方法及装置

技术领域

[0001] 本发明涉及计算机及网络技术领域,尤其涉及一种利用计算机及网络技术对阿拉伯字符显示进行修复的方法及装置。

背景技术

[0002] 大多数阿拉伯字母都有变体(Contextual forms),包括独立体(Isolated)、字首(Beginning/Initial)、字中(Middle/Medial)、字尾(End/Final),即一个阿拉伯字符,在unicode(统一码、万国码、单一码)编码中,除了有一个编码用于表示原始的输入字符(General Unicode)外,还可能存在4个变体对应的编码。参见表1,为阿拉伯变体对应表的一个示例。
[0003] 表1
[0004]
[0005] 通过计算机技术,在浏览器上显示阿拉伯字符的流程如下:
[0006] S1、通过http请求页面,下载页面到本地内存中;
[0007] S2、解析html页面,在内存中生成对应的页面元素节点树,确定各元素的内容及属性;
[0008] S3、按照html规则排版各元素,确定各元素在窗口中的位置信息;
[0009] S4、显示各元素,具体包括:
[0010] S4.1、根据S3步骤的结果,确定显示的位置;
[0011] S4.2、根据S2步骤的结果,设置字体的属性;
[0012] S4.3、根据S2步骤的结果,确定显示的内容;
[0013] S4.4、按照从右向左的排版规则,对需要显示的内容进行排版;
[0014] S4.5、按照变体规则,确定实际显示的字符编码;
[0015] S4.6、对每一个字符,以显示字符编码为参数,向字库查询字型数据;
[0016] S4.7、字库返回字符对应的位图(bitmap);
[0017] S4.8、在对应的位置显示位图。
[0018] 然而,通过上述现有方案有时难以准确显示阿拉伯字符,特别是在阿拉伯语连写的实现上,存在不准确之处。
[0019] 例如,埃及(egypt)对应的阿拉伯编码为0x06450x06350x0631。下面的表2中包括三个字符的变体编码对应表中的行:
[0020] 表2
[0021]
[0022] 计算机首先根据从右向左排版规则确定实际显示的字母顺序为:0x06310x06350x0645。
[0023] 再根据单词内字母所在的位置,确定各字母需要采用的变体为表3所示:
[0024] 表3
[0025]原始输入字符 0x0631 0x0635 0x0645
变体 字尾 字中 字首
[0026] 再根据变体编码对应表,确定实际需要显示的编码,如表4所示:
[0027] 表4
[0028]原始输入字符 0x0631 0x0635 0x0645
变体 字尾 字中 字首
显示编码 0xFEAD 0xFEBC 0xFEE3
[0029] 最后,从左向右,逐一取字母的显示编码(Visual Unicode)向字库查询字型数据,在屏幕上绘制。
[0030] 如果字体为Arial,最后显示出来的为:
[0031]
[0032] 计算机实现阿拉伯字母连写的基础是,字库提供正确的变体字型数据。因此,字库需要保证,如果一个阿拉伯字母存在变体,则该变体的字型数据与该字母相邻的字母的字型数据绘制在一起,视觉上应该被用户认为是连写的。但并不是所有的字体都能保证这一点。
[0033] 下面是另一种字体(字体名称为GE SS TV Bold),在字体大小为40px下显示的效果为:
[0034]
[0035] 可以看到,最后右侧两个字符并没有很好地连写在一起,视觉上,感觉字与字之间存在间隙。

发明内容

[0036] 有鉴于此,本发明提供一种阿拉伯字符显示的修复方法及装置,以解决现有显示方案存在的字符没有很好连写、存在间隙的问题。
[0037] 为此,本发明实施例采用如下技术方案:
[0038] 一种阿拉伯字符显示的修复方法,针对字库返回的字符进行修复,包括:获取基准字符及其字型位图;根据基准字符与待修复字符的位图属性,确定需要修复的行;根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复。
[0039] 其中,实现修复的具体过程为:对需要修复的行进行逐列检查,在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。
[0040] 若所述待修复的字符的变体类型为字尾或字中,则实现修复的流程如下:
[0041] 步骤1:设置变量col为最右侧对应的列,col缺省值为待修复字符的位图宽度width;
[0042] 步骤2:设置修复标识flag为假;
[0043] 步骤3:获取当前列位于rowstart-1、rowstart、rowend、rowend-1四行的四个像素点,分别存入变量p1、p2、p3、p4,其中,rowstart、rowend分别表示修复起始行和终止行;
[0044] 步骤4:如果p1、p2、p3、p4全为0,则执行步骤6;
[0045] 步骤5:如果p2>p1且p3>p4,设置修复标志flag为真,否则,跳到步骤8;
[0046] 步骤6:col减1;
[0047] 步骤7:如果col不小于0,跳转到步骤1;
[0048] 步骤8:结束对列的检查;
[0049] 步骤9:如果flag为真,则从col列向右开始利用基准字符进行修复。
[0050] 若所述待修复的字符的变体类型为字首或字中,则实现修复的流程如下:
[0051] 步骤1:设置变量col为最左侧对应的列,col缺省值为0;
[0052] 步骤2:设置修复标识flag为假;
[0053] 步骤3:获取当前列位于rowstart-1、rowstart、rowend、rowend-1四行的四个像素点,分别存入变量p1、p2、p3、p4,其中,rowstart、rowend分别表示修复起始行和终止行;
[0054] 步骤4:如果p1、p2、p3、p4全为0,则执行步骤6;
[0055] 步骤5:如果p2>p1且p3>p4,设置修复标志flag为真,否则,跳到步骤8;
[0056] 步骤6:col加1;
[0057] 步骤7:如果col不大于待修复字符的位图宽度width,跳转到步骤1;
[0058] 步骤8:结束对列的检查;
[0059] 步骤9:如果flag为真,则从col列向右开始利用基准字符进行修复。
[0060] 所述根据基准字符与待修复字符的位图属性确定需要修复的行的具体过程为:获取基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离;根据基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离确定出需要修复的起始行和终止行;其中,
[0061] 所述起始行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离;
[0062] 所述终止行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离+基准字符的位图高度-1。
[0063] 其中,所述基准字符为0x0640。
[0064] 一种阿拉伯字符显示的修复装置,针对字库返回的字符进行修复,包括:基准字符获取单元,用于获取基准字符及其字型位图;修复行确定单元,用于根据基准字符与待修复字符的位图属性,确定需要修复的行;修复执行单元,用于根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复。
[0065] 其中,所述修复执行单元包括:变体类型确定子单元,用于确定待修复字符的变体类型;行-列位置确定子单元,用于根据所述变体类型,对需要修复的行进行逐列检查,确定需要修复的行-列位置;具体修复子单元,用于在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。
[0066] 其中,所述修复行确定单元具体包括:位图属性获取子单元,用于获取基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离;修复行计算子单元,根据基准字符的位图高度、基准字符的位图起始行离基线的垂直距离以及待修复字符的位图起始行离基线的垂直距离确定出需要修复的起始行和终止行;其中,
[0067] 所述起始行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离;
[0068] 所述终止行=待修复字符的位图起始行离基线的垂直距离-基准字符的位图起始行离基线的垂直距离+基准字符的位图高度-1。
[0069] 其中,所述基准字符获取单元获取的基准字符为0x0640。
[0070] 本发明方案可以有效对阿拉伯字符显示的间隙进行修复,并且至少存在以下优点:
[0071] 1.基于单个字符的字型位图数据修复,而不是基于字符组合情况来修复,简化了单元测试的用例数量,提高了修复方案的可行性。
[0072] 2.使用字库中存在的基准字符,保证了修复后视觉上字型风格上的一致性。
[0073] 3.基于unicode码的变体情况,确定修复字型数据左侧还是右侧,避免对正确定符的不当修复,降低了风险。
[0074] 4.使用0x0640作为基准字符,利用了0x0640字型的特殊性。
[0075] 5.矢量字库反锯齿算法会在字符边缘处渐变填充,使用基准字符的第二像象数据修复位图,避免了使用渐变色填充字符间隙。

附图说明

[0076] 图1为本发明阿拉伯字符显示的修复方法流程图;
[0077] 图2为本发明基准字符0x0640的位图;
[0078] 图3为本发明基准字符0x0640的位图数据示意图;
[0079] 图4为本发明待修复字符0xFEE3的位图;
[0080] 图5为本发明待修复字符0xFEE3的位图数据示意图;
[0081] 图6为本发明阿拉伯字符显示的修复装置示意图。

具体实施方式

[0082] 本发明提供一种阿拉伯字符显示的修复方法,针对字库返回的字符进行修复,参见图1,该方法包括以下步骤:
[0083] S101:获取基准字符及其字型位图;
[0084] S102:根据基准字符与待修复字符的位图属性,确定需要修复的行;
[0085] S103:根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复。
[0086] 可见,本发明方案是基于单个字符的字型位图的修复,而不是基于字符组合情况来修复的,简化了单元测试的用例数量,提供了修复方案的可行性。另外,采用字库中存在的基准字符,保证了修复视觉上字型风格的一致性。
[0087] 优选地,实现修复的具体过程为:首先对需要修复的行进行逐列检查;然后在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。此时,矢量字库反锯齿算法会在字符边缘变渐变填充,使用基准字符的第二像素数据修复位图,避免了使用渐变色填充字符间隙。
[0088] 下面详细介绍本发明方法实施例。
[0089] 1、接S4.7(请参见本文背景技术)字库返回字符对应的位图(bitmap)。
[0090] 2、取相同字库、相同字库基准字符(例如0x0640)的字型位图。
[0091] 3、根据基准字符与待修复字符的位图属性,确定需要修复的行,即连写所在的行。
[0092] 3.1、设修复起始行号为rowStart
[0093] 3.2、设修复终止行号为rowEnd
[0094] 4、取待修复字符的变体类型。
[0095] 5、如果变体类型为字尾(FINAL)或字中(MEDIAL),则检查字符最右侧:
[0096] 5.1、设置变量col为最右侧对应的列,即值为待修复字符的位图宽度width。
[0097] 5.2、设置需要修复标识flag为假。
[0098] 5.3、取当前列位于rowStart-1,rowStart,rowEnd,rowEnd-1四行的四个像象点,存入变量p1,p2,p3,p4。
[0099] 5.4、如果p1,p2,p3,p4全为0,则跳到第5.6步。
[0100] 5.5、如果p2>p1且p3>p4,设置修复标识flag为真,否则,跳到5.8步。
[0101] 5.6、col减一。
[0102] 5.7、如果col不小于0,跳转到5.1步。
[0103] 5.8、此时,对列的检查已经结束。
[0104] 5.9、如果修复标识flag为真,则从col列向右开始修复。修复即在需要修复的行(rowStart~rowEnd)填充基准字符的第二列像素内容。
[0105] 6、如果变体类型为INITIAL或MEDIAL,则检查字符最左侧:
[0106] 6.1、设置变量col为最左侧对应的列,即值为0。
[0107] 6.2、设置需要修复标识flag为假。
[0108] 6.3、取当前列位于rowStart-1,rowStart,rowEnd,rowEnd-1四行的四个像象点,存入变量p1,p2,p3,p4。
[0109] 6.4、如果p1,p2,p3,p4全为0,则跳到第6.6步。
[0110] 6.5、如果p2>p1且p3>p4,设置修复标识flag为真,否则,跳到6.8步。
[0111] 6.6、col加一。
[0112] 6.7、如果col不大于width,跳转到6.1步。
[0113] 6.8、此时,对列的检查已经结束。
[0114] 6.9、如果修复标识flag为真,则从col列向右开始修复。修复即在需要修复的行(rowStart~rowEnd)填充基准字符的第二列像素内容。
[0115] 7、接S4.8(请参见本文背景技术)在对应位置显示位图。
[0116] 优选地,本发明方案采用0x0640作为基准字符,“GE SS TV Bold”字体、40px字号下,0x0640的位图如图2所示,其对应的数据请参见图3.
[0117] 关于位图的属性,可以通过unicode(general unicode或者变体后对应的unicode)为参数,向字库查询对应的字型,字库返回的是一个位图以及位图的参数。
[0118] 例如,“GE SS TV Bold”字体、40px字号下,待修复字符0xFEE3对应的位图如图4所示,其中:
[0119] horiBearingX:位图起始列与当前画笔位置的水平距离
[0120] horiBearingY:位图起始行离基线(baseline)的垂直距离
[0121] horiAdvance:为画笔水平前进的距离
[0122] width:位图的宽度
[0123] rows:位图的行数,也就是高度
[0124] buffer:位图数据,是一块连续的内存,大小为width*rows,位图中每一个点对应一个字节。类型为unsigned char,表示当前点的透明度(alpha)。实际绘制字符时,会根据点所在位置的背景色(backColor)与字符颜色(textColor)计算实际绘制的颜色(color):color=textColor*alpha+backColor*(1-alpha)。
[0125] 对于根据基准字符与待修复字符的位图属性确定需要修复的行的具体过程介绍如下:
[0126] 由待修复字符.horiBearingY-基准字符.horiBearingY=5-2=3可以得到修复字符需要从哪一行开始修复。
[0127] 由待修复字符.horiBearingY-基准字符.horiBearingY+基准字符.height-1=5-2+3-1=5可以得到需要到哪一行结束修复。
[0128] 上述图4位图对应的buffer数据如图5所示。
[0129] 对于变体类型的判断,unicode中与字体arabic有关的部分是分区域定义的,共有四个区域,如下:
[0130] 0x0600~0x06ff Arabic
[0131] 0x0750~0x077f Arabic Supplement
[0132] 0xfb50~0xfdff Arabic Presentation Forms A
[0133] 0xfe70~0xfeff Arabic Presentation Forms B
[0134] 变体后的unicode一定位于0xfb50~0xfdff和0xfe70~0xfeff这两个区域。
[0135] 首先定义变体类型:
[0136] #define ARABIC_FORM_GENERAL 0
[0137] #define ARABIC_FORM_ISOLATED 1
[0138] #define ARABIC_FORM_FINAL 2
[0139] #define ARABIC_FORM_MEDIAL 3
[0140] #define ARABIC_FORM_INITIAL 4
[0141] 再定义两个数组,
[0142] unsigned char_arabic_form_fd50_fdff[]={
[0143] ARABIC_FORM_ISOLATED ,/*0xFB50*/
[0144] ARABIC_FORM_FINAL ,/*0xFB51*/
[0145] ARABIC_FORM_ISOLATED ,/*0xFB52*/
[0146] 0x0750~0x077f Arabic Supplement
[0147] 0xfb50~0xfdff Arabic Presentation Forms A
[0148] 0xfe70~0xfeff Arabic Presentation Forms B
[0149] 变体后的unicode一定位于0xfb50~0xfdff和0xfe70~0xfeff这两个区域。
[0150] 首先定义变体类型:
[0151] #define ARABIC_FORM_GENERAL 0
[0152] #define ARABIC_FORM_ISOLATED 1
[0153] #define ARABIC_FORM_FINAL 2
[0154] #define ARABIC_FORM_MEDIAL 3
[0155] #define ARABIC_FORM_INITIAL 4
[0156] 再定义两个数组,
[0157]
[0158]
[0159] 最后,即可实现从unicode取变体类型的函数:
[0160]
[0161] 基于数组的实现,优点是速度比较快。
[0162] 本发明方案可以有效对阿拉伯字符显示的间隙进行修复,并且至少存在以下优点:
[0163] 1.基于单个字符的字型位图数据修复,而不是基于字符组合情况来修复,简化了单元测试的用例数量,提高了修复方案的可行性。
[0164] 2.使用字库中存在的基准字符,保证了修复后视觉上字型风格上的一致性。
[0165] 3.基于unicode码的变体情况,确定修复字型数据左侧还是右侧,避免对正确定符的不当修复,降低了风险。
[0166] 4.使用0x0640作为基准字符,利用了0x0640字型的特殊性。
[0167] 5.矢量字库反锯齿算法会在字符边缘处渐变填充,使用基准字符的第二像象数据修复位图,避免了使用渐变色填充字符间隙。
[0168] 与上述方法相对应,本发明还提供一种阿拉伯字符显示的修复装置,针对字库返回的字符进行修复,参见图6,该装置包括以下单元:
[0169] 基准字符获取单元601,用于获取基准字符及其字型位图;
[0170] 修复行确定单元602,用于根据基准字符与待修复字符的位图属性,确定需要修复的行;
[0171] 修复执行单元603,用于根据待修复字符的变体类型,采用所述基准字符的位图对待修复字符的位图逐行进行修复。
[0172] 优选地,基准字符获取单元601获取的基准字符为0x0640。
[0173] 其中,修复执行单元603包括:
[0174] 变体类型确定子单元,用于确定待修复字符的变体类型;
[0175] 行-列位置确定子单元,用于根据所述变体类型,对需要修复的行进行逐列检查,确定需要修复的行-列位置;
[0176] 具体修复子单元,用于在确定需要修复的行-列位置采用基准字符的第二列像素内容进行填充。
[0177] 其中,修复行确定单元602具体包括:
[0178] 位图属性获取子单元,用于获取基准字符的位图高度、待修复字符的位图高度以及待修复字符的位图起始行距基准线的垂直距离;
[0179] 修复行计算子单元,根据基准字符的位图高度、待修复字符的位图高度以及待修复字符的位图起始行距基准线的垂直距离确定出需要修复的起始行和终止行。
[0180] 关于装置的具体实现请参见方法实施例,此处不作赘述。
[0181] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。