diff --git a/include/SDL3/SDL_surface.h b/include/SDL3/SDL_surface.h index e37cb59f25..437eeaccf3 100644 --- a/include/SDL3/SDL_surface.h +++ b/include/SDL3/SDL_surface.h @@ -1027,6 +1027,14 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipM * larger than the original, with the background filled in with the colorkey, * if available, or RGBA 255/255/255/0 if not. * + * If `surface` has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, + * the new copy will have the adjusted value set: if the rotation property is + * 90 and `angle` was 30, the new surface will have a property value of 60 + * (that is: to be upright vs gravity, this surface needs to rotate 60 more + * degrees). However, note that further rotations on the new surface in this + * example will produce unexpected results, since the image will have resized + * and padded to accommodate the not-90 degree angle. + * * \param surface the surface to rotate. * \param angle the rotation angle, in degrees. * \returns a rotated copy of the surface or NULL on failure; call diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index 22709207d9..3fc5f60901 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -2198,6 +2198,14 @@ SDL_Surface *SDL_RotateSurface(SDL_Surface *surface, float angle) SDL_DestroySurface(convert); } } + + if (rotated) { + if (SDL_HasProperty(surface->props, SDL_PROP_SURFACE_ROTATION_FLOAT)) { + const float rotation = (SDL_GetNumberProperty(surface->props, SDL_PROP_SURFACE_ROTATION_FLOAT, 0) - angle); + SDL_SetFloatProperty(SDL_GetSurfaceProperties(rotated), SDL_PROP_SURFACE_ROTATION_FLOAT, rotation); + } + } + return rotated; }