如何计算fix_screeninfo的line_length变量?

时间:2017-10-16 15:33:08

标签: c linux framebuffer

在我的fbtest应用程序中,我只是在framebuffer中随机绘制。代码无处不在,帧缓冲的使用非常简单。但是我在使用帧缓冲区时遇到了一些问题 - 一切看起来都是因为我错误地映射了内存。经过一段时间后,我发现使用无处不在的公式(Android,Linux教程,很多其他地方)在帧行中给出错误的字节数结果:

struct fb_var_screeninfo vi;
struct fb_fix_screeninfo fi;

// ... initialize the variables by the ioctls...

unsigned row_bytes = vi.xres * vi.bits_in_pixel / 8;

此公式中的row_bytes实际上会给出错误的结果,导致我的图像不正确:实际尺寸 2944 vs 2880 (720像素* 4在我的情况下的字节)。我发现正确的大小写在fi.line_length变量中。问题是为什么它们不同,为什么每个人都写出这个公式,如果它给出了错误的结果?我也试图找到关于此的任何文档,但没有成功。

1 个答案:

答案 0 :(得分:1)

公式xres*bits_in_pixel/8以字节为单位给出一行的宽度。这并不总是与图像的步幅相同(从一行到下一行的偏移),因为行之间可能存在填充。

文档确实很稀疏,示例代码经常出错,因为很多人都没有硬件使这个问题成为一个明显的问题。你很幸运直接遇到它,所以你比普通的fb用户更有教养。