framebuffer属性

linux的图形界面可以通过直接向framebuffer写数据来实现,framebuffer在这个意义上就相当于显卡缓存。framebuffer包括许多属性,简单列举如下

分辨率(800x600), 色深(32位),缓冲大小, 颜色模式等。今天我主要记录下颜色模式,因为这两天才发现他的作用。就如我现在的程序而言,arm板上的色深是16位,我一直没有办法从24位转换位16位,后来才发现framebuffer其实已经告诉我转换办法,比如我的framebuffer反馈颜色模式为RGB565,所以我定义了一个宏实现RGB888(24位)转换为RGB565(16位):#define RGB_U16(r,g,b)       (((((r) >> 3) & 0x1f) << 11) | ((((g) >> 3) & 0x3f) << 5) | (((b) >> 3) & 0x1f))

部分程序摘录

获取属性

if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0)

{
        printf("errorioctl FBIOGET_VSCREENINFO\n");
        close(fb_fd);
        return -1;

}

printf("transp: o=%d, l=%d, mr=%d\n", vinfo.transp.offset,vinfo.transp.length, vinfo.transp.msb_right);
printf("red: o=%d, l=%d, mr=%d\n", vinfo.red.offset,vinfo.red.length, vinfo.red.msb_right);
printf("green: o=%d, l=%d, mr=%d\n", vinfo.green.offset,vinfo.green.length, vinfo.green.msb_right);
printf("blue: o=%d, l=%d, mr=%d\n", vinfo.blue.offset,vinfo.blue.length, vinfo.blue.msb_right);

设置属性

vinfo.red.offset = 0;
vinfo.red.length = 5;
vinfo.green.offset = 5;
vinfo.green.length = 5;
vinfo.blue.offset = 10;
vinfo.blue.length = 5;
vinfo.transp.offset = 15;
vinfo.transp.length = 1;

//Set variable screen information
if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo) == -1)
{
        printf("Error reading variable information.\n");

        return -1;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值