上QQ阅读APP看书,第一时间看更新
7 绘制矩形(harib01g)
颜色备齐了,下面我们来画“画”吧。首先从VRAM与画面上的“点”的关系开始说起。在当前画面模式中,画面上有320×200(=64000)个像素。假设左上点的坐标是(0,0),右下点的坐标是(319,199),那么像素坐标(x, y)对应的VRAM地址应按下式计算。
0xa0000 + x + y * 320
其他画面模式也基本相同,只是0xa0000这个起始地址和y的系数320有些不同。
根据上式计算像素的地址,往该地址的内存里存放某种颜色的号码,那么画面上该像素的位置就出现相应的颜色。这样就画出了一个点。继续增加x的值,循环以上操作,就能画一条长长的水平直线。再向下循环这条直线,就能够画很多的直线,组成一个有填充色的长方形。
根据这种思路,我们制作了函数boxfill8。源程序就是bootpack.c。并且在程序HariMain中,我们不再画条纹图案,而是使用这个函数3次,画3个矩形。也不知能不能正常运行,我们来“make run”看看。哦,好像成功了。
本次的bootpack.c节选
#define COL8_000000 0 #define COL8_FF0000 1 #define COL8_00FF00 2 #define COL8_FFFF00 3 #define COL8_0000FF 4 #define COL8_FF00FF 5 #define COL8_00FFFF 6 #define COL8_FFFFFF 7 #define COL8_C6C6C6 8 #define COL8_840000 9 #define COL8_008400 10 #define COL8_848400 11 #define COL8_000084 12 #define COL8_840084 13 #define COL8_008484 14 #define COL8_848484 15 void HariMain(void) { char *p; /* p变量的地址 */ init_palette(); /* 设置调色板 */ p = (char *) 0xa0000; /* 将地址赋值进去 */ boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120); boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150); boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180); for (; ; ) { io_hlt(); } } void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) { int x, y; for (y = y0; y <= y1; y++) { for (x = x0; x <= x1; x++) vram[y * xsize + x] = c; } return; }
这次新出现了#define声明方式,它用来表示常数声明。要记住哪种色号对应哪种颜色实在太麻烦了,所以为了便于理解,做了以上声明。