diff --git a/include/SDL3/SDL_surface.h b/include/SDL3/SDL_surface.h index 37e5b1525..8742cd1b7 100644 --- a/include/SDL3/SDL_surface.h +++ b/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 */ diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index b0a57d4e6..dec18df53 100644 --- a/src/video/SDL_surface.c +++ b/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);