首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VxWorks汉字显示解决方案(2)

VxWorks汉字显示解决方案(2)

4 WindML的点阵存储结构和操作方法
WindML双字节编码显示的参数和实现思路集中体现在点阵存储文件的结构上,该文件的框架如下(这些文件在WIND_BASE/target/src/ugl/fonts/bmf目录下):
UGL_LOCAL const unsigned char UGL_FAR_DATA
page0Data[]=
{…
/*0x0023('#')*/
0,/*page*/
0x23,/*index*/
0,/*size(MSB)*/
20,/*size(LSB)*/
8,/*width*/
16,/*high*/
14,/*ascent*/
0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0x00,/*数据*/
/*0x0024和其它字符*/

/*结束*/
0,0,0,0
}/*西文扩展为双字节编码的点阵表*/
/*上表解析:
page+index就是该字符的ASCII编码,过扩成了双字节;
size(MSB)+size(LSB)是该字节的点阵信息长度,注意实际描述体的长度是2(2字节page,index)+该长度+1(从0开始编大小,所以从1数据要加1),而ascent之后的真正点阵数据的大小是该大小减4;
width+height是该点阵资料的宽度和高度;
ascent是点阵处在baseline以上的偏移位置,baseline的位置要看整个字符表描述结构的定义;
data是按行扫描得到的点阵资料,是列递增把行显示效果排成一个连续空间后,按字节来描述每位的打点状态;如果行宽是8位的整数倍,不会把位补0去凑8位整数倍 。
字符点阵描述数据依次往下排列,直到以4个0标志结束。
*/
UGL_LOCAL const unsigned char UGL_FAR_DATA
Page1Data[]=
{ 0x81,/*page*/
0x40,/*index*/
0,/*size*/
36,/*size*/
16,/*width*/
16,/*hight*/
14,/*ascent*/
0x00,0x08,0xff,0xfc,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x10,0x1f,0xf8,0x00,0x10,
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x02,0x20,0x01,0x40,0x00,0x80,
/*其它字符*/

/*结束*/
0,0,0,0
}*/国标码对应的点阵表*/
/*上表解析:
数据含义与西文表类似,注意字码是双字节国标码*/
UGL_LOCAL const unsigned char *const pageArray[]
{ page0Data,
page1Data,
UGL_NULL
};/*总的点阵资料表*/
/*上表解析:
把分类的点阵资料表汇集成一张表,总表以UGL_NULL结束,注意各个分表是以0,0,0,0结束。
可以把汉字表按GB2312编码的page分类,构建多个汉字分表,然后把分表指针填入该表。当然,也可以做成一个汉字大表,把指针放在该表,甚至也可以把中西文点阵做成的中西文混合大表,然后把该表指针放在该数组里。
*/
const UGL_BMF_FONT_DESC uglBMFFont_Song_16=
{
/*UGL_FONT_DESC结束*/
{
{16,16}, /*点阵大小*/
{UGL_FONT_BOLD_OFF,UGL_FONT_BOLD_OFF},
/*宽度*/
UGL_FONT_UPRIGHT, /*斜体*/
UGL_FONT_PROPORTIONAL,/*行间距属性*/
UGL_FONT_UNICODE, /*字符集*/
“Song 16x16Dot”, /*字体名称*/
“Song” /*字体系列名称*/
}/*点阵名称等点阵属性表*/
/*UGL_BMF_FONT_DESC结构*/
/*点阵表的属性和位置*/
2, /*行间距*/
14, /*最大上偏移位置*/
2, /*最大下偏移位置*/
14, /*最大宽度*/
pageArray /*字形页*/
};/*点阵描述结构*/
/*上表解析:
首先是定义属性表,然后是定义字模和间距,并定义总的点阵描述表指针。
*/
最后定义的const UGL_BMF_FONT_DESC  uglBMFFont_Song_16包含了该点阵的所有信息。只要能定位该结构,则任何能在该点阵表内匹配出字码的字都可以显示出来。WindML选择不同的点阵就是选择不同的该结构去做点阵寻址,其实现的大体过程如下:
①WIND_BASE/target/src/ugl/config/uglBmfCfge文件描述了整个系统能使用的字符集,如:
extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_12;
extern const uglBMFFont_Song_16;/*就是上面的例子*/
const UGL_BMF_FONT_DESC * uglBMFFontData[]=
{
&uglBMFFont_Courier_12,
&uglBMFFont_Song_16,
NULL
};
②通过如uglDriverFind (UGL_FONT_ENGINE_TYPE,0,(UGL_UINT32*)&fontDrvId);的调用定位点阵驱动,即控制对点阵表访问、打点等操作的函数;
通过如uglFontFindString(fontDrvId,“familyName=Song;pixelSize=16”&systemFontDef);的调用定位点阵描述结构;
通过如fontSystem=uglFontCreate(fontDrvId,&systemFontDef));的调用绑接点阵和点阵驱动,并标识为fontSystem;
如此重复创建多个字符集的点阵标识。
③通过如:uglFontSet(gc,fontSystem);的调用设置当前字符集;
通过如uglTextDrawW(gc,iX,iY,iLength,caString);的调用在iX,iY的位置显示caString里的字码。
可见,只要开发者根据上述的存储结构开发出对应的字符点阵,然后把点阵描述结构加入到uglBMFFontData,便可以用系统的函数使用这些点阵了。在Dos/Windosw、Linux系统下一些应用程序,可以把操作系统的点阵导出为C文件或数组,把这些导出的文件加以调整,就可以得到VxWorks系统支持的格式。
5 Zinc对汉字的支持
只要WindML的汉字支持做成功,则可以按如下方法使Zinc支持汉字:
WIND_BASE/target/src/zinc/generic/i_ugldsp.cpp文件是WindML与Zic的接口文件,在ZafScreenDisplay::ZafScreenDisplay函数里使用上述的函数定义了Zinc要使用的字符集。把这些字符集改成汉字字符集,并且把Zinc配置成支持UNICODE的方式重新编译,则Zinc就自然支持汉字显示了。
6 注意事项和总结
在使用过程中,还要注意几个问题。
①Tornado对汉字的编译,如果把汉字定义为如short  ca[]={'董',0x00}(把单个汉字定义在单引号),则编译生成的目标码是正序的国标码;如果定义为“董”(双引号定义出的汉字字符串),则编译生成的目标码是反序的国标码。这样,就必须约定一种定义以根据该约定产生的国标码来构建字符点阵表(以根据该约定产生的国标码来构建字符点阵表(需要改变表里面的字码顺序)。
②如果使用双引导定义汉字字符中,要注意该串数据是以一个字节0结束,使用uglTextDrawW要求是以字为单位,所以,需要在该字节串结尾补一个0("000"即可)。
③有些字库表的字码是UNICODE的编码,尤其是使用一些操作系统的点阵导出程序生成的字库表。UNICODE编码与国际码有一一对应关系,可以把这样的字库表转换过来或者在程序里适当位置把要显示的内容转化为UNICODE再显示。
本文就嵌入式操作系统上作用汉字这一热门论题,论述了VxWorks上的图形实现方案、汉字开发方案,图形组件WindML对多字节码的支持特性,并在论述特性的同时,列举了宋体16点阵的框架,帮助汉字开发者理解点阵实现的细节。在论述WindML汉字操作函数之后,提出了在Zinc层实现汉字显示的方法和编程时注意事项。这套方案已经成功地实现,并在上海大众的导航产品、南京电力的电力控制产品等项目上获得成功的应用。文章的作者都在VxWorks操作系统上做了多年的开发和支持,感兴趣或需要帮助的朋友可通过donleo@china.com.cn与我们联系。
继承事业,薪火相传
返回列表