糖果派对官方网站_可以赌钱的糖果游戏_手机版
bb电子糖果派对:文本浏览器及数码画框 -2.2-字符点阵及汉字库

bb电子糖果派对:文本浏览器及数码画框 -2.2-字符点阵及汉字库

作者:操作系统    来源:未知    发布时间:2019-12-23 19:56    浏览量:

要求:原操作系统代码里只是永葆了拉脱维亚语呈现,须求做的是贯彻对这些系统的汉字全角扶助。

2017/07/02 更新,此前随手复制的人家的,只希图自身存档,所以格式没怎么管,可是看看500+阅读量认为挺对不起在此之前点开的恋人的,并且终于计划好好经营那几个号了,所以能够整理了一晃。

FrameBuffer的法规     FrameBuffer 是出今后 2.2.xx 幼功此中的生龙活虎种驱动程序接口。

hzk16的牵线甚至轻松的施用方法

【转自 自身上学用 侵删】

    Linux是办事在敬重情势下,所以客户态进度是无能为力象DOS这样采纳显卡BIOS里提供的中止调用来落实直接写屏,Linux抽象出 FrameBuffer那一个装置来供客商态进程实现间接写屏。Framebuffer机制模仿显卡的作用,将显卡硬件构造抽象掉,能够因而Framebuffer的读写直接对显存举行操作。客户能够将Framebuffer看成是显得内部存款和储蓄器的叁个影象,将其映射到进度地址空间之后,就足以一贯实行读写操作,而写操作能够立刻反馈在荧屏上。这种操作是聊以自慰的,统风流倜傥的。顾客不用关注物理显存的职位、换页机制等等具体细节。那个都以由 Framebuffer设备驱动来成功的。

HZK16字库是顺应GB2312规范的16×16点阵字库,HZK16的GB2312-80帮忙的汉字有67六十六个,符号681个。此中一流汉字有3754个,按声序排列,二级汉字有3008个,按偏旁部首排列。大家在一部分利用处合根本用不到这般多汉字字模,所以在使用时就可以只领到部分字体作为己用。

HZK16字库是适合GB2312标准的16×16点阵字库,HZK16的GB2312-80接济的汉字有6761个,符号6八十二个。此中一流汉字有 3754个,按声序排列,二级汉字有3008个,按偏旁部首排列。

    但Framebuffer本人不具备任何运算数据的力量,就只可以比是一个一时寄存水的水池.CPU将运算后的结果放到那个水池,水池再将结果流到显示屏. 中间不会对数码做处理. 应用程序也能够一贯读写那些水池的内容.在这里种体制下,即使Framebuffer需求真正的显卡驱动的支撑,但装有展现职责都有CPU完结,因而CPU 担负相当重

HZK16字Curry的16×16汉字黄金时代共须要257个点来体现,也正是说须求三十捌个字节工夫达到规定的规范展现贰个平时汉字的指标。

大家在部分选择场地根本用不到这么多汉字字模,所以在行使时就能够只领到部分字体作为己用。

framebuffer的配备文件日常是 /dev/fb0、/dev/fb1 等等。

大家知道两个GB2312汉字是由多个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每四个区有玖拾伍个字符(注意:那只是编码的特许范围,不确定都有字型对应,譬如符号区就有广大编码空白区域)。上面以汉字“作者”为例,介绍如何在HZK16文本中找到它对应的三十八个字节的字样数据。

HZK16字Curry的16×16汉字意气风发共须要2六贰十二个点来体现,也正是说供给三11个字节能力到达展现叁个普通汉字的指标。

能够用命令: #dd if=/dev/zero of=/dev/fb 清空荧屏. 如若突显情势是 1024x768-8 位色,

后边谈起贰个汉字占八个字节,这两当中前三个字节为该汉字的区号,后贰个字节为该字的位号。个中,各类区记录九十四个汉字,位号为该字在该区中的地点。所以要找到“笔者”在hzk16库中的地点就务须拿到它的区码和位码。(为了分裂使用了区码和区号,其实是一个事物,别被本人误导了)

