Pcgame 版 (精华区)
发信人: bell (花开时是冷冷月光), 信区: Pcgame
标 题: Allegro 中译文档(调色板例程)
发信站: 紫 丁 香 (Tue May 4 14:23:15 1999), 转信
调色板例程
vsync
set_color
_set_color
set_palette
set_palette_range
get_color
get_palette
get_palette_range
fade_interpolate
fade_from_range
fade_in_range
fade_out_range
fade_from
fade_in
fade_out
select_palette
unselect_palette
generate_332_palette
generate_optimized_palette
black_palette
desktop_palette
所有的 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 仅有的遗留代
码, 可能是不好意识把它去掉吧 :-)
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: jxjd.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.345毫秒