/* 打开帧缓冲设备 */
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;
}
阅读(551) | 评论(0) | 转发(0) |