render: draw when hidden, except on iOS and Android. Fixes #2979.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 0552918..0c6388f 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);
}