基于FrameBuffer的简易图形库开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档