fix_screeninfo的line_length变量是怎么统计的?

How the line_length variable of fix_screeninfo is counted?

在我的 fbtest 应用程序中,我只是在帧缓冲区中随机绘制。代码无处不在,很简单的framebuffer用法。但是我在使用帧缓冲区时遇到了一些问题——一切看起来都是因为我错误地映射了内存。一段时间后,我发现 everywhere(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 变量中。问题是为什么它们不同,如​​果给出错误的结果为什么每个人都写这个公式?我也试图找到关于此的任何文档,但没有成功。

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

文档确实很少,而且示例代码经常是错误的,因为很多人没有硬件使这个问题成为一个明显的问题。你只是幸运地直接遇到它,所以你比一般的 fb 用户受过更多的教育。