Allow the render context to do necessary work when the video mode changes.
authorSam Lantinga <slouken@libsdl.org>
Sun, 06 Aug 2006 04:39:13 +0000
changeset 1970 db3ba6c0d0df
parent 1969 5d3724f64f2b
child 1971 5432b63cc919
Allow the render context to do necessary work when the video mode changes.
src/events/SDL_windowevents.c
src/video/SDL_renderer_gl.c
src/video/SDL_renderer_sw.c
src/video/SDL_sysvideo.h
src/video/SDL_video.c
src/video/cocoa/SDL_cocoaopengl.m
test/common.c
--- a/src/events/SDL_windowevents.c	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/events/SDL_windowevents.c	Sun Aug 06 04:39:13 2006 +0000
@@ -72,6 +72,7 @@
         }
         window->w = data1;
         window->h = data2;
+        SDL_OnWindowResized(window);
         break;
     case SDL_WINDOWEVENT_MINIMIZED:
         if (window->flags & SDL_WINDOW_MINIMIZED) {
--- a/src/video/SDL_renderer_gl.c	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/video/SDL_renderer_gl.c	Sun Aug 06 04:39:13 2006 +0000
@@ -34,6 +34,7 @@
 
 static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
 static int GL_ActivateRenderer(SDL_Renderer * renderer);
+static int GL_DisplayModeChanged(SDL_Renderer * renderer);
 static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
 static int GL_SetTexturePalette(SDL_Renderer * renderer,
                                 SDL_Texture * texture,
@@ -97,6 +98,7 @@
 typedef struct
 {
     SDL_GLContext context;
+    SDL_bool updateSize;
     SDL_bool GL_ARB_texture_rectangle_supported;
     int blendMode;
     int scaleMode;
@@ -219,6 +221,7 @@
     }
 
     renderer->ActivateRenderer = GL_ActivateRenderer;
+    renderer->DisplayModeChanged = GL_DisplayModeChanged;
     renderer->CreateTexture = GL_CreateTexture;
     renderer->SetTexturePalette = GL_SetTexturePalette;
     renderer->GetTexturePalette = GL_GetTexturePalette;
@@ -282,13 +285,7 @@
     } else {
         data->glEnable(GL_TEXTURE_2D);
     }
-    data->glMatrixMode(GL_PROJECTION);
-    data->glLoadIdentity();
-    data->glMatrixMode(GL_MODELVIEW);
-    data->glLoadIdentity();
-    data->glViewport(0, 0, window->w, window->h);
-    data->glOrtho(0.0, (GLdouble) window->w, (GLdouble) window->h, 0.0, 0.0,
-                  1.0);
+    data->updateSize = SDL_TRUE;
 
     return renderer;
 }
@@ -299,7 +296,29 @@
     GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
     SDL_Window *window = SDL_GetWindowFromID(renderer->window);
 
-    return SDL_GL_MakeCurrent(window->id, data->context);
+    if (SDL_GL_MakeCurrent(window->id, data->context) < 0) {
+        return -1;
+    }
+    if (data->updateSize) {
+        data->glMatrixMode(GL_PROJECTION);
+        data->glLoadIdentity();
+        data->glMatrixMode(GL_MODELVIEW);
+        data->glLoadIdentity();
+        data->glViewport(0, 0, window->w, window->h);
+        data->glOrtho(0.0, (GLdouble) window->w, (GLdouble) window->h, 0.0,
+                      0.0, 1.0);
+        data->updateSize = SDL_FALSE;
+    }
+    return 0;
+}
+
+static int
+GL_DisplayModeChanged(SDL_Renderer * renderer)
+{
+    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
+
+    data->updateSize = SDL_TRUE;
+    return 0;
 }
 
 static __inline__ int
--- a/src/video/SDL_renderer_sw.c	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/video/SDL_renderer_sw.c	Sun Aug 06 04:39:13 2006 +0000
@@ -31,6 +31,8 @@
 /* SDL surface based renderer implementation */
 
 static SDL_Renderer *SW_CreateRenderer(SDL_Window * window, Uint32 flags);
+static int SW_ActivateRenderer(SDL_Renderer * renderer);
+static int SW_DisplayModeChanged(SDL_Renderer * renderer);
 static int SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
 static int SW_QueryTexturePixels(SDL_Renderer * renderer,
                                  SDL_Texture * texture, void **pixels,
@@ -179,7 +181,8 @@
         SDL_OutOfMemory();
         return NULL;
     }
-
+    renderer->ActivateRenderer = SW_ActivateRenderer;
+    renderer->DisplayModeChanged = SW_DisplayModeChanged;
     renderer->CreateTexture = SW_CreateTexture;
     renderer->QueryTexturePixels = SW_QueryTexturePixels;
     renderer->SetTexturePalette = SW_SetTexturePalette;
@@ -270,6 +273,32 @@
 }
 
 static int
