在这个帖子里,集中说明如何制造一个包含中文字体的字库。# `+ K: [. v/ ] w; ^+ l
在看这个帖子前,请先看一下这个帖子
3 H* w3 R6 J6 L X9 I8 |& Y( `https://www.chinaavg.com/read.php?tid=18959) D2 P6 n% x+ f1 ?' ~- E7 H% E g
为了便于理解,我制作了一个示意图,看了示意图应该很容易理解字库的结构。
% \' q @$ M6 `: W! I% l a
0 O% |. u: V6 `3 ~; U0 I示意图如下:
' N( I. L1 O) Y# ]- t1 x
- l& p* ~( X5 c. i u
, P/ z0 [/ z: S原来的字库的高度均为26个像素。每个像素用一个字节表示。. u% D, [8 `; A9 D: Z5 E3 W
背景像素 0x00
, |$ P3 M' k5 U9 ~9 u* j, t9 x0 u边框像素 0xC8 : I( j5 R w' \2 x, l/ |/ j/ \7 F
字体像素 0xC1' o+ n$ }+ T u% m. p
2 b% g% U7 k0 s& c p. s我的设计是 中文字体的高度也为26个像素,宽度固定为20个像素。" @# l) A. o- E5 p5 F; f+ U: r# W
原来的边框的宽度为2个像素,我觉得太宽了,不太好看,决定中文的边框为1个像素。
, Z% O1 w9 g# s- `- ]( x我用一个中文的田字来演示字库的结构,黑色表示边框像素,红色表示字体像素,黄色表示背景像素。背景像素在显示到画面上以后,会被画面的像素所取代,字体像素会被设定的字体颜色所取代。& W9 {, |+ h, F/ o
边框像素的值是固定不变的。
5 T* j) B! L( R7 Z1 J" w
7 g/ Q0 S% C1 P0 k$ h4 z我们要把这6000多个汉字的字模加在原来的字库的最后,然后在字库的索引部分也加上这6000多个汉字在字库中的索引。别忘了,在每个字的字模的前面有一个小的文件头,也要加上。总之,制作出来的字库和原来的字库的结构要完全保持一致。# ]3 i1 a, B0 y; E! u2 O' ^
0 C1 o1 H$ T$ Y4 J' I
下面说一下如何制作这个字库。
* l ]4 _ B9 P) Y7 D有一个工具,可以把TTF字体转化为点阵字库。以前在极速天龙的汉化中也用过这个工具。
2 o% Y- t2 g, a( n- V* w# G4 E+ A工具如下:% {0 q8 p( q0 j& ^9 z) F9 Y: g3 k
https://www.chinaavg.com/read.php?tid=171389 k6 i+ z. P: M& W
, b4 W. d6 b+ Z% [- W制作出来的字库是字节对齐的,由于这次制作的字体的大小(不含边框)是16X16的点阵大小。$ \! j( r" F, O! N7 r
所以字节对齐的问题可以不用考虑。4 d( E8 P$ Z! K0 J; P
) n$ E0 Z+ U( n% A( r+ \3 x
1. 用这个工具制作16X16的点阵字库。每个汉字是32个字节。, m" c8 d5 R' Q8 [( O
2. 这个字库每个像素是用1个bit表示,我们要制作一个转换程序,把它转换为上面示意图的格式。
( F+ y8 F% S% X1 k# W+ J, w: T) p; X 有色点的像素用0xC1来表示
) j& U' S1 a& V7 Q 无色点的像素用0x00来表示
7 ^* I7 ~4 V4 _# s: N0 Y0 J. O 另外,用这个工具制作16X16的点阵字库是不含边框的,所以我们先要制作出边框来。 W0 q4 k; j! g5 y# T! g
我们可以这么做
; ~; l% c' d0 z2 _) b4 o* ]8 C+ e. [(1) 用0x00填充 26X20 的矩阵
! Z6 W; ]. {& h" f' l(2) 用0xC8把原16X16的点阵字形用上下左右,及4个45度方向共8个方向,画8次。) }% B% C) q8 B* ?4 ? k
(3) 用0xC1把原16X16的点阵字形在原位置画1次。
4 X# E5 W2 R* W D6 j+ |# ?# p: C% W) t7 }& Y0 ^
这样就能制作出符合要求的中文字库。 |