|
@@ -47,12 +47,19 @@ this should probably be removed at some point in the future. --ryan. */
|
|
|
|
|
|
#define SDL_WINDOWRENDERDATA "_SDL_WindowRenderData"
|
|
|
|
|
|
-#define CHECK_RENDERER_MAGIC(renderer, retval) \
|
|
|
+#define CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, retval) \
|
|
|
if (!renderer || renderer->magic != &renderer_magic) { \
|
|
|
SDL_InvalidParamError("renderer"); \
|
|
|
return retval; \
|
|
|
}
|
|
|
|
|
|
+#define CHECK_RENDERER_MAGIC(renderer, retval) \
|
|
|
+ CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, retval); \
|
|
|
+ if (renderer->destroyed) { \
|
|
|
+ SDL_SetError("Renderer's window has been destroyed, can't use further"); \
|
|
|
+ return retval; \
|
|
|
+ }
|
|
|
+
|
|
|
#define CHECK_TEXTURE_MAGIC(texture, retval) \
|
|
|
if (!texture || texture->magic != &texture_magic) { \
|
|
|
SDL_InvalidParamError("texture"); \
|
|
@@ -4345,11 +4352,14 @@ void SDL_DestroyTexture(SDL_Texture *texture)
|
|
|
SDL_free(texture);
|
|
|
}
|
|
|
|
|
|
-void SDL_DestroyRenderer(SDL_Renderer *renderer)
|
|
|
+void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer)
|
|
|
{
|
|
|
SDL_RenderCommand *cmd;
|
|
|
|
|
|
- CHECK_RENDERER_MAGIC(renderer, );
|
|
|
+ SDL_assert(renderer != NULL);
|
|
|
+ SDL_assert(!renderer->destroyed);
|
|
|
+
|
|
|
+ renderer->destroyed = SDL_TRUE;
|
|
|
|
|
|
SDL_DelEventWatch(SDL_RendererEventWatch, renderer);
|
|
|
|
|
@@ -4382,20 +4392,33 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer)
|
|
|
|
|
|
if (renderer->window) {
|
|
|
SDL_SetWindowData(renderer->window, SDL_WINDOWRENDERDATA, NULL);
|
|
|
+ renderer->window = NULL;
|
|
|
}
|
|
|
|
|
|
- /* It's no longer magical... */
|
|
|
- renderer->magic = NULL;
|
|
|
-
|
|
|
/* Free the target mutex */
|
|
|
SDL_DestroyMutex(renderer->target_mutex);
|
|
|
renderer->target_mutex = NULL;
|
|
|
|
|
|
/* Free the renderer instance */
|
|
|
renderer->DestroyRenderer(renderer);
|
|
|
+}
|
|
|
+
|
|
|
+void SDL_DestroyRenderer(SDL_Renderer *renderer)
|
|
|
+{
|
|
|
+ CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer,);
|
|
|
+
|
|
|
+ /* if we've already destroyed the renderer through SDL_DestroyWindow, we just need
|
|
|
+ to free the renderer pointer. This lets apps destroy the window and renderer
|
|
|
+ in either order. */
|
|
|
+ if (!renderer->destroyed) {
|
|
|
+ SDL_DestroyRendererWithoutFreeing(renderer);
|
|
|
+ renderer->magic = NULL; // It's no longer magical...
|
|
|
+ }
|
|
|
+
|
|
|
SDL_free(renderer);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
int SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh)
|
|
|
{
|
|
|
SDL_Renderer *renderer;
|