矢量字库在嵌入式机顶盒中的应用
时间:09-05
来源:互联网
点击:
引言
在当前嵌入式系统设计中,广泛涉及到字符和图标的显示。过去的方法通常是使用硬件自带字库或者转换中文操作系统(例如UCDOS)的点阵字库,但随着嵌入式开发技术的发展,人们对用户界的要求也越来截止高,大小固定、字体有限、使用不便的点阵字库已经难再满足要求。于是众多开发人员将目光投向了Windows操作系统丰富的字库和图标资源,以Widnows 2000系统为例,其OpenType矢量字库有基于Unicode内码的四万多个字符,特殊符号以及近百种字体可以选用。但是Windows系统结构复杂,难以直接提取矢量字库,并且矢量字库解析算法涉及到Micorosoft和Adobe公司OpenType字体专利,这些问题为Windows字库的使用带来了很大的困难。
在笔者参与的DVB-S数字卫星接收机顶盒用户界面的设计工作中,也遇到了同样的问题。按照设计要求,需要用到一套完备的,支持包括俄、德、拉丁、阿拉伯等多种语言和特殊符号的小型字库,但是难以找到合适的现成字库,在参考了一些商业字模提取软件的功能后,提出了一种提取Win dows矢量字符以及图标资源的方法,并用Visual C++6.0程序实现。实际应用表明,用本方法生成的字库字形美观,字体多样,完全可以替代商业字库,同时还具有使用方便,便于扩展等优点。
1 机顶盒图文显示原理
机顶盒中文字和位图的显示是通过OSD(图文屏显技术)模块完成的。传统的屏显示OSD主要应用在VCR、LD和电视机上,采用专用的芯片修改屏幕上指定部位的信号的角度和亮度,实现模拟视频的同步改变,从而达到显示的目的。含有OSD的视频输出信号在屏幕上从底向上以6个层次显示:边界颜色、静止视频图像、活动视频图像、OSD背窗口、OSD位图区域和OSD硬件游标。本文介绍的机顶盒系统是基于ST公司的方案,接收机软件是ST公司为其数字卫星接收机硬件评估板配套提供的。其主芯片采用Sti5518微控制器,内部集成OSD处理单元。OSD功能模块框图如图1所示。
OSD功能模块位于NTSC/PAL/SECAM编码之前,包括一张颜色查找表(LUTs)、Alpha混合滤波器和控制逻辑单元,所有子功能先于将信息从重建缓冲区传到SDRAM或与其它静态图像混合前执行。
当要输出图文信息时,将字符图标的位图信息送至OSD位图区域的相应位置。OSD位图区域由其头部定义,每个OSD头主要包括OSD显示短形区域的起始位置、大小及两个分别指向顶场和底场图像数据的指针(这是针对隔行扫描显示方式;对于逐行扫描,这两个指针向同一块内存区域),还有一个指向下一个OSD位图数据头的指针。由于采用了这种基于指针的OSD数据管理结构,理论上OSD位图数据块的数目不受限制,实际上它要受到内存大小的限制。头部不仅定义了位图区域的尺寸、位置以及及颜色信息,而且提供了颜色表更新等功能。字符的颜色设置使用OSD处理单元(LUT)的颜色查找表,也称做调色板。2位的LUT意味着有4种颜色可以选择,并且位图中的每个像素仅占有存储单元的2位。如果是透明文字,还要把第一个像素的调色板颜色值定为透明色掩码值,这个过程由Alpha混合处理完成。如果输出像素不在OSD区域,停止处理视频接口处理器数据;如果输出像素在OSD区域,OSD数据或OSD和视频接口处理数据的混合数据经Alpha混合滤波处理后以16位YC(Cb,Cr)格式传输。对于调色板颜色值是透明的情况,则直接传送视频数据而略过OSD位图数据。
OSD的软件部分可以分为两部分:硬件抽象层和图形函数接口。OSD模块软件部分为整个系统软件部分提供一系列的图形函数接口,是实现图文显示的基础,也是给用户提供一个方便直观的图形文字交互方式的保障。本文中硬件抽象层为ST公司提供的STAPI函数库,图形函数接口在中间件的基础上自行开发。
由此可见,在机顶盒系统中字符输出有三个主要步骤:
① 系统专用字库的建立;
② 字符数据的查找;
③ 调用OSD模块功能将字符在屏幕上输出。
下面介绍如何通过转换Windows矢量字符,建立一套功能完善,使用方便的字库系统。
2 提取矢量字符
Winodws矢量字库存储汉字的矢量图形。因为存储的是笔样条,对于字符做旋转、缩放、甚至三维拉伸都不会产生失真,但在字符显示的时候需要计算样条曲线而增加了计算量。由于嵌入式系统只是针对专一控制应用的系统,处理器的性能和资源还不如PC机,一般使用的仍然是点阵字库。本文介绍的DVB-S机顶盒系统同样没有直接使用矢量字库;而是通过提取Windows中矢量字库的方法将矢量字符转换成相应的点阵信息。在本开发方案中,字库文件中所有汉字的字模信息和图标信息被存储到两个大的数组中,并作为一个头文件包含在汉字显示模块中。利用计算出的偏移值得到字模数组中的下标,从而得到汉字存放在数组中的字模点阵信息。使用程序存储器空间做字库,这在汉字用量不大的情况下是一种较完美的解决方案。本系统中负责屏显功能的API函烽是STOSD函数库,里面已把位图的宽度定义为32像素的整数倍。这是由于系统的内存操作函数只能对16字节整数倍的块进行拷贝操作,否则内存只能一个字节一个字节地填充,速度非常慢。例如在16色的调色板情况下,无论是24×24点阵还是32×32点阵,基于字符单元宽度统一为32像素。一个宽为32像素,高为28像素的基本字符点阵信息需要一个大小为28字节的整型数组为记录。以开发方案为例,大小为500字符的24×24点阵小型字库将需要24 000字节的ROM空间。
转换的关键是要获得矢量字库的点阵信息。程序中,回避了较困难的直接解板矢量字库问题,巧妙地从PC显示缓冲区中获得位映像数据,再将其转换成OSD模块函数支持的点阵格式。位图法转换矢量字符的算法如下。
① 把汉字以位图的形式显示在指定的32×28的点阵区域内,然后按行提取像素点,每1行以8个像素点为1个字节(1行4个字节),以二进制补码的形式分别存放在4个字节里。最低字节存放每一点阵行的前8位。每一行结束后将其转化为十六进制点阵码并保存于一个整型数组中。
② 整个字符转换结束后放在字库信息文件里,生成一个字符区域地址映射表,为后面的字符分组查找提供方便。同时生成字符宽度、高度、字体、风格以及代码页等相关信息。
西文“特殊”字符(拉丁字符集里的第128~255字符,码值大于0x80)的转换是提取矢量字符过程中需要注意的问题。通过VC 6.0开发环境可以把执行文件编译成Unicode和ASCII两片版本。对于Unicode内码版本的应用程序,Windows 2000对其字符的显示有着很好的支持,但对于ASCII版本的应用程序则存在一定问题。当在应征程序中输入字符时,因编辑框只支持单字节,系统会将双字节的Unicode输入字符重新解释,造成的后果是程序无法正确接收这些字符,输出的特殊字符也一律被显示为“?”。本文的矢量字库提取程序为了和Win9x操作系统兼容而被设计为ASCII版本。为了解决上述问题,程序沿用了代码页的方法。代码页是一个内部表,操作系统将字符、数字和标点等符号映射为字符编号,不同的代码而支持不同国家所使用的字符集。代码页通过编号引用,例如,代码页932代表日 本字符集,950代表繁体中文字符集。由代码页确定字符集,首先把需要转换的特殊矢量字符编辑后以RTF富文本格式的文本保存,矢量字符提取程序打开RTF文件并插入文本到视图中,读取每个特殊字符的值并转换成十六进制。然后读取RTF文件内的代码页编号和字体,尺寸和风格等标签。根据代码页确定对应的字符集,根据标签设置显示字符属性。最后按一般字符的输出方法将特殊字符显示在视图中。
在当前嵌入式系统设计中,广泛涉及到字符和图标的显示。过去的方法通常是使用硬件自带字库或者转换中文操作系统(例如UCDOS)的点阵字库,但随着嵌入式开发技术的发展,人们对用户界的要求也越来截止高,大小固定、字体有限、使用不便的点阵字库已经难再满足要求。于是众多开发人员将目光投向了Windows操作系统丰富的字库和图标资源,以Widnows 2000系统为例,其OpenType矢量字库有基于Unicode内码的四万多个字符,特殊符号以及近百种字体可以选用。但是Windows系统结构复杂,难以直接提取矢量字库,并且矢量字库解析算法涉及到Micorosoft和Adobe公司OpenType字体专利,这些问题为Windows字库的使用带来了很大的困难。
在笔者参与的DVB-S数字卫星接收机顶盒用户界面的设计工作中,也遇到了同样的问题。按照设计要求,需要用到一套完备的,支持包括俄、德、拉丁、阿拉伯等多种语言和特殊符号的小型字库,但是难以找到合适的现成字库,在参考了一些商业字模提取软件的功能后,提出了一种提取Win dows矢量字符以及图标资源的方法,并用Visual C++6.0程序实现。实际应用表明,用本方法生成的字库字形美观,字体多样,完全可以替代商业字库,同时还具有使用方便,便于扩展等优点。
1 机顶盒图文显示原理
机顶盒中文字和位图的显示是通过OSD(图文屏显技术)模块完成的。传统的屏显示OSD主要应用在VCR、LD和电视机上,采用专用的芯片修改屏幕上指定部位的信号的角度和亮度,实现模拟视频的同步改变,从而达到显示的目的。含有OSD的视频输出信号在屏幕上从底向上以6个层次显示:边界颜色、静止视频图像、活动视频图像、OSD背窗口、OSD位图区域和OSD硬件游标。本文介绍的机顶盒系统是基于ST公司的方案,接收机软件是ST公司为其数字卫星接收机硬件评估板配套提供的。其主芯片采用Sti5518微控制器,内部集成OSD处理单元。OSD功能模块框图如图1所示。
OSD功能模块位于NTSC/PAL/SECAM编码之前,包括一张颜色查找表(LUTs)、Alpha混合滤波器和控制逻辑单元,所有子功能先于将信息从重建缓冲区传到SDRAM或与其它静态图像混合前执行。
当要输出图文信息时,将字符图标的位图信息送至OSD位图区域的相应位置。OSD位图区域由其头部定义,每个OSD头主要包括OSD显示短形区域的起始位置、大小及两个分别指向顶场和底场图像数据的指针(这是针对隔行扫描显示方式;对于逐行扫描,这两个指针向同一块内存区域),还有一个指向下一个OSD位图数据头的指针。由于采用了这种基于指针的OSD数据管理结构,理论上OSD位图数据块的数目不受限制,实际上它要受到内存大小的限制。头部不仅定义了位图区域的尺寸、位置以及及颜色信息,而且提供了颜色表更新等功能。字符的颜色设置使用OSD处理单元(LUT)的颜色查找表,也称做调色板。2位的LUT意味着有4种颜色可以选择,并且位图中的每个像素仅占有存储单元的2位。如果是透明文字,还要把第一个像素的调色板颜色值定为透明色掩码值,这个过程由Alpha混合处理完成。如果输出像素不在OSD区域,停止处理视频接口处理器数据;如果输出像素在OSD区域,OSD数据或OSD和视频接口处理数据的混合数据经Alpha混合滤波处理后以16位YC(Cb,Cr)格式传输。对于调色板颜色值是透明的情况,则直接传送视频数据而略过OSD位图数据。
OSD的软件部分可以分为两部分:硬件抽象层和图形函数接口。OSD模块软件部分为整个系统软件部分提供一系列的图形函数接口,是实现图文显示的基础,也是给用户提供一个方便直观的图形文字交互方式的保障。本文中硬件抽象层为ST公司提供的STAPI函数库,图形函数接口在中间件的基础上自行开发。
由此可见,在机顶盒系统中字符输出有三个主要步骤:
① 系统专用字库的建立;
② 字符数据的查找;
③ 调用OSD模块功能将字符在屏幕上输出。
下面介绍如何通过转换Windows矢量字符,建立一套功能完善,使用方便的字库系统。
2 提取矢量字符
Winodws矢量字库存储汉字的矢量图形。因为存储的是笔样条,对于字符做旋转、缩放、甚至三维拉伸都不会产生失真,但在字符显示的时候需要计算样条曲线而增加了计算量。由于嵌入式系统只是针对专一控制应用的系统,处理器的性能和资源还不如PC机,一般使用的仍然是点阵字库。本文介绍的DVB-S机顶盒系统同样没有直接使用矢量字库;而是通过提取Windows中矢量字库的方法将矢量字符转换成相应的点阵信息。在本开发方案中,字库文件中所有汉字的字模信息和图标信息被存储到两个大的数组中,并作为一个头文件包含在汉字显示模块中。利用计算出的偏移值得到字模数组中的下标,从而得到汉字存放在数组中的字模点阵信息。使用程序存储器空间做字库,这在汉字用量不大的情况下是一种较完美的解决方案。本系统中负责屏显功能的API函烽是STOSD函数库,里面已把位图的宽度定义为32像素的整数倍。这是由于系统的内存操作函数只能对16字节整数倍的块进行拷贝操作,否则内存只能一个字节一个字节地填充,速度非常慢。例如在16色的调色板情况下,无论是24×24点阵还是32×32点阵,基于字符单元宽度统一为32像素。一个宽为32像素,高为28像素的基本字符点阵信息需要一个大小为28字节的整型数组为记录。以开发方案为例,大小为500字符的24×24点阵小型字库将需要24 000字节的ROM空间。
转换的关键是要获得矢量字库的点阵信息。程序中,回避了较困难的直接解板矢量字库问题,巧妙地从PC显示缓冲区中获得位映像数据,再将其转换成OSD模块函数支持的点阵格式。位图法转换矢量字符的算法如下。
① 把汉字以位图的形式显示在指定的32×28的点阵区域内,然后按行提取像素点,每1行以8个像素点为1个字节(1行4个字节),以二进制补码的形式分别存放在4个字节里。最低字节存放每一点阵行的前8位。每一行结束后将其转化为十六进制点阵码并保存于一个整型数组中。
② 整个字符转换结束后放在字库信息文件里,生成一个字符区域地址映射表,为后面的字符分组查找提供方便。同时生成字符宽度、高度、字体、风格以及代码页等相关信息。
西文“特殊”字符(拉丁字符集里的第128~255字符,码值大于0x80)的转换是提取矢量字符过程中需要注意的问题。通过VC 6.0开发环境可以把执行文件编译成Unicode和ASCII两片版本。对于Unicode内码版本的应用程序,Windows 2000对其字符的显示有着很好的支持,但对于ASCII版本的应用程序则存在一定问题。当在应征程序中输入字符时,因编辑框只支持单字节,系统会将双字节的Unicode输入字符重新解释,造成的后果是程序无法正确接收这些字符,输出的特殊字符也一律被显示为“?”。本文的矢量字库提取程序为了和Win9x操作系统兼容而被设计为ASCII版本。为了解决上述问题,程序沿用了代码页的方法。代码页是一个内部表,操作系统将字符、数字和标点等符号映射为字符编号,不同的代码而支持不同国家所使用的字符集。代码页通过编号引用,例如,代码页932代表日 本字符集,950代表繁体中文字符集。由代码页确定字符集,首先把需要转换的特殊矢量字符编辑后以RTF富文本格式的文本保存,矢量字符提取程序打开RTF文件并插入文本到视图中,读取每个特殊字符的值并转换成十六进制。然后读取RTF文件内的代码页编号和字体,尺寸和风格等标签。根据代码页确定对应的字符集,根据标签设置显示字符属性。最后按一般字符的输出方法将特殊字符显示在视图中。
- 单片机嵌入式系统在运程电网监测系统中的应用(05-13)
- 嵌入式测试为串行I/O提供真正的价值(05-26)
- 今天的绿色 POL DC/DC 转换器设计需要高效率和低 IQ(07-11)
- flash接口电路的实现(07-18)
- RS485串行总线可靠性的研究(03-24)
- 一种支持ISP的Flash在嵌入式设计中的应用(08-19)