VxWorks汉字显示解决方案
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就自然支持汉字显示了。