Programming 版 (精华区)
发信人: lansh (沧海一粟), 信区: Programming
标 题: Allegro 游戏程序库 (调色板例程)
发信站: 哈工大紫丁香 (2002年09月11日20:05:39 星期三), 站内信件
发信人: cloudwu (云风), 信区: GAME_Designer
标 题: Allegro 游戏程序库 (调色板例程)
发信站: BBS 水木清华站 (Sun May 17 09:40:59 1998)
______ ___ ___
/\ _ \ /\_ \ /\_ \
\ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
\ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
\ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
\ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
\/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
/\____/
\_/__/ 3.0 版
一个游戏程序库
By Shawn Hargreaves, 1994/97
云风 译 5/16/1998
http://www.nease.net/~cloudwu
E-mail: cloudwu@nease.net
==========================================
============ 调色板例程 ============
==========================================
所有的 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 仅有的遗留代码,
可能是不好意识把它去掉吧 :-)
--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net
--
人生得意需尽欢,莫使金樽空对月。
天生我才必有用,千金散尽还复来。
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hitsat.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.735毫秒