首页 > 代码库 > hzk16在项目中的使用

hzk16在项目中的使用

最近做的项目中需要使用到hzk16。

以下转载自网络:

HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个. 其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列. 我们在一些应用场合根本用不到这么多汉字字模, 所以在应用时就可以只提取部分字体作为己用.HZK16字库里的16×16汉字一共需要256个点来显示, 也就是说需要32个字节才能达到显示一个普通汉字的目的.我们知道一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE.A1-A9为符号区, B0到F7为汉字区. 每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域).

以下为部分代码:
int fd_fb;struct fb_var_screeninfo var;struct fb_fix_screeninfo fix;int screen_size;unsigned char *fbmem;unsigned int line_width;unsigned int pixel_width;int fd_hzk16;struct stat hzk_stat;unsigned char *hzkmem;void lcd_put_pixel(int x,int y,unsigned int color){    unsigned char *pen_8 = fbmem+y*line_width+x*pixel_width;    unsigned short *pen_16;    unsigned int *pen_32;    unsigned char red,green,blue;        pen_16 = (unsigned short *)pen_8;    pen_32 = (unsigned int *)pen_8;    switch(var.bits_per_pixel)    {        case 8:        {            *pen_8 = color;            break;        }        case 16:        {            /* R:G:B = 5:6:5 */            red   = ((color>>16)&0x1f)<<11;            green = ((color>>8)&0x3f)<<6;            blue  = color&0x1f;            *pen_16 = red | green | blue;            break;        }        case 32:        {            *pen_32 = color;        }        default:        {            printf("Can‘t surport %d bpp\n",var.bits_per_pixel);            break;        }    }}void lcd_put_ascii(int x,int y,unsigned char c){    unsigned char *dots = &fontdata_8x16[c*16];    int i,j;    unsigned char byte;        for(i=0;i<16;i++)    {        byte = dots[i];        for(j=7;j>=0;j--)        {            if(byte&(1<<j))            {                /* show */                lcd_put_pixel(x+7-j,y+i,0xffffff);    // 显示白色            }            else            {                /* hide */                lcd_put_pixel(x+7-j,y+i,0x0);    // 显示黑色            }        }    }}void lcd_put_chinese(int x,int y,unsigned char *str){    unsigned int area  = str[0] - 0xA1;  // 默认以UTF-8存储,"中"的UTF-8存储为D6D0,存储其实位置行列均为A1    unsigned int where = str[1] - 0xA1;    unsigned char *dots = hzkmem + (area*94 + where)*32;  // 每个区占据94个字符,每个字符占据32个字节    unsigned char byte;    int i,j,b;    for(i=0;i<16;i++)    {        for(j=0;j<2;j++)        {            byte = dots[i*2+j];            for(b=7;b>=0;b--)            {                if(byte&(1<<b))                {                    /* show */                    lcd_put_pixel(x+8*j+7-j,y+i,0xffffff);      // 显示白色                }                else                {                    /* hide */                    lcd_put_pixel(x+8*j+7-j,y+i,0x0);     // 显示黑色                }            }        }    }            }

 

 

hzk16在项目中的使用