changeset 1398:08116cb5ffaa

Fix absolute mouse mode when non-default overscan settings are used
author Michael Pavone <pavone@retrodev.com>
date Wed, 14 Jun 2017 20:46:11 -0700
parents 89eb967fed72
children 19044d5e388c
files io.c render.h render_sdl.c
diffstat 3 files changed, 34 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/io.c	Wed Jun 14 09:48:46 2017 -0700
+++ b/io.c	Wed Jun 14 20:46:11 2017 -0700
@@ -614,11 +614,14 @@
 	case MOUSE_NONE:
 		break;
 	case MOUSE_ABSOLUTE: {
-		float scale_x = 640.0 / ((float)render_width());
-		float scale_y = 480.0 / ((float)render_height());
-		float scale = scale_x > scale_y ? scale_y : scale_x;
-		mice[mouse].motion_port->device.mouse.cur_x = x * scale_x;
-		mice[mouse].motion_port->device.mouse.cur_y = y * scale_y;
+		float scale_x = (render_emulated_width() * 2.0f) / ((float)render_width());
+		float scale_y = (render_emulated_height() * 2.0f) / ((float)render_height());
+		int32_t adj_x = x * scale_x + 2 * render_overscan_left() - 2 * BORDER_LEFT;
+		int32_t adj_y = y * scale_y + 2 * render_overscan_top() - 4;
+		if (adj_x >= 0 && adj_y >= 0) {
+			mice[mouse].motion_port->device.mouse.cur_x = adj_x;
+			mice[mouse].motion_port->device.mouse.cur_y = adj_y;
+		}
 		break;
 	}
 	case MOUSE_RELATIVE: {
--- a/render.h	Wed Jun 14 09:48:46 2017 -0700
+++ b/render.h	Wed Jun 14 20:46:11 2017 -0700
@@ -99,7 +99,10 @@
 void render_errorbox(char *title, char *message);
 void render_warnbox(char *title, char *message);
 void render_infobox(char *title, char *message);
-
+uint32_t render_emulated_width();
+uint32_t render_emulated_height();
+uint32_t render_overscan_top();
+uint32_t render_overscan_left();
 
 #endif //RENDER_H_
 
--- a/render_sdl.c	Wed Jun 14 09:48:46 2017 -0700
+++ b/render_sdl.c	Wed Jun 14 20:46:11 2017 -0700
@@ -567,9 +567,11 @@
 #define FPS_INTERVAL 1000
 #endif
 
+static uint32_t last_width;
 void render_framebuffer_updated(uint8_t which, int width)
 {
 	static uint8_t last;
+	last_width = width;
 	uint32_t height = which <= FRAMEBUFFER_EVEN 
 		? (video_standard == VID_NTSC ? 243 : 294) - (overscan_top[video_standard] + overscan_bot[video_standard])
 		: 240;
@@ -692,6 +694,26 @@
 	events_processed = 0;
 }
 
+uint32_t render_emulated_width()
+{
+	return last_width - overscan_left[video_standard] - overscan_right[video_standard];
+}
+
+uint32_t render_emulated_height()
+{
+	return (video_standard == VID_NTSC ? 243 : 294) - overscan_top[video_standard] - overscan_bot[video_standard];
+}
+
+uint32_t render_overscan_left()
+{
+	return overscan_left[video_standard];
+}
+
+uint32_t render_overscan_top()
+{
+	return overscan_top[video_standard];
+}
+
 void render_wait_quit(vdp_context * context)
 {
 	SDL_Event event;