VxWorks汉字显示解决方案.docx
- 文档编号:626817
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:5
- 大小:19.09KB
VxWorks汉字显示解决方案.docx
《VxWorks汉字显示解决方案.docx》由会员分享,可在线阅读,更多相关《VxWorks汉字显示解决方案.docx(5页珍藏版)》请在冰豆网上搜索。
VxWorks汉字显示解决方案
VxWorks汉字显示解决方案
摘要:
论述VxWorks上WindML对多字节码的显示支持,着重讨论其存储结构和意义,并给出汉字显示的实现方法。
关键词:
VxWorks操作系统WindML组件汉字点阵国标编码
1VxWorks操作系统图形显示方案
VxWorks作为嵌入式实时操作系统,在国内应用已非常广泛,但VxWorks原厂商没有直接提供完备的汉字显示解决方案。
本文这个热点论题,通过对VxWorks显示组件的分析,具体给出一种汉字显示的方案。
VxWorks的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。
VxWorks有三种显示方案可供选择。
WindML+Zinc
WindML是WindRiverMutli-mediaLibrary的简称,其中包含UGL。
该组件直接控制显示硬件,主要提供显示模式设置、标准输入输出控制、点线面作图等函数,编程接口很类似于TorboC、BorlandC里的图形库。
Zinc基于WindML,提供了类Widnows风格的接口,有各种控件被封装于内,编程接口很类似于Windows编程。
WindML+Jworks
Jworks提供Java的支持,在VxWorks上启动Java虚拟机来解释Java语言;图形开发编程接口是Java语言,Java虚拟机的图形实现基于WindML。
WebServer+WindML+Jworks+Browser
WebWerver使显示编程接口成为编写网页,可以通过远程的Browser来访问而使设备具有远程显示接口,也可以在本机做Browser使设备具有本机显示接口。
该Browser的实现需要WindML或Jworks的支持。
上述方案内,纯WebServer的方案不需要本地汉字显示,只要在网页上放国标码或Unicode码等,由远程的Browser去实现显示;其它方案基本上都需要WindML的支持,这是因为VxWorks系统里所有底层的显示操作都是通过WindML实现的。
2汉字显示方案
实现本地汉字显示的方案一定会涉及到WindML,只是不同的方案对WindML的依赖程度有所不同,一般有如下几种。
①利用WindML对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉辽码到汉字显示。
这种方法使用了系统机制,最根本的解决方法,并使WindML的其它上层组件很方便地实现汉字显示。
②自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节和单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。
该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到WindML上。
③完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。
该方法具有最大的灵活性,甚至不理睬WindML的任何机制,直接在上层组件里实现,但这种方法使程序的中英文混合显示变得复杂,程序可移植性也比较差。
本文将就第一种显示方案和第一种汉字显示方案详细论述WindML的双字节编码机制,并利用该机制构建WindML汉字显示框架,并论述Zinc如何使用该框架。
这些机制和思路其实是任何方案都需要考虑的,对绕开WindML的方案也具指导和借鉴意义。
3WindML的点阵参数
①每个字模都有一个占据的空间,该空间对于点阵字库里的每个字是一样大的,所有字符点阵的大小都不应该超过该空间,如果超过,显示时超出部分将被截掉。
相关参数有
maxAdvance——最大宽度大小,以点为单位。
MaxAscent,maxDescent——maxAscent+maxDescend是最大长度大小,两数的交界决定了一个baseline,maxAscent是baseline以上的长度,maxDescent是baseline以下的部分。
Baseline对于定位具体字符点阵的打点起始位置非常重要,另外如果有一行来自同一个字符集的字符串,则这些字符的baseline是在一条线上的。
maxAscent+maxDescent有时被称为字符表高度height,注意要与下面所述的字符高度区别开来。
②每个字符点阵也有一个范围大小,其大小与每个字符有关。
该大小一般不会填满整个字模空间。
相关参数有
width——宽度。
height——高度。
ascent——点阵打点开始位置在baseline之上的偏移,如果是负数,则点阵在baseline之下开始打点。
Ascent和height决定了点阵从字模的多少行开始打点,要打多少行。
而列的打点起始位置,固定是0,即字模的最左边,所以只有width描述打点的宽度。
③字符横向和纵向都要有额外空间,以防止字符粘接重叠。
相关参数有
leading——行间距。
④对字符的一些变换选项,字符读取的标志等。
相关参数有
pixelSixe——平均行、列大小。
weight——行、列加粗属性。
italic——斜体属性。
spacing——字符行间距属性。
charSet——字符集标志。
faceName——字符集名称。
familyName——字符集的家族名称。
scalable——字符放大缩小比例。
WindML显示字符时,以maxAscent+maxDescend作为字符高度,以width作为字符宽度;根据字符ascent和字符height取出字符点阵数据,进行weight、italic、scalable等运算,然后输出到屏幕。
4WindML的点阵存储结构和操作方法
WindML双字节编码显示的参数和实现思路集中体现在点阵存储文件的结构上,该文件的框架如下
UGL_LOCALconstunsignedch
arUGL_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+该长度+1,而ascent之后的真正点阵数据的大小是该大小减4;
width+height是该点阵资料的宽度和高度;
ascent是点阵处在baseline以上的偏移位置,baseline的位置要看整个字符表描述结构的定义;
data是按行扫描得到的点阵资料,是列递增把行显示效果排成一个连续空间后,按字节来描述每位的打点状态;如果行宽是8位的整数倍,不会把位补0去凑8位整数倍。
字符点阵描述数据依次往下排列,直到以4个0标志结束。
*/
UGL_LOCALconstunsignedcharUGL_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_LOCALconstunsignedchar*constpageArray[]
{page0Data,
page1Data,
UGL_NULL
};/*总的点阵资料表*/
/*上表解析
把分类的点阵资料表汇集成一张表,总表以UGL_NULL结束,注意各个分表是以0,0,0,0结束。
可以把汉字表按GB2312编码的page分类,构建多个汉字分表,然后把分表指针填入该表。
当然,也可以做成一个汉字大表,把指针放在该表,甚至也可以把中西文点阵做成的中西文混合大表,然后把该表指针放在该数组里。
*/
constUGL_BMF_FONT_DESCuglBMFFont_Song_16=
{
/*UGL_FONT_DESC结束*/
{
{16,16},/*点阵大小*/
{UGL_FONT_BOLD_OFF,UGL_FONT_BOLD_OFF},
/*宽度*/
UGL_FONT_UPRIGHT,/*斜体*/
UGL_FONT_PROPORTIONAL,/*行间距属性*/
UGL_FONT_UNICODE,/*字符集*/
“Song16x16Dot”,/*字体名称*/
“Song”/*字体系列名称*/
}/*点阵名称等点阵属性表*/
/*UGL_BMF_FONT_DESC结构*/
/*点阵表的属性和位置*/
2,/*行间距*/
14,/*最大上偏移位置*/
2,/*最大下偏移位置*/
14,/*最大宽度*/
pageArray/*字形页*/
};/*点阵描述结构*/
/*上表解析
首先是定义属性表,然后是定义字模和间距,并定义总的点阵描述表指针。
*/
最后定义的constUGL_BMF_FONT_DESCuglBMFFont_Song_16包含了该点阵的所有信息。
只要能定位该结构,则任何能在该点阵表内匹配出字码的字都可以显示出来。
WindML选择不同的点阵就是选择不同的该结构去做点阵寻址,其实现的大体过程
①WIND_BASE/target/src/ugl/config/uglBmfCfge文件描述了整个系统能使用的字符集,如
externconstUGL_BMF_FONT_DESCuglBMFFont_Courier_12;
externconstuglBMFFont_Song_16;/*就是上面的例子*/
constUGL_BMF_FONT_DESC*uglBMFFontData[]=
{
&uglBMFFont_Courier_12,
&uglBMFFont_Song_16,
NULL
};
②通过如uglDriverFind(UG
L_FONT_ENGINE_TYPE,0,(UGL_UINT32*)&fontDrvId);的调用定位点阵驱动,即控制对点阵表访问、打点等操作的函数;
通过如uglFontFindString(fontDrvId,“familyName=Song;pixelSize=16”&systemFontDef);的调用定位点阵描述结构;
通过如fontSystem=uglFontCreate(fontDrvId,&systemFontDef));的调用绑接点阵和点阵驱动,并标识为fontSystem;
如此重复创建多个字符集的点阵标识。
③通过如:
uglFontSet(gc,fontSystem);的调用设置当前字符集;
通过如uglTextD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VxWorks 汉字 显示 解决方案