Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
When the window is resized, the viewport is automatically reset.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
slouken committed May 29, 2013
1 parent 5d8990e commit 43c04f5
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 44 deletions.
3 changes: 1 addition & 2 deletions include/SDL_render.h
Expand Up @@ -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()
Expand Down
3 changes: 3 additions & 0 deletions include/SDL_test_common.h
Expand Up @@ -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;
Expand Down
25 changes: 3 additions & 22 deletions src/render/SDL_render.c
Expand Up @@ -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);
Expand All @@ -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) {
Expand Down
1 change: 0 additions & 1 deletion src/render/SDL_sysrender.h
Expand Up @@ -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;
Expand Down
52 changes: 33 additions & 19 deletions src/test/SDL_test_common.c
Expand Up @@ -27,7 +27,7 @@
#include <stdio.h>

#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]"
Expand Down Expand Up @@ -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]) {
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 43c04f5

Please sign in to comment.