这篇文章其实也不算是原创,看了前辈们的资料加上自己的一些理解。在文章末尾,我提供几篇好的资料。
如果有必要那么我们可以使用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())
{
printf("qvfb init error!\n");
return -1;
}
/*open input device */
if(open_inputdev())
{
printf("open input device error!\n");
return -2;
}
在main()函数结束之前,我们必须还close打开的设备文件。
dis_qvfb_exit(); close_inputdev();2、我的main函数里面有一个while(1)函数,在内部不断从鼠标文件中读取鼠标信息,然后显示到qvfb的屏幕设备上。
在做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
以上纯属个人学习笔记,如果哪里错了,希望提出。愿和大家一起共同学习,一起进步。我的邮箱地址是:[email protected]