Forráskód Böngészése

Store the surface properties in the reserved pointer of a surface

This prevents us from exposing the properties publicly and allows us to repurpose the pointer later if necessary.

Fixes https://github.com/libsdl-org/SDL/issues/8758
Sam Lantinga 1 éve
szülő
commit
d71454da17
2 módosított fájl, 12 hozzáadás és 10 törlés
  1. 1 5
      include/SDL3/SDL_surface.h
  2. 11 5
      src/video/SDL_surface.c

+ 1 - 5
include/SDL3/SDL_surface.h

@@ -104,11 +104,7 @@ typedef struct SDL_Surface
     int pitch;                  /**< Read-only */
     void *pixels;               /**< Read-write */
 
-    /** Application data associated with the surface */
-    union {
-        void *reserved;         /**< For ABI compatibility only, do not use */
-        SDL_PropertiesID props; /**< Read-only */
-    };
+    void *reserved;             /**< Private */
 
     /** information needed for surfaces requiring locks */
     int locked;                 /**< Read-only */

+ 11 - 5
src/video/SDL_surface.c

@@ -252,23 +252,28 @@ SDL_Surface *SDL_CreateSurfaceFrom(void *pixels, int width, int height, int pitc
 
 SDL_PropertiesID SDL_GetSurfaceProperties(SDL_Surface *surface)
 {
+    SDL_PropertiesID props;
+
     if (!surface) {
         SDL_InvalidParamError("surface");
         return 0;
     }
 
-    if (!(surface->flags & SDL_SURFACE_USES_PROPERTIES)) {
+    if (surface->flags & SDL_SURFACE_USES_PROPERTIES) {
+        props = (SDL_PropertiesID)(uintptr_t)surface->reserved;
+    } else {
         if (surface->reserved != NULL) {
             SDL_SetError("Surface has userdata, incompatible with properties");
             return 0;
         }
 
-        surface->props = SDL_CreateProperties();
-        if (surface->props) {
+        props = SDL_CreateProperties();
+        if (props) {
+            surface->reserved = (void *)(uintptr_t)props;
             surface->flags |= SDL_SURFACE_USES_PROPERTIES;
         }
     }
-    return surface->props;
+    return props;
 }
 
 int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette)
@@ -1570,7 +1575,8 @@ void SDL_DestroySurface(SDL_Surface *surface)
     }
 
     if (surface->flags & SDL_SURFACE_USES_PROPERTIES) {
-        SDL_DestroyProperties(surface->props);
+        SDL_PropertiesID props = (SDL_PropertiesID)(uintptr_t)surface->reserved;
+        SDL_DestroyProperties(props);
     }
 
     SDL_InvalidateMap(surface->map);