基于FrameBuffer的简易图形库开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FrameBuffer的简易图形库开发
QT不是基于FrameBuffer的吗,现在被Nokia收购了,可惜对于很简单的应用,QT太宠大了,既然知道FrameBuffer的工作原理,自己写一个也行啊,找了找资料,写了以下的代码,当然功能极其简单,实现的基本原理是将FrameBuffer 的物理内容映射到进程空间内,然后直接对这段内存进行写操作,这样就会直接将数据显示在屏幕上。
//zsygui.h
#ifndef __ZSYGUI_H__
#define __ZSYGUI_H__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ERR(fmt,args...) printf("Error:" fmt,##args)
/*frame buffer device structure*/
struct fb_dev{
int fd; /*file descriptor*/
struct fb_fix_screeninfo fixinfo;
struct fb_var_screeninfo varinfo;
char *addr; /*map address*/
int fb_size; /*frame buffer size*/
char *buffer; /*buffer,equals to framebufer's size*/
};
struct fb_dev* zsygui_open(const char *device,int mode);
extern int zsygui_flush_buffer(struct fb_dev *pdev);
extern int zsygui_fill_color(struct fb_dev*pdev,int color);
extern int zsygui_draw_line(struct fb_dev *pdev,int whichline,int startpos,int endpos,int color);
extern int zsygui_close(struct fb_dev *pdev);
#endif //__ZSYGUI_H__
//zsygui.c
#include "zsygui.h"
struct fb_dev* zsygui_open(const char *device,int mode){
struct fb_dev *dev=(struct fb_dev*)malloc(sizeof(struct fb_dev));
if(!dev){
return NULL;
}
if(!device){
free(dev);
return NULL;
}
if((dev->fd=open(device,mode))<0){
printf("open %s failed./n",device);
free(dev);
return NULL;
}
if(ioctl(dev->fd,FBIOGET_FSCREENINFO,&dev->fixinfo)==-1){
printf("ioctl failed./n");
free(dev);
return NULL;
}
if(ioctl(dev->fd,FBIOGET_VSCREENINFO,&dev->varinfo)==-1){
printf("ioctl failed./n");
free(dev);
return NULL;
}
//frame buffer size
dev->fb_size=(dev->varinfo.yres) * (dev->fixinfo.line_length);
//map physical address to process virtual address
dev->addr=mmap(NULL,dev->fb_size,PROT_READ|PROT_WRITE,MAP_SHARED,dev ->fd,0);
if(!dev->addr){
printf("mmap failed./n");
free(dev);
return NULL;
}
//allocate the same size buffer
dev->buffer=(char*)malloc(dev->fb_size);
if(!dev->buffer){
printf("malloc failed./n");
free(dev);
return NULL;
}
memset(dev->buffer,0,dev->fb_size);
return dev;
}
int zsygui_fill_color(struct fb_dev*pdev,int color){
if(!pdev){
return -1;
}