zoukankan      html  css  js  c++  java
  • 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
    ",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);     // 显示黑色
                    }
                }
            }
        }
                
    }
     
    ————————————————————————————————————————————————————————————————————————————— 无他,唯手熟尔。。。
  • 相关阅读:
    作品第二课----改变DIV任意属性的值
    今天遇到的mouseout和mouseleave之坑
    作品第二课----弹出层
    作品第二课----求数组中所有数字的和
    作品第二课----点击DIV显示其内容
    作品第二课----点击切换显示隐藏
    Linux 静态库与动态库
    Linux学习6-套接字
    Linux学习5-线程
    Linux学习4-信号
  • 原文地址:https://www.cnblogs.com/ZXNblog/p/4007450.html
Copyright © 2011-2022 走看看