Mercurial > repos > blastem
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;