请向我解释这个代码..(convert_bitfield)

时间:2014-02-19 12:56:02

标签: bitmap framebuffer

此代码出现在帧缓冲驱动程序中..

static inline u32 convert_bitfield(int val, struct fb_bitfield *bf)
{
        unsigned int mask = (1 << bf->length) - 1;

        return (val >> (16 - bf->length) & mask) << bf->offset;
}

从如下使用方式判断,

if (regno < 15) {
        fb->cmap[regno] = convert_bitfield(transp, &fb->fb.var.transp) |
                          convert_bitfield(blue, &fb->fb.var.blue) |
                          convert_bitfield(green, &fb->fb.var.green) |
                          convert_bitfield(red, &fb->fb.var.red);
        return 0;
}

我认为这个函数将值移动到16位值的位置。例如,如果16位值由5位R,6位G和5位B组成,并且如果R = 1,G = 2,B = 3,则16位值将变为0x0843。 (没有alpha位) 00001 000010 00011 = 0000 1000 0100 0011 = 0x0843。

但是上面的代码似乎并没有像预期的那样工作。由于(16-bf->长度)项,该值在被屏蔽之前被移出到零。有人请解释这是如何工作的? (找到3个帧缓冲驱动程序,所以人们似乎对它感到满意..)

提前致谢。 陈

编辑:沃尔特,这是fb_bitfied。

struct fb_bitfield {
        __u32 offset;                   /* beginning of bitfield        */
        __u32 length;                   /* length of bitfield           */
        __u32 msb_right;                /* != 0 : Most significant bit is */
                                        /* right */ 
};

1 个答案:

答案 0 :(得分:1)

我将尝试解释该函数的作用:

Fisrt值为transp,蓝绿色为16位且反转,例如

blue = 28 = 0b0000000000011100 is actually 0b0011100000000000

让我们假设RGB565所以蓝色长度为5:

val >> (16 - bf->length) shifts blue 11 places blue = 0b0000000000000111

然后掩码5 - 1 = 4位,

(val >> (16 - bf->length) & mask) translates to 0b0000000000000111 & 0b0000000000001111

最后它会转换为蓝色应该是R G B格式

瓦尔特