HZK16字Curry的16×16中华夏族民共和国字一共供给2陆15个点来呈现
Tagged Tags:

要求:原操作系统代码里只是支撑了丹麦语呈现,需求做的是完结对那些类其余方块字全角帮衬。

hzk16的牵线以及轻便的施用方法

HZK16字库是契合GB2312标准的16×16点阵字库,HZK16的GB2312-80帮忙的汉字有6764个,符号6捌16个。在那之中一流汉字有37伍拾陆个,按声序排列,二级汉字有3008个,按偏旁部首排列。大家在有的行使场面根本用不到这么多汉字字模,所以在动用时就能够只领到部分字体作为己用。

HZK16字Curry的16×16中华夏族民共和国字一共供给259个点来彰显,也正是说供给三拾八个字节技艺完毕呈现一个平时汉字的指标。

我们精通贰个GB2312汉字是由多少个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每贰个区有95个字符(注意:这只是编码的承认范围,不料定都有字型对应,譬如符号区就有无数编码空白区域)。下边以汉字“小编”为例,介绍怎么样在HZK16文本中找到它对应的叁十三个字节的字样数据。

前面提起四个中华夏族民共和国字占四个字节,这两个中前一个字节为该汉字的区号,后贰个字节为该字的位号。个中,每一个区记录九十三个汉字,位号为该字在该区中的地方。所以要找到“作者”在hzk16库中的地点就非得获得它的区码和位码。(为了差距使用了区码和区号,其实是叁个东西,别被笔者误导了)

区码:区号(汉字的第二个字节)-0xa0
(因为汉字编码是从0xa0区早先的,所以文件最前面就是从0xa0区初步,要算出相对区码)

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

诸如此类大家就能够收获汉字在HZK16中的相对偏移地方:

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

注明:1、区码减1是因为数组是以0为发端而区号位号是以1为初阶的

2、(94*(区号-1)+位号-1)是三个中中原人民共和国字字模占用的字节数

3、最终乘以32是因为汉字库文应从该岗位起的32字节音信记录该字的字样消息(前边提到叁在那之中华人民共和国字要有34个字节呈现)

 有了摇头地址就足以从HZK16中读取汉字编码了

HZK16字Curry的16×16中华夏族民共和国字一共供给2陆15个点来呈现。兑现思路:

  1. HZK16字Curry的16×16中华夏族民共和国字一共供给2陆15个点来呈现。叩问HZK编码,驾驭一下契合GB2312标准的普通话点阵字库文件HZK16;
  2. 下载中文GB2312的二进制点阵文件;
  3. HZK16字Curry的16×16中华夏族民共和国字一共供给2陆15个点来呈现。将HZK16.fnt文件放入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将原来装载nihongo.fnt的语句替换到装载HZK16.fnt就可以;
  5. HZK16字Curry的16×16中华夏族民共和国字一共供给2陆15个点来呈现。修改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. 30天操作系统帮助中文。

发表评论

电子邮件地址不会被公开。 必填项已用*标注