From f142a7961e42d76bfde09ca20ee3b4e67366e9d6 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 14 Aug 2017 13:37:14 -0700 Subject: [PATCH] Fixed bug 2441 - SDL_DuplicateSurface Rainer Deyke I've written a small patch that adds a small SDL_DuplicateSurface function to SDL. I've written the function as part of a larger (as yet unfinished) patch, but I think this function is useful enough that it merits inclusion in SDL on its own. --- include/SDL_surface.h | 5 +++++ src/dynapi/SDL_dynapi_overrides.h | 1 + src/dynapi/SDL_dynapi_procs.h | 1 + src/video/SDL_surface.c | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+) diff --git a/include/SDL_surface.h b/include/SDL_surface.h index c3ea1d53292d9..510690c9cffe3 100644 --- a/include/SDL_surface.h +++ b/include/SDL_surface.h @@ -359,6 +359,11 @@ extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, SDL_Rect * rect); +/* + * Creates a new surface identical to the existing surface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_DuplicateSurface(SDL_Surface * surface); + /** * Creates a new surface of the specified format, and then copies and maps * the given surface to it so the blit of the converted surface will be as diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index 7c3a8a06f4042..bb1f290caa57c 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -628,3 +628,4 @@ #define SDL_LoadFile_RW SDL_LoadFile_RW_REAL #define SDL_wcscmp SDL_wcscmp_REAL #define SDL_ComposeCustomBlendMode SDL_ComposeCustomBlendMode_REAL +#define SDL_DuplicateSurface SDL_DuplicateSurface_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index ed2c5e6e62835..a5aa6d94a9828 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -660,3 +660,4 @@ SDL_DYNAPI_PROC(size_t,SDL_utf8strlen,(const char *a),(a),return) SDL_DYNAPI_PROC(void*,SDL_LoadFile_RW,(SDL_RWops *a, size_t *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_wcscmp,(const wchar_t *a, const wchar_t *b),(a,b),return) SDL_DYNAPI_PROC(SDL_BlendMode,SDL_ComposeCustomBlendMode,(SDL_BlendFactor a, SDL_BlendFactor b, SDL_BlendOperation c, SDL_BlendFactor d, SDL_BlendFactor e, SDL_BlendOperation f),(a,b,c,d,e,f),return) +SDL_DYNAPI_PROC(SDL_Surface*,SDL_DuplicateSurface,(SDL_Surface *a),(a),return) diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index 19e1ab73e4e03..f4a014e85ae62 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -870,6 +870,15 @@ SDL_UnlockSurface(SDL_Surface * surface) } } +/* + * Creates a new surface identical to the existing surface + */ +SDL_Surface * +SDL_DuplicateSurface(SDL_Surface * surface) +{ + return SDL_ConvertSurface(surface, surface->format, surface->flags); +} + /* * Convert a surface into the specified pixel format. */ @@ -882,6 +891,15 @@ SDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format, SDL_Color copy_color; SDL_Rect bounds; + if (!surface) { + SDL_InvalidParamError("surface"); + return NULL; + } + if (!format) { + SDL_InvalidParamError("format"); + return NULL; + } + /* Check for empty destination palette! (results in empty image) */ if (format->palette != NULL) { int i;