这篇文章其实也不算是原创,看了前辈们的资料加上自己的一些理解。在文章末尾,我提供几篇好的资料。
如果有必要那么我们可以使用qvfb开发自己的GUI图形引擎,qvfb是一个模拟/dev/fb0的framebuffer显示方式的应用程序,使用共享内存,外部程序比如minigui传递数据到qvfb建立的共享内存,之后qvfb将数据刷新到qvfb软件界面上,需要注意的是,qvfb并不是严格意义上的framebuffer,当minigui将数据发送到qvfb的共享内存之后,qvfb并不会立即将修改的数据反应到qvfb的软件界面上,
而是需要外部程序,比如minigui,首先设置qvfb创建的共享空间结构体下面的update矩形失效范围,即(left,top)和(right,bottom),
然后设置qvfb创建的共享空间结构体下面的dirty控制字为1,
这样qvfb检测到drity标志为1后,将取出update中待刷新矩形描述区间,然后将update指定
区间中的数据刷新到qvfb界面上,之后qvfb将共享空间的drity标志置0,同时将update设为无效的(0,0)和(-1,-1)
qvfb的原理很简单,它建立了一个system V共享内存,用户只需将需要显示的图像按像素格式要求放到共享内存里qvfb就可以显示了。
System V共享内存连接的步骤是:
1.通过ftok拿到key
2.使用shmget拿到shmid
3.使用shmat连接到共享内存
这里需要注意的是,key的生成需要向ftok传入一个双方约定好的文件名,对于qvfb屏幕设备,这个文件是/tmp/.qtvfb_mouse-0。
qvfb创建的共享内存包含一个私有的数据头,用于指示像素格式、宽高等信息。这个头结构定义如下:
- typedef struct tagrect_t
- {
- int left;
- int top;
- int right;
- int bottom;
- }RECT_T;
- typedef struct tagQVFbHeader
- {
- int width; //the width of qvfb screen device
- int height; //the height of qvfb screen device
- int depth; //the depth of qvfb screen device
- int linestep; //length of a line in bytes
- int dataoffset; //data in shared memory offset
- RECT_T update; //the area to be updated
- unsigned char dirty; //update flags,when dirty=1,the area will be updated
- int numcols; //number of colors
- unsigned int clut[256]; //color index
- }QVFBHEADER;
1、程序规范
这里的规范不仅仅是风格上面的规范,更重要的为合法性校验,内存泄露问题。
如下代码,我们必须对程序的返回结果进行校验,这样的代码比较健壮。
- if(dis_qvfb_init())
- {
- <span style="white-space:pre"> </span>printf("qvfb init error!\n");
- return -1;
- }
- /*open input device */
- if(open_inputdev())
- {
- printf("open input device error!\n");
- return -2;
- }
- dis_qvfb_exit();
- close_inputdev();
在做GUI的开发,往往都有这样的一个流程:
a.往数据地址写数据;
b.更新“framebuffer”
如果像不断显示鼠标信息这样的一个应用,则每次写数据之前都要先clear那块区域
这方面的资料相对比较少,在这里连接上一些好资料的原文地址
1、浅析qvfb图像显示原理和鼠标键盘信息获取方法
2、使用qvfb在X11下开发framebuffer应用程序
3、QVFB
4、Linux下framebuffer及qvfb编程示例
5、Framebuffer Driver
在这里附上程序源代码下载链接:http://download.csdn.net/detail/fzu_dianzi/3718774
以上纯属个人学习笔记,如果哪里错了,希望提出。愿和大家一起共同学习,一起进步。我的邮箱地址是:xzy@yingzhi8.com