Needed to allocate memory for the shadow surface if we needed to create one.
authorSam Lantinga <slouken@libsdl.org>
Wed, 16 Feb 2011 01:40:44 -0800
changeset 5309 da080d3247c9
parent 5308 50ceebd6e12f
child 5310 a9945ce48999
Needed to allocate memory for the shadow surface if we needed to create one.
src/SDL_compat.c
--- a/src/SDL_compat.c	Wed Feb 16 01:26:39 2011 -0800
+++ b/src/SDL_compat.c	Wed Feb 16 01:40:44 2011 -0800
@@ -847,14 +847,14 @@
     }
 
     /* Copy the old bits out */
-    length = SDL_VideoSurface->w * SDL_VideoSurface->format->BytesPerPixel;
-    pixels = SDL_malloc(SDL_VideoSurface->h * length);
+    length = SDL_PublicSurface->w * SDL_PublicSurface->format->BytesPerPixel;
+    pixels = SDL_malloc(SDL_PublicSurface->h * length);
     if (pixels) {
-        src = (Uint8*)SDL_VideoSurface->pixels;
+        src = (Uint8*)SDL_PublicSurface->pixels;
         dst = (Uint8*)pixels;
-        for (row = 0; row < SDL_VideoSurface->h; ++row) {
+        for (row = 0; row < SDL_PublicSurface->h; ++row) {
             SDL_memcpy(dst, src, length);
-            src += SDL_VideoSurface->pitch;
+            src += SDL_PublicSurface->pitch;
             dst += length;
         }
     }
@@ -894,8 +894,8 @@
                 SDL_VideoSurface->flags &= ~SDL_DONTFREE;
                 SDL_FreeSurface(SDL_VideoSurface);
                 SDL_free(SDL_ShadowSurface->pixels);
-                SDL_ShadowSurface->flags |= SDL_PREALLOC;
                 SDL_VideoSurface = SDL_ShadowSurface;
+                SDL_VideoSurface->flags |= SDL_PREALLOC;
                 SDL_ShadowSurface = NULL;
             } else {
                 /* No problem, just change the video surface format */
@@ -907,9 +907,18 @@
         } else {
             /* We can make the video surface the shadow surface */
             SDL_ShadowSurface = SDL_VideoSurface;
+            SDL_ShadowSurface->pitch = SDL_CalculatePitch(SDL_ShadowSurface);
+            SDL_ShadowSurface->pixels = SDL_malloc(SDL_ShadowSurface->h * SDL_ShadowSurface->pitch);
+            if (!SDL_ShadowSurface->pixels) {
+                /* Uh oh, we're hosed */
+                SDL_ShadowSurface = NULL;
+                return 0;
+            }
+            SDL_ShadowSurface->flags &= ~SDL_PREALLOC;
 
             SDL_VideoSurface = SDL_CreateRGBSurfaceFrom(NULL, 0, 0, 32, 0, 0, 0, 0, 0);
             SDL_VideoSurface->flags = SDL_ShadowSurface->flags;
+            SDL_VideoSurface->flags |= SDL_PREALLOC;
             SDL_FreeFormat(SDL_VideoSurface->format);
             SDL_VideoSurface->format = SDL_WindowSurface->format;
             SDL_VideoSurface->format->refcount++;
@@ -928,13 +937,13 @@
     /* Copy the old bits back */
     if (pixels) {
         src = (Uint8*)pixels;
-        dst = (Uint8*)SDL_VideoSurface->pixels;
-        for (row = 0; row < SDL_VideoSurface->h; ++row) {
+        dst = (Uint8*)SDL_PublicSurface->pixels;
+        for (row = 0; row < SDL_PublicSurface->h; ++row) {
             SDL_memcpy(dst, src, length);
             src += length;
-            dst += SDL_VideoSurface->pitch;
+            dst += SDL_PublicSurface->pitch;
         }
-        SDL_Flip(SDL_VideoSurface);
+        SDL_Flip(SDL_PublicSurface);
         SDL_free(pixels);
     }