亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1348 | 回復(fù): 0
打印 上一主題 下一主題

[學(xué)習(xí)] linux下framebuffer刷屏怎么只能刷半截? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-07-30 11:29 |只看該作者 |倒序?yàn)g覽
實(shí)際取得的數(shù)據(jù)如下:
varinfo.xres=640 varinfo.yres=480 varinfo.bits_per_pixel=16 fixinfo.line_length=1280 dwScreensize=614400
但是只能刷掉半解屏幕

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)

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* gui_open(const char *device,int mode);
int gui_flush_buffer(struct fb_dev *pdev);
int gui_fill_color(struct fb_dev*pdev,int color);
int gui_draw_line(struct fb_dev *pdev,int whichline,int startpos,int endpos,int color);
int gui_close(struct fb_dev *pdev);
struct fb_dev* gui_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.xres * dev->varinfo.yres * dev->varinfo.bits_per_pixel / 8;

//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 gui_fill_color(struct fb_dev*pdev,int color){
if(!pdev){
  return -1;
}
memset(pdev->buffer,color,pdev->fb_size);
gui_flush_buffer(pdev);
return 0;
}
int gui_close(struct fb_dev*pdev){
free(pdev->buffer);
free(pdev);  
}
int gui_flush_buffer(struct fb_dev *pdev){
char *src,*dst;
if(!pdev){
  return -1;
}
src=pdev->buffer;
dst=pdev->addr;

memcpy(dst,src,pdev->fb_size);

return 0;
}
int gui_draw_hline(struct fb_dev*pdev,int whichline,int startpos,int endpos,int color){
int i;
char *buf;
if(!pdev){
  return -1;
}
if(startpos<0 || startpos>pdev->varinfo.xres)
  startpos=0;
if(endpos<0 || endpos>pdev->varinfo.xres)
  endpos=pdev->varinfo.xres;
if(whichline<0 || whichline>pdev->varinfo.yres)
  whichline=0;
buf=pdev->buffer+whichline*pdev->varinfo.xres;
for(i=startpos;i<endpos;i++)
  *buf++=color;
gui_flush_buffer(pdev);
return 0;
}
int main(int argc,char **argv){
struct fb_dev *dev;
dev=gui_open("/dev/fb0",O_RDWR);
int dwWidth=dev->varinfo.xres;
int dwHeight=dev->varinfo.yres;
int dwScreensize =  dev->fb_size;
printf("varinfo.xres=%d varinfo.yres=%d varinfo.bits_per_pixel=%d fixinfo.line_length=%d dwScreensize=%d\r\n",
        dev->varinfo.xres,
        dev->varinfo.yres,
        dev->varinfo.bits_per_pixel,
        dev->fixinfo.line_length,
        dwScreensize
        );


gui_fill_color(dev,0x0);
gui_draw_hline(dev,dev->varinfo.yres-1,0,300,0xFF0000);
gui_draw_hline(dev,dev->varinfo.yres-3,0,400,0x00FF00);
gui_draw_hline(dev,dev->varinfo.yres-5,0,500,0x0000FF);
gui_close(dev);
return 0;
}


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP