一、shtctl的指定省略
1、目的
这里作者是想减少函数的形式参数shtctl。我理解的原因是,如果形参过多,函数的定义会变得臃肿和难以理解,降低了代码的可读性。其他人阅读代码时可能会难以理解函数的功能和参数之间的关系。
2、实现方式
原本两个形参SHEET和SHTCTL ,把其中的一个参数,写进另一个参数的结构里面,如下:
struct SHEET {
unsigned char *buf;
int bxsize, bysize, vx0, vy0, col_inv, height, flags;
struct SHTCTL *ctl;
};
struct SHTCTL {
unsigned char *vram;
int xsize, ysize, top;
struct SHEET *sheets[MAX_SHEETS];
struct SHEET sheets0[MAX_SHEETS];
};
这里是把给struct SHTCTL *ctl写进了图层SHEET 。
需要在初始化时,为每个图层SHEET指定ctl起始地址(这里是相同的,因为只有一个结构体变量)。后续就只需要传递图层SHEET,而不再需要传递SHTCTL。想访问SHTCTL时,直接使用sht->ctl来访问。
二、显示窗口
三、高速定时器
1、定义
所谓高速计数器,其实就是定义一个变量counter,在系统的大循环中无条件快速累加,再把这个counter的值打印到我们创建的窗口中。
for (;;)
count++;
sprintf(s, "%010d", count);
boxfill8(buf_win, 160, COL8_C6C6C6, 40, 28, 119, 43);
putfonts8_asc(buf_win, 160, 40, 28, COL8_000000, s);
sheet_refresh(sht_win, 40, 28, 120, 44);
这样直接一直打印和累加的写法不高明,作者做了两次优化
2、优化(1)
只刷当前图层和当前图层以上的图层(鼠标),实现起来比较简单,只需要多传递一个形参:当前图层高度,在循环刷新的时候,从当前图层高度向上刷新即可。
3、优化(2)
建立map,大小与VRAM相同,用于精细控制刷新区域。
刷新时,先判断是不是要刷新的区域,保证只刷新需要的区域,减弱窗口闪烁。