基于高通手机平台汉字显示解决方案
扫描二维码
随时随地手机看文章
引 言
高通作为全球领先CDMA手机平台供应商,在国内得到广大手机设计公司和手机厂商的青睐,其中包括德信无线、上海精佑、赛龙上海和UT斯达康等国内许多手机设计公司和手机厂商。为了支持国内市场,汉字显示是必不可少的,而高通手机平台上没有直接提供完备的汉字显示解决方案,本文就这个热点论题,通过对高通手机平台字符显示特点进行了分析,具体地给出了基于BMP文件格式存储汉字字库的一种汉字显示方案。
2 高通手机平台Brew字符显示原理
高通手机平台Brew字符显示由两部分构成,一部分为上层应用提供一个统一的字符显示接口部分,另一部分为某一种字符集或字体具体实现部分,这两个部分是通过虚函数机制绑定在一起。在Brew字符显示接口统一定义如下:
IFONT AddRef():用于引用记数功能;
IFONT_Release():释放当前应用程序字符显示实例;
IFONT_QueryInterface():他根据字符ID检索当前应用程序字符显示实例;
IFON_DrawText():他用于显示具体的文本;
IFONT_MeasureText():他用于计算以象素为单位文本的大小和字符的总数目;
IFONT_GetFontInfo():他用于检索字符相关信息,比如ascent和descent的值。
从上面的显示接口定义可见,系统的设计者将字符显示接口视为一个脱离依赖具体字符显示的转换模块,而字符具体实现部分则需要根据显示接口每个接口函数给出一个标准实现,功能就是针对某一种字符实现文本显示,计算文本大小,返回该种字体一些信息等。
例如:高通关于ASCII字符显示的参考设计中就定义了一组与显示接口一致的一组函数:
然后通过指针赋值方式把这组函数与接口函数对应部分关联起来,即在函数AEEVarBitFont_NewFromBBF内部通过指针赋值方式使显示接口部分与具体实现部分绑定在一起。
上层应用模块调用字符显示模块的过程如下:
3 高通手机平台上汉宇字库的BMP文件存储结构的设计
在手机平台上汉字显示可以采用国标码或UNICode任何一种编码方案,但为了信息交换方便,大多数手机开发采用Unicode显示方式,这里以Unicode为例来说明。传统的汉字存储结构采用数组方式,明显地,字符集这种存储方式无法直观地显示给用户和软件开发者,用户和软件开发者也很难了解字符集内真正包含了那些字符,再者,当显示汉字时,系统需要将汉字字模存储方式转换为屏幕显示方式,这将会增加系统开销,降低运行效率。这里设计了用BMP文件格式来存储汉字字库,他保证整个存储空间没有明显增加的同时,能够使用户直观地了解字符集内包含了那些字符,提高系统运行效率。
与现有其他的汉字存储结构和汉字显示方法相比,该方法具有3个主要特点:
直观性强 由于采用BMP图片存储结构方式,可以浏览汉字字符集中包含的汉字;
运行效率高 由于采用BMP图片存储结构方式,使得单个字符的字模存储方式与屏幕显示方式保持一致,当显示汉字时,不需要把汉字字模存储方式转换为屏幕显示方式;
可移植性强、开发周期较短 对上层应用模块汉字显示耦合得更好,由于这种方法尽可能地采用了Brew系统现有的字符显示参考设计和已有的显示接口机制。
由于汉字的Unicode编码范围为u4E00~u9FA5和uF900~uFA2D,如果不在这个范围内就不是汉字了。为了讨论方便,这里考虑汉字Unicode编码范围为u4E00~ugFA5,总计有20 901个汉字,他们是连续编码的。
16*16汉字字库BMP文件格式描述如下:
|
从上面的存储结构可知,他实际就是一幅BMP格式的汉字字库图片,这幅BMP图片就是汉字字符集的二进制表示,他是从BMP图片格式转换过来的。这里每个字符字模对应BMP图片中一个图片片,字模存储方式与屏幕显示方式是一致的。
4 基于BMP文件存储结构汉字显示实现
实现本地汉字显示较早的一种方案基于Native UI,他不需依赖Brew显示接口。目前较多的汉字显示方案会涉及到Brew显示接口,常见汉字显示解决方案为:
(1) 基于Native UI方案,实现汉字显示。完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。该方法具有最大的灵活性,甚至不理睬Brew任何显示接口机制,直接在上层组件里实现,但这种方法使程序可移植性比较差,对第三方应用程序汉字显示支持也不方便。
(2) 基于Brew方案,实现汉字显示。自己开发点阵存储、点阵获取、点阵显示,改造Brew的显示接口函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。然后把该自己开发的显示函数绑接到Brew显示接口上。该方法对点阵的操作更加灵活,工作量较大,开发周期较长,这种方法比较适用已有成熟的点阵操作方法开发者。
这里利用Brew对BMP文件格式的支持,使用BMP文件格式实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用Brew的显示函数实现汉字码到汉字显示。这种方法尽可能地使用了Brew系统现有的字符显示参考设计和已有的显示接口机制,开发周期较短,是最根本的解决方法,他使得Brew的其他上层应用模块能很方便实现汉字显示。这种方法使程序通用性好,可移植性强,支持第三方应用程序开发也较方便等特点。
为了支持第三方软件厂商集成不同国家文字显示,高通手机平台提供一个绑定显示接口和对应的实现部分的接口函数,通过这个函数就可以把各种不同文字类型显示方式绑定到Brew统一的显示接口上,软件厂商只需要根据具体文字的显示方式实现具体的接口函数即可。这个接口如下:
各个参数介绍如下
IFont**ppif:汉字接口函数;
conST uint16*pwGlyphs:汉字码表;
int cntGlyphs:汉字总数目;
const char*pbyBitmap:用BMP表示的汉字字库;
int cbBitmap:用BMP表示的汉字字库总的字节数目;
int xCharWid:每个汉字宽度;
int yCharHeight:每个汉字高度;
int yCharDescent:点阵打点开始位置在baseline之下的偏移;
uint16 wUndefGlyph:未定义的ASCII字符数目;
int nHalfChars:ASCII字符数目;
UTFONTTYPE FontType:汉字类型。
为了实现BMP文件格式存储结构字库的汉字显示方式,主要工作集中于下面两个方面:
(1) 定义创建字体实例接口函数
在Brew方案中,上层应用模块都是通过ID创建字体实例,这里可以按照如下方式定义创建字体接口函数。
(2) 实现汉字显示一组具体的接口函数
由于Brew方案中已经实现了基于BMP格式对ASCII码显示支持方式,所以显示接口函数IFONT_Ad-dRef(),IFONT_Release(),IFONT_QueryInterface的功能已经实现,而汉字显示方式这三个函数要实现的功能与ASCII是一致的,不需要改动。函数IFONT GetFon-tInfo对于汉字显示不适用,因为汉字的ascent和descent的值为0,这里只要考虑IFONT_DrawText()和IFONTMeasureText()两个函数的实现问题。
为了实现IFONT_MeasureText(),在他对应的实现函数内部增加计算一个汉字宽度的相应代码。
为了实现IFONT_DrawText(),由于Brew提供了基于BMP格式对ASCII码显示支持方式,对于汉字显示关键是计算汉字UNICODE码与BMP格式的汉字字模的对应关系。由于汉字的UNICODE码是连续,在BMP图片中字模已经按照UNICODE码顺序排列,对于任何汉字只要计算他与第一个汉字(4E00)的偏移量,然后根据偏移量直接拷贝BMP图片中该字符的图片片到显示缓冲区即可,不需要把单个字符字模转换为屏幕显示方式,提高了系统显示速度。
5 注意事项
在实际开发中,手机软件开发商一般以点阵形式从第三方购买字库,为了能够应用第三方字库到高通手机平台上需要转换成BMP格式的文件。另一个要注意的问题是这里把汉字显示作为单独的一个字符集来考虑的,在实际中可以把ASCII,汉字和汉字偏旁部首构成一个字符集来考虑。只要根据不同的码值分别计算他们各自对应BMP图形的偏移量即可。
6 结 语
本文就高通手机平台关于汉字存储和汉字显示方式这一热门论题进行了详尽讨论,论述高通手机平台Brew字符显示原理、传统汉字存储结构的不足和不同汉字显示方案的特点,并在论述这些原理和方案的同时提出了一种具有通用强,移植方便和容易扩展的汉字显示方案,也提出了在实际应用需要注意问题。