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.
This commit is contained in:
Sam Lantinga 2013-05-29 03:22:19 -07:00
parent c55f53aa40
commit 20c5cf1e8b
5 changed files with 40 additions and 44 deletions

View file

@ -481,8 +481,7 @@ extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, i
* *
* \return 0 on success, or -1 on error * \return 0 on success, or -1 on error
* *
* \note When the window is resized, the current viewport is automatically * \note If the window associated with the renderer is resized, the viewport is automatically reset.
* centered within the new window size.
* *
* \sa SDL_RenderGetViewport() * \sa SDL_RenderGetViewport()
* \sa SDL_RenderSetLogicalSize() * \sa SDL_RenderSetLogicalSize()

View file

@ -69,6 +69,9 @@ typedef struct
int window_minH; int window_minH;
int window_maxW; int window_maxW;
int window_maxH; int window_maxH;
int logical_w;
int logical_h;
float scale;
int depth; int depth;
int refresh_rate; int refresh_rate;
int num_windows; int num_windows;

View file

@ -110,29 +110,11 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
renderer->WindowEvent(renderer, &event->window); renderer->WindowEvent(renderer, &event->window);
} }
if (event->window.event == SDL_WINDOWEVENT_RESIZED) { if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
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 (renderer->logical_w) { if (renderer->logical_w) {
UpdateLogicalSize(renderer); UpdateLogicalSize(renderer);
} else if (!renderer->resized) { } else {
/* Window was programmatically resized, reset viewport */ /* Window was resized, reset viewport */
int w, h; int w, h;
SDL_GetWindowSize(window, &w, &h); SDL_GetWindowSize(window, &w, &h);
@ -149,7 +131,6 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
renderer->UpdateViewport(renderer); renderer->UpdateViewport(renderer);
} }
} }
renderer->resized = SDL_FALSE;
} else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) {
renderer->hidden = SDL_TRUE; renderer->hidden = SDL_TRUE;
} else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) {

View file

@ -123,7 +123,6 @@ struct SDL_Renderer
/* The window associated with the renderer */ /* The window associated with the renderer */
SDL_Window *window; SDL_Window *window;
SDL_bool hidden; SDL_bool hidden;
SDL_bool resized;
/* The logical resolution for rendering */ /* The logical resolution for rendering */
int logical_w; int logical_w;

View file

@ -27,7 +27,7 @@
#include <stdio.h> #include <stdio.h>
#define VIDEO_USAGE \ #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 \ #define AUDIO_USAGE \
"[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]" "[--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); state->window_maxH = SDL_atoi(h);
return 2; 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) { if (SDL_strcasecmp(argv[index], "--depth") == 0) {
++index; ++index;
if (!argv[index]) { if (!argv[index]) {
@ -849,6 +876,11 @@ SDLTest_CommonInit(SDLTest_CommonState * state)
SDL_GetError()); SDL_GetError());
return SDL_FALSE; 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) { if (state->verbose & VERBOSE_RENDER) {
SDL_RendererInfo info; SDL_RendererInfo info;
@ -1140,24 +1172,6 @@ SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done)
switch (event->type) { switch (event->type) {
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
switch (event->window.event) { 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: case SDL_WINDOWEVENT_CLOSE:
{ {
SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);