2 增加更多的颜色(1)(harib22b)

到目前为止我们的操作系统只用了16种颜色,话说既然现在我们已经用上了256色的显示模式,那实际上还有240种颜色可以用,不用的话实在太浪费了。因此我们准备修改一下操作系统,以便可以显示更多的颜色。

到底要增加哪些颜色呢?我们可以为光的三原色reg、green、blue(红、绿、蓝)中每种颜色赋予6个色阶2,这样一来,我们就可以定义出6×6×6=216种颜色,没定义的就只剩下24种颜色了。

2 6个色阶:也就是6个级别的浓度的意思。在这里,定义为“6个级别的亮度”应该更加准确。

对于操作系统,我们需要修改graphic.c,好久没碰这个文件了,真怀念啊!

本次的graphic.c节选

  1. void init_palette(void)
  2. {
  3. static unsigned char table_rgb[16 * 3] = {
  4. (中略)
  5. };
  6. unsigned char table2[216 * 3];
  7. int r, g, b;
  8. set_palette(0, 15, table_rgb);
  9. for (b = 0; b < 6; b++) {
  10. for (g = 0; g < 6; g++) {
  11. for (r = 0; r < 6; r++) {
  12. table2[(r + g * 6 + b * 36) * 3 + 0] = r * 51;
  13. table2[(r + g * 6 + b * 36) * 3 + 1] = g * 51;
  14. table2[(r + g * 6 + b * 36) * 3 + 2] = b * 51;
  15. }
  16. }
  17. }
  18. set_palette(16, 231, table2);
  19. return;
  20. }

这样一来,当我们需要指定RGB=[51, 102, 153]这个颜色时,只要使用色号137就可以了。137这个数字的计算方法为:16+1+2×6+3×36。

按照这样的划分方式,色号0和16所代表的颜色都是#000000,浪费了一个色号,不过我们就偷个懒先这样吧。除此之外,#ff0000等颜色也会发生重复(重复的颜色一共有8种)。

接下来我们还需要编写应用程序,不过这次不用编写新的API,所以任务很轻松。

本次的color.c

  1. int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);
  2. void api_initmalloc(void);
  3. char *api_malloc(int size);
  4. void api_refreshwin(int win, int x0, int y0, int x1, int y1);
  5. void api_linewin(int win, int x0, int y0, int x1, int y1, int col);
  6. int api_getkey(int mode);
  7. void api_end(void);
  8. void HariMain(void)
  9. {
  10. char *buf;
  11. int win, x, y, r, g, b;
  12. api_initmalloc();
  13. buf = api_malloc(144 * 164);
  14. win = api_openwin(buf, 144, 164, -1, "color");
  15. for (y = 0; y < 128; y++) {
  16. for (x = 0; x < 128; x++) {
  17. r = x * 2;
  18. g = y * 2;
  19. b = 0;
  20. buf[(x + 8) + (y + 28) * 144] = 16 + (r / 43) + (g / 43) * 6 + (b / 43) * 36;
  21. }
  22. }
  23. api_refreshwin(win, 8, 28, 136, 156);
  24. api_getkey(1); /*等待按下任意键*/
  25. api_end();
  26. }

赶紧“make run”一下,嗯,好漂亮!

2 增加更多的颜色(1)(harib22b) - 图1

五彩斑斓