minuitwrp: fix and hopefully speed up fbdev screen flipping

Fix: use row_bytes instead of xres (should help on Shield tablet)
Speed: Moving the calculations out of the inner loop

Change-Id: Ie43ae5e94ae88822360900c7b4d852b7aab4379b
This commit is contained in:
that
2016-02-09 01:42:08 +01:00
committed by Dees Troy
parent 2948b6f393
commit 506fc803bf
+16 -7
View File
@@ -282,15 +282,24 @@ static GRSurface* fbdev_flip(minui_backend* backend __unused) {
if (double_buffered)
gr_active_fb = 1-displayed_buffer;
/* flip buffer 180 degrees for devices with physicaly inverted screens */
unsigned int i, j;
for (i = 0; i < vi.yres; i++) {
for (j = 0; j < vi.xres; j++) {
memcpy(gr_framebuffer[gr_active_fb].data + (i * vi.xres_virtual + j) * gr_framebuffer[0].pixel_bytes,
gr_draw->data + ((vi.yres - i - 1) * vi.xres_virtual + vi.xres - j - 1) * gr_framebuffer[0].pixel_bytes,
gr_framebuffer[0].pixel_bytes);
/* flip buffer 180 degrees for devices with physically inverted screens */
unsigned int row_pixels = gr_draw->row_bytes / gr_framebuffer[0].pixel_bytes;
if (gr_framebuffer[0].pixel_bytes == 4) {
for (unsigned int y = 0; y < gr_draw->height; ++y) {
uint32_t* dst = reinterpret_cast<uint32_t*>(gr_framebuffer[gr_active_fb].data) + y * row_pixels;
uint32_t* src = reinterpret_cast<uint32_t*>(gr_draw->data) + (gr_draw->height - y - 1) * row_pixels + gr_draw->width;
for (unsigned int x = 0; x < gr_draw->width; ++x)
*(dst++) = *(--src);
}
} else {
for (unsigned int y = 0; y < gr_draw->height; ++y) {
uint16_t* dst = reinterpret_cast<uint16_t*>(gr_framebuffer[gr_active_fb].data) + y * row_pixels;
uint16_t* src = reinterpret_cast<uint16_t*>(gr_draw->data) + (gr_draw->height - y - 1) * row_pixels + gr_draw->width;
for (unsigned int x = 0; x < gr_draw->width; ++x)
*(dst++) = *(--src);
}
}
if (double_buffered)
set_displayed_framebuffer(1-displayed_buffer);
#endif