Провёл кое-какую оптимизацию:
Создал буфер для хранения "картинки" в оперативе:
Код:
uint32_t membuf[1024][768];
При инициализации он забивается нулями (чёрным цветом)
Модифицировал функцию для вывода:
Код:
void fb_set_pix(int x,int y,uint32_t color)
{
membuf[x][y]=color;
unsigned where = x*(fbbpp/8) + y*fbpitch;
framebuffer[where + 0] = color; // BLUE
framebuffer[where + 1] = (color >> 8); // GREEN
framebuffer[where + 2] = (color >> 16); // RED
}
Ну и функция прокрутки:
Код:
void fb_scroll_y(int numpix, uint32_t color) {
int i,j;
int where = 0;
int xoffset = fbbpp/8;
// смещаем верх
for(i=numpix; i<768; i++){
for(j=0; j<1024; j++){
membuf[j][i-numpix] = membuf[j][i];
framebuffer[where] = membuf[j][i]; // BLUE
framebuffer[where + 1] = (membuf[j][i] >> 8); // GREEN
framebuffer[where + 2] = (membuf[j][i] >> 16); // RED
where += xoffset;
}
where += fbpitch;
}
// красим низ
for(i=fb_screenH-numpix; i<768; i++){ // height
for(j=0; j<1024; j++){ // width
fb_set_pix(j,i,color);
}
}
}
По логике, вроде всё в порядке - для каждого пикселя увеличивается адрес смещения, а при проходе строки - добавляется смещение для перехода на следующую строку.
Однако работает этот код не правильно - буквы размываются, увеличиваются по высоте.