30天自制操作系统-第10天 harib09d 关于sheet_refreshsub的详细解释

隔了几天没做实验了,在看sheet_refreshsub的时候,源码还是很明白,但是后面有点不太清楚。所以把自己的理解放上来。

这个sheet图层恰好满足那四种情况,当前图层以(sht->vx0,sht->vy0)为起点边长分别为bxsize,bysize,图中以(vx0,vy0)到(vx1,vy1)是要刷新的范围,

在这里插入图片描述

简而言之,就是去掉与当前图层无关的刷新范围,如果如果当前图层起点(x坐标或y坐标)在刷新范围(大矩形框)内,将刷新范围的起始点(对应x坐标或y坐标)从(vx0,vy0)移动到图层的的起始点(x坐标或者y坐标),如下图所示

在这里插入图片描述
当然,右下部分出现无关刷新部分时也需要去掉,具体做法就是将结束端点,移到图层的右下角(恰好与图层完全重合)。

在这里插入图片描述

另外一个极端情况,就是刷新部分完全在当前图层之中,刷新区域就不用改变,直接刷新就是了。

在这里插入图片描述

当然,还有几种情况,类似图层的起始点x坐标在刷新范围的x范围之内,但y不在刷新范围的y范围之内,这种结合前面两个情况就行了,不难。

源码如下

void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1)
{
	int h, bx, by, vx, vy, bx0, by0, bx1, by1;
	unsigned char *buf, c, *vram = ctl->vram;
	struct SHEET *sht;
	for (h = 0; h <= ctl->top; h++) {
		sht = ctl->sheets[h];
		buf = sht->buf;
		/* vx0~vy1を使って、bx0~by1を逆算する */
		bx0 = vx0 - sht->vx0;
		by0 = vy0 - sht->vy0;
		bx1 = vx1 - sht->vx0;
		by1 = vy1 - sht->vy0;
		if (bx0 < 0) { bx0 = 0; }
		if (by0 < 0) { by0 = 0; }
		if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }
		if (by1 > sht->bysize) { by1 = sht->bysize; }
		for (by = by0; by < by1; by++) {
			vy = sht->vy0 + by;
			for (bx = bx0; bx < bx1; bx++) {
				vx = sht->vx0 + bx;
				c = buf[by * sht->bxsize + bx];
				if (c != sht->col_inv) {
					vram[vy * ctl->xsize + vx] = c;
				}
			}
		}
	}
	return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值