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 用户受过更多的教育。
在我的 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 用户受过更多的教育。