Pcgame 版 (精华区)
发信人: bell (花开时是冷冷月光), 信区: Pcgame
标 题: Allegro 中译文档(位图对象)
发信站: 紫 丁 香 (Tue May 4 14:18:36 1999), 转信
位图对象
screen
create_bitmap
create_bitmap_ex
create_sub_bitmap
create_video_bitmap
destroy_bitmap
bitmap_color_depth
bitmap_mask_color
is_same_bitmap
is_linear_bitmap
is_planar_bitmap
is_memory_bitmap
is_screen_bitmap
is_sub_bitmap
set_clip
一旦你选择了一个图形模式,你就可以经过位图 '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 都为零, 剪裁就关掉了, 这可以轻微
的提高一些绘图操作 (通常只有微不足道的 区别, 然而有点帮助) 但是后果是当你试图 向
位图以外的空间作画时, 你的程序会狠惨的死掉.
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: jxjd.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.701毫秒