位图传送(Blitting) 和精灵



所有的这些例程都将被目标位图的剪裁矩形所影响.


void clear(bitmap);
将位图全部清为颜色 0.

void clear_to_color(BITMAP *bitmap, int color);
用指定的颜色清位图.

void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
从源位图复制一个矩形区域到目标位图. 参数 source_x 和 source_y 是将复制的源位图上的部分的左上角, dest_x 和 dest_y 是 目标位图上的坐标. 这个例程将考虑 目标位图的剪裁矩形, 如果你试图复制一个源位图外的区域同样也将做剪裁处理.


你可以在任两个位图间复制, 甚至是两个重叠的内存位图 (即, 来源和目标是相同的, 或者一个是另一个的子位图). 然而,你应当注意的是,许多 SVGA 卡不提供 分开的读写窗, 这就是说从屏幕的一个部分复制到另一部分时 需要使用一个在内存里的临时位图, 这样将极其的慢. 因此一个普遍的规则是 你应当避免在 SVGA 模式下的屏幕本身的复制.

另一方面,在 mode-X 下, 从屏幕的一个部分复制到另一部分 可以比从内存到屏幕的复制出奇的快, 只要源部分和目标部分正确的对齐. 在重叠的屏幕矩形间复制很慢,但是如果 区域不重叠, 而且它们有相同的面位置(plane alignment) (即: (source_x%4) == (dest_x%4)), VGA 门锁(latch)寄存器可以被用来做 很快的数据传输. 为了得到这个优势, 在 mode-X 下经常值得在 显存的隐藏区域储存砖块图片(使用一个大的 虚拟屏幕), 然后再将它们复制到可显的屏幕上.


如果 gfx_capabilite 标志的 GFX_HW_VRAM_BLIT 位被设置, 当前的驱动程序支持从屏幕的一部分 blit 到另一部分的硬件加速. 这极其的快, 因此当这个标志被设置了, 将你最常用的图形放才显存的屏幕以外的位置是很有价值的.


不象所有的图形例程, blit() 允许源位图和目标 位图有不同的颜色深度, 所以它可以被用来 在两种点格式之间转换.

void masked_blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
象 blit() 那样, 但是忽略透明点 ( 在 256 色模式下是 0, 真彩数据里是亮点). 源图片必须是内存位图或它的子位图, 并且源图和目标图区域绝对不能重叠.

当 gfx_capabilite 的 GFX_HW_VRAM_BLIT_MASKED 位被设置, 当前的驱动程序支持从屏幕的一部分到另一部分的掩式 blit 硬件加速. 这极其的快, 因此当这个标志被设置了, 将你最常用的图形放才显存的屏幕以外的位置是很有价值的.


警告: 如果硬件加速标志没有被设置, masked_blit() 在源图是显存位图时将工作不正常, 输入图形必须永远是内存位图!

void stretch_blit(BITMAP *source, BITMAP *dest, int source_x, source_y, source_width, source_height, int dest_x, dest_y, dest_width, dest_height);
象 blit() 那样, 不过它还可以调整图片的比例因此源图和目标图 可以有不同的大小.这个例程没有象常规的复制 那样做常规的安全检查: 你必须特别小心 不要复制源图以外的区域, 而且你不能 在重叠区域间复制, 即你必须将源图和目标图使用不同的位图. 同样, 源图必须是内存位图或它的子位图, 不能是硬件屏幕.

void draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
画一个精灵位图到目标位图的 指定位置.这完全和 blit(sprite, bmp, 0, 0, x, y, sprite->w, sprite->h) 相同, 但是它使用了掩式绘图模式, 透明 点被忽略, 因此背景图片将透过精灵被显示. 透明点在 256 色模式下是 0, 在真彩数据中是亮粉红点 (红值蓝值最大, 绿值为零).

如果 gfx_capability 标志里的 GFX_HW_VRAM_BLIT_MASKED 位被设置, 当源图是显存位图或屏幕子位图时, 当前驱动程序支持硬件加速.

这及其的快, 因此如果这个标志被设置, 你才显存中屏幕以外的位置存放些极其常用的精灵将很有价值.


警告: 如果硬件加速标志没有被设置, draw_sprite() 在使用显存位图做源位图时将工作不正常, 输入图形必须总是内存位图!

虽然一般不支持混合颜色深度图形, 但 由于特殊的原因, 这个函数能用来将 256 色源图画在 真彩目标图上, 因此你可以在真彩程序里的指定精灵上使用调色板效果.


void draw_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_h_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_vh_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
这些象 draw_sprite(), 但是它们翻折图片,可以是纵向的, 横向的, 对角线的轴变换. 这个产生了精确的镜像图片, 但它和 旋转精灵不同 (它比旋转例程要快的多). 精灵必须是内存位图.

void draw_trans_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
使用一个全局色彩映射表或真彩色混合函数来将一个 精灵覆盖在存在的图片上面. 这个必须在你 已经设置了颜色映射表 ( 256 色模式) 或混合映射表 (真彩模式) 后才能使用. 因为它在写图时还牵扯了读操作, 如果你直接向显存画半透明效果,将非常的慢, 因此无论何地有可能的话你都应当使用内存位图来代替屏幕位图.

void draw_lit_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
使用全局色彩映射表向指定色彩或亮度级过度精灵图片, 将算出的图片画到目标位图上. 这个必须在你设置了颜色映射表 (256 色模式) 或 混合映射表(真彩模式) 后才能使用.

void draw_gouraud_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int c1, int c2, int c3, int c4);
将精灵向指定的颜色或光度过度, 从四角颜色添入图形的表面. 这必须在 你已经设置了颜色映射表 ( 256 色模式) 或混合映射表 (真彩模式) 后才能使用.

void draw_character(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
将精灵位图画在位图的指定 位置上, 将透明点以当前文字模式画 (如果文字模式是 -1 则忽略, 否则以文字背景颜色画), 并且将所有其它的点画成指定的颜色. 透明点为 256 色模式下的零或 真彩数据中的亮粉红 ( 红蓝值最大, 绿值为零). 精灵必须是 8 位图片, 即使目标位图是真彩位图.

void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
旋转位图一个指定的角度,将它画在位图的指定位置. 角度是一个 16.16 的定点数. 这个定点数和 定点数三角例程中的一样, 256 等于 整圈, 64 是直角, 等等. 精灵必须是内存位图.


void rotate_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale);
象 rotate_sprite() 相同, 但是在旋转的同时还做拉扯或压缩的操作.


void stretch_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int w, int h);
将精灵图片画在位图的指定位置, 拉扯它到指定的宽度和高度. stretch_sprite() 和 stretch_blit() 的不同之处在于 stretch_sprite() 去掉 了透明点, 在 256 色模式下是 0, 真彩数据中的亮粉红色 (红和蓝值为最大, 绿值为 0).




返回