调色板例程



所有的 Allegro 绘图函数使用整数参数来代表颜色. 在真彩分辨率下这些数字以红,绿,蓝的联合位来直接描述色彩, 但是在常规的 256 色模式下 这些值被看作是当前调色板的一个索引号, 这个调色板是 描述 256 种可能的色彩中每一个颜色的红,绿,蓝的强度值的一个列表.


调色板被储存在一个 RGB 结构里, 它包含了以 VGA 硬件格式描述的红,绿,蓝的强度值,每一范围是 0-63. 这个结构是 这样定义的:

typedef struct RGB
{
   unsigned char r, g, b;
} RGB;

例如:

   RGB black = { 0,  0,  0  };
   RGB white = { 63, 63, 63 };
   RGB green = { 0,  63, 0  };
   RGB grey  = { 32, 32, 32 };

类型 PALETTE 被定义成 256 RGB 结构的数组.

你将注意到 Allegro 里的许多代码将 'palette' 拼写成 'pallete'. 这是因为我在 Atari 上的旧的 Mark Williams 编译的头文件 将它拼写成两个 l, 以至于我也这样做. Allegro 很乐意 接受其它的拼法, 只要在 allegro.h 里加上一些 #define 就可以了.

void vsync();
等待一个垂直回扫的开始. 回扫发生在 你的显示器里的电子束到达屏幕的下方然后回到 上方准备下次扫描的时候.在这个短暂的时期, 图形卡不向显示器发送任何数据, 因此你能够做一些 在其它时间不可能做的事, 比如改变 无闪烁(雪花)的改变调色板. Allegro 将自动 在改变调色板或做任何硬件滚屏之前等待回扫, 所以你一般不必去调用这个函数.


void set_color(int index, RGB *p);
设置指定的 RGB 组到指定的调色板口. 不象 其它的调色板函数, 这个不去做任何的回扫同步, 所以你要 在调用它之前调用 vsync() 来避免雪花的问题.

void _set_color(int index, RGB *p);
这是 set_color() 的在线(online) 版本, 为在 垂直回扫模拟器回叫函数里使用而设计. 它仅能在 VGA 13h 模式和 mode-X 下使用, 因为许多新的 SVGA 芯片 不是 VGA 兼容的 (set_color() 和 set_palette() 将在这些卡上使用 VESA 调用, 但是 _set_color() 不知道这些).

void set_palette(PALETTE p);
设置整个调色板的 256 种颜色. 你应提供 256 个 RGB 结构的数组. 不象 set_color(), 没有必要在这个函数之前调用 vsync().


void set_palette_range(PALETTE p, int from, int to, int vsync);
设置 from 到 to 之间的调色板口 (包括这两个值:传入 0 和 255 设置整个调色板). 如果 vsync 被设置则等待垂直回扫, 否则它马上设置颜色.

void get_color(int index, RGB *p);
取得指定的调色板口的值.

void get_palette(PALETTE p);
取得整个调色板的 256 种颜色. 你应该提供 256 个 RGB 结构的数组,将数据存放在里面.

void get_palette_range(PALETTE p, int from, int to);
取得 from 到 to 之间的调色板口的值 (包括这两个值:传入 0 和 255 将得到整个调色板).

void fade_interpolate(PALETTE source, dest, output, int pos, int from, to);
在 source 和 dest 之间计算出一个过渡调色板, 将它返回到 output 参数中. 在两个极端间的位置 由 pos 变量指定: 0 则返回 source 的精确拷贝, 64 则返回 dest 的精确拷贝, 32 就返回两个调色板的中间调色板, 等等. 这个例程只对 from 到 to 之间的颜色起作用 (包括这两个: 传入 0 和 255 两处理整个调色板).

void fade_from_range(PALETTE source, dest, int speed, int from, to);
从 source 调色板到 dest 调色板逐渐过度一部分调色板. speed 从 1 ( 最慢) 到 64 (立刻变化). 这个 例程只对 from 到 to 之间的颜色起变化 (包括这两个: 传入 0 和 255 将过度整个调色板).

void fade_in_range(PALETTE p, int speed, int from, to);
从黑屏到指定的调色板逐渐过度调色板. speed 从 1 (最慢) 到 64 (立刻变化). 这个例程只对 from 到 to 之间的颜色起变化 (包括这两个: 传入 0 和 255 将过度整个调色板).

void fade_out_range(int speed, int from, to);
将当前的调色板的一部分逐渐过度到黑屏. speed 从 1 (最慢) 到 64 (立刻变化). 这个例程只对 from 到 to 之间的颜色起作用 (包括这两个: 传入 0 和 255 两处理整个调色板).

void fade_from(PALETTE source, PALETTE dest, int speed);
从 source 调色板逐渐过度到 dest 调色板. speed 从 1 (最慢) 到 64 (立刻变化).

void fade_in(PALETTE p, int speed);
从黑屏逐渐过度到指定的调色板. speed 从 1 (最慢) 到 64 (立刻变化).

void fade_out(int speed);
从当前的调色板逐渐过度到黑屏. speed 从 1 (最慢) 到 64 (立刻变化).

void select_palette(PALLETE p);
暂时的变换,巧妙的使用在当你需要在调色板间和真彩图象格式转换形式下. 象 set_palette() 函数那样设置内部调色板, 这样转换过程 将使用指定的调色板, 但是它却不影响显示硬件. 前一个调色板设置被保存在一个 内部缓冲里, 可以调用 unselect_palette() 来恢复.

void unselect_palette();
恢复上次调用 select_palette() 调色板之前的调色板表.


void generate_332_palette(PALETTE pal);
建立一个伪真彩调色板, 使用 3 位的红色和绿色和 2 位的蓝色. 如果文件没有包含自己的调色板 load_bitmap() 函数将返回这个 (即, 你正在读入一个真彩的位图).


int generate_optimized_palette(BITMAP *bmp, PALETTE pal, char rsvd[256]);
产生适当的减少指定的真彩图象的 256 色调色板的版本. rsvd 这个参数指向一个 表示那些颜色可以被使用的表: 零表示可以自由使用, 非零表示这个颜色被你自己保留. 如果 rsvd 是 NULL, 从映射将使用整个调色板.

extern PALETTE black_palette;
这个调色板包含着一团黑色, 由过度(fade) 例程使用.

extern PALETTE desktop_palette;
这个调色板由 Atari ST 低分辨率桌面使用. 我不好 确认这个为什么还在这儿, 除了 grabber 和测试程序使用外,就没什么用途了. 这可能是 Allegro 里 Atari 仅有的遗留代码, 可能是不好意识把它去掉吧 :-)




返回