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毫秒