renjwjx 发表于 2008-12-23 16:33:00
几种格式字库的简介
QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,TTF或PFA/PFB。即让应用程序在显示的时候再计算点阵,最终的效果并不理想,会发现有些字大,有些字小,而且需要占用非常多的FLASH和内存,速度也有点慢,所以我在此不想过多的介绍PFA/PFB。如果直接使用BDF,速度非常慢,而且需要占用比较多的FLASH和内存;使用QPF,速度和占用其它资源是最小的,因此我们最终的产品中采用QPF格式。下面我简单介绍,TTF,BDF和QPF字体的结构,这样就比较容易理解后面的转换过程。
1.1 TTF字体
TTF(TrueType Font)是Apple公司和Microsoft公司共同推出的字体文件格式,随着Windows的流行,已经变成最常用的一种字体文件表示方式。TTF字体已经成功用在Windows中文版生成汉字字库,此字体采用二次B样条曲线来描述字符轮廓,对字符轮廓的上的点,按顺时针方向从小到大编号,填充部分在其右边。TTF文件结构分成三个部分:文件名(12Bytes),描述表目录(每个16Bytes),描述表数据。
对于每一个字,都有一个假想的矩形框,正常情况字是不会超出这个矩形框的,中文属于象形字,不象英文,大小不一致,比如:英文中的f就可能会超出矩形框。微软把矩形的高度称为EM,实际字符的高度称为BODY.矩形框最原始的坐标系是矩形的中心为原点,但为了实际字体在打印和显示的使用过程中的方便,通常将坐标原点放在左下角,或中下。
通常,在实际打印过程中,TTF字体是用像素来度量的,如何将矩形框中的字体转成像素呢?有一个计算公式,实例如下:如果18个点的72点每英寸屏下有一个550的长度,矩形框内有2048个单位。那其像素为550*18*72/72/2048=4.83像素。显然,每英寸里的点取的越多,字就越逼真,同时这样的存储空间和计算的时间也就越多。在嵌入程序开发过程中,这往往是不可以接受的,因为嵌入式系统的硬件资源本来就很有限,如果真的这样的话,在显示过程会很慢。并且如果为了提高速度而减少每英寸中的点数,则字体失真的情况很严重。更加具体的关于,TTF字体的内容可见参考资料[3]。
另外,在Windows下编程,Microsoft实现了让用户对字体操作处理具有透明性,有关字体结构定义见参考文献[4]。
1.2 BDF字体
BDF(Bitmap Distribution Format)是在X窗口系统中的一种表示位图字体的文件格式。是X协会定义的一种标准,是ASCII文件 它由两部分组成,一是表示字体整体属性的文件头信息;二是每一个字符独有的属性和位图数据。我以16*16的位图字体为例描述BDF字体文件格式。
STARTFONT2.1 /*后面跟一个版本号,指出该字体文件版本*/
COMMENT /*表示注释*/
FONT -adobe -courier -bold -r -normal -16 -160 -75 -75 -m -160 -gb2312.1980 -0
/*表示字体名*/
SIZE 16 75 75 /*字符大小与在X,Y方向上的分辨率*/
FONTBOUNDINGBOX 16 16 0 0 /*X方向上宽度与Y方向高度及x和Y方向上的偏移*/
STARTPROPERTIES 16 /*设置字体的属性项目数*/
FOUNDRY "Adobe" /*字体的制造厂家*/
FAMILY_NAME "Courier" /*字体的变种字型*/
WEIGHT_NAME "Bold" /*字体的印刷权*/
SLANT "R" /*字体字型的设计情况*/
SEWINDTH_NAME "Normal" /*字体的缩放因素*/
ADD_STYLE_NAME "" /*唯一的标识该字体,一般为空*/
PIXEL_SIZE 16 /*依赖于设备的字体尺寸*/
POINT_SIZE 160 /*设计字体的实际尺寸*/
RESOLUTION_X 75 /*设计字体的水平分辨率*/
RESOLUTION_Y 75 /*设计字体的垂直分辨率*/
SPACING "m" /*指出字符宽度是定长还是可变*/
AVERAGE_WIDTH 160 /*字体中所有字符的平均宽度*/
CHARSET_REGISTRY "gb2312.1980" /*字符集名*/
CHARSET_ENCODING "0" /*字符集编号*/
FONT_DESCENT 0 /*基线下的高度*/
FONT_ASCENT 16 /*基线上的高度*/
ENDPROPERTIES /*属性项设置结束*/
CHAR 6775 /*字体文件中的字符数*/
STARTCHAR 啊 /*字符起始标志及名称*/
ENCODE 3021 /*X服务器在存取该字符时使用的编码。如汉字国标码*/
SWIDTH 1000 0 /*X和Y方向上的逻辑宽度和高度*/
DWIDTH 16 0 /*字符在x和Y方向上的设备单位宽度*/
BBX 16 16 0 0 /*字符边界框的宽度,高度以及偏移*/
BITMAP /*字符的位图的信息起始标志*/
0000 /*字符位图*/
04a0
……
0590
ENDCHAR /*字符结束标志*/
STARTCHAR 阿 /*第二个字符开始*/
……
ENDFONT /*BDF字体文件结束标志*/
1.3 QPF字体简介
QPF格式的字库是仅用于QT/Embedded的不可缩放的字体,在程序运行过程中,对TTF格式的字体,在第一次装入使用时,都要以给定的字体大小进行处理;而对于BDF字体,当其使用时,所有字体都必须被处理;而对于QPF字体,均以相同格式的存储。所以在字体显示时,Qt只要读取字体,做相应分析,然后显示就完成了,这样进一步减少了对RAM资源的浪费。QPF字体是基于UNICODE编码的,这为QT/Embedded良好的可移植性奠定了基础。有关QPF更详细的资料可以查阅参考文献[5]。
阅读全文(1442) | 评论(5)
5楼 52RD网友(游客) 发表于 2009-12-3 9:35:00
看中文比看英文方便多了,再说不是所有人都能看明白英语。
4楼 52RD网友(游客) 发表于 2009-11-19 10:51:00
说的是1楼的,别误会
3楼 52RD网友(游客) 发表于 2009-11-19 10:49:00
最鄙视ls的,你要是觉得不好,你可以翻译篇好的啊。你说不如直接放英文好,你以为所有人英文水平都想您老人家那么高啊。
2楼 zjhfqq(游客) 发表于 2009-9-12 21:29:00
还不错啊。蛮好的。
1楼 52RD网友(游客) 发表于 2009-8-25 19:45:00
这说的是什么啊,哎。。。。拿到外国文档往google上面一放,就拿过来发表,有点责任感好不好~~~~有什么用嘛,直接放英文还好一些。。哎。。。。
9 1 :