请向我解释此代码。(convert_bitfield)

问题描述 投票:1回答:1

此代码显示在帧缓冲驱动程序中。

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-> length)项,该值在被屏蔽之前移出为零。 有人请解释这是如何工作的? (找到了3个framebuffer驱动程序,所以人们对此很满意。)

提前致谢。 陈

编辑:沃尔特,这是fb_bitfied。

struct fb_bitfield {
        __u32 offset;                   /* beginning of bitfield        */
        __u32 length;                   /* length of bitfield           */
        __u32 msb_right;                /* != 0 : Most significant bit is */
                                        /* right */ 
};
bitmap framebuffer
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.