笔者们知晓叁个GB2312汉字是由七个字节编码的,范围为0xA1A1~0xFEFE。A1-A9为符号区,B0-F7为汉字区。每叁个区有95个字符(注意:那只是编码的特许约束,不自然都有字型对应,例如符号区就有众多编码空白区域卡塔尔(قطر‎。

用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空显示器;

区码:区号(汉字的首先个字节)-0xa0 (因为汉字编码是从0xa0区始发的,所以文件最前面正是从0xa0区开端,要算出相对区码)

上边以汉字"小编"为例,介绍怎么着在HZK16文书中找到它对应的三20个字节的字样数据。前面提起七个汉字占多个字节,这两在那之中前一个字节为该汉字的区号,后贰个字节为该字的位号。当中,每种区记录九十几个汉字,位号为该字在该区中之处。所以要找到"作者"在hzk16库中之处就亟须得到它的区码和位码。

用命令: #dd if=/dev/fb of=fbfile  能够将fb中的内容保留下来;

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

区码:汉字的先是个字节-0xA0(因为汉字编码是从0xA0区最初的, 所以文件最前方就是从0xA0区开始, 要算出相对区码卡塔尔国

能够重复写回显示屏: #dd if=fbfile of=/dev/fb;

像这种类型咱们就足以获得汉字在HZK16中的相对偏移地点:

位码:汉字的第3个字节-0xA0

在动用Framebuffer时,Linux是将显卡置于图形格局下的.

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

这么咱们就足以获得汉字在HZK16中的相对偏移地点:

 

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

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

    在应用程序中,平时通过将 FrameBuffer 设备映射到进度地址空间的方法采纳,举例上面包车型客车次序就开采 /dev/fb0 设备,

2、(94*(区号-1卡塔尔+位号-1卡塔尔(قطر‎是一当中华夏儿女民共和国字字模占用的字节数

注解:

并因而 mmap 系统调用进行地址映射,随后用 memset 将显示屏清空(这里借使呈现形式是 1024x768-8 位色情势,线性内存形式):

3、最终乘以32是因为汉字库文应从该岗位起的32字节消息记录该字的字样音讯(后面提到一个汉字要有三十多少个字节展现)

区码减1是因为数组是以0为伊始而区号位号是以1为初始的

int fb;

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

(94*(区号-1卡塔尔+位号-1卡塔尔是多个汉字字模占用的字节数

unsigned char* fb_mem;

兑现思路:

最后乘以32是因为汉字库文应从该职位起的32字节音信记录该字的字样新闻(前边提到二个汉字要有叁拾四个字节展现卡塔尔国

fb = open ("/dev/fb0", O_RDWR);

  1. 打探HZK编码,领会一下切合GB2312标准的普通话点阵字库文件HZK16;
  2. 下载汉语GB2312的二进制点阵文件;
  3. 将HZK16.fnt文书放入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将原来装载nihongo.fnt的话语替换到装载HZK16.fnt就可以;
  5. 改进bootpack.c文件,将事前分配的装载朝鲜语字体的内部存款和储蓄器扩展,载入字库的公文名;
  6. 在haribote/graphic.c中加上辅助汉字的代码,扩大一个函数用于呈现汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测量试验程序。
  9. 注意:罗马尼亚语的编码是分为左半局地和右半部分,而大家利用的HZK16是分为上半部分和下半部分的。

自家画的图示:

fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

此处别的之处相比弄,第5步将大小改进一下,小编的是nihongo = (unsigned char *) memman_alloc_4k(memman, 55*94*32);

所以,'我'在HZK16 16*16点阵字库的寄存的行列为:

memset (fb_mem, 0, 1024*768卡塔尔国; //那么些命令应该只有在root能够实行

第6步,要注意,HZK16是左右两有个别,不相同于丹麦语的左右两有个别的结构。

(生机勃勃行朝气蓬勃行地保留,共16行,每行2个字节, 共三十三个字节卡塔尔国

 

代码如下:

04 80 0E A0 78 90 08 90 08 84 FF FE 08 80 08 90

0A 90 0C 60 18 40 68 A0 09 20 0A 14 28 14 10 0C

依傍写叁个

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;
}

宛如上边那样:

 

 

以下是自家自身写的亲自过问程序, 可以团结改善成此外的数码格式.(一点也不细略, 所以没写注释卡塔尔。

1     fd_fb = open("/dev/fb0",O_RDWR);
 2     if(fd_fb < 0)
 3     {
 4         printf("can't open /dev/fb0 n");
 5         return -1;
 6     }
 7     if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))            //取出可变信息
 8     {
 9         printf("can't get var n");
10         return -1;    
11     }
12     if(ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix))            //取出固定信息
13     {
14         printf("can't get fix n");
15         return -1;    
16     }
17     screen_size = var.xres * var.yres * var.bits_per_pixel / 8;    //占内存大小 单位字节
18     line_width = var.xres *  var.bits_per_pixel / 8;         //一行像素大小
19     pixel_width =  var.bits_per_pixel / 8;               //一点像素大小
20     
21     fb_mem = (unsigned char *)mmap(NULL, screen_size,        //mmap 系统调用进行地址映射
22         PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
23     if(fb_mem == (unsigned char *) -1)
24     {                                      
25         printf("can't mmap n");
26         return -1;
27     }
28     memset(fb_mem, 0, screen_size);                   //清屏,黑色

运作结果,我们在euc.txt中步入一些中国字。

示例源代码

 

bb电子糖果派对 1

版本1

字符点阵呈现

仿照效法资料:

int main(void)

8*16像素的字符点阵

1. 30天操作系统扶植普通话。

{

贰个字节8位来表暗指气风发行的8个像素是不是被选中式点心亮

FILE* fphzk = NULL;

每一个字符由16个字节表示

int i, j, k, offset;

仅必要用asii码值乘以16就足以固定到日前字符的点阵地点

int flag;

 

unsigned char buffer[32];

1 static const unsigned char fontdata_8x16[FONTDATAMAX] = {
 2 
 3     /* 0 0x00 '^@' */
 4     0x00, /* 00000000 */
 5     0x00, /* 00000000 */
 6     0x00, /* 00000000 */
 7     0x00, /* 00000000 */
 8     0x00, /* 00000000 */
 9     0x00, /* 00000000 */
10     0x00, /* 00000000 */
11     0x00, /* 00000000 */
12     0x00, /* 00000000 */
13     0x00, /* 00000000 */
14     0x00, /* 00000000 */
15     0x00, /* 00000000 */
16     0x00, /* 00000000 */
17     0x00, /* 00000000 */
18     0x00, /* 00000000 */
19     0x00, /* 00000000 */
20 
21     /* 1 0x01 '^A' */
22     0x00, /* 00000000 */
23     0x00, /* 00000000 */
24     0x7e, /* 01111110 */
25     0x81, /* 10000001 */
26     0xa5, /* 10100101 */
27     0x81, /* 10000001 */
28     0x81, /* 10000001 */
29     0xbd, /* 10111101 */
30     0x99, /* 10011001 */
31     0x81, /* 10000001 */
32     0x81, /* 10000001 */
33     0x7e, /* 01111110 */
34     0x00, /* 00000000 */
35     0x00, /* 00000000 */
36     0x00, /* 00000000 */
37     0x00, /* 00000000 */
38 
39         /*****
40     ****
41     ****
42     ****
43     ****
44     ****
45     ****
46     ****
47     *****/
48 
49     /* 255 0xff '' */
50     0x00, /* 00000000 */
51     0x00, /* 00000000 */
52     0x00, /* 00000000 */
53     0x00, /* 00000000 */
54     0x00, /* 00000000 */
55     0x00, /* 00000000 */
56     0x00, /* 00000000 */
57     0x00, /* 00000000 */
58     0x00, /* 00000000 */
59     0x00, /* 00000000 */
60     0x00, /* 00000000 */
61     0x00, /* 00000000 */
62     0x00, /* 00000000 */
63     0x00, /* 00000000 */
64     0x00, /* 00000000 */
65     0x00, /* 00000000 */
66 
67 };

unsigned char word[3] = "我";

 

unsigned char key[8] = {

刷写8*16字符点阵

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

 

};

1 lcd_put_ascii(int x, int y, unsigned char c )
 2 {
 3     unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];
 4     int i, b;
 5     unsigned char byte;
 6     
 7     for(i = 0; i < 16; i++)
 8     {
 9         byte = dots[i];
10         
11         for(b = 7; b >= 0; b --)
12         {
13             if(byte & (1<<b))
14             {
15                 /* 显示 */
16                 lcd_put_pixel(x + 7 - b, y + i, 0xffffff);//白
17             }
18             else
19             {
20                         /* 不显示 */
21                 lcd_put_pixel(x + 7 - b, y + i, 0);//黑
22             
23             }
24         }
25     }
26     

fphzk = fopen("hzk16", "rb");

 

bb电子糖果派对,if(fphzk == NULL){

行使HZK16 字库,将它拷贝到内部存款和储蓄器中,使用时一贯用数组指向有些汉字所在地方

上一篇:没有了
下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有