增长华语字库

要求:原先操作系统代码里单独是支撑了保加海法语展现,需要开的是落实对是体系的汉字全角扶助。

hzk16底介绍及简单的运方法

HZK16字库凡副GB2312标准的16×16点阵字库,HZK16底GB2312-80扶助之汉字有6763个,符号682单。其中一级汉字有3755单,按声序排列,二级汉字有3008只,按偏旁部首排列。我们当有的行使场所向用非顶这般多字字模,所以当使用时就可独自提部分字体作为己用。

HZK16配库里之16×16中国字一共用256独点来展现,也就是说要32个字节才会落得突显一个常常汉字的目标。

俺们知晓一个GB2312汉字是由少单字节编码的,范围也A1A1~FEFE。A1-A9吗符号区,B0到F7为汉字区。每一个区有94独字符(注意:这只有是编码的认同限制,不自然还出字型对应,比如符号区就起不少编码空白区域)。下面为汉字“我”为例,介绍怎么着当HZK16文本被找到它们对应之32只字节的字样数据。

眼前说到一个汉字占少数单字节,这半单中前一个字节为该字之区号,后一个字节为该字的位号。其中,每个区记录94独字,位号为该字在该区中的职务。所以若找到“我”在hzk16仓库中之职位就是必须拿到她的区码和位码。(为了区别使用了区码和区号,其实是一个事物,别被我误导了)

区码:区号(汉字的率先只字节)-0xa0
(因为汉字编码是从0xa0区起之,所以文件最前方就是从0xa0区开首,要算有相对区码)

位码:位号(汉字之次只字节)-0xa0

这般我们虽可取得汉字在HZK16碰到的绝对偏移地方:

offset=(94*(区码-1)+(位码-1))*32

诠释:1、区码减1是盖数组是以0为起首如区号位号是因1为始发之

2、(94*(区号-1)+位号-1)是一个字字模占用的字节数

3、最终就以32是为汉字库文应自该职位由的32字节信息记录该字之字样消息(前边提到一个字要发32独字节突显)

 有了摇地址便得于HZK16惨遭读取汉字编码了

落实思路:

  1. 刺探HZK编码,领悟一下入GB2312标准的华语点阵字库文件HZK16;
  2. 下载粤语GB2312的老二上制点阵文件;
  3. 用HZK16.fnt文书放入nihongo文件夹着;
  4. 修改主makefile文件和app_make.txt文件,将原先装载nihongo.fnt的讲话替换成装载HZK16.fnt即可;
  5. 修改bootpack.c文件,将事先分配的装朝鲜语字体的内存扩充,载入字库的文件称;
  6. 每当haribote/graphic.c中添加协助汉字之代码,增添一个函数用于展现汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测试程序。
  9. 专注:日文的编码是分为左半部分和右半有些,而我辈接纳的HZK16凡是分为上半部分和下半部分的。

此地外的地点比弄,第5步将大小修改一下,我的凡nihongo = (unsigned
char *) memman_alloc_4k(memman, 55*94*32);

第6步,要留意,HZK16凡左右两有的,不同于日文的左右个别有的布局。

代码如下:

void putfont32(char *vram, int xsize, int x, int y, char c, char *font1, char *font2)
{
    int i,k,j,f;
    char *p, d ;
    j=0;
    p=vram+(y+j)*xsize+x;
    j++;
    //上半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font1[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
       /* for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    //下半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font2[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
        /*for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    return;
}

 

运转结果,我们以euc.txt中插足一些中国字。

图片 1

参考资料:

1.https://www.cnblogs.com/wunaozai/p/3858473.html 30龙操作系统补助粤语。

相关文章