From 57c2a4566f4369917f54938ddb0d115824724d22 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 2 Apr 2021 14:01:41 -0400 Subject: [PATCH] render: draw when hidden, except on iOS and Android. Fixes #2979. --- src/render/SDL_render.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 0552918ab..0c6388f22 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -32,6 +32,18 @@ # include "../core/android/SDL_android.h" #endif +/* as a courtesy to iOS apps, we don't try to draw when in the background, as +that will crash the app. However, these apps _should_ have used +SDL_AddEventWatch to catch SDL_APP_WILLENTERBACKGROUND events and stopped +drawing themselves. Other platforms still draw, as the compositor can use it, +and more importantly: drawing to render targets isn't lost. But I still think +this should probably be removed at some point in the future. --ryan. */ +#if defined(__IPHONEOS__) || defined(__TVOS__) || defined(__ANDROID__) +#define DONT_DRAW_WHILE_HIDDEN 1 +#else +#define DONT_DRAW_WHILE_HIDDEN 0 +#endif + #define SDL_WINDOWRENDERDATA "_SDL_WindowRenderData" #define CHECK_RENDERER_MAGIC(renderer, retval) \ @@ -2481,10 +2493,12 @@ SDL_RenderDrawPoints(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) { return RenderDrawPointsWithRects(renderer, points, count); @@ -2551,10 +2565,12 @@ SDL_RenderDrawPointsF(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) { return RenderDrawPointsWithRectsF(renderer, points, count); @@ -2726,10 +2742,12 @@ SDL_RenderDrawLines(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) { return RenderDrawLinesWithRects(renderer, points, count); @@ -2769,10 +2787,12 @@ SDL_RenderDrawLinesF(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) { return RenderDrawLinesWithRectsF(renderer, points, count); @@ -2853,10 +2873,12 @@ SDL_RenderDrawRects(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif for (i = 0; i < count; ++i) { if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) { @@ -2881,10 +2903,12 @@ SDL_RenderDrawRectsF(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif for (i = 0; i < count; ++i) { if (SDL_RenderDrawRectF(renderer, &rects[i]) < 0) { @@ -2946,10 +2970,12 @@ SDL_RenderFillRects(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif frects = SDL_small_alloc(SDL_FRect, count, &isstack); if (!frects) { @@ -2987,10 +3013,12 @@ SDL_RenderFillRectsF(SDL_Renderer * renderer, return 0; } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif frects = SDL_small_alloc(SDL_FRect, count, &isstack); if (!frects) { @@ -3095,10 +3123,12 @@ SDL_RenderCopyF(SDL_Renderer * renderer, SDL_Texture * texture, return SDL_SetError("Texture was not created with this renderer"); } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif real_srcrect.x = 0; real_srcrect.y = 0; @@ -3184,10 +3214,12 @@ SDL_RenderCopyExF(SDL_Renderer * renderer, SDL_Texture * texture, return SDL_SetError("Renderer does not support RenderCopyEx"); } +#if DONT_DRAW_WHILE_HIDDEN /* Don't draw while we're hidden */ if (renderer->hidden) { return 0; } +#endif real_srcrect.x = 0; real_srcrect.y = 0; @@ -3277,10 +3309,13 @@ SDL_RenderPresent(SDL_Renderer * renderer) FlushRenderCommands(renderer); /* time to send everything to the GPU! */ +#if DONT_DRAW_WHILE_HIDDEN /* Don't present while we're hidden */ if (renderer->hidden) { return; } +#endif + renderer->RenderPresent(renderer); }