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