图形模式



void set_color_depth(int depth);
设置点的格式来由随后调用 set_gfx_mode() 和 create_bitmap() 时使用. 有效的颜色深度有 8 (缺省值), 15, 16, 24, 和 32 位.


int set_gfx_mode(int card, int w, int h, int v_w, int v_h);
切换图形模式. 参数 card 必须是以下值中的一个:


      GFX_TEXT          - 返回文本模式
      GFX_AUTODETECT    - 让 Allegro 选择一个合适的图形驱动程序
      GFX_VGA           - 选择 VGA 模式 13h (320x200 或 320x100)
      GFX_MODEX         - 选择平面扭转的(plannar tweaked) VGA 模式
      GFX_VESA1         - 使用 VESA 1.x 驱动程序
      GFX_VESA2B        - 使用 VBE 2.0 分页模式驱动程序
      GFX_VESA2L        - 使用 VBE 2.0 线形页面缓冲驱动程序
      GFX_VESA3         - 使用 VBE 3.0 驱动程序
      GFX_VBEAF         - 使用 VBE/AF 加速器 API (未完成)
      GFX_XTENDED       - 使用断链式(unchained) 640x400 模式驱动程序

参数 w 和 h 指定了你想要的屏幕分辨率. 可能的模式有:


参数 v_w 和 v_h 指定了最小虚拟屏幕的大小, 因为 你需要一个大的虚拟屏幕来做硬件滚屏或多页面切换. 如果你不在乎虚拟屏幕的大小就应该将它们设为零. 虚拟屏幕回造成许多混乱, 但是它们真的 很简单. 留神: 技术说明来了, 所以你 可以跳过这一段的剩下部分 :-) 将显示内存想象成 一张矩形的纸, 通过一个上面有一个小洞(你的显示器)的卡片来看它. 既然纸比洞要大, 你在任何时候就只能看见纸的一部分, 但是移动卡片 你就能改变看到的景象. 你能将洞放在一个地点而忽略显示内存其它看不见的部分, 但是你可以利用移动屏幕窗口来实现许多有用的效果, 或者可以在显存隐藏的部分先画好图片然后 切换过去来显示它们.

举个例子, 你选择了一个虚拟屏幕为 1024x1024 的 640x480 模式, 然后可以在这个大区域上移动可视的部分. 初始化时, 可视部分在 显存的左上角, 这个设置看起来象这样:


      (0,0)------------(640,0)----(1024,0)
        |                  |           |
        |   可视屏幕部分   |           |
        |                  |           |
      (0,480)----------(640,480)       |
        |                              |
        |        显存的其它部分        |
        |                              |
      (0,1024)--------------------(1024,1024)

这是什么? 你正在用相称的字体来显示? 呵呵.

当你调用 set_gfx_mode() 时, v_w 和 v_h 参数 提供你的程序能够接受的最小虚拟屏幕的大小. 大小的范围通常很受限制, Allegro 一般 最终会创建一个比你要求要大的多的虚拟屏幕. 在 SVGA 卡上一兆的显存能够让你创建 1024x1024 的虚拟屏幕 (256 色) 或是 1024x512 (15 或 16 bpp), 而 512k 显存你可以得到 1024x512 (256 色). 其它的大小可能或不可能得到: 不要假定它们能工作. 在 mode-X 下虚拟屏幕的 宽度可以是物理屏幕宽度的 8X 倍或是与之相同, 于是模拟高度就被相应的设定了 ( VGA 有 256K 显存, 所以虚拟高度将是 256*1024/虚拟宽度).

在你选择一个图形模式以后, 物理的和虚拟的屏幕大小 可以用宏 SCREEN_W(), SCREEN_H(), VIRTUAL_W(), 和 VIRTUAL_H() 来测得.

如果 Allegro 不能选择一个合适的模式, set_gfx_mode() 将返回一个负数并且将问题的描述储存在 allegro_error 里. 否则它返回零.

extern int gfx_capabilities;
描述当前图形卡驱动程序和显示硬件的能力的位域. 这可以包含下面标志的任何组合:

GFX_CAN_SCROLL:
表示 scroll_screen() 函数可以被这个驱动程序使用.


GFX_CAN_TRIPLE_BUFFER:
表示 request_scroll() 和 poll_scroll() 函数可以 被这个驱动程序使用. 作为一个特殊的条件, mode-X 驱动程序仅仅 在回扫模拟器加载后才支持三缓冲, 因此在 mode-X 的分辨率下 你必须在做任何三缓冲操作前调用 timer_simulate_retrace().


GFX_HW_CURSOR:
表示硬件鼠标在使用中. 当这个标志设置了, 可以不先隐藏鼠标指针而安全的向屏幕上作图. 注意不是所有的指针图形被硬件支持: 尤其是 VBE/AF 只支持 2 色 32x32 大小的图片, 其中第二个颜色正好是第一个的逆色. 这就是说, Allegro 可能需要在你的程序执行时依据 鼠标指针切换硬件和软件鼠标, 因此你不要 假定这个标志会持续保持很长的时间. 它仅仅告诉你当前时间硬件鼠标是否正在使用, 无论何时你隐藏/重显鼠标指针它都可能改变.


GFX_HW_HLINE:
表示普通的 hline() 不透明版本正在 使用硬件加速. 这不仅仅提高 hline() 本身的执行效率, 还有许多其它使用 它的函数, 比如 circlefill(), triangle(), 和 floodfill().

GFX_HW_HLINE_XOR:
表示 hline()的 XOR 版本,和其它调用它的函数, 使用着硬件加速.


GFX_HW_HLINE_SOLID_PATTERN:
表示 hline() 函数的实心(solid) 和遮掩(mask) 方式,及其 其它使用它的函数, 正在使用硬件加速 (见下面的注解).

GFX_HW_HLINE_COPY_PATTERN:
表示 hline() 函数的复制方式, 及其它 使用它的函数, 正在使用硬件加速 (见下面的注解).

GFX_HW_FILL:
表示 rectfill() 函数, clear() 例程, clear_to_color() 的不透明版本, 正在使用硬件加速

GFX_HW_FILL_XOR:
表示 rectfill() 函数的 XOR 版本, 正在使用硬件加速

GFX_HW_FILL_SOLID_PATTERN:
表示 rectfill() 函数的实心(solid) 和遮掩(mask) 花纹方式, 正在使用硬件加速 (见下面的注解).

GFX_HW_FILL_COPY_PATTERN:
表示 rectfill() 函数的复制方式, 正在使用硬件加速 (见下面的注解).

GFX_HW_LINE:
表示 line() 和 vline() 函数的不透明版本, 正在使用硬件加速

GFX_HW_LINE_XOR:
表示 line() 和 vline() 函数的 XOR 版本, 正在使用硬件加速

GFX_HW_TRIANGLE:
表示 triangle() 函数的不透明版本, 正在使用硬件加速

GFX_HW_TEXTOUT_FIXED:
表示单色字符扩大 ( 8x8 和 8x16 定宽字体格式) 正在使用硬件加速.

GFX_HW_TRIANGLE_XOR:
表示 triangle() 函数的 XOR 版本 正在使用硬件加速.

GFX_HW_VRAM_BLIT:
表示从屏幕的一部分到另一部分的 blit 操作 正在使用硬件加速. 如果这个标志被设置, 显存里的 blit 操作将以最快的可能方式来 显示图片, 因此将最常用的图形储存在 屏幕以外的显存里是很值得的.


GFX_HW_VRAM_BLIT_MASKED:
表示 masked_blit() 例程能够在显存里复制时被硬件加速, 并且 draw_sprite() 将在源图是屏幕或显存的子位图时使用 硬件加速. 如果这个标志被设置, 显存里的 blit 操作将以最快的可能方式来 显示图片, 因此将最常用的精灵储存在 屏幕以外的显存里是很值得的.


警告: 如果这个标志没有被设置, masked_blit() 和 draw_sprite() 在使用显存源位图时将不能正常的工作! 如果他们被硬件支持, 你必须仅仅尝试使用这些函数来在 显存里复制.

GFX_HW_MEM_BLIT:
表示内存位图向屏幕的 blit 操作正在被硬件加速.


GFX_HW_MEM_BLIT_MASKED:
表示 masked_blit() 和 draw_sprite() 函数在 源图是内存位图而目标位图是物理屏幕时被 硬件加速.

注释: 即使是在表示可能的信息说绘图块 被硬件加速的时候, 也不是所有的大小都可以. VBE/AF 仅仅支持 8x8 以内的图案, 因此 Allegro 在你使用的图案大于这个的时候就使用最初的非加速版.


注释2: 这些硬件加速特性仅仅在你 直接向屏幕位图, 显存位图, 或它们的子位图作画的时候才发生效果. 硬件加速在页切换 或 3 缓冲设置的时候最有用, 而对于 经典的 "画在内存位图上, 然后 blit 到 屏幕上" 的系统毫无效果.


int scroll_screen(int x, int y);
尝试硬件滚动屏幕来显示虚拟屏幕的不同部分 (初始化时位置在 0,0, 就是左上角). 成功则返回零: 如果图形驱动程序 不能做硬件滚屏或者虚拟屏幕不够大则它可能出错. 你可以使用这个来在一个大的虚拟空间中移动屏幕显示区间, 或者在虚拟屏幕的两个不重叠的部分间进行页切换. 注意在屏幕位图上超出原始坐标作图时, 你必须改变剪裁矩形: 见后.


Mode-X 滚屏是可信的,它可以在任何卡上工作. 可惜 大多 VESA 实现程序只能处理 水平上的 4 点递增滚动, 所以在 SVGA 模式下平滑的水平滚动 是不可能的. 这真是惭愧, 但是我没有办法解决它. 大多数 VESA 实现程序似乎在真彩模式下的滚动都有非常多的 bug, 因此我建议你不要 指望这个例程来正确的进行真彩模式下的滚屏,除非你确认 SciTech Display Doctor 已经加载了.

Allegro 将在滚动屏幕时进行必要的垂直回扫同步, 因此你不必在前面调用 vsync(). 这意味着 scroll_screen() 和 vsync() 造成的延时时间相同.

int request_scroll(int x, int y);
这个函数用于三缓冲. 它请求硬件滚屏到 指定位置, 但是马上返回而不是等待一次回扫. 这个滚动将在下次垂直回扫中被实现, 但是你可以在这段时间执行其它的代码并 使用 poll_scroll() 例程来检测何时 flip(页切换) 完成了 (见 examples/ex20.c). 三缓冲只能工作在适当的硬件上: 如果时钟模拟器激活,它可以工作在任何 mode-X 分辨率下 (但是不能正确的在 win95 下工作), 增强版 可以由 VBE 3.0 和 VBE/AF 驱动程序支持有限的几种 高档图形卡. 你可以检查 gfx_capabilities 标志的 GFX_CAN_TRIPLE_BUFFER 位 来看看在当前的驱动程序下能否工作.

int poll_scroll();
这个函数在 3 缓冲时使用. 它检查前面由 request_scroll() 例程初始化的一个硬件卷屏的状态, 如果还在等待发生, 则返回非零, 如果已经发生则返回零.


int show_video_bitmap(BITMAP *bitmap);
尝试页切换硬件屏幕来显示指定的显存位图对象, 这个位图必须和物理屏幕有相同的大小, 并且是由调用 create_video_bitmap() 函数得到的. 成功则返回零. 如果图形卡需要, 这个函数将等待一次垂直回扫, 因此你不必自己调用 vsync().


int request_video_bitmap(BITMAP *bitmap);
这个函数为实现 3 缓冲来使用. 它请求一次页切换 来显示指定的显存位图对象, 但是立即返回而不是 等待回扫. 回扫将在下次 垂直回扫期间发生, 但是你可以在这段时间运行其他的代码, 使用 poll_scroll() 例程来检测何时切换真正 发生. 3 缓冲仅仅只能在合适的硬件上实现: 见 request_scroll() 的注解.

int request_modex_scroll(int x, int y);
int poll_modex_scroll();
作废的 request_scroll() 和 poll_scroll() 版本, 为向以前兼容而保留.


void split_modex_screen(int line);
这个函数只在 mode-X 下有效. 它将在指定行将 VGA 的显示 分成两个部分. 屏幕上面的部分可以利用 scroll_screen() 函数被滚动到 显存的任意部分, 而指定行下面的部分将被保留并且从 屏幕位图的坐标 (0,0) 开始显示. 在分割屏幕 以后你一般想滚动所以上面的部分是从接下来的显存开始向显存后面延伸, 然后创建两个子位图 来控制这两个部分 (见 examples/ex19.c 看看 这些是如何运作的演示). 关掉分割用 split_modex_screen(0).




返回