第五天之添加字体
显示字体的方法:
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.");//阴影显示