点阵字库结构以及点阵字显示的实现原理_第1页
点阵字库结构以及点阵字显示的实现原理_第2页
点阵字库结构以及点阵字显示的实现原理_第3页
点阵字库结构以及点阵字显示的实现原理_第4页
点阵字库结构以及点阵字显示的实现原理_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上点阵字库结构以及点阵字显示的实现原理    在 DOS 下作游戏要实现汉字或英文的输出,一般都是使用的点阵字库技术。这样可以使程序有更好的兼容性。那么我们如何在程序中使用点阵字库呢,这片文档将会讲解这个。    先讲讲什么是点阵字库,我首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据。至于什么是点阵,我想我不讲大家都知道的,使用过“文曲星”之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出“点阵”的痕迹。在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,

2、PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此“点阵”的痕迹也就不那么明显了。    点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词。点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点。矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列。位图就是这种二维的阵列,这个阵列中的 (x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值。但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的。因此,我们

3、需要将二维的数据线性化到一维里面去。通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维。    那么点阵字的数据存放细节到底是怎么样的呢。其实也十分的简单,举个例子最能说明问题。比如说 16*16 的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放。第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面

4、,第二行的前八个点的数据存放在点阵数据的第三个字节里面,.,然后后面的就以此类推了。这样我们可以计算出存放一个点阵总共需要32个字节。看看下面这个图形化的例子:               | |1| | | | | | | | | | |1| | | |               | | |1|1| |1|1|1|

5、1|1|1|1|1|1| | |               | | | |1| | | | | | | | |1| | | |               |1| | | | | |1| | | | | |1| | | |        

6、       | |1|1| | | |1| | | | | |1| | | |               | | |1| | | |1| | | | |1| | | | |               | | | | |1| | |1| | | |1| |

7、 | | |               | | | |1| | | |1| | |1| | | | | |               | | |1| | | | | |1| |1| | | | | |         

8、0;     |1|1|1| | | | | | |1| | | | | | |               | | |1| | | | | |1| |1| | | | | |               | | |1| | | | |1| | | |1| | | | |

9、0;              | | |1| | | |1| | | | | |1| | | |               | | |1| | |1| | | | | | |1|1|1| |           &#

10、160;   | | | | |1| | | | | | | | |1| | |               | | | | | | | | | | | | | | | | |    可以看出这是一个“汉”字的点阵,当然文本的方式效果不是很好。根据上面的原则,我们可以写出这个点阵的点阵数据:0x40,0x08,0x37,0xfc,0x10,0x08,., 当然写这个确实很麻烦所以我不再继续下去。我这样做,也

11、只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的。    当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如 12*12 的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面8个点存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零。这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址。对于其他不规则的点阵,也是按照这个原则进行处理的。这样我们可以得出一个 m*n 的点阵所占用的字节数为 (m+7)/

12、8*n。    在明白了以上所讲的以后,我们可以写出一个显示一个任意大小的点阵字模的函数,这个函数的功能是输出一个宽度为w,高度为h的字模到屏幕的 (x,y) 坐标出,文字的颜色为 color,文字的点阵数据为 pdata 所指:/*输出字模的函数*/void  _draw_model(char *pdata, int w, int h, int x, int y, int color)    int     i;    /* 控制行 */ &#

13、160;  int     j;    /* 控制一行中的8个点 */    int     k;    /* 一行中的第几个“8个点”了 */    int     nc;   /* 到点阵数据的第几个字节了 */    int     cols; /* 控

14、制列 */    BYTE    static mask8=128, 64, 32, 16, 8, 4, 2, 1; /* 位屏蔽字 */    w  = (w + 7) / 8 * 8;  /* 重新计算w */    nc = 0;    for (i=0; i<h; i+)             

15、;   cols = 0;        for (k=0; k<w/8; k+)                        for (j=0; j<8; j+)         &#

16、160;                      if (pdatanc&maskj)                    putpixel(x+cols, y+i, color); &#

17、160;              cols+;                            nc+;        &

18、#160;               代码很简单,不用怎么讲解就能看懂,代码可能不是最优化的,但是应该是最易读懂的。其中的 putpixel 函数,使用的是TC提供的 Graphics 中的画点函数。使用这个函数就可以完成点阵任意大小的点阵字模的输出。    接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了。要解决这个问题,首先需要了解汉字在计算机中是如何表示的。在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII

19、 码,并且使用两个扩展 ASCII 码来表示一个汉字。一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码。一个汉字由两个扩展 ASCII 码组成,第一个扩展 ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码。在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字。在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点

20、阵数据,在每一个区中有是按照位的顺序来存放的。在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体的说就是:    第一个扩展ASCII码 = 128+32 + 汉字区码    第二个扩展ASCII吗 = 128+32 + 汉字位码如果用char hz2来表示一个汉字,那么我可以计算出这个汉字的区位码为:    区码 = hz0 - 128 - 32 = hz0 - 160    位码 =

21、 hz1 - 128 - 32 = hz1 - 160。    这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:    汉字点阵数据在字库文件中的偏移 = (区码-1) * 94 + 位码) * 一个点阵字模占用的字节数在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了。以下是实现代码:/* 输出一个汉字的函数 */void  _draw_hz(char hz2, FILE *fp, int x, int y, int w, int h, int color)    char fon

22、tbuf128;   /* 足够大的缓冲区,也可以动态分配 */    int ch0 = (BYTE)hz0-0xA0;  /* 区码 */    int ch1 = (BYTE)hz1-0xA0;  /* 位码 */    /* 计算偏移 */    long offset = (long)pf->_hz_buf_size * (ch0 - 1) * 94 + ch1 - 1);    fseek(fp, offset, SEEK_SET);    

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论