Objetivo : Estou escrevendo um visualizador de imagens muito simples para framebuffer /dev/fb0
(algo como fbi ).
Estado atual:
- Meu software obtém a resolução de pixel de
/sys/class/graphics/fb0/virtual_size
(como1920,1080
). - E então (para cada linha) ele gravará 4 bytes (BGRA) para cada 1920 pixels de linha (total 4x1920 = 7680 bytes) para
/dev/fb0
. Isso funciona perfeitamente bem no meu laptop com resolução de 1920 x 1080. - Mais precisamente: definir um pixel em
y
-rowx
-col =>arr[y * 1920 * 4 + x * 4 + channel]
onde o valorchannel
é0,1,2,3
(paraB
,G
,R
eA
, respectivamente).
Problema :
Quando tento o mesmo software em meu laptop antigo com ( /sys/.../virtual_size
-> 1366,768
resolução), a imagem não é exibida corretamente (um pouco distorcida). Então eu brinquei com o valor da largura do pixel e descobri que o valor era 1376 (não 1366).
Perguntas :
- De onde vêm esses 10 bytes extras?
- E como posso obter esse valor de 10 bytes extras em máquinas diferentes (automaticamente, não ajustando manualmente)?
- Por que algumas máquinas precisam desses 10 bytes extras, quando outras não precisam?
Programaticamente, para recuperar informações sobre um framebuffer, você deve usar e
FBIOGET_FSCREENINFO
sFBIOGET_VSCREENINFO
ioctl
:line_length
dá-lhe o passo de linha.A passada da remada não precisa ser igual à largura ; em sua tela de 1920, seu software funcionou "por acidente" (não muito por acidente, os passos são normalmente escolhidos para requisitos de alinhamento de hardware e 1920 já é divisível por 16, que é um requisito de alinhamento comum).
Não estando familiarizado com a boa e velha infraestrutura de framebuffer do Linux, não posso lhe dizer diretamente como fazê-lo, mas você precisará descobrir o passo a passo.
O Linux apenas documenta que as linhas estão alinhadas por múltiplos de 16, você sempre precisa arredondar sua largura para o próximo múltiplo disso ou /sys/class/graphics/fb0/ contém um arquivo virtual diferente que definiu o passo, ou o alinhamento da linha.