位图对象



一旦你选择了一个图形模式,你就可以经过位图 'screen' 来画些东西显示出来. 所有的 Allegro 图形例程都是向 BITBMP 结构来作画的, 这个结构是一块包含了一个矩形图片的内存, 以 连续字节分配形式 ( 每点 8 位) 储存. 你在系统内存中可以创建和使用位图, 也可以直接写向特别的 'screen' 位图, 这个位图 代表了你的图形卡上的显存.

举个例子, 要向屏幕画一个点,你可以这样写:

   putpixel(screen, x, y, color);

或者使用一个双缓冲实现程序:

   BITMAP *bmp = create_bitmap(320, 200);    // 在系统内存中创建一个位图
   clear(bmp);                               // 将内存位图清空
   putpixel(bmp, x, y, color);               // 画在内存位图上
   blit(bmp, screen, 0, 0, 0, 0, 320, 200);  // 将其复制到屏幕上

见下面来了解如何在一个位图中直接控制图象所在的内存.


Allegro 支持几种不同类型的位图:

- 屏幕位图, 代表了硬件显存 最终你必须画在它上面来使得你的图片可以显示.


- 内存位图, 它存在于系统内存中,可以用来 储存图象或者作为双缓冲系统的临时作画的位置. 这些能够由调用 create_bitmap(), load_pcx(), 或是从 grabber 数据文件里载入而得到.

- 子位图. 它共享父位图的存储器空间 (父位图可以是 屏幕, 一个内存位图, 或是另一个子位图), 因此在它们上面作画 也将同时改变它们的父位图. 它们是任何大小并可以定义在父位图上的任何位置, 也可以有它们自己的 剪裁矩形, 因此这是将一个位图分成几个小部分的很有用的途径, 比如, 将一个大的虚拟屏幕分割成两个部分来 实现页切换 (见 examples/ex9.c).

- 显存位图. 这些由 create_video_bitmap() 函数创建, 通常起屏幕对象子位图的相同功能.


extern BITMAP *screen;
一个位图的全局指针, 大小为 VIRTUAL_W x VIRTUAL_H. 这个由 set_gfx_mode() 创建, 映射到硬件显存上. 只有一部分 大小为 SCREEN_W x SCREEN_H 的位图被显示. 通常这个部分在大的虚拟屏幕的左上角, 因此你如果没有兴趣去做 硬件滚屏或页切换时可以忽略虚拟屏幕的不可显部分. 要移动显示窗口到 屏幕位图的其它部分, 调用 scroll_screen(). 初试化时剪裁矩形将限制在物理屏幕的大小, 因此如果你想在大的虚拟屏幕上超出这个矩形的部分作画, 则需要调整剪裁空间.


BITMAP *create_bitmap(int width, int height);
创建一个大小为 width x height 的内存位图, 并且返回指向它的指针. 这个位图将打开剪裁功能, 剪裁矩形 被设置为整个位图. 图象内存不会为你清空, 因此上面可能有写垃圾: 你必须在使用前清空位图. 这个例程总是使用全局的点格式, 由 调用 set_color_depth() 来指定.

BITMAP *create_bitmap_ex(int color_depth, int width, int height);
以指定的颜色深度(8, 15, 16, 24 或 32位每点)来创建位图.


BITMAP *create_sub_bitmap(BITMAP *parent, int x, y, width, height);
创建一个子位图. 即,让一个位图共享另一个 已经存在的位图的空间, 但是可能有不同的大小和剪裁设定. 当在 mode-X 屏幕上创建子位图时, x 坐标必须是 4 的倍数. 子位图的宽度和高度可以扩展到 父位图的右边界和下边界以外 (它们将被剪裁掉), 但是起点必须在父位图的区域.

BITMAP *create_video_bitmap(int width, int height);
以指定大小分配显存位图, 如果成功则返回 一个指针, 失败则返回 NULL (即: 如果你超出了 vram). 这可以用来在分配屏幕以外的显存储存 原始图象为硬件加速的 blit 操作作准备, 或是创建多重显示内存页, 它能够以调用 show_video_bitmap() 来显示. 显存位图通常和 屏幕位图分配相同的空间, 因此它们可以重叠: 所以使用和这个函数返回的任何表面同时使用整个屏幕不是个好主意.


void destroy_bitmap(BITMAP *bitmap);
当你使用完一个内存位图,子位图或显存位图后销毁它.


int bitmap_color_depth(BITMAP *bmp);
返回指定位图的颜色深度 (8, 15, 16, 24, 或 32).

int bitmap_mask_color(BITMAP *bmp);
返回指定位图的掩色 (这个色彩值将在画精灵时被忽略). 在 256 色位图里是零, 在真彩位图里是亮粉红色 (红和蓝值最大, 绿值为零).


int is_same_bitmap(BITMAP *bmp1, BITMAP *bmp2);
如果两个位图描述了同样一个绘图表面将返回 TRUE, 即, 指针相等, 或一个是另一个的子位图, 或 它们是 同一位图的子位图.

int is_linear_bitmap(BITMAP *bmp);
当位图是线形位图时返回 TRUE. 即,是一内存位图, 或 13h 模式的屏幕, 或 SVGA 屏幕. 线形位图可以被 _putpixel(), _getpixel(), bmp_write_line(), 和 bmp_read_line() 函数使用.

int is_planar_bitmap(BITMAP *bmp);
当位图是分屏 (planar) (mode-X 或 Xtended 模式) 屏幕位图时返回 TRUE.

int is_memory_bitmap(BITMAP *bmp);
当位图是内存位图时返回 TRUE, 即, 它是由调用 create_bitmap() 创建或从 grabber 数据文件或 PCX 文件里载入的. 内存位图可以经位图结构中的行指针来直接控制, 比如: bmp->line[y][x] = color.

int is_screen_bitmap(BITMAP *bmp);
如果位图是屏幕位图,显存位图或是它们之一的子位图时返回 TRUE.


int is_sub_bitmap(BITMAP *bmp);
如果位图是子位图则返回 TRUE.

void set_clip(BITMAP *bitmap, int x1, int y1, int x2, int y2);
每个位图有一个伴随的剪裁矩形, 它是一个 能够将图画上去的区域. 在这块空间以外, 什么也画不上去. 参数为剪裁矩形的两个角的坐标: 这些点被包括在内. 比如 set_clip(bitmap, 16, 16, 32, 32) 将 允许画到 (16, 16) 和 (32, 32) 上, 但是不能画到 (15, 15) 和 (33, 33). 如果 x1, y1, x2, 和 y2 都为零, 剪裁就关掉了, 这可以轻微的提高一些绘图操作 (通常只有微不足道的 区别, 然而有点帮助) 但是后果是当你试图 向位图以外的空间作画时, 你的程序会狠惨的死掉.




返回