VxWorks5.5 平台下矢量字体显示的实现
摘 要:VxWorks5.5 采用点阵字库实现字体显示,这种字库设计简洁,应用广泛,但一个字库只能对应一种字体的一种大小,在不确定使用何种字体的情况下,这种传统的字体显示方式便不能够满足需求。通过使用TrueType字库和FreeType 字体引擎相结合的方式,能实现多种字体、任意大小的显示功能。主要介绍了TrueType、FreeType技术的基本原理,以及在VxWorks5.5 下如何将WindML、FreeType 和TrueType 三者相结合实现矢量字体显示的方法。 1 VxWorks5.5点阵字库的局限性 VxWorks5.5 是美国风河公司开发的嵌入式操作系统,图形系统采用WindML3.0,支持点阵字显示,不支持矢量字体显示。点阵字采用内存模式加载,使用前需要将字体库先加载到内存,再通过WindML 图形接口实现点阵字显示。点阵字库采用。c 文件方式储存信息,每个字信息都包含在一个数据结构中,其中包含了字体的所有点信息,字体显示时只要根据字的宽高将点信息直接送入显存显示。这种方式的字体实现简单、显示速度快,但是一个字体文件只包含一种字体、一个大小的信息,使用具有一定的局限性。 随着嵌入式软件的不断发展,在设计象嵌入式浏览器这样的人机界面的软件时,发现点阵字库已经远远不能满足设计要求,嵌入式浏览器对字体的需求是根据网页内容来决定的,在网页上任何类型,任何大小的字体都可能出现,点阵字库要将所有字体类型,每种字体的所有大小都包括是不可能的,这种局限性大大降低了浏览器的显示效果。TrueType 字库引入到VxWorks5.5 系统下,有效的解决了字体的问题,所有Windows 下的TrueType 字库都可以在VxWorks5.5 系统直接使用,资源非常丰富,能满足嵌入式系统对字库的新需求。 2 TrueType字库原理及FreeType字体引擎 TrueType 是Apple 公司和Microsoft 公司合作开发的页面描述语言(简称TTF),采用了直线和二次贝赛尔曲线来描述字符的轮廓,结合了光栅技术和矢量技术的优点,克服了以往所有点阵字体、矢量字体和向量轮廓字体的缺点,字体可以任意放大、缩小、旋转和变形而不会影响输出质量,提供了真正的设备无关性,二次贝赛尔曲线既能保证轮廓曲线的光滑性,又有利于提高字形还原的速度。如下图1 所示。 图1 TrueType 字体轮廓图 FreeType 是一个完全免费的、高品质的可移植的字体引擎,它提供同一的接口访问多种字体格式,包括TrueType,openType,CID,CFF 等。支持单色位图,反走样位图的渲染,FreeType 库是高度模块化的程序库,它使用ANSI C 开发,但采用面向对象的思想,FreeType 用户可以灵活地对它进行裁剪。 3 VxWorks5.5下矢量字库的实现 VxWorks5.5 下矢量字库采用开放源代码的Freetype 库和Windows 下的TrueType 字库结合实现,通过WindML 图形系统将矢量字应用到VxWorks5.5系统中。矢量字使用前先初始化WindML 图形系统,再初始化矢量字库,并将矢量字库的接口函数挂接到图形系统下,在应用矢量字库时只需调用WindML 接口函数,调用方式和点阵字库一致,实现了与WindML的无缝挂接。TrueType 字库根据加载方式不同分为动态加载和静态加载两种方式,动态加载方式是将TrueType 字库拷贝到目标机硬盘,根据应用程序的设计要求在程序运行时动态加载字库;静态加载方式是将TrueType 字库在系统启动时便加载到目标机内存,应用程序可以直接调用字库信息。动态加载方式优点在于节省内存和加载灵活,缺点在于不同字体切换时消耗的时间长,不适合需字体的频繁切换的应用程序;静态加载方式优点在于不同字体切换时消耗的时间短,适合需字体的频繁切换的应用程序,缺点在于内存消耗大,加载不灵活。 3.1 矢量字体的初始化 矢量字库的初始化主要有矢量字体设备创建和矢量字体设备注册两部分组成。先创建矢量字体设备,如果创建成功则将矢量字体设备注册到系统中,如果创建不成功则退出程序。 矢量字体设备创建函数UGL_FONT_DRIVER*uglFT2FontDriverCreate(UGL_UGI_DRIVER*pDriver,UGL_FT2_FONT_DRV_CFG *pFT2FontConfig),参数pDriver 为图形系统设备号,取值graphicsDevID 为WindML 初始化时创建的图形系统设备号;参数pFT2FontConfig 为字体配置结构,根据字体加载的方式不同参数也不同,具体见3.4 章节;返回值ft_fontDevID为矢量字体设备号。 设备注册函数UGL_STATE uglRegistryAdd(UGL_UINT32 type, UGL_UINT32 data, UGL_UINT32id, char *name),参数type 为矢量字体设备类型,需定义一个新设备类型UGL_FONT_ENGINE_FTTYPE,取值为13;参数data 为图形系统设备ID,取值(UGL_UINT32)graphicsDevID;参数id 为矢量字体设备号,取值(UGL_UINT32) ft_fontDevID;参数name取值0. 3.2 字体单双字节编码转换 3.4 字库加载 字体库加载方式分动态和静态两种,两者之间互有优缺点,可根据用户的不同需求自主选择加载方式。 3.4.1 字库动态加载 字库动态加载方式是将windows 下的TrueType 字体库文件(*.ttf,*.ttc)拷贝到目标机目录下,根据用户需求在程序执行过程中动态加载字库。动态加载的实现方法:先声明两个结构变量。 1) UGL_FT2_FONT_DRV_CFG ft_font_cfg; 2) UGL_FT2_FONT_PATH_DESC FontPathDesc; 接着设置FontPathDesc 信息, FontPathDesc.PFontSearchPath=/ata0a/ttf/; FontPathDesc.filter=*.ttf;pFontSearchPath 为字体文件搜索路径,filter 为文件过滤器。再设置ft_font_cfg 信息,ft_font_cfg.numFontPathDesc=1;ft_font_cfg.pFontPathDesc=FontPathDesc; ft_font_cfg.defaultCharset=FT_ENCODING_UNICODE;numFontPathDesc 为字体搜索路径的个数,pFontPathDesc 为搜索路径,defaultCharset 为设置矢量字体的编码模式。最后按照3.1 章节对矢量字库进行初始化。 3.4.2 字库静态加载 字体库静态加载方式是将windows 下的TrueType字体库文件(*.ttf,*.ttc)编译生成一个。o 文件,并在应用程序执行前先加载到内存。静态加载的实现方法:
评论