点阵字库文件格式" />
解析如下:
1).
文件头(蓝色框选部分)。
前 16 Byte
55 46 4C 11 --
标识头,判断是否为合法的字库文件。
55 = 'U',
表示该文件为 Unicode
编码格式的字库文件。
46 = 'F',
4C = 'L'
11
表示该字库文件版本信息为: Version
1.1
3C 52 00 00 --
文件总长度
03 --
包含几个Section。03 即表示分为3段。
18
--
字体高度.
即表示字体大小为24(0x18)点阵。
A0 00
A0 00
--
选择的字符集标志位。即0x00A0(00000000 10100000),
根据字符集序, 故得出当前选择为:
中欧+西欧字符集。
0F 01
--
有效点阵字符数。 即表示有0x10F个字符的点阵数据。
00 00
--
预留字节
2).
段信息
(粉红色框选部分)。
nSection * sizeof(FL_SECTION_INF) = 3
* 8 = 24Byte
此文件分3段,解析如下:
Section1.
20 00
-- First character,
即此段首字符为0x20
D2 06
-- Last character,即此段尾字符为0x6D2
28 00 00 00 --
指向的是首字符(0x20)的字符信息(即检索表)的起始地址,即为0x28.
Section2.
01 0E
-- First character,
即此段首字符为0xE01
5B 0E
-- Last character,即此段尾字符为0xE5B
F4 1A 00 00 --
指向的是首字符(0xE01)的字符信息(即检索表)的起始地址,即为0x1AF4.
Section3.
0C 20
-- First character,
即此段首字符为0x200C
22 21
-- Last character,即此段尾字符为0x2122
60 1C 00 00 --
指向的是首字符(0x200C)的字符信息(即检索表)的起始地址,即为0x1C60.
注: 根据段信息,即可得出字符的检索信息。
如何快速定位一个字符的检索信息(字符信息)?
a. 先比较确定该字符属于哪一段。
b. 精确计算其起始地址。 (起始地址=字符的unicode码 - Section[x].First)* sizeof(UFL_CHAR_INDEX ) +
Section[x].OffAddr)
例如1: 字符 '5'.即 0x35.
它属于第1段(>= 0x20 &&
<= 0x6d2),所以它的检索信息存放在: (0x35-0x20) * 4 + 0x28 =
0x7C
例如2:
字符 右双引号‘”’,即 0x201D
它属于第3段(>=
0x200C &&
<= 0x2122),所以它的检索信息存放在: (0x201D-0x200C) * 4 + 0xC160
= 0xC1A4
3).
检索表
(绿色下划线标记部分)
每个字符的检索数据(4
字节/字符)结构如下:
typedef struct tagUflCharInfo{
DWORD
OffAddr :
26;
//低26bit,存放 当前字符点阵数据的起始地址
DWORD
Width : 6;
// 高6bit,
存放当前字符点阵的像素的宽度
} UFL_CHAR_INDEX;
注:
04 27 00 40
: 即为0x40002704 (01000000 00000000 00100111 00000100)。
高6位,表示当前字符的宽度。故得出 010000--0x10,即当前字符的宽度为16.
低 26位,表示当前字符点阵数据的偏移地址。故得出 00 00000000 00100111 00000100
---0x2704。
4). 点阵数据(蓝色下划线标记部分)
所有数据均为横向扫描, 字符宽度不同,点阵数据size也不同。
计算方法: 字体高度 × (字符宽度 + 7)/8 =
size
例如:字符大写字母‘E’(0x45)。
a)
读取字库文件头,获取字库的基本信息。
b)
确定属第几段。
因为0x45 >= 0x20
&& 0x45 <=
0x6D2,
故可确定其在第1段。
c)
计算点阵信息的起始地址。
起始地址=(0x45-0x20)*4+0x28 = 0xBC
故可得出检索信息:04 27 00 40,
即为0x40002704
(01000000 00000000 00100111
00000100)。
高6位,表示当前字符的宽度。故得出
010000—16,即当前字符的宽度为16.
低 26位,表示当前字符点阵数据的偏移地址。故得出
00 00000000 00100111 00000100
---0x2704。
即当前字符点阵数据的偏移地址为 0x2704。
d)
蓝色下划线标记部分,即为大写字母‘E’的点阵数据。因为它的字体高度为24, 宽度为16, 故其点阵数据长度为: 24 * (16+7)/8 =
48
===================================================================================================
新版本工具下载地址: http://ishare.iask.sina.com.cn/f/15537623.html