|
FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是 /dev/fb0、/dev/fb1 等等。比如,假设现在的显示模式是 1024x768-8 位色,则可以通过如下的命令清空屏幕:
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):
- int fb;
- unsigned char* fb_mem;
- fb = open (“/dev/fb0”, O_RDWR);
- fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
- memset (fb_mem, 0, 1024*768);
复制代码
FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
说到这里,读者可能已经意识到 FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己动手完成。这对于大多数人来说,并不是一件简单的事。
libfbx是linux framebuffer 的一个扩充库,使用它,你可以很方便的开发framebuffer的应用程序。
下面这个简单的程序就可以产生一个有边框的窗口。
- /* gui.c -a simple box
- *
- * By cloudfly<yfy001@etang.com>
- *
- */
- #include <libfbx/libfbx.h>
- #include <libfbx/libfbx-gui.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <config.h>
- int main()
- {
- int x, y;
- int dx, dy;
- int frame = 0;
- fb_init();//初始化
- fb_handle_signals();
- x = fb_screen->width;//宽度
- y = fb_screen->height;//高度
- fb_draw_textbox(0,0,x,y,0,255,0,255,0,0,fb_screen);//画方框
- return 0;
- }
- gcc -o gui gui.c -lfbx -lfbx-gui -ldl
复制代码
完成编译。
同时,libfbx还支持图像,目前支持的图像有png和ppm.
下面这个简单的程序是画一个移动的图像
- /* fbxmove.c - Tests the fb_move_object and fb_draw_image functions.
- *
- * By Michael Bourgeous
- *
- * $Id: fbxmove.c,v 1.10 2001/02/25 20:40:07 lethal Exp $
- */
- #include <libfbx/libfbx.h>
- #include <math.h>
- #include <config.h>
- int main()
- {
- float speed = 0.125;
- float radians = 0.0;
- float x = 160.0;
- float y = 120.0;
- fb_surface *object;
- fb_init();
- fb_handle_signals();
- object = fb_load_ppm("smiley.ppm");
- fb_cls();
- for(radians = 0.0; radians < (PI * 64.0); radians += (PI / 512.0))
- {
- fb_move_object(speed, radians, &x, &y);
- fb_draw_image(object, fb_screen, (int)x, (int)y);
- speed = 0.1 * (sin(0.125 * radians) + 1.25);
- }
- fb_cleanup();
- return 0;
- }
- gcc -o fbxmove fbxmove.c -lfbx -ldl
复制代码
完成编译。
你可以发现,使用libfbx,你可以非常简单快捷的开发framebuffer应用程序。
下载安装:
你可以从 http://sourceforge.net/ 下载,你也可以从我的主页下 载 http://yfy001.myetang.com 安装可参照相关的说明。 |
|