转换的关键是要获得矢量字库的点阵信息。程序中,回避了较困难的直接解板矢量字库问题,巧妙地从PC显示缓冲区中获得位映像数据,再将其转换成OSD模块函数支持的点阵格式。位图法转换矢量字符的算法如下。
①把汉字以位图的形式显示在指定的32%26;#215;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文件内的代码页编号和字体,尺寸和风格等标签。根据代码页确定对应的字符集,根据标签设置显示字符属性。最后按一般字符的输出方法将特殊字符显示在视图中。
3 程序实现
3.1 功能设计和界面设计
主程序为MFC生成的SDI单文档程序。视图类由CscrollView派生,显示的字符和位图可以自由地放大和缩小,当字符超过窗口大小时视图自动滚动,以满足提取不同大小库点阵的需要,用一个RichEditBox控件来接收输入字符。添加静态控件,显示字符点阵的宽、高等信息。在菜单栏分别添加插入位图、插入图标、插入特殊字符、字体设置、字体放大和字体缩小等菜单项。
程序的界面如图2所示。图中程序正在提取阿拉伯矢量字符集,使用该程序时直接在该工具的图形操作界面下输入需要提取的字符或者插入位图和图标。待调整好全部所需的字符图标后点击保存,程序自动转换矢量字符和图形并生成存入文件。实现的功能有:①能在视图显示RichEditBox控件内输入英文、汉字等矢量字符,并通过图形设备上下文CDC读取视图的点阵信息;②能读取所有插入RTF文本内的特殊字体点阵信息;③能读取插入的位图和图标点阵信息;④能将点阵信息保存在font.h文件中,并添加字库索引表和字符宽、高、字体等信息。
[!--empirenews.page--]
3.2 主要类和模块
CfontView为CscrollView派生类,负责字符和图标的缩放显示,CfontModule类封装了字符串操作函数,CtextSetDlg类负责字符属性的设定。程序中点阵信息的数据、位图和图标的数据和字符串数据分别封装在类CdotMatrix、CimageElemnt和CwordElement中。在主要的模块函数里,Create_Text_Dot_Matrix和Create_Bmp_Dot_Matrix函数是本程序的核心函数。功能是在内存中形式位映射数据,完成矢量汉字或矢量图形向点阵数据的转换。设向量图型尺寸宽width像素,高height像素,程序流程如下:
①计算该位图对应的缓冲区尺寸。每行长度为:BytePerLine=(width+1)/8,缓冲区大小为Buffersize=BytePerLine*height。
②申请内存缓冲区。如果内存不足以容纳整 个图形,则可以分段处理。
BufferPtr=(unsigned char*)malloc(BufferSize)。
③计算坐标点在所申请内存缓冲区的偏移量和屏蔽位。设原点(0,0)在内存中的偏移量为0,则图中任意一点P(x,y)相对于原点(0,0)的偏移量为
offset=y*BytePerLine+x/8,该点对应的字节内屏蔽位为mask=0x80>>(X%8)。
④读取点P(x,y)在内存中对应的颜色值Value,读取所在的字节。
byte=(unsigned char)*(Bufferptr+offset),取该点对应的位,
Value=byte %26;amp; mask最后得到点阵信息,输出到屏幕或磁盘文件。
3.3 主程序流程
主程序流程图如图3所示。首先进入响应用户消息分支,当从编辑框输入标准汉字或ASCII字符,程序检查字符同码判断字符有效性,若满足条件则跳至显示部分;当用户从外部磁盘插入图标或位图图片,程序直接读入文件数据;如果插入的是特殊字符则进入RTF格式文本解析部分,得到特殊字符的代码页、字体、大小等信息。然后将字符图标信息在视图中显示,此时可通过图形界面调整字符外观。通过获得内存中图像信息形成位映射数据,计算点阵数据。最后将字库点阵和索引表、字体、大小等附加信息按头文件格式保存到字库文件中。程序源代码见网站www.dpj.com.cn。
4 结论
实际应用中,本方法可以有关键人物 地提取Windows环境下矢量字库的字模,满足嵌入式机顶盒系统的开发需要。字模提取程序具有多种功能,可以生成各种大小风格的字体、符号和图形点阵信息,从而使机顶盒能利用Windows中丰富的字体和图像资源,显示更为精彩的图形用户界面。