30天自制操作系统(Mac版)读书笔记(day5)

绘制字母

  1. 字母的二进制表示
static char fontA[16] = {
0x00, 0x18, 0x18, 0x18,0x18,0x24,0x24,0x24,
0x24, 0x7e, 0x42, 0x42,0x42, 0xe7, 0x00, 0x00
};
  1. 绘制方法
void showFont8(char *vram, int xsize, int x, int y, char c, char* font) {
    int i;
    char d;

    for (i = 0; i < 16; i++) {
        d = font[i]; 
        if ((d & 0x80) != 0) {vram[(y+i)*xsize + x + 0] = c;}
        if ((d & 0x40) != 0) {vram[(y+i)*xsize + x + 1] = c;}
        if ((d & 0x20) != 0) {vram[(y+i)*xsize + x + 2] = c;}
        if ((d & 0x10) != 0) {vram[(y+i)*xsize + x + 3] = c;}
        if ((d & 0x08) != 0) {vram[(y+i)*xsize + x + 4] = c;}
        if ((d & 0x04) != 0) {vram[(y+i)*xsize + x + 5] = c;}
        if ((d & 0x02) != 0) {vram[(y+i)*xsize + x + 6] = c;}
        if ((d & 0x01) != 0) {vram[(y+i)*xsize + x + 7] = c;}
    }
}
  1. 调用函数绘制字母
showFont8(vram, xsize, 20, 20, COL8_FFFFFF, fontA);

绘制所有字母

  1. 生成字母表,这个感觉比较机械,主要是吧01组成的一个整列转换成数组,我们直接拿结果过来用就可以了。
  2. 这里要注意的是 inlcude 要记得放在haribote.nasm中的[SECTION .s16]部分。不然会出问题。
  3. c语言中调用汇编的变量,可以使用extern char 的方式。
  4. 调用方法:
showFont8(vram, xsize, 8, 8, COL8_FFFFFF, systemFont + 'A'*16);
   showFont8(vram, xsize, 16, 8, COL8_FFFFFF, systemFont + 'B'*16);
   showFont8(vram, xsize, 24, 8, COL8_FFFFFF, systemFont + 'C'*16);
   showFont8(vram, xsize, 32, 8, COL8_FFFFFF, systemFont + '1'*16);
   showFont8(vram, xsize, 48, 8, COL8_FFFFFF, systemFont + '2'*16);
   showFont8(vram, xsize, 64, 8, COL8_FFFFFF, systemFont + '3'*16);

绘制字符串

乘热打铁,输出一个字符串的方法如下:

void showString(char* vram, int xsize, int x, int y, char color, unsigned char *s ) {
    for (; *s != 0x00; s++) {
       showFont8(vram, xsize, x, y,color, systemFont+ *s * 16);
       x += 8;
    }
}

最终结果如下:
在这里插入图片描述

绘制鼠标

  1. 把鼠标表示的字符串转换成二进制的透明图,这里需要在主程序中申请一段内存传进来。
void init_mouse_cursor(char* mouse, char bc) {
    static char cursor[16][16] = {
        "**************..",
        "*OOOOOOOOOOO*...",
        "*OOOOOOOOOO*....",
        "*OOOOOOOOO*.....",
        "*OOOOOOOO*......",
        "*OOOOOOO*.......",
        "*OOOOOOO*.......",
        "*OOOOOOOO*......",
        "*OOOO**OOO*.....",
        "*OOO*..*OOO*....",
        "*OO*....*OOO*...",
        "*O*......*OOO*..",
        "**........*OOO*.",
        "*..........*OOO*",
        "............*OO*",
        ".............***"
    };

      int x, y;
      for (y = 0; y < 16; y++) {
          for (x = 0; x < 16; x++) {
             if (cursor[y][x] == '*') {
                 mouse[y*16 + x] = COL8_000000;
             }
             if (cursor[y][x] == 'O') {
                mouse[y*16 + x] = COL8_FFFFFF;
             }
             if (cursor[y][x] == '.') {
                 mouse[y*16 + x] = bc;
             }
          }
      }
}

  1. 移动已经初始化好的内存,里面存放着鼠标对应的图片
void putblock(char* vram, int vxsize, int pxsize,int pysize, int px0, int py0, char* buf, int bxsize) {
    int x, y;
    for (y = 0; y < pysize; y++)
      for (x = 0; x < pxsize; x++) {
          vram[(py0+y) * vxsize + (px0+x)] = buf[y * bxsize + x];
      }
}
  1. 需要注意的是,在这里申请堆内存,最好是直接用stiatc。
static char mcursor[256];
  1. 删除之前调用绘制字符串的代码,最终效果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值