第五天之添加字体

显示字体的方法:

A

00000000

00011000

00011000

00011000

00011000

00100100

00100100

00100100

00100100

01000010

01000010

....

用了8x16的一个矩阵来表示。

首先定义字体需要显示的数组

static char font_A[16] = {
0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24,
0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00
};

输出方法

putfont8(binfo->vram, binfo->scrnx, 10, 10, COL8_FFFFFF, font_A);

实现方法

void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
{
int i;
char *p, d /* data */;
for (i = 0; i < 16; i++) {
p = vram + (y + i) * xsize + x;
d = font[i];
if ((d & 0x80) != 0) { p[0] = c; } //相当于拿00000000与10000000进行与操作,如果不等于0,则表示最左边的一个有1这个值,也就是p[0]需要添加色块。
if ((d & 0x40) != 0) { p[1] = c; }
if ((d & 0x20) != 0) { p[2] = c; }
if ((d & 0x10) != 0) { p[3] = c; }
if ((d & 0x08) != 0) { p[4] = c; }
if ((d & 0x04) != 0) { p[5] = c; }
if ((d & 0x02) != 0) { p[6] = c; }
if ((d & 0x01) != 0) { p[7] = c; }
}
return;
}

 

 

 

 

但是不可能每一个字符或者字母都这样做,于是使用了一个txt文档,把所有256各字符参照ascII的顺序做好,链接在sys里面。

makefile里面新增了几个内容:

MAKEFONT = $(TOOLPATH)makefont.exe
BIN2OBJ = $(TOOLPATH)bin2obj.exe

hankaku.bin : hankaku.txt Makefile
$(MAKEFONT) hankaku.txt hankaku.bin

hankaku.obj : hankaku.bin Makefile
$(BIN2OBJ) hankaku.bin hankaku.obj _hankaku


bootpack.bim : bootpack.obj naskfunc.obj hankaku.obj Makefile
$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
bootpack.obj naskfunc.obj hankaku.obj

 

bookpack.c文件新增字体渲染

extern char hankaku[4096];

putfont8(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A' * 16);
putfont8(binfo->vram, binfo->scrnx, 16, 8, COL8_FFFFFF, hankaku + 'B' * 16);
putfont8(binfo->vram, binfo->scrnx, 24, 8, COL8_FFFFFF, hankaku + 'C' * 16);
putfont8(binfo->vram, binfo->scrnx, 40, 8, COL8_FFFFFF, hankaku + '1' * 16);
putfont8(binfo->vram, binfo->scrnx, 48, 8, COL8_FFFFFF, hankaku + '2' * 16);
putfont8(binfo->vram, binfo->scrnx, 56, 8, COL8_FFFFFF, hankaku + '3' * 16);

 

 

 作者见如此繁琐的函数打印于是又开始脑洞:

申明

void putfonts8_asc(char *vram,int xsize,int x,int y,char c,unsigned char *s);

实现

void putfonts8_asc(char *vram,int xsize,int x,int y,char c,unsigned char *s) //*s 此处string 表示要传输的字符串
{
extern char hankaku[4096];
for(;*s !=0x00;s++) //遍历字符串所有的字符
{
putfont8(vram,xsize,x,y,c,hankaku + *s *16);
x +=8;//一个字符打印完后向后偏移8各像素
}
return;
}

调用

putfonts8_asc(binfo->vram, binfo->scrnx,8,8,COL8_FFFFFF,"abc_123");

 

 

putfonts8_asc(binfo->vram, binfo->scrnx,8,8,COL8_FFFFFF,"abc_123");
putfonts8_asc(binfo->vram, binfo->scrnx,31,31,COL8_000000,"Haribote OS.");
putfonts8_asc(binfo->vram, binfo->scrnx,30,30,COL8_FFFFFF,"Haribote OS.");//阴影显示

 

 

 

 

posted @ 2020-03-30 13:18  下雨天不爱打伞  阅读(150)  评论(0编辑  收藏  举报