添加中文字库
要求:原操作系統(tǒng)代碼里只是支持了日語顯示,需要做的是實(shí)現(xiàn)對(duì)這個(gè)系統(tǒng)的漢字全角支持。
hzk16的介紹以及簡(jiǎn)單的使用方法
HZK16字庫是符合GB2312標(biāo)準(zhǔn)的16×16點(diǎn)陣字庫,HZK16的GB2312-80支持的漢字有6763個(gè),符號(hào)682個(gè)。其中一級(jí)漢字有3755個(gè),按聲序排列,二級(jí)漢字有3008個(gè),按偏旁部首排列。我們?cè)谝恍?yīng)用場(chǎng)合根本用不到這么多漢字字模,所以在應(yīng)用時(shí)就可以只提取部分字體作為己用。
HZK16字庫里的16×16漢字一共需要256個(gè)點(diǎn)來顯示,也就是說需要32個(gè)字節(jié)才能達(dá)到顯示一個(gè)普通漢字的目的。
我們知道一個(gè)GB2312漢字是由兩個(gè)字節(jié)編碼的,范圍為A1A1~FEFE。A1-A9為符號(hào)區(qū),B0到F7為漢字區(qū)。每一個(gè)區(qū)有94個(gè)字符(注意:這只是編碼的許可范圍,不一定都有字型對(duì)應(yīng),比如符號(hào)區(qū)就有很多編碼空白區(qū)域)。下面以漢字“我”為例,介紹如何在HZK16文件中找到它對(duì)應(yīng)的32個(gè)字節(jié)的字模數(shù)據(jù)。
前面說到一個(gè)漢字占兩個(gè)字節(jié),這兩個(gè)中前一個(gè)字節(jié)為該漢字的區(qū)號(hào),后一個(gè)字節(jié)為該字的位號(hào)。其中,每個(gè)區(qū)記錄94個(gè)漢字,位號(hào)為該字在該區(qū)中的位置。所以要找到“我”在hzk16庫中的位置就必須得到它的區(qū)碼和位碼。(為了區(qū)別使用了區(qū)碼和區(qū)號(hào),其實(shí)是一個(gè)東西,別被我誤導(dǎo)了)
區(qū)碼:區(qū)號(hào)(漢字的第一個(gè)字節(jié))-0xa0 (因?yàn)闈h字編碼是從0xa0區(qū)開始的,所以文件最前面就是從0xa0區(qū)開始,要算出相對(duì)區(qū)碼)
位碼:位號(hào)(漢字的第二個(gè)字節(jié))-0xa0
這樣我們就可以得到漢字在HZK16中的絕對(duì)偏移位置:
offset=(94*(區(qū)碼-1)+(位碼-1))*32
注解:1、區(qū)碼減1是因?yàn)閿?shù)組是以0為開始而區(qū)號(hào)位號(hào)是以1為開始的
2、(94*(區(qū)號(hào)-1)+位號(hào)-1)是一個(gè)漢字字模占用的字節(jié)數(shù)
3、最后乘以32是因?yàn)闈h字庫文應(yīng)從該位置起的32字節(jié)信息記錄該字的字模信息(前面提到一個(gè)漢字要有32個(gè)字節(jié)顯示)
?有了偏移地址就可以從HZK16中讀取漢字編碼了
實(shí)現(xiàn)思路:
這里其他的地方比較弄,第5步將大小修改一下,我的是nihongo = (unsigned char *) memman_alloc_4k(memman, 55*94*32);
第6步,要注意,HZK16是上下兩部分,不同于日文的左右兩部分的結(jié)構(gòu)。
代碼如下:
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; }?
運(yùn)行結(jié)果,我們?cè)趀uc.txt中加入一些漢字。
參考資料:
1.https://www.cnblogs.com/wunaozai/p/3858473.html 30天操作系統(tǒng)支持中文。
轉(zhuǎn)載于:https://www.cnblogs.com/JsonZhangAA/p/9426335.html
總結(jié)
- 上一篇: C# Linq to Entity La
- 下一篇: 2018.09.22 atcoder I