30天自制操作系统day10

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

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 256
struct 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。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值