在WindML下汉字、图形界面及图片显示的开发研究

2014-08-01 14:56胥小武余立建刘洪雨
铁路计算机应用 2014年8期
关键词:字库字体引擎

胥小武, 余立建, 刘洪雨

(西南交通大学 信息科学与技术学院, 成都 610031)

在WindML下汉字、图形界面及图片显示的开发研究

胥小武, 余立建, 刘洪雨

(西南交通大学 信息科学与技术学院, 成都 610031)

本文介绍WindML的结构,重点叙述在开发文字图形前字库的原理、结构和配置、显示图片文件前的准备工作及WindML设置编译的重要注意事项,最后用具体的项目开发成果,展示了在VxWorks下用WindML开发的文字、图形、图片文件的显示。

VxWorks;WindML;文字;图形;图片文件

VxWorks实时操作系统由400多个相对独立的、短小精炼的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统,这就有效保证了系统的安全性和可靠性[1]。VxWorks包含了BSP,Wind内核,I/O系统,文件系统,网络系统,图形系统等[2]。

WindML是VxWorks下的一部分,它支持多媒体程序运行于嵌入式操作系统,主要用于提供基本的图形、视频和声频技术应用开发。WindML API提供了一个统一的图形硬件接口及处理输入/输出设备事件的能力。

WindML包括两个组件:(1)SDK。它提供了图形资源的初始化和清理例程,多媒体API包括了2D图形化界面、区域管理、窗口、颜色管理、视频音频、JPEG支持、事件服务、内存管理、扩展API和设备管理;(2)DDK。它提供了一个完整的常见硬件配置,参考驱动程序例程和API文档可以快速建立起新的驱动程序[3]。 WindML的层次结构如图1所示。?

图1 WindML层次结构图

1 WindML汉字库和WindML的配置

在WindML第一次使用之前要配置、编译WindML。VxWorks中的板级支持包BSP (board support package)是介于底层硬件和上层软件之间的底层软件开发包,它主要用来屏蔽底层硬件,进行硬件系统的初始化并调用外设的驱动程序接口管理系统外设。当用户开发目标板的BSP时,可以从所提供的BSP中选一个接近的来修改。根据基本的硬件信息来修改相应的BSP文件中的组成文件包括makefile,config.h,romInit. s,sysLn97xEnd.c等文件[4~5]。例如修改config. h 中定义的一些参数,使编译出来的系统引导程序bootrom 和VxWorks 的映像符合要求,修改sysLn97xEnd.c 文件,以使系统的网络功能正常运行。

修改完成后,开始编译用户定义的BSP,打开Tornado选择build boot room,确保select a BSP的选项是自己命名的BSP名字,select an image to build->bootrom->select a tool->gnu。

当配置好后点击OK进行编译,成功后自定义的BSP就可以用了。

1.1 汉字字库设置

WindML根据ISO8859-1标准为8位字符表示和UNICODE标准的16位字符表示提供了位图字体集,WindML本身不支持中文显示,想要实现中文显示,要利用WindML中对双字节编码的支持实现汉字的点阵存储、点阵获取、点阵显示的全过程[6~7]。一般从网上下载的字库或用软件转换过来的字库需要把相应的字库C文件修改,否则放到ugl/fonts/bmf文件夹中后,配置WindML中的bitmap font项无法识别,也就是整个excluded和include都没有字体库,修改内容如图2所示。

图2 修改C文件内容

下载或转换过来的字库C文件没有“/* Yahei12.c - Yahei_12 font for BMF font driver */”,WindML无法识别。在标准的编译器里,不管是C还是 C++语言,“/* Yahei12.c - Yahei_12 font for BMF font driver */”都是被编译器忽略掉的,但是在这里不能忽略掉,Yahei_12就是代表字库中有Yahei 12中文字库。改好这一点,WindML可以识别加进去的字库,但是在编译WindML时还会出现错误。要想解决问题,必须确保在所编译的字体文件中有如下所示的文字,其具体的含义如下:

{

{24,24}, /*表示点阵大小 */

{UGL_FONT_BOLD_OFF,

UGL_FONT_BOLD_OFF},

UGL_FONT_UPRIGHT, /*表示斜体*/

UGL_FONT_PROPORTIONAL, /*表示行间距属性*/

UGL_FONT_ISO_8859_1, /*表示字符集*/

"Yahei 12x12 Dot", /*表示字体名称*/

"Yahei" /*表示字体系列名称*/

}, /*点阵名称等点阵属性表 */

0, /*表示行间距*/

24, /*最大上偏移位置*/

0, /*最大下偏移位置*/

24, /*最大宽度*/

pageArray /*字形页*/

}; /*点阵描述解构*/

