基于Unicode编码方式的TrueType字体的实现
作者:赵黎,蔡雪梅
来源:《电脑知识与技术》2010年第03期
作者:赵黎,蔡雪梅
来源:《电脑知识与技术》2010年第03期
摘要:MiniGUI是典型的图形用户界面系统,它采用面向对象的技术实现多字体和多字符集的支持。MiniGUI针对字体和字符集定义了一系列抽象接口,如果要增加对某种字体或某种字符集的支持,只需实现该字体类型和该字符集的接口即可。该文重点讲述了对Unicode字符集和TrueType字体的支持和实现,并提供了Unicode编码方式的文本处理和显示的API。
关键词:MiniGUI;TrueType字体;Unicode;字符集
中图分类号:TP391文献标识码:A文章编号:1009-3044(2010)03-738-04
Implement of TrueType Font Based on Unicode encoding
ZHAO Li, CAI Xue-mei
(College of Electroning Engineering, Chongqing University of Posts and Telecommunications, Chongqing 400065, China)
Abstract: MiniGUI is a typical Graphic User Interface System.It achieves multi-font and multi-character set support by adopting the techniques of object-oriented. It defines a series of abstract interface for fonts and character sets,the support of a certain font or a character set is increased by achieving the interfaces of the font type and the character set.The paper describes the support and implement for Unicode character set and TrueType font, and it provides the application program interface of the text process and display in Unicode encoding ways.
Key words: MiniGUI; truetype; unicode; character set
MiniGUI 是一个跨操作系统的、面向嵌入式系统的轻量级图形用户界面支持系统。它主要在Linux控制台上运行,是基于SVGALib和LinuxThread库的多窗口图形用户界面支持系统。它采用了类Win32的API接口,实现了简化的类Windows 98风格的图形用户界面。自1999年初遵循GPL条款发布第一个版本以来,MiniGUI已广泛应用于手持信息终端、机顶盒、工业控制
系统及工业仪表、便携式多媒体播放机、查询终端等产品和领域。而且MiniGUI2.0为基于嵌入式Linux的高端嵌入式设备提供了完整的多进程支持,从而将MiniGUI从中端市场带到了高端市场[3]。
MiniGUI采用了面向对象的技术实现了图形抽象层(GAL)、输入抽象层(IAL)以及多字体和多字符集的支持。GAL和IAL大大提高了 MiniGUI 的可移植性,并将底层图形设备和上层接口分离开来。MiniGUI采用逻辑字体实现多字体和多字符集处理。这一技术成功应用了面向对象技术,通过单一的逻辑接口,可以实现对各种字符集以及各种字体的支持[4]。
1 MiniGUI中TrueType字体的实现
1.1 TrueType字体简介
TrueType是Apple公司和 Microsoft公司合作开发的页面描述语言(Page Description Language,PDL)TrueImage中的字形描述部分。TrueType字体(简称 TTF)采用直线和二次Bezier曲线来描述字符的轮廓,结合了光栅技术和矢量技术的优点,克服了以往所有点阵字体、矢量字体和向量轮廓字体的缺点,字体可以任意放大、缩小、旋转和变形而不会影响输出质量,
提供了真正的设备无关性。二次Bezier曲线既能保证轮廓曲线的光滑性,又有利于提高字形还原速度。另外,TrueType所特有的丰富的指令集,不仅弥补了TTF的二次曲线描述轮廓的不足,而且增强了TTF字形描述的灵活性。若要提高字体的质量,不仅可以通过数据信息来实现,而且可通过增加指令来进行。Microsoft公司从Windows 3.1开始就采用TrueType字体技术。随着Windows的流行,TrueType已经成为事实上的字形描述标准之一[5]。
1.2 TrueType字体的分析及实现
1.2.1 TrueType字体的数据结构
本文采用FreeType这个中间件来实现TrueType字体支持。在MiniGUI设备字体定义中,有一个data字段可用来保存设备字体相关的数据结构。对TrueType字体来讲,我们使用 TTFGLYPHINFO和TTFINSTANCEINFO两个数据结构来存储TrueType字体的文字轮廓信息和实例信息。
typedef struct tagTTFGLYPHINFO
{
TT_Face face;
TT_Glyphglyph;
TT_UShort last_glyph_index;
TT_CharMapchar_map;
TT_Ushort first_char;
TT_Ushort last_char;
BOOLcan_kern;
TT_Kerningdirectory;
BOOLvalid;
}TTFGLYPHINFO, *PTTFGLYPHINFO;
typedef struct tagTTFINSTANCEINFO {
PTTFGLYPHINFO ttf_glyph_info;
TT_Instance instance;
int rotation;
TT_Matrix matrix;
int max_width;
int ave_width;
int height;
int ascent;
int descent;
unsigned short* widths;
short cur_glyph_code;
unicode所有字符 TT_Outlinecur_outline;
TT_Poscur_xmin, cur_ymin;
TT_F26Dot6cur_width, cur_height;
TT_Poscur_advance;
short last_glyph_code;
short last_pen_pos;
}TTFINSTANCEINFO,*PTTFINSTANCEINFO;
如前面所说,TTFGLYPHINFO和TTFINSTANCEINFO数据结构来存储TrueType的图元信息和实例信息。其中TTFGLYPHINFO中的成员valid是用来判断该设备字体是否初始化完毕。
1.2.2 TrueType字体的字体操作集freetype_font_ops
MiniGUI 中的设备字体操作集针对每种设备字体类型而定义,包括对这种设备字体的各种操作函数。TrueType字体的字体操作集freetype_font_ops的结构成员及功能如表1所示。
1.2.3 InitFreeTypeFont和TermFreeType Fonts函数
这两个函数负责整个TrueType字体的初始化和终结。
InitFreeTypeFonts的主要任务是:初始化TTF字库,并向系统注册用来处理TrueType字体的字体操作集freetype_font_ops。
TermFreeTypeFonts则是注销TrueType字体,关闭TTF字库。
1.2.4向配置文件MiniGUI.cfg添加TrueType字体支持
MiniGUI在初始化时,要读取MiniGUI.cfg中的字体定义并装载指定字体文件,装载后的字体在MiniGUI内部称为“设备字体”。设备字体定义了这种字体的样式名、风格、大小以及它所支持的字符集。MiniGUI在创建逻辑字体时,要根据已装载的设备字体,以及应用程序指定的字
体类型、样式名、大小、字符集等信息寻合适的设备字体来显示文本[1]。
在MiniGUI.cfg文件中的systemfont段添加下面代码:
font4=ttf-sic-rrncnn-*-12-ISO8859-1
font5=ttf-sic-rrncnn-*-16-ISO8859-1
2 MiniGUI中Unicode字符集UTF-16LE编码方式的实现
MiniGUI对多字符集的支持通过逻辑字体接口来实现。应用程序在显示文本时,通常要建立逻辑字体,并指定该字体使用的字符集编码名称。在创建逻辑字体之后,应用程序就可以使用该逻辑字体显示文本或者分析文本结构。
Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。它具有多种编码方式,常见的有:UTF-8,UTF-16,UTF-32。而UTF-16分为UTF-16LE和UTF-16BE,本文采用UTF-16LE编码方式进行文本显示和输出。
常用的文本输出函数有Text和DrawText等,其中只有DrawText函数不支持UTF-16编码方式的文本输出。本文将提供支持Unicode字符集UTF-16LE编码的DrawText函数[1]。
2.1 DrawText函数相关源代码导读
要使DrawText函数支持UTF-16LE编码,需更改libminigui-1.6.10/src/newgdi目录下的Text.c文件的部分代码,改写方法如下:
1)Text.c 的523行char_len = 1改为char_len = is_utf16_logfont(pdc)?2:1。
2)Text.c 的592行if (is_utf16_logfont (pdc)) return -1注释掉。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论