增添国语字库

要求:原操作系统代码里只是支撑了土耳其共和国(The Republic of Turkey)语显示,必要做的是落实对这几个类别的方块字全角辅助。

hzk1陆的介绍以及轻便的行使格局

HZK16字库是适合GB231贰标准的1陆×16点阵字库,HZK1六的GB231二-80支撑的方块字有67陆二个,符号6八十多个。当中一流汉字有37伍十一个,按声序排列,二级汉字有300几个,按偏旁部首排列。大家在一些利用场地根本用不到那样多汉字字模,所以在使用时就足以只领到部分字体作为己用。

HZK1陆字库里的1陆×1陆汉字1共需求二伍十九个点来体现,约等于说必要三十七个字节才干达到呈现贰个一般汉字的指标。

我们清楚三个GB231二汉字是由四个字节编码的,范围为A1A一~FEFE。A一-A玖为符号区,B0到F7为汉字区。每3个区有玖四个字符(注意:那只是编码的许可限制,不必然都有字型对应,比如符号区就有许多编码空白区域)。上边以汉字“小编”为例,介绍怎样在HZK1陆文本中找到它对应的三二十个字节的字样数据。

前面谈到贰当中华夏族民共和国字占五个字节,那两当中前三个字节为该汉字的区号,后1个字节为该字的位号。在那之中,每一个区记录九五个汉字,位号为该字在该区中的地点。所以要找到“小编”在hzk1陆库中的地方就无法不获得它的区码和位码。(为了差别使用了区码和区号,其实是三个东西,别被本身误导了)

区码:区号(汉字的率先个字节)-0xa0
(因为汉字编码是从0xa0区起初的,所以文件最终面正是从0xa0区起先,要算出相对区码)

位码:位号(汉字的第三个字节)-0xa0

ca88官网,如此我们就足以博得汉字在HZK1陆中的相对偏移地点:

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

疏解:一、区码减一是因为数组是以0为早先而区号位号是以一为开始的

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

3、最后乘以3二是因为汉字库文应从该职责起的3二字节音信记录该字的字样消息(前面提到贰个汉字要有33个字节显示)

 有了摇头地址就能够从HZK1陆中读取汉字编码了

贯彻思路:

  1. 打听HZK编码,精晓一下适合GB231贰标准的汉语点阵字库文件HZK1六;
  2. 下载普通话GB2312的2进制点阵文件;
  3. 将HZK16.fnt文件放入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将原来装载nihongo.fnt的话语替换来装载HZK16.fnt就可以;
  5. 修改bootpack.c文件,将事先分配的装载匈牙利(Magyarország)语字体的内部存款和储蓄器增添,载入字库的文本名;
  6. 在haribote/graphic.c中增进补助汉字的代码,扩充四个函数用于体现汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测试程序。
  9. 专注:日文的编码是分为左半有的和右半部分,而作者辈选取的HZK1六是分为上半部分和下半部分的。

那边其余的地点相比弄,第6步将大小修改一下,作者的是nihongo = (unsigned
char *) memman_alloc_4k(memman, 55*94*32);

第四步,要注意,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中参加一些中中原人民共和国字。

ca88官网 1

参谋资料:

1.https://www.cnblogs.com/wunaozai/p/3858473.html 30天操作系统援助中文。

相关文章