30天自制操作系统day10

来源:互联网 发布:金山软件占市场 编辑:程序博客网 时间:2024/05/22 03:16

这一章讲到了多图层的显示问题。
首先将图层作为一个数据结构:

struct SHEET{    unsigned char *buf;    int bxsize,bysize,vx0,vy0,col_inv,height,flags;};

其中,buf指向该图层所描绘的内容,应该是一个像素的数组。bxsize和bysize是图层大小。vx0,vy0是图层在屏幕的位置坐标,height表示图层高度,用于处理图层间遮挡关系。flags=0表示该图层未使用,1表示正在使用。

此外还有一个图层管理的结构:

#define MAX_SHEETS 256struct SHTCTL{    unsigned char *vram;    int xsize,ysize,top;    struct SHEET *sheets[MAX_SHEETS];    struct SHEET sheets0[MAX_SHEETS];};

其中top表示当前最上面的图层的高度。当top为-1时表示没有图层。sheets0[]存放256个图层结构。

接下来有一个sheet_updown()函数,用来调整图层的高度。调整的是各图层在sheets[]中的位置。每次调整之后,被调整的图层到达给定的高度,如果过高则放到top上,过低则置为-1(隐藏)。其余图层也相应地移动,保证所有非隐藏的n个图层在sheets[]的前n位。

绘制图层

最简单的绘制图层的方法是,遍历所有非隐藏的图层,按照从低到高的顺序绘制每个图层的buf。

不过这样效率较低。因为每次移动鼠标都要重新绘制整个屏幕。我们希望只绘制有变化的部分。可以在每次绘制之前,记录变化的图层之前的坐标和新的坐标,然后以这两个坐标为起点绘制两次。

如果图层只是一部分变化了,如在屏幕上显示一行字,则只需要重新绘制这行字占有的区域。

0 0