minigui bin字库制作

时间:2024-05-19 09:07:49

bin字库的格式,bin字库如何生成,bin字库如何解析?

  • 为何选择.bin字库?
    芯片处理性能不是很好时,为了降低cpu处理数据量,才选择使用.bin字库;矢量字库虽然美观,但解析耗时故未采用。

  • minigui 自带的bin字库格式是怎样的?
    1.font目录下有8x16-iso8859-1.bin ,song-16-gb2312.bin
    翻阅资料,其实就是把数组以二进制的形式保存写入到文件中;
    eg:
    unsigned char GBK_font[]={
    0x00,0x00,0x00,0x00,0x04,0x20,0x19,0x20,0x17,0xF0,0x19,0x70,0x11,0xA8,0x1F,0x28,
    0x1F,0xC8,0x1F,0xF8,0x15,0xC8,0x0A,0xC8,0x0F,0xC8,0x0A,0xF8,0x12,0x00,0x13,0xF0,/* “?”, 7614*/};

fwrite(GBK_font, sizeof(GBK_font), 1, fd);

生成的文件就是.bin文件;网上的C转bin工具其实就是实现这个功能,只不过包了一层壳而已;
完整函数:

int wfoo()
{
	FILE *fd;
	char *fName="gbk.bin";
	
	fd=fopen(fName, "w+");
	if(fd==NULL){
		perror("fopen fail\n");
		return -1;
	}

	fwrite(GBK_font, sizeof(GBK_font), 1, fd);
	
	fclose(fd);
	return 1;
}
  • 如何解析.bin文件?
    我的想法是全部读出来,按字节打印出来;

    int rfoo(const char name)
    {
    int i=0;
    FILE fd;
    long offset=0;
    unsigned char GBK_font[16
    7614
    2]={0};

     if(access(name, F_OK)!=0){
     	fprintf(stderr, "%s not exist", name);
     	return 0;
     }
     
     fd=fopen(name, "r");
     if(fd==NULL){
     	perror("fopen fail\n");
     	return -1;
     }
     
     #if 0
     fseek(fd, 0, SEEK_END);
     offset = ftell(fd);
     printf("offset:%d\n", offset);
     #else
     
     fread(GBK_font, sizeof(GBK_font), 1, fd);
     for(i=0; i<sizeof(GBK_font); i++){
     	if(i!=0 && i%16==0)
     		printf("\n");
     	printf("0x%02x,", GBK_font[i]);
     }
     printf("\n");
     #endif
     
     fclose(fd);
     return 1;
    

    }

做过黑白屏显示的都知道,生成的1616的中文字库,其实一般都是分上下两部分,即上面8个字节,下面8个字节,主要是和白屏是按页写的原因,姑且这样设计的吧!
其实刚不知道要多大的数组,计算了一下文件的大小,再由每个字符所占空间,计算出一共有多少个字符;
16
16的中文gb字库的每个字符点阵字节数是32【宽16个字节,上下两部分】,
ls -l 该字库大小为 243648
故该字库包含了 7614个字符;
(写一个扫描解析函数,每次解析32个字节,按位解析,即可画出这个字符;为此,写了一个脚本,实现的两种方式,用数字0,1分别代表解析的每一位,把结果写入文件,打开该文件就可以看到字符点阵样子,还可以使用shell终端按颜色打印,把0,1解析为对应的颜色值,这样显示的字符更加直观)。
minigui bin字库制作
minigui bin字库制作
其实,当看到7614个字符时,头都大了,那种编码的字库有7614个字符?找了半天资料也没有答案;
原始方法:一个一个字符画出来,有了上面自制的工具,把解析出来的数组,一个一个打印出来,慢慢的找到了规律;
对比GB2312简体中文编码表:
http://www.knowsky.com/resource/gb2312tbl.htm
逐渐得到一个规律,并不是都乱掉了,
其实是这个字库做了裁剪,去掉了一些无用的字符;
花了一天半,把每个其实字符打印出来,总算去除多余的字符;得到完整的字符库;
至此,有完整的字库,在PCto2002w完美版工具下,导入该文件在选择字体,即可生成想要的自制字库文件。

其实,在生成的字库时还遇到一些问题:

  • 生成的文件后面的注释字符乱码?
    刚开始还以为是生成的字符有问题,取几个特殊易辨别的字符验证一下发现是没问题的;所以需要处理一下。我的做法是函数打开两个文件,按行读文件,把乱码字符用字符文件中的字符替换;期间遇到的问题是需要转码,不然无论怎么替换都是乱码数据;
    其实,如果只为实现替换,这个注释是不会写入到.bin文件的,直接替换到数组里面,再把数组写入文件,后缀为.bin,其实就完成了功能;

  • 如何测试字库是否正确?
    自制字库完成后,上传字库替换minigui自带的字库即可;
    增加,需要修改MiniGUI.cfg配置,新增配置项即可;

对应工具上传到github路径:
https://github.com/first-aid/minigui-bin-font/commits/master

欢迎大家指正完善。