目标:我正在为帧缓冲区编写一个非常简单的图像查看器/dev/fb0
(类似于fbi)。
当前状态:
/sys/class/graphics/fb0/virtual_size
我的软件从(例如)获取像素分辨率1920,1080
。- 然后(对于每一行)它将为每 1920 行像素(总共 4x1920=7680 字节)写入 4 个字节(BGRA)到
/dev/fb0
. 这在我的一台分辨率为 1920x1080 的笔记本电脑上运行得非常好。 - 更准确地说:在
y
-rowx
-col =>arr[y * 1920 * 4 + x * 4 + channel]
值所在的位置channel
设置像素0,1,2,3
(分别为B
、G
、R
和A
)。
问题:
当我在分辨率为 ( /sys/.../virtual_size
->的旧笔记本电脑上尝试使用相同的软件时1366,768
,图像显示不正确(有点歪斜)。所以我研究了像素宽度值,发现该值是1376(不是 1366)。
问题:
- 这 10 个额外字节从何而来?
- 而且,我怎样才能在不同的机器上获得 10 个额外字节的值(自动,而不是手动调整它)?
- 为什么有些机器需要这些额外的 10 个字节,而有些机器不需要它们?
以编程方式,要检索有关帧缓冲区的信息,您应该使用
FBIOGET_FSCREENINFO
andFBIOGET_VSCREENINFO
ioctl
s:line_length
给你线步幅。行步幅不必与宽度相同;在您的 1920 宽屏幕上,您的软件只是“意外地”运行(不是意外,通常选择步长来满足硬件对齐要求,并且 1920 已经可以被 16 整除,这是常见的对齐要求)。
不熟悉良好的 ole Linux 帧缓冲区基础结构,我不能直接告诉你如何去做,但你需要弄清楚步幅。
Linux 只是记录行以 16 的倍数对齐,你总是需要将宽度四舍五入到下一个倍数,或者 /sys/class/graphics/fb0/ 包含一个不同的虚拟文件来定义步幅,或行对齐。