SDL: render: draw when hidden, except on iOS and Android.

From 57c2a4566f4369917f54938ddb0d115824724d22 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
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);
 }