Я не могу изменить фреймбуфер - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь изменить фреймбуфер на Linux. Я запускаю программу через виртуальный терминал (tty). Кажется, я не могу изменить пиксель, который хочу. Вот мой код:

#include <stdio.h>

    unsigned char buffer[4 * 1366 * 768];
    const int framewidth = 1366;
void placepixel(int x, int y, int r, int g, int b, int a){
    buffer[(framewidth * y) + x] = b;
    buffer[(framewidth * y) + x+1] = g;
    buffer[(framewidth * y) + x+2] = r;
    buffer[(framewidth * y) + x+3] = a;
}

void placepixelbynum(int i, int r, int g, int b, int a){
    buffer[i] = b;
    buffer[i+1] = g;
    buffer[i+2] = r;
    buffer[i+3] = a;
}
int main(){
    for(int i = 0; i < 4 * 1366 * 768; i+=4){
        placepixelbynum(i, 50,50,50,0);
    }
    FILE *write_ptr;

    write_ptr = fopen("/dev/fb0","wb");

    int x, y, z, xr, yr, zr;

    while(true){

    for(int i = 0; i < 128; i++){

    placepixel(128+i,128,255,0,0,0);
    }
    fwrite(buffer,sizeof(buffer),1,write_ptr);

    }
    return 0;

}



Когда я запускаю это, экран становится серым (как и ожидалось), но строка помещается не там, где я ожидал. (Я хочу, чтобы он начинался с 128x128 и заканчивался 256x128), но он находится в правом конце экрана.

1 Ответ

2 голосов
/ 17 июня 2020

Проблема, по-видимому, возникает из-за того, что не учитываются 4 байта буферного пространства для каждого пикселя. Рассмотрим следующую настольную проверку

pixel(0,0)  
(framewidth*y) + x + 0  -> 0    
(framewidth*y) + x + 1  -> 1    
(framewidth*y) + x + 2  -> 2    
(framewidth*y) + x + 3  -> 3
pixel(1,0)  
(framewidth*y) + x + 0  -> 1    
(framewidth*y) + x + 1  -> 2    
(framewidth*y) + x + 2  -> 3    
(framewidth*y) + x + 3  -> 4

Я подозреваю, что вы добьетесь большего успеха с чем-то вроде этого:

void placePixel(int x, int y, int r, int g, int b, int a)
{
    int index = 4 * ((frameWidth*y) + x)
    buffer[index+0] = r;
    buffer[index+1] = g;
    buffer[index+2] = b;
    buffer[index+3] = a;
}
...