免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1364 | 回复: 0
打印 上一主题 下一主题

在嵌入式Linux及QT/Embedded-2.3.7下制作QPF字库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-24 16:20 |只看该作者 |倒序浏览
QT是目前在Linux操作系统平台下应用最多的图形用户界面的底层库,由其派生出的QT/Embedded大量用于嵌入式系统开发和研制中。实际上,QT/Embedded提供给用户的非ASCII码的字库一般比较少,在我们开发过程中用的嵌入式Linux系统中中文和日文的字库都只有一个(不算不同的旋转角),其中还存在字体大小不一样的问题,因此在实际开发过程中我们在处理中文字体显示时,最终使用这些工具开发出来的软件的用户就经常抱怨字体很难看,字体大小有时都不一致,因此定制自己的字库,以便使得最终用户能够看到漂亮的中文显示,这是使用QT/Embedded开发各种程序急需解决的一个问题。
1 如何定制字库
    定制自己的字库需要修改两个文件,一个是FONTDIR,它是应用程序寻找当前系统中最适合自己需要的字库的索引;另一个就是字库文件了,可以有一个或者多个字库文件,字库文件是最终显示的字的位图或者矢量。它们都必须放在目录/usr/qt/lib/fonts下(基于我们的平台QT/Embedded,其它平台可能有区别,下同)。
1.1 FONTDIR的简介
     一个典型的FONTDIR文件的内容如下所示:
fixed fixed_120_50.qpf QPF n 50 120
helvetica helvetica_80_50.qpf QPF n 50 80
helvetica helvetica_120_50.qpf QPF n 50 120 u
helvetica helvetica_120_75.qpf QPF n 75 120 u
helvetica helvetica_140_75.qpf QPF n 75 140
helvetica helvetica_180_75.qpf QPF n 75 180
    文件中每行都标识一个特定的字库,每个段的含义是:第一列为name,第二列为file,第三列为renderer,相当于字型格式,所以有BDF,TTT,QPF等选择。第四列n表示iitalic,表示是否为斜体字。第五列表示weight,其中50表示Normal,75表示Bold。第六列表示size,例如:120表示12pt。第七列为flags,有下面三个选择:s=smooth(anti-aliased)u =unicode range when saving (default is Latin 1 a = ASCII range when saving(default is Latin 1))
                                                         —— 摘自参考文献[1]
    其中属性file,renderer(BDF,TTF,QPF)和size特别要设置对,其它属性问题不大。还要注意如果在该目录下有QPF的文件,系统只会使用QPF格式的文件,而不会读取其它格式的文件,不管FONTDIR里面的内容是什么。如果有多个QPF文件,应用程序按照大小,家族,黑体和斜体的顺序查找,即首先查找大小和自己一样的字库,大小无法区分唯一的字库的再看对应的家族,还是无法区分的再看是否黑体,是否斜体。可以参考PC上的字库索引文件FONTDIR:
例如:
-cclib -song -medium -r -normal -jiantizi -16 -160 -75 -75 -c -160 -gb2312 1980 -0
其中,每个段的含义如下:
cclib:制造商
song:字体族,此处表示“宋体”字
medium:字权重(中等),还有bold(粗体)选项
r:倾斜,R(Roman),I(Italic),O(Oblique)
normal:字符集宽度,此外还有condensed,narrow,double
jiantizi:附加说明(此处意义为“简体字”)
16:用像素衡量的宽度。
160:点数 10
75(1):水平分辨率(dpi)
75(2):垂直分辨率(dpi)
c:间距。c:square,m:fixed width,p:variable width
160:平均宽度(10*pixels)
gb2312.1980:注册字符集,标准名
0:第0套,基本集
                                                      —— 摘自参考文献[2]
1.2 几种格式字库的简介
    QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,TTF或PFA/PFB。即让应用程序在显示的时候再计算点阵,最终的效果并不理想,会发现有些字大,有些字小,而且需要占用非常多的FLASH和内存,速度也有点慢,所以我在此不想过多的介绍PFA/PFB。如果直接使用BDF,速度非常慢,而且需要占用比较多的FLASH和内存;使用QPF,速度和占用其它资源是最小的,因此我们最终的产品中采用QPF格式。下面我简单介绍,TTF,BDF和QPF字体的结构,这样就比较容易理解后面的转换过程。
1.2.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.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.2.3 QPF字体简介
    QPF格式的字库是仅用于QT/Embedded的不可缩放的字体,在程序运行过程中,对TTF格式的字体,在第一次装入使用时,都要以给定的字体大小进行处理;而对于BDF字体,当其使用时,所有字体都必须被处理;而对于QPF字体,均以相同格式的存储。所以在字体显示时,Qt只要读取字体,做相应分析,然后显示就完成了,这样进一步减少了对RAM资源的浪费。QPF字体是基于UNICODE编码的,这为QT/Embedded良好的可移植性奠定了基础。有关QPF更详细的资料可以查阅参考文献[5]。
2 如何从TTF字体文件转成QPF字体文件
2.1 把TTF转换成BDF
    尽管不推荐使用TTF格式的字库,但由于TTF格式的字库可以转换成任意大小的BDF字库,而可以找到的BDF字库都是固定大小的,因此在实际制作QPF字体文件时,还是需要TTF格式的字库。把TTF转换成BDF的方法如下:
./ttf2bdf source.ttf -p yourSize -o destination.bdf
    即利用软件ttf2bdf可以把源文件source.ttf转换成大小为yourSize的BDF格式的文件destination.bdf。那在程序内部是如何实现将TTF转成BDF的呢?由2.2.1和2.2.2的介绍,并且查阅参考文献[3],可以知道TTF的内部存储结构。其中最核心的部分是TTF文件格式中的12个字节的文件表:表目录按tag以升序排列。
Type
Name
Description
ULONG
tag
4字节的标识
ULONG
checkSum
表中的CheckSum
ULONG
offset
TrueType font文件的起始偏移量Offset
ULONG
length
表长
    还有一个有关Offset表的信息,包括版本号,表的数量,查找范围。入口选择,转换范围。
    通过操作文件表,将描述表中的数据取出来,按照BDF字体所定义的格式写入,就可以生成对应的字体。比如,可以给出一小段c语言程序,此程序用于计算当前CheckSum的位置。
ULONG
CalcTableChecksum(ULONG *Table,ULONG Length)
{
ULONG Sum = 0L;
ULONG *Endptr=Table+((Length+3)& ~3)/sizeof(ULONG);
while(Table

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49221/showart_704487.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP