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
diff --git a/minuitwrp/graphics_fbdev.cpp b/minuitwrp/graphics_fbdev.cpp
index dc2bb2f..afc4151 100644
--- a/minuitwrp/graphics_fbdev.cpp
+++ b/minuitwrp/graphics_fbdev.cpp
@@ -282,15 +282,24 @@
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