Fixed bug 1224 - Blit map not updated if source palette changed
authorSam Lantinga <slouken@libsdl.org>
Sat, 07 Jan 2012 01:28:06 -0500
changeset 6166 0bc1f6da9c74
parent 6165 b7347e716ab6
child 6167 c071e1372341
Fixed bug 1224 - Blit map not updated if source palette changed bastien.bouclet@gmail.com 2011-06-12 11:08:58 PDT SDL_LowerBlit doesn't update the blit color map if the source surface has changed. A proposed fix is attached, storing the source palette version in the color map.
src/video/SDL_blit.h
src/video/SDL_pixels.c
src/video/SDL_surface.c
--- a/src/video/SDL_blit.h	Sat Jan 07 01:25:55 2012 -0500
+++ b/src/video/SDL_blit.h	Sat Jan 07 01:28:06 2012 -0500
@@ -92,7 +92,8 @@
 
     /* the version count matches the destination; mismatch indicates
        an invalid mapping */
-    Uint32 palette_version;
+    Uint32 dst_palette_version;
+    Uint32 src_palette_version;
 } SDL_BlitMap;
 
 /* Functions found in SDL_blit.c */
--- a/src/video/SDL_pixels.c	Sat Jan 07 01:25:55 2012 -0500
+++ b/src/video/SDL_pixels.c	Sat Jan 07 01:28:06 2012 -0500
@@ -969,7 +969,8 @@
         return;
     }
     map->dst = NULL;
-    map->palette_version = 0;
+    map->src_palette_version = 0;
+    map->dst_palette_version = 0;
     if (map->info.table) {
         SDL_free(map->info.table);
         map->info.table = NULL;
@@ -1036,9 +1037,15 @@
     map->dst = dst;
 
     if (dstfmt->palette) {
-        map->palette_version = dstfmt->palette->version;
+        map->dst_palette_version = dstfmt->palette->version;
     } else {
-        map->palette_version = 0;
+        map->dst_palette_version = 0;
+    }
+
+    if (srcfmt->palette) {
+        map->src_palette_version = srcfmt->palette->version;
+    } else {
+        map->src_palette_version = 0;
     }
 
     /* Choose your blitters wisely */
--- a/src/video/SDL_surface.c	Sat Jan 07 01:25:55 2012 -0500
+++ b/src/video/SDL_surface.c	Sat Jan 07 01:28:06 2012 -0500
@@ -494,7 +494,9 @@
     /* Check to make sure the blit mapping is valid */
     if ((src->map->dst != dst) ||
         (dst->format->palette &&
-         src->map->palette_version != dst->format->palette->version)) {
+         src->map->dst_palette_version != dst->format->palette->version) ||
+        (src->format->palette &&
+         src->map->src_palette_version != src->format->palette->version)) {
         if (SDL_MapSurface(src, dst) < 0) {
             return (-1);
         }