2 增加更多的颜色(1)(harib22b)
到目前为止我们的操作系统只用了16种颜色,话说既然现在我们已经用上了256色的显示模式,那实际上还有240种颜色可以用,不用的话实在太浪费了。因此我们准备修改一下操作系统,以便可以显示更多的颜色。
到底要增加哪些颜色呢?我们可以为光的三原色reg、green、blue(红、绿、蓝)中每种颜色赋予6个色阶2,这样一来,我们就可以定义出6×6×6=216种颜色,没定义的就只剩下24种颜色了。
2 6个色阶:也就是6个级别的浓度的意思。在这里,定义为“6个级别的亮度”应该更加准确。
对于操作系统,我们需要修改graphic.c,好久没碰这个文件了,真怀念啊!
本次的graphic.c节选
void init_palette(void)
{
static unsigned char table_rgb[16 * 3] = {
(中略)
};
unsigned char table2[216 * 3];
int r, g, b;
set_palette(0, 15, table_rgb);
for (b = 0; b < 6; b++) {
for (g = 0; g < 6; g++) {
for (r = 0; r < 6; r++) {
table2[(r + g * 6 + b * 36) * 3 + 0] = r * 51;
table2[(r + g * 6 + b * 36) * 3 + 1] = g * 51;
table2[(r + g * 6 + b * 36) * 3 + 2] = b * 51;
}
}
}
set_palette(16, 231, table2);
return;
}
这样一来,当我们需要指定RGB=[51, 102, 153]这个颜色时,只要使用色号137就可以了。137这个数字的计算方法为:16+1+2×6+3×36。
按照这样的划分方式,色号0和16所代表的颜色都是#000000,浪费了一个色号,不过我们就偷个懒先这样吧。除此之外,#ff0000等颜色也会发生重复(重复的颜色一共有8种)。
接下来我们还需要编写应用程序,不过这次不用编写新的API,所以任务很轻松。
本次的color.c
int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);
void api_initmalloc(void);
char *api_malloc(int size);
void api_refreshwin(int win, int x0, int y0, int x1, int y1);
void api_linewin(int win, int x0, int y0, int x1, int y1, int col);
int api_getkey(int mode);
void api_end(void);
void HariMain(void)
{
char *buf;
int win, x, y, r, g, b;
api_initmalloc();
buf = api_malloc(144 * 164);
win = api_openwin(buf, 144, 164, -1, "color");
for (y = 0; y < 128; y++) {
for (x = 0; x < 128; x++) {
r = x * 2;
g = y * 2;
b = 0;
buf[(x + 8) + (y + 28) * 144] = 16 + (r / 43) + (g / 43) * 6 + (b / 43) * 36;
}
}
api_refreshwin(win, 8, 28, 136, 156);
api_getkey(1); /*等待按下任意键*/
api_end();
}
赶紧“make run”一下,嗯,好漂亮!
五彩斑斓