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

Commit

Permalink
Fixed loading textures when the window starts hidden.
Browse files Browse the repository at this point in the history
The viewport automatically resets to the window size when you programmatically resize the window.
  • Loading branch information
slouken committed Jan 23, 2012
1 parent 9855fa5 commit 9bf2ce7
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 30 deletions.
70 changes: 50 additions & 20 deletions src/render/SDL_render.c
Expand Up @@ -100,7 +100,7 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
renderer->WindowEvent(renderer, &event->window);
}

if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
if (event->window.event == SDL_WINDOWEVENT_RESIZED) {
/* Try to keep the previous viewport centered */
int w, h;
SDL_Rect viewport;
Expand All @@ -116,10 +116,40 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
viewport.h = renderer->viewport.h;
SDL_RenderSetViewport(renderer, &viewport);
}
renderer->resized = SDL_TRUE;
} else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
int w, h;
SDL_Rect viewport;

if (!renderer->resized) {
/* Window was programmatically resized, reset viewport */
SDL_GetWindowSize(window, &w, &h);
if (renderer->target) {
renderer->viewport_backup.x = 0;
renderer->viewport_backup.y = 0;
renderer->viewport_backup.w = w;
renderer->viewport_backup.h = h;
} else {
viewport.x = 0;
viewport.y = 0;
viewport.w = w;
viewport.h = h;
SDL_RenderSetViewport(renderer, &viewport);
}
renderer->resized = SDL_FALSE;
}
} else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) {
renderer->hidden = SDL_TRUE;
} else if (event->window.event == SDL_WINDOWEVENT_SHOWN) {
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {
renderer->hidden = SDL_FALSE;
}
} else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) {
renderer->minimized = SDL_TRUE;
renderer->hidden = SDL_TRUE;
} else if (event->window.event == SDL_WINDOWEVENT_RESTORED) {
renderer->minimized = SDL_FALSE;
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
renderer->hidden = SDL_FALSE;
}
}
}
}
Expand Down Expand Up @@ -218,10 +248,10 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
renderer->magic = &renderer_magic;
renderer->window = window;

if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) {
renderer->minimized = SDL_TRUE;
if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED)) {
renderer->hidden = SDL_TRUE;
} else {
renderer->minimized = SDL_FALSE;
renderer->hidden = SDL_FALSE;
}

SDL_SetWindowData(window, SDL_WINDOWRENDERDATA, renderer);
Expand Down Expand Up @@ -974,8 +1004,8 @@ SDL_RenderClear(SDL_Renderer * renderer)
{
CHECK_RENDERER_MAGIC(renderer, -1);

/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
return renderer->RenderClear(renderer);
Expand Down Expand Up @@ -1004,8 +1034,8 @@ SDL_RenderDrawPoints(SDL_Renderer * renderer,
if (count < 1) {
return 0;
}
/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
return renderer->RenderDrawPoints(renderer, points, count);
Expand Down Expand Up @@ -1036,8 +1066,8 @@ SDL_RenderDrawLines(SDL_Renderer * renderer,
if (count < 2) {
return 0;
}
/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
return renderer->RenderDrawLines(renderer, points, count);
Expand Down Expand Up @@ -1089,8 +1119,8 @@ SDL_RenderDrawRects(SDL_Renderer * renderer,
return 0;
}

/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
for (i = 0; i < count; ++i) {
Expand Down Expand Up @@ -1132,8 +1162,8 @@ SDL_RenderFillRects(SDL_Renderer * renderer,
if (count < 1) {
return 0;
}
/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
return renderer->RenderFillRects(renderer, rects, count);
Expand Down Expand Up @@ -1193,8 +1223,8 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
texture = texture->native;
}

/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
}
return renderer->RenderCopy(renderer, texture, &real_srcrect,
Expand Down Expand Up @@ -1246,8 +1276,8 @@ SDL_RenderPresent(SDL_Renderer * renderer)
{
CHECK_RENDERER_MAGIC(renderer, );

/* Don't draw while we're minimized */
if (renderer->minimized) {
/* Don't draw while we're hidden */
if (renderer->hidden) {
return;
}
renderer->RenderPresent(renderer);
Expand Down
3 changes: 2 additions & 1 deletion src/render/SDL_sysrender.h
Expand Up @@ -100,7 +100,8 @@ struct SDL_Renderer

/* The window associated with the renderer */
SDL_Window *window;
SDL_bool minimized;
SDL_bool hidden;
SDL_bool resized;

/* The drawable area within the window */
SDL_Rect viewport;
Expand Down
4 changes: 3 additions & 1 deletion src/render/opengl/SDL_render_gl.c
Expand Up @@ -412,7 +412,9 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
static void
GL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
{
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
event->event == SDL_WINDOWEVENT_SHOWN ||
event->event == SDL_WINDOWEVENT_HIDDEN) {
/* Rebind the context to the window area and update matrices */
SDL_CurrentContext = NULL;
}
Expand Down
4 changes: 3 additions & 1 deletion src/render/opengles/SDL_render_gles.c
Expand Up @@ -370,7 +370,9 @@ GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
{
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;

if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
event->event == SDL_WINDOWEVENT_SHOWN ||
event->event == SDL_WINDOWEVENT_HIDDEN) {
/* Rebind the context to the window area and update matrices */
SDL_CurrentContext = NULL;
}
Expand Down
4 changes: 3 additions & 1 deletion src/render/opengles2/SDL_render_gles2.c
Expand Up @@ -241,7 +241,9 @@ GLES2_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
{
GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata;

if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
event->event == SDL_WINDOWEVENT_SHOWN ||
event->event == SDL_WINDOWEVENT_HIDDEN) {
/* Rebind the context to the window area */
SDL_CurrentContext = NULL;
}
Expand Down
7 changes: 7 additions & 0 deletions src/video/SDL_video.c
Expand Up @@ -107,6 +107,11 @@ static SDL_VideoDevice *_this = NULL;
return retval; \
}

#define INVALIDATE_GLCONTEXT() \
_this->current_glwin = NULL; \
_this->current_glctx = NULL;


/* Support for framebuffer emulation using an accelerated renderer */

#define SDL_WINDOWTEXTUREDATA "_SDL_WindowTextureData"
Expand Down Expand Up @@ -1846,12 +1851,14 @@ SDL_GetWindowGrab(SDL_Window * window)
void
SDL_OnWindowShown(SDL_Window * window)
{
INVALIDATE_GLCONTEXT();
SDL_OnWindowRestored(window);
}

void
SDL_OnWindowHidden(SDL_Window * window)
{
INVALIDATE_GLCONTEXT();
SDL_UpdateFullscreenMode(window, SDL_FALSE);
}

Expand Down
14 changes: 8 additions & 6 deletions src/video/cocoa/SDL_cocoaopengl.m
Expand Up @@ -200,14 +200,16 @@
SDL_WindowData *windowdata = (SDL_WindowData *)window->driverdata;
NSOpenGLContext *nscontext = (NSOpenGLContext *)context;

if (window->flags & SDL_WINDOW_SHOWN) {
#ifndef FULLSCREEN_TOGGLEABLE
if (window->flags & SDL_WINDOW_FULLSCREEN) {
[nscontext setFullScreen];
} else
if (window->flags & SDL_WINDOW_FULLSCREEN) {
[nscontext setFullScreen];
} else
#endif
{
[nscontext setView:[windowdata->nswindow contentView]];
[nscontext update];
{
[nscontext setView:[windowdata->nswindow contentView]];
[nscontext update];
}
}
[nscontext makeCurrentContext];
} else {
Expand Down

0 comments on commit 9bf2ce7

Please sign in to comment.