diff --git a/include/SDL_render.h b/include/SDL_render.h index 4e85cfcd7..2551f3a69 100644 --- a/include/SDL_render.h +++ b/include/SDL_render.h @@ -481,8 +481,7 @@ extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, i * * \return 0 on success, or -1 on error * - * \note When the window is resized, the current viewport is automatically - * centered within the new window size. + * \note If the window associated with the renderer is resized, the viewport is automatically reset. * * \sa SDL_RenderGetViewport() * \sa SDL_RenderSetLogicalSize() diff --git a/include/SDL_test_common.h b/include/SDL_test_common.h index 611c54334..f07acf7c1 100644 --- a/include/SDL_test_common.h +++ b/include/SDL_test_common.h @@ -69,6 +69,9 @@ typedef struct int window_minH; int window_maxW; int window_maxH; + int logical_w; + int logical_h; + float scale; int depth; int refresh_rate; int num_windows; diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index fcab8c44f..5167f029d 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -110,29 +110,11 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event) renderer->WindowEvent(renderer, &event->window); } - if (event->window.event == SDL_WINDOWEVENT_RESIZED) { - if (renderer->logical_w) { - /* We'll update the renderer in the SIZE_CHANGED event */ - } else { - /* Try to keep the previous viewport centered */ - int w, h; - - SDL_GetWindowSize(window, &w, &h); - if (renderer->target) { - renderer->viewport_backup.x = (w - renderer->viewport_backup.w) / 2; - renderer->viewport_backup.y = (h - renderer->viewport_backup.h) / 2; - } else { - renderer->viewport.x = (w - renderer->viewport.w) / 2; - renderer->viewport.y = (h - renderer->viewport.h) / 2; - renderer->UpdateViewport(renderer); - } - } - renderer->resized = SDL_TRUE; - } else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { + if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (renderer->logical_w) { UpdateLogicalSize(renderer); - } else if (!renderer->resized) { - /* Window was programmatically resized, reset viewport */ + } else { + /* Window was resized, reset viewport */ int w, h; SDL_GetWindowSize(window, &w, &h); @@ -149,7 +131,6 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event) renderer->UpdateViewport(renderer); } } - renderer->resized = SDL_FALSE; } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h index b01ac887c..f06ee1d80 100644 --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -123,7 +123,6 @@ struct SDL_Renderer /* The window associated with the renderer */ SDL_Window *window; SDL_bool hidden; - SDL_bool resized; /* The logical resolution for rendering */ int logical_w; diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index 8e0e4487c..304e74de5 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -27,7 +27,7 @@ #include #define VIDEO_USAGE \ -"[--video driver] [--renderer driver] [--gldebug] [--info all|video|modes|render|event] [--log all|error|system|audio|video|render|input] [--display N] [--fullscreen | --fullscreen-desktop | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--min-geometry WxH] [--max-geometry WxH] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab]" +"[--video driver] [--renderer driver] [--gldebug] [--info all|video|modes|render|event] [--log all|error|system|audio|video|render|input] [--display N] [--fullscreen | --fullscreen-desktop | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--min-geometry WxH] [--max-geometry WxH] [--logical WxH] [--scale N] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab]" #define AUDIO_USAGE \ "[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]" @@ -301,6 +301,33 @@ SDLTest_CommonArg(SDLTest_CommonState * state, int index) state->window_maxH = SDL_atoi(h); return 2; } + if (SDL_strcasecmp(argv[index], "--logical") == 0) { + char *w, *h; + ++index; + if (!argv[index]) { + return -1; + } + w = argv[index]; + h = argv[index]; + while (*h && *h != 'x') { + ++h; + } + if (!*h) { + return -1; + } + *h++ = '\0'; + state->logical_w = SDL_atoi(w); + state->logical_h = SDL_atoi(h); + return 2; + } + if (SDL_strcasecmp(argv[index], "--scale") == 0) { + ++index; + if (!argv[index]) { + return -1; + } + state->scale = SDL_atof(argv[index]); + return 2; + } if (SDL_strcasecmp(argv[index], "--depth") == 0) { ++index; if (!argv[index]) { @@ -849,6 +876,11 @@ SDLTest_CommonInit(SDLTest_CommonState * state) SDL_GetError()); return SDL_FALSE; } + if (state->logical_w && state->logical_h) { + SDL_RenderSetLogicalSize(state->renderers[i], state->logical_w, state->logical_h); + } else if (state->scale) { + SDL_RenderSetScale(state->renderers[i], state->scale, state->scale); + } if (state->verbose & VERBOSE_RENDER) { SDL_RendererInfo info; @@ -1140,24 +1172,6 @@ SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done) switch (event->type) { case SDL_WINDOWEVENT: switch (event->window.event) { - case SDL_WINDOWEVENT_SIZE_CHANGED: - { - SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); - if (window) { - for (i = 0; i < state->num_windows; ++i) { - if (window == state->windows[i] && - (state->window_flags & SDL_WINDOW_RESIZABLE)) { - SDL_Rect viewport; - - viewport.x = 0; - viewport.y = 0; - SDL_GetWindowSize(window, &viewport.w, &viewport.h); - SDL_RenderSetViewport(state->renderers[i], &viewport); - } - } - } - } - break; case SDL_WINDOWEVENT_CLOSE: { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);