diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 106862722..e2fc16e5c 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -168,29 +168,29 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event) } else if (event->type == SDL_MOUSEMOTION) { SDL_Window *window = SDL_GetWindowFromID(event->motion.windowID); if (renderer->logical_w && window == renderer->window) { - event->motion.x -= renderer->viewport.x; - event->motion.y -= renderer->viewport.y; - event->motion.x = (int)(event->motion.x / renderer->scale.x); - event->motion.y = (int)(event->motion.y / renderer->scale.y); + event->motion.x -= (renderer->viewport.x * renderer->dpi_scale.x); + event->motion.y -= (renderer->viewport.y * renderer->dpi_scale.y); + event->motion.x = (int)(event->motion.x / (renderer->scale.x * renderer->dpi_scale.x)); + event->motion.y = (int)(event->motion.y / (renderer->scale.y * renderer->dpi_scale.y)); if (event->motion.xrel > 0) { - event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / renderer->scale.x)); + event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x))); } else if (event->motion.xrel < 0) { - event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / renderer->scale.x)); + event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x))); } if (event->motion.yrel > 0) { - event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / renderer->scale.y)); + event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y))); } else if (event->motion.yrel < 0) { - event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / renderer->scale.y)); + event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y))); } } } else if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) { SDL_Window *window = SDL_GetWindowFromID(event->button.windowID); if (renderer->logical_w && window == renderer->window) { - event->button.x -= renderer->viewport.x; - event->button.y -= renderer->viewport.y; - event->button.x = (int)(event->button.x / renderer->scale.x); - event->button.y = (int)(event->button.y / renderer->scale.y); + event->motion.x -= (renderer->viewport.x * renderer->dpi_scale.x); + event->motion.y -= (renderer->viewport.y * renderer->dpi_scale.y); + event->motion.x = (int)(event->motion.x / (renderer->scale.x * renderer->dpi_scale.x)); + event->motion.y = (int)(event->motion.y / (renderer->scale.y * renderer->dpi_scale.y)); } } return 0; @@ -289,6 +289,18 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) renderer->window = window; renderer->scale.x = 1.0f; renderer->scale.y = 1.0f; + renderer->dpi_scale.x = 1.0f; + renderer->dpi_scale.y = 1.0f; + + if (window && renderer->GetOutputSize) { + int window_w, window_h; + int output_w, output_h; + if (renderer->GetOutputSize(renderer, &output_w, &output_h) == 0) { + SDL_GetWindowSize(renderer->window, &window_w, &window_h); + renderer->dpi_scale.x = (float)window_w / output_w; + renderer->dpi_scale.y = (float)window_h / output_h; + } + } if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_TRUE; diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index 4c1ac1b4f..24ea98ac5 100644 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -154,6 +154,9 @@ struct SDL_Renderer SDL_FPoint scale; SDL_FPoint scale_backup; + /* The pixel to point coordinate scale */ + SDL_FPoint dpi_scale; + /* The list of textures */ SDL_Texture *textures; SDL_Texture *target;