上面所述就是点阵的基本结构,通过uglFont FindString(fontDrvId,”familyName=Yahei;pixelSiz e=16”,&systemFontDef)能找到自定义的字库文件。

字体C文件的最后"Yahei 12x12 Dot"、"Yahei",一定要改为自定义文件名和相应的点阵,不然编译WindML时会出现错误。

1.2 WindML的配置及编译

WindML具体的配置如下:Tornado环境下打开Tools→WindML…,在WindML configuration选择编译的文件名,点击configure进入WindML Configuration,在build选项中选择处理器类型、工具等信息;在graphics driver中选择开发板的图形驱动,在display中选择显示器的型号,在图形设置graphics setting配置显示屏大小,刷新的频率;在advanced选项中,如果需求图片、视频,可以选择JPEG和double buffer 。新增汉字库中的汉字编码是双字节,在编译WindML时要把bitmap fonts 中的include Unicode support选上。

完成配置后点击build开始编译WindML,在此之前最好clean一次。

2 WindML汉字、图形和JPEG图片文件的显示

2.1 汉字、图形的显示

在显示汉字之前,必须初始化字体驱动和字体引擎,字体驱动在2D字体的API层和字体引擎之间提供接口,同时为图形驱动程序和字体引擎扮演者服务的角色,其结构如图3所示。

图3 字体驱动与字体引擎

2D字体API:应用程序可以使用API来显示文字,而不用考虑字体引擎本身的能力。这些API服务于WindML中所有的字体引擎。

字体驱动:字体驱动在2D字体API和字体引擎专有的API之间提供了一个抽象层。字体驱动也是显示驱动以及字体引擎之间的接口。有了字体驱动层,应用程序就可以通过使用相同的2D字体API来访问不同的字体引擎。

字体引擎:通过使用字体驱动的服务提供并显示文字。

开发应用程序时,用uglInitialize()函数初始化字体引擎和字体驱动,用uglDeinitialize()销毁字体引擎和字体驱动。用下面的函数找到设备标识符,输入服务标识符,字体驱动标识符,具体的代码如下:

if(uglInitialize() == UGL_STATUS_ERROR) {return

; } /*初始化字体引擎和字体驱动*/

pRegistryData=uglRegistryFind(UGL_DISPLAY_TY

PE, 0, 0, 0); /*在注册表中找到相应的设

备号*/

deviceID = (UGL_DEVICE_ID)pRegistryData->id;

/*找到设备ID号*/

pRegistryData=uglRegistryFind(UGL_INPUT_SERV

ICE_TYPE, 0, 0, 0);

inputServiceId=(UGL_INPUT_SERVICE_ID)pRegis

tryData->id; /*找到输入服务ID号*/

pRegistryData=uglRegistryFind(UGL_FONT_ENGI

NE_TYPE, 0, 0, 0);

fontDrvId=(UGL_FONT_DRIVER_ID)pRegistryDat a->id; /*找到字体驱动ID号*/

接下来,用函数uglCreateGc()来创建图形上下文:

gc = uglGcCreate(deviceID); /*创建上下文*/

textOrigin = UGL_FONT_TEXT_UPPER_LEFT;

/*是文字的显示从左上开始*/

uglFontDriverInfo(fontDrvId,

UGL_FONT_TEXT_ORIGIN, &textOrigin);

/*是文字的显示从左上开始*/

uglFontFindString(fontDrvId, "familyName=Yahei;

pixelSize=24", &fontDef)

textFont = uglFontCreate(fontDrvId, &fontDef);

/*初始化自定义的文字字体大小样式*/

uglColorAlloc (deviceID, &bgColor, UGL_NULL,

&textBgColor, 1); /*设置屏幕背景颜色*/

uglColorAlloc(deviceID, &foreColor, UGL_NULL,

&textForeColor, 1); /*设置屏幕前景颜色*/

uglForegroundColorSet(gc, textForeColor);

/*设置文字背景颜色

uglBackgroundColorSet(gc, textBgColor);

/*设置文字背景颜色*/

uglFontSet(gc, textFont);

/*设置字体的颜色和字体的背景颜色。*/

通过上面的步骤就可以调用uglTextDraw()函数显示出单字节字符,调用uglTextDrawW()函数显示出双字节字符,uglRectangle(), uglEllipse()函数分别是画矩形、圆圈和椭圆形状,其具体的实例如图4所示。

图4 汉字图形的显示界面

2.2 JPEG图片的显示

WindML中2D位图管理的API允许创建或者渲染单色、彩色、透明位图到显示器上。

VxWorks是一个实时操作系统,有硬盘等设备,要将JPEG图片显示在显示屏上则需要把JPEG文件上传到VxWorks的硬盘里,假设VxWorks的盘符为ata0a,利用ftp工具把JPEG文件上传到VxWorks硬盘里。首先进入到VxWorks的virtual console控制台界面中,输入cd “/ata0a”,进入VxWorks硬盘,用ls命令查看硬盘里的文件,如果要将图片文件放入一个新的文件夹就用命令mkdir image创建一个存放图片的文件夹,创建后再次用ls命令查看是否已经成功的操作。打开ftp文件传输软件把JPEG文件上传到VxWorks硬盘中。

前期准备工作后,进行软件代码的编写。WindML 2D设备和驱动的扩展机制为处理图片数据奠定了基础,使得WindML支持处理JPEG图片。首先用函数uglJpegInit()初始化JPEG的扩展功能,验证JPEG扩展功能为特别的图形设备而安装,初始化后uglJpegInit()函数会返回UGL_JPEG_ID,此ID号为以后的JPEG例程调用作为一个参数值而返回。

WindML定义了一种方便的点阵图称作DDB(设备有关位图),如果要显示的JPEG图片较大,则花费在处理图片的时间越长,因此要权衡图片大小和处理时间。

显示图片除了需要初始化字体库和设备标识符外还需要调用uglJpegInit()函数初始化JPEG库和JPEG的扩展功能,这样才能让JPEG图片显示在界面上,初始化完成后会返回一个ID号,接着要设置JPEG引擎,具体的代码如下:

jpegId = uglJpegInit(devId, &jpegVersion);

uglJpegModeSet(jpegId, &jpegMode);

把要显示的JPEG图片文件的内容读到文件指针里,调用uglJpegToDDBFromFile()函数解压缩后写入到位图中,然后调用uglBitmapBlt()函数把UGL_BITMAP_ID传输到UGL_DDB_ID中,并以UGL_GC_ID开始绘制图片,以下是代码:

uglJpegToDDBFromFile (jpegId, fp, &jpeg-DdbId, UGL_NULL, 0, 0);

uglBitmapSizeGet(jpegDdbId, &jpegWidth, &jpegHeight);

uglBitmapBlt(gc, jpegDdbId, 0, 0, jpegWidth -1, jpegHeight - 1, UGL_DEFAULT_ID, 0, 0);

本实例是利用WindML支持2D位图的功能显示出JPEG图片,程序写好后进行编译,将其下载到目标板上,运行后在终端显示如图5所示。

图5 JEPG图片显示结果

3 结束语

本文介绍了在WindML下开发字体、图形及图片文件的显示,程序开发后能够运行在具体的项目板上,同时对开发中可能出现的问题和解决方案做了详细的步骤说明,应用于实际的开发项目中取得了良好的效果。

[1] 周启平,张 杨,吴 琼.VxWorks开发指南和Tornado实用手册[M].北京:中国电力出版社,2004.

[2] 孙凤丽,王 瑞,杨桂枝,等.实时嵌入式操作系统VxWorks结构分析和剪裁[J].软件产业与工程,2013(1):33-36.

[3] 杨 蔚.基于VxWorks 的数据采集与重演软件的图形界面的设计与实现[J].宇航计测技术,2012,32(3):69-74.

[4] 王 洋.VxWorks嵌入式实时操作系统设备驱动与BSP开发设计[M].北京:北京航空航天大学出版社,2012.

[5] 王彦刚,吕遵明,万留进.VxWorks系统的BSP设计与实现[J].计算机系统应用,2011,20(12):91-94.

[6] 刘亚丽,颜丽娟.一种基于VxWorks 的汉字输入法实现[J].电子科技,2012,25(2):97-99.

[7] 韩改宁.嵌入式系统VxWorks下汉字输入法的研究与实现[J].咸阳师范学院学报,2012,27(4):44 - 46.

责任编辑 陈 蓉

Chinese character, graphics interface and photo display under WindML

XU Xiaowu, YU Lijian, LIU Hongyu
( School of Information Science and Technology , Southwest Jiaotong University, Chengdu 610031, China)

VxWorks; WindML; text; graphics; image fi le

: This paper introduced the structure of WindML, focused on the development, described the principle of preceding text graphics character, structure and con fi guration, the preparatory work before displaying the picture fi le and the important note of WindML setting compile. With the development of speci fi c projects, the paper demonstrated the text, graphics, images, fi les, which were developed by WindML under VxWorks.

2014-03-04

胥小武,在读硕士研究生;余立建,教授。

U29∶TP39

A

1005-8451(2014)08-0049-04

猜你喜欢
字库字体引擎
新海珠,新引擎,新活力!
No.2 喜茶联合汉仪字库推出微型书和书签
车坛往事4:引擎进化之屡次失败的蒸汽机车
字体的产生
论计算机字库单字的著作权保护
——以方正诉宝洁案为例
蓝谷: “涉蓝”新引擎
老家的惜字库
组合字体
字库之战
字体安装步步通