From 43c04f53307a81bb186694c81c6716ce8906ab38 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 29 May 2013 03:22:19 -0700 Subject: [PATCH] When the window is resized, the viewport is automatically reset. This resolves lots of confusion around resizable windows. Most people don't expect a viewport to be implicitly set when the renderer is created and then not to be reset to the window size if the window is resized. Added common test command line parameters --logical WxH and --scale N to test the render logical size and scaling APIs. --- include/SDL_render.h | 3 +-- include/SDL_test_common.h | 3 +++ src/render/SDL_render.c | 25 +++--------------- src/render/SDL_sysrender.h | 1 - src/test/SDL_test_common.c | 52 ++++++++++++++++++++++++-------------- 5 files changed, 40 insertions(+), 44 deletions(-) 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);