FrameBufferの各行に書き込まれたバイト数を取得する方法は?

FrameBufferの各行に書き込まれたバイト数を取得する方法は?

ターゲット:私はフレームバッファ用の非常に単純な画像ビューアを書いています/dev/fb0(例:FBI)。

現在の状態:

  1. /sys/class/graphics/fb0/virtual_size私のソフトウェアは(たとえば)からピクセル解像度を取得します1920,1080
  2. 次に(各行ごとに)1920行ピクセル(合計4×1920 = 7680バイト)あたり4バイト(BGRA)を/dev/fb0
  3. より正確には、y-row -col =>の値がそれぞれ(、および)のピクセルをx設定します。arr[y * 1920 * 4 + x * 4 + channel]channel0,1,2,3BGRA

質問:

/sys/.../virtual_size( - >解像度)を使用して以前のノートブックで1366,768同じソフトウェアを試したときに画像が正しく表示されませんでした(少し傾いた)。そのため、ピクセル幅の値を調べたところ、値は次のようになりました。1376(1366ではない)。

質問:

  1. この10個の追加バイトはどこから来るのでしょうか?
  2. そして、他のコンピュータでこの10バイトの値をどのように取得できますか(手動で調整せずに自動的に)?
  3. なぜ一部のシステムにはこれらの追加の10バイトが必要であり、一部のシステムには必要ないのですか?

ベストアンサー1

プログラムでフレームバッファに関する情報を取得するには、次のものを使用する必要があります。FBIOGET_FSCREENINFOそしてFBIOGET_VSCREENINFO ioctl:

#include <fcntl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>

int main(int argc, char **argv) {
  struct fb_fix_screeninfo fix;
  struct fb_var_screeninfo var;

  int fb = open("/dev/fb0", O_RDWR);
  if (fb < 0) {
    perror("Opening fb0");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_FSCREENINFO, &fix) != 0) {
    perror("FSCREENINFO");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_VSCREENINFO, &var) != 0) {
    perror("VSCREENINFO");
    exit(1);
  }

  printf("Line length: %ld\n", fix.line_length);
  printf("Visible resolution: %ldx%ld\n", var.xres, var.yres);
  printf("Virtual resolution: %ldx%ld\n", var.xres_virtual, var.yres_virtual);
}

line_lengthあなたに行ストライドを与えます。

おすすめ記事