2
P2P数字电视机顶盒OSD中文显示解决方案
由于DaVinci DM6446平台不支持中文显示,因此要在应用程序界面上使用中文字符,需要自己开发中文显示函数。在图形操作系统中,中文字符(包括英文)通常有两种存储格式:一种是存储字符的矢量图形,例如,用样条的方式,拟合一个字符的所有笔画轮廓,存储样条的关键点,来实现字符的存储,这种字库称为矢量字库;另一种是存储字符的图形点阵,即是以位图形式存储字符,在数据中,用0或1区分汉字的笔画,这种字库称为位图字库或点阵字库。这两种方式各有优缺点,矢量字库不存在放大以后失真的问题,并且因为存储的是笔画样条,可以对字符做旋转、缩放、高斯模糊,甚至三维拉伸都不会失真,但是矢量字库存储的是样条,在显示的时候,增加了计算量,不便于快速显示。而对于点阵字体,虽然在放大的时候边缘会产生锯齿,影响整个字符的美观,但是由于每个相同大小的字符存储所用空间是固定的,且便于管理、易于显示,适应于性能和资源相对比较欠缺的嵌入式环境,因此在本嵌入式平台中,使用的是16点阵的位图字体库。
众所周知,在计算机内一个英文字符用一个字节的ACSII码表示,该字节的最高位经常用于奇偶校验位,因此实际表示字符的只有7位,即可以表示2^7=128个字符,但是由于汉字的复杂性,需要使用两个字节表示一个汉字,针对这种情况国家制定了国标码。
国标码规定,组成两字节代码的各字节的最高位均为0,即每个字节仅只使用7位,这样在机器内使用时,由于英文的ASCII码也在使用,可能将国标码误看作两个ASCII码,因而在机器内使用汉字时,每个字节的最高位均为1,以表示该码表示的是汉字,这些国标码两字节最高位加1后的代码称为机器内的代码,俗称“内码”。
汉字内码与区位码有固定的转换关系,例如汉字字符“国”字的内码0xb9fa,它所对应的区码和位码分别为:qm=0xb9-0xa0;wm=0xfa-0xa0;因而该汉字在16*16点阵汉字库中距离字库文件头的偏移位置offset(以字节为单位),可计算得:
offset=(94*(qm-1)+(wm-1))*32L
获取偏移位置后,调用fseek()函数和fread()函数从事先已经fopen()的字库中提取要显示汉字的字模,将获取的汉字字模存储到一个字符数组中。这样,顺序读取32字节的点阵信息后,利用画图函数drawpixel(int x,int y,int r,int g,int b)在屏幕上指定的(x,y)位置上对一个16*16像素的图形区域进行色彩填充(设置r、g、b值),如果点阵汉字中某位为1,则填充该像素点;若为0,则不填充该像素点,从而就可以显示出来一个汉字。
查找字库显示点阵有两种方式:一种是边查找边显示,即在显示每个汉字之前,先根据区位号读取点阵字模,对于16*16的点阵,需要16*16/8=32个字节的存储空间,这样在显示所有汉字点阵之前需要大量地频繁查找字库,消耗了大量的CPU时间。另一种是先从字库中读取所有要显示汉字的点阵字模,放到一个缓冲区中,然后再显示,这样对于100个汉字所占用的缓冲区空间大约为3kB(100*32=3200)。由于机顶盒CPU需要处理大量的视频和音频数据,并且对于嵌入式系统,点阵缓冲所占用的空间并不算大,综合考虑,采用第二种方案更加合理。
3 结束语
文中所描述的基于TI公司DaVinci技术TMS320DM6446的P2P机顶盒OSD研究与实现,较好地解决了该平台适应于P2P流媒体播放技术时界面操作和面向本土化开发所欠缺的问题,从理论和工程实践上研究了OSD的原理以及具体实现,汉字显示的原理以及具体实现。实践证明,该方案获得了良好的效果。 |