+SW_ActivateRenderer(SDL_Renderer * renderer)
+{
+    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
+
+    if (data->renderer && data->renderer->ActivateRenderer) {
+        if (data->renderer->ActivateRenderer(data->renderer) < 0) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
+static int
+SW_DisplayModeChanged(SDL_Renderer * renderer)
+{
+    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
+
+    if (data->renderer && data->renderer->DisplayModeChanged) {
+        if (data->renderer->DisplayModeChanged(data->renderer) < 0) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
+static int
 SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
 {
     if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
--- a/src/video/SDL_sysvideo.h	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/video/SDL_sysvideo.h	Sun Aug 06 04:39:13 2006 +0000
@@ -56,6 +56,7 @@
 struct SDL_Renderer
 {
     int (*ActivateRenderer) (SDL_Renderer * renderer);
+    int (*DisplayModeChanged) (SDL_Renderer * renderer);
     int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
     int (*QueryTexturePixels) (SDL_Renderer * renderer, SDL_Texture * texture,
                                void **pixels, int *pitch);
@@ -133,8 +134,7 @@
     SDL_DisplayMode *display_modes;
     SDL_DisplayMode desktop_mode;
     SDL_DisplayMode current_mode;
-    SDL_DisplayMode desired_mode;
-    SDL_DisplayMode *fullscreen_mode;
+    SDL_DisplayMode fullscreen_mode;
     SDL_Palette *palette;
 
     Uint16 *gamma;
@@ -389,6 +389,7 @@
 
 extern void SDL_OnWindowShown(SDL_Window * window);
 extern void SDL_OnWindowHidden(SDL_Window * window);
+extern void SDL_OnWindowResized(SDL_Window * window);
 extern void SDL_OnWindowFocusGained(SDL_Window * window);
 extern void SDL_OnWindowFocusLost(SDL_Window * window);
 extern SDL_WindowID SDL_GetFocusWindow(void);
--- a/src/video/SDL_video.c	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/video/SDL_video.c	Sun Aug 06 04:39:13 2006 +0000
@@ -645,6 +645,7 @@
 SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode)
 {
     SDL_VideoDisplay *display;
+    SDL_DisplayMode fullscreen_mode;
     int i;
 
     if (!_this) {
@@ -653,18 +654,29 @@
     }
 
     display = &SDL_CurrentDisplay;
-    if (mode) {
-        SDL_GetClosestDisplayMode(mode, &display->desired_mode);
-        display->fullscreen_mode = &display->desired_mode;
-    } else {
-        display->fullscreen_mode = NULL;
+    if (!mode) {
+        mode = &display->desktop_mode;
     }
 
+    SDL_GetClosestDisplayMode(mode, &fullscreen_mode);
+    if (SDL_memcmp
+        (&fullscreen_mode, &display->fullscreen_mode,
+         sizeof(fullscreen_mode)) == 0) {
+        /* Nothing to do... */
+        return 0;
+    }
+    display->fullscreen_mode = fullscreen_mode;
+
     /* Actually set the mode if we have a fullscreen window visible */
     for (i = 0; i < display->num_windows; ++i) {
         SDL_Window *window = &display->windows[i];
         if (FULLSCREEN_VISIBLE(window)) {
-            return SDL_SetDisplayMode(display->fullscreen_mode);
+            if (SDL_SetDisplayMode(&display->fullscreen_mode) < 0) {
+                return -1;
+            }
+        }
+        if (window->flags & SDL_WINDOW_FULLSCREEN) {
+            SDL_OnWindowResized(window);
         }
     }
     return 0;
@@ -678,7 +690,7 @@
         return -1;
     }
     if (mode) {
-        *mode = *SDL_CurrentDisplay.fullscreen_mode;
+        *mode = SDL_CurrentDisplay.fullscreen_mode;
     }
     return 0;
 }
@@ -1197,7 +1209,7 @@
                 }
             }
 
-            SDL_SetDisplayMode(display->fullscreen_mode);
+            SDL_SetDisplayMode(&display->fullscreen_mode);
         }
     } else {
         window->flags &= ~SDL_WINDOW_FULLSCREEN;
@@ -1252,12 +1264,22 @@
 }
 
 void
+SDL_OnWindowResized(SDL_Window * window)
+{
+    SDL_Renderer *renderer = window->renderer;
+
+    if (renderer && renderer->DisplayModeChanged) {
+        renderer->DisplayModeChanged(renderer);
+    }
+}
+
+void
 SDL_OnWindowFocusGained(SDL_Window * window)
 {
     SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
 
     if (window->flags & SDL_WINDOW_FULLSCREEN) {
-        SDL_SetDisplayMode(display->fullscreen_mode);
+        SDL_SetDisplayMode(&display->fullscreen_mode);
     }
     if (display->gamma && _this->SetDisplayGammaRamp) {
         _this->SetDisplayGammaRamp(_this, display->gamma);
--- a/src/video/cocoa/SDL_cocoaopengl.m	Sun Aug 06 00:09:04 2006 +0000
+++ b/src/video/cocoa/SDL_cocoaopengl.m	Sun Aug 06 04:39:13 2006 +0000
@@ -268,6 +268,7 @@
         NSOpenGLContext *nscontext = (NSOpenGLContext *)context;
 
         [nscontext setView:[windowdata->window contentView]];
+        [nscontext update];
         [nscontext makeCurrentContext];
     } else {
         [NSOpenGLContext clearCurrentContext];
--- a/test/common.c	Sun Aug 06 00:09:04 2006 +0000
+++ b/test/common.c	Sun Aug 06 04:39:13 2006 +0000
@@ -749,15 +749,15 @@
             fprintf(stderr, "Window %d hidden", event->window.windowID);
             break;
         case SDL_WINDOWEVENT_EXPOSED:
-            fprintf(stderr, "Window %d exposed: %d", event->window.windowID);
+            fprintf(stderr, "Window %d exposed", event->window.windowID);
             break;
         case SDL_WINDOWEVENT_MOVED:
-            fprintf(stderr, "Window %d moved to %d,%d: %d",
+            fprintf(stderr, "Window %d moved to %d,%d",
                     event->window.windowID, event->window.data1,
                     event->window.data2);
             break;
         case SDL_WINDOWEVENT_RESIZED:
-            fprintf(stderr, "Window %d resized to %dx%d: %d",
+            fprintf(stderr, "Window %d resized to %dx%d",
                     event->window.windowID, event->window.data1,
                     event->window.data2);
             break;