一般情况下, Allegro 是为同时使用一种颜色深度设计的, 因此你只要调用一次 set_color_depth() 然后将你所有 位图以相同的格式储存. 如果你想混合使用几种不同的点格式, 就可以使用 create_bitmap_ex() 来代替 create_bitmap(), 通过调用 bitmap_color_depth() 来查询指定图片的格式. 所有的 图形例程需要它所有的参数在相同的格式下 (例如: 你不能拉伸 15 位的源图到一个 24 位 目标图上), 但是有三个例外: blit() 可以在任何 位图格式间复制, 根据需要转换数据, draw_sprite() 可以 将 256 色的源图画在任何格式的目标图上, 而且 draw_character() _总是_ 无论目标图是什么格式都使用 256 色的源图.
将 256 色源图展开到真彩目标图相当的快
(显然在做转换之前你必须设置正确调色板!).
在不同的真彩格式间转换有点点慢,
将真彩图片减少到 256 色就非常的慢了
(如果你在转换前设置了全局 rgb_map 表就可以提高许多的速度了).
int bestfit_color(PALLETE pal, int r, int g, int b);
搜索指定的调色板来寻找寻求颜色的最佳匹配,
是 VGA 硬件 0-63 格式. 正常情况你
应该用调用 makecol8() 替代, 但是如果你需要使用其他的调色板
而不是当前选择的一个, 或特殊情况下你不想使用 rgb_map 查找表,
这个底层函数就很有用了.
extern RGB_MAP *rgb_map;
为了提高将 RGB 值减到 8 位调色板的速度, Allegro 使用了一个
32k 查找表 (每部分颜色 5 位). 你必须在使用光影例程前
设置这个表, 如果提供了这张表,
将大量提升 makecol8() 函数的速度. RGB 表可以利用
rgbmap 工具预先算好, 或者运行时在得到.
RGB_MAP 结构是这样定义的:
typedef struct { unsigned char data[32][32][32]; } RGB_MAP;void create_rgb_table(RGB_MAP *table, PALETTE pal, void (*callback)(int pos));
void hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b);
void rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v);
在 HSV 和 RGB 颜色之间转换色彩值. RGB 值的范围是
从 0 到 255, 色度的范围是从 0 到 360, 饱和度和亮度的范围是
0 到 1.