加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

图文详解 unicode 点阵字库文件格式

(2011-06-08 22:59:27)
标签:

详解

如何

获取

unicode

宋体

字符信息

点阵

字库文件

字符集

it

分类: 文件系统与文件格式
注意:在此讲述的是由 fontmaker 工具生成的 unicode 点阵字库文件格式。

unicode 点阵字库格式:
http://s2/middle/5d8cc641ga534a729c651&690unicode 点阵字库文件格式" TITLE="图文详解 unicode 点阵字库文件格式" />
...
http://s13/middle/5d8cc641ga534b15489dc&690unicode 点阵字库文件格式" TITLE="图文详解 unicode 点阵字库文件格式" />
...
http://s12/middle/5d8cc641ga534b27c040b&690unicode 点阵字库文件格式" TITLE="图文详解 unicode 点阵字库文件格式" />

解析如下:

    1. 文件头(蓝色框选部分)。 16 Byte

    55 46 4C 11 -- 标识头,判断是否为合法的字库文件。    

                   55 = 'U', 表示该文件为 Unicode 编码格式的字库文件。

                   46 = 'F'4C = 'L'

                   11 表示该字库文件版本信息为: Version 1.1

    3C 52 00 00 -- 文件总长度

    03          -- 包含几个Section03 即表示分为3段。

18                             -- 字体高度. 即表示字体大小为240x18)点阵。

     A0 00        A0 00       -- 选择的字符集标志位。0x00A000000000 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
点阵字库解析源码(c): http://ishare.iask.sina.com.cn/f/16883614.html
===================================================================================================


但愿能给您带来帮助,谢谢您的阅读!

祝生活愉快,幸运永伴。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有