嵌入式软件工程师&&太极拳
全部博文(548)
分类:
2011-02-20 19:50:30
/* 打开帧缓冲设备 */ int openFB(const char *name) { int fh; char *dev; if(name == NULL) { dev = getenv("FRAMEBUFFER"); if(dev) name = dev; else name = DEFAULT_FRAMEBUFFER; } if((fh = open(name, O_WRONLY)) == -1) { fprintf(stderr, "open %s: %s\n", name, strerror(errno)); exit(1); } return fh; } /* 关闭帧缓冲设备 */ int closeFB(int fh) { return close(fh); } /* 得到屏幕可变参数 */ void getVarScreenInfo(int fh, struct fb_var_screeninfo *var) { if(ioctl(fh, FBIOGET_VSCREENINFO, var)) { fprintf(stderr, "ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno)); exit(1); } } /* 设置屏幕可变参数 */ void setVarScreenInfo(int fh, struct fb_var_screeninfo *var) { if(ioctl(fh, FBIOPUT_VSCREENINFO, var)) { fprintf(stderr, "ioctl FBIOPUT_VSCREENINFO", strerror(errno)); exit(1); } } /* 得到屏幕固定参数 */ void getFixScreenInfo(int fh, struct fb_fix_screeninfo *fix) { if(ioctl(fh, FBIOGET_FSCREENINFO, fix)) { fprintf(stderr, "ioctl FBIOGET_FSCREENINFO", strerror(errno)); exit(1); } } /* 构造颜色表 */ void make332map(struct fb_cmap *map) { int rs, gs, bs, i; int r = 8, g = 8, b = 4; map->red = red; map->green = green; map->blue = blue; rs = 256 / (r - 1); gs = 256 / (g - 1); bs = 256 / (b - 1); for(i = 0; i < 256; i++) { map->red[i] = (rs * ((i / (g * b)) % r)) * 255; map->green[i] = (gs * ((i / b) % g)) * 255; map->blue[i] = (bs * ((i) % b)) * 255; } } /* 设置颜色表 */ void set8map(int fh, struct fb_cmap *map) { if(ioctl(fh, FBIOPUTCMAP, map) < 0) { fprintf(stderr, "Error putting colormap"); exit(1); } } /* 构造并设置颜色表 */ void set332map(int fh) { make332map(&map332); set8map(fh, &map332); } /* 获得颜色表 */ void get8map(int fh, struct fb_cmap *map) { if(ioctl(fh, FBIOGETCMAP, map) < 0) { fprintf(stderr, "Error getting colormap"); exit(1); } } /* 组成BPP = 16时的缓冲数据 */ inline unsigned short make16color(unsigned char r, unsigned char q, unsigned char b) { return ((((r >> 3) & 31) << 11) | (((g >> 2) & 63) << 5) | ((b >> 3) & 31)); } /* 把RGB数据按照屏幕的BPP调整 */ void *convertRGB2FB(int fh, unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp) { unsigned long i; void *fbbuff = NULL; unsigned char *c_fbbuff; unsigned short *s_fbbuff; unsigned int *i_fbbuff; switch(bpp) { case 8: //... break; case 15: //... break; case 16: *cpp = 2; s_fbbuff = (unsigned short *)malloc(count * sizeof(unsigned short)); for(i = 0; i < count; i++) s_fbbuff[i] = make16color(rgbbuff[i * 3], rgbbuff[i * 3 + 1], rgbbuff[i * 3 + 2]); fbbuff = (void *)s_fbbuff; break; case 24: break; case 32: //... break; default: fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp); exit(1); } return fbbuff; }