diff --git a/include/SDL_render.h b/include/SDL_render.h index 4ae23a17f..15cb173bb 100644 --- a/include/SDL_render.h +++ b/include/SDL_render.h @@ -174,6 +174,11 @@ extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window, */ extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface); +/** + * \brief Get the renderer associated with a window. + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window); + /** * \brief Get information about a rendering context. */ diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index ed153275f..2fa5239d6 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -30,6 +30,8 @@ #include "software/SDL_render_sw_c.h" +#define SDL_WINDOWRENDERDATA "_SDL_WindowRenderData" + #define CHECK_RENDERER_MAGIC(renderer, retval) \ if (!renderer || renderer->magic != &renderer_magic) { \ SDL_SetError("Invalid renderer"); \ @@ -123,6 +125,16 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) int n = SDL_GetNumRenderDrivers(); const char *hint; + if (!window) { + SDL_SetError("Invalid window"); + return NULL; + } + + if (SDL_GetRenderer(window)) { + SDL_SetError("Renderer already associated with window"); + return NULL; + } + hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC); if (hint) { if (*hint == '0') { @@ -178,6 +190,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) renderer->magic = &renderer_magic; renderer->window = window; + SDL_SetWindowData(window, SDL_WINDOWRENDERDATA, renderer); + SDL_RenderSetViewport(renderer, NULL); SDL_AddEventWatch(SDL_RendererEventWatch, renderer); @@ -208,6 +222,12 @@ SDL_CreateSoftwareRenderer(SDL_Surface * surface) #endif /* !SDL_RENDER_DISABLED */ } +SDL_Renderer * +SDL_GetRenderer(SDL_Window * window) +{ + return (SDL_Renderer *)SDL_GetWindowData(window, SDL_WINDOWRENDERDATA); +} + int SDL_GetRendererInfo(SDL_Renderer * renderer, SDL_RendererInfo * info) { @@ -1149,6 +1169,8 @@ SDL_DestroyRenderer(SDL_Renderer * renderer) SDL_DestroyTexture(renderer->textures); } + SDL_SetWindowData(renderer->window, SDL_WINDOWRENDERDATA, NULL); + /* It's no longer magical... */ renderer->magic = NULL;