- uint16_t *vram = gpu.vram;
- int stride = gpu.screen.hres;
- int fb_offs, doffs;
- uint8_t *dest;
-
- fb_offs = y * 1024 + x;
- dest = (uint8_t *)screen_buf;
-
- // only do centering, at least for now
- doffs = (stride - w) / 2 & ~1;
-
- if (gpu.status.rgb24)
- {
- if (cbs->only_16bpp) {
- dest += doffs * 2;
- for (; h-- > 0; dest += stride * 2, fb_offs += 1024)
- {
- fb_offs &= 1024*512-1;
- bgr888_to_rgb565(dest, vram + fb_offs, w * 3);
- }
- }
- else {
- dest += (doffs / 8) * 24;
- for (; h-- > 0; dest += stride * 3, fb_offs += 1024)
- {
- fb_offs &= 1024*512-1;
- bgr888_to_rgb888(dest, vram + fb_offs, w * 3);
- }
- }
+ int vram_h = 512;
+ int src_x2 = 0;
+
+#ifdef RAW_FB_DISPLAY
+ w = 1024, h = 512, x = src_x = y = src_y = 0;
+#endif
+ if (x < 0) { w += x; src_x2 = -x; x = 0; }
+ if (y < 0) { h += y; src_y -= y; y = 0; }
+
+ if (w <= 0 || h <= 0)
+ return;
+
+ check_mode_change(0);
+ if (gpu.state.enhancement_active) {
+ if (!gpu.state.enhancement_was_active)
+ return; // buffer not ready yet
+ vram = gpu.get_enhancement_bufer(&src_x, &src_y, &w, &h, &vram_h);
+ if (vram == NULL)
+ return;
+ x *= 2; y *= 2;
+ src_x2 *= 2;