SDL: Don't flush in RenderDraw*WithRects()

From 2026a78dc20e8cc6bb585dfcd02ef1fa46b98280 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 8 Jan 2022 09:23:58 -0800
Subject: [PATCH] Don't flush in RenderDraw*WithRects()

This allows these functions to be reused in the future for other primitives
---
 src/render/SDL_render.c | 137 +++++++++++-----------------------------
 1 file changed, 36 insertions(+), 101 deletions(-)

diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index b75a0347353..985de5ee7c3 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -2654,7 +2654,7 @@ RenderDrawPointsWithRects(SDL_Renderer * renderer,
 
     SDL_small_free(frects, isstack);
 
-    return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
+    return retval;
 }
 
 int
@@ -2683,22 +2683,21 @@ SDL_RenderDrawPoints(SDL_Renderer * renderer,
 #endif
 
     if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
-        return RenderDrawPointsWithRects(renderer, points, count);
-    }
-
-    fpoints = SDL_small_alloc(SDL_FPoint, count, &isstack);
-    if (!fpoints) {
-        return SDL_OutOfMemory();
-    }
-    for (i = 0; i < count; ++i) {
-        fpoints[i].x = points[i].x * renderer->scale.x;
-        fpoints[i].y = points[i].y * renderer->scale.y;
-    }
-
-    retval = QueueCmdDrawPoints(renderer, fpoints, count);
+        retval = RenderDrawPointsWithRects(renderer, points, count);
+    } else {
+        fpoints = SDL_small_alloc(SDL_FPoint, count, &isstack);
+        if (!fpoints) {
+            return SDL_OutOfMemory();
+        }
+        for (i = 0; i < count; ++i) {
+            fpoints[i].x = points[i].x * renderer->scale.x;
+            fpoints[i].y = points[i].y * renderer->scale.y;
+        }
 
-    SDL_small_free(fpoints, isstack);
+        retval = QueueCmdDrawPoints(renderer, fpoints, count);
 
+        SDL_small_free(fpoints, isstack);
+    }
     return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
 }
 
@@ -2728,7 +2727,7 @@ RenderDrawPointsWithRectsF(SDL_Renderer * renderer,
 
     SDL_small_free(frects, isstack);
 
-    return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
+    return retval;
 }
 
 int
@@ -2757,22 +2756,21 @@ SDL_RenderDrawPointsF(SDL_Renderer * renderer,
 #endif
 
     if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
-        return RenderDrawPointsWithRectsF(renderer, points, count);
-    }
-
-    fpoints = SDL_small_alloc(SDL_FPoint, count, &isstack);
-    if (!fpoints) {
-        return SDL_OutOfMemory();
-    }
-    for (i = 0; i < count; ++i) {
-        fpoints[i].x = points[i].x * renderer->scale.x;
-        fpoints[i].y = points[i].y * renderer->scale.y;
-    }
-
-    retval = QueueCmdDrawPoints(renderer, fpoints, count);
+        retval = RenderDrawPointsWithRectsF(renderer, points, count);
+    } else {
+        fpoints = SDL_small_alloc(SDL_FPoint, count, &isstack);
+        if (!fpoints) {
+            return SDL_OutOfMemory();
+        }
+        for (i = 0; i < count; ++i) {
+            fpoints[i].x = points[i].x * renderer->scale.x;
+            fpoints[i].y = points[i].y * renderer->scale.y;
+        }
 
-    SDL_small_free(fpoints, isstack);
+        retval = QueueCmdDrawPoints(renderer, fpoints, count);
 
+        SDL_small_free(fpoints, isstack);
+    }
     return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
 }
 
@@ -2798,63 +2796,6 @@ SDL_RenderDrawLineF(SDL_Renderer * renderer, float x1, float y1, float x2, float
     return SDL_RenderDrawLinesF(renderer, points, 2);
 }
 
-static int
-RenderDrawLinesWithRects(SDL_Renderer * renderer,
-                     const SDL_Point * points, const int count)
-{
-    SDL_FRect *frect;
-    SDL_FRect *frects;
-    SDL_FPoint fpoints[2];
-    int i, nrects = 0;
-    int retval = 0;
-    SDL_bool isstack;
-
-    frects = SDL_small_alloc(SDL_FRect, count-1, &isstack);
-    if (!frects) {
-        return SDL_OutOfMemory();
-    }
-
-    for (i = 0; i < count-1; ++i) {
-        if (points[i].x == points[i+1].x) {
-            const int minY = SDL_min(points[i].y, points[i+1].y);
-            const int maxY = SDL_max(points[i].y, points[i+1].y);
-
-            frect = &frects[nrects++];
-            frect->x = points[i].x * renderer->scale.x;
-            frect->y = minY * renderer->scale.y;
-            frect->w = renderer->scale.x;
-            frect->h = (maxY - minY + 1) * renderer->scale.y;
-        } else if (points[i].y == points[i+1].y) {
-            const int minX = SDL_min(points[i].x, points[i+1].x);
-            const int maxX = SDL_max(points[i].x, points[i+1].x);
-
-            frect = &frects[nrects++];
-            frect->x = minX * renderer->scale.x;
-            frect->y = points[i].y * renderer->scale.y;
-            frect->w = (maxX - minX + 1) * renderer->scale.x;
-            frect->h = renderer->scale.y;
-        } else {
-            /* FIXME: We can't use a rect for this line... */
-            fpoints[0].x = points[i].x * renderer->scale.x;
-            fpoints[0].y = points[i].y * renderer->scale.y;
-            fpoints[1].x = points[i+1].x * renderer->scale.x;
-            fpoints[1].y = points[i+1].y * renderer->scale.y;
-            retval += QueueCmdDrawLines(renderer, fpoints, 2);
-        }
-    }
-
-    if (nrects) {
-        retval += QueueCmdFillRects(renderer, frects, nrects);
-    }
-
-    SDL_small_free(frects, isstack);
-
-    if (retval < 0) {
-        retval = -1;
-    }
-    return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
-}
-
 static int
 RenderDrawLinesWithRectsF(SDL_Renderer * renderer,
                           const SDL_FPoint * points, const int count)
@@ -2873,8 +2814,8 @@ RenderDrawLinesWithRectsF(SDL_Renderer * renderer,
 
     for (i = 0; i < count-1; ++i) {
         if (points[i].x == points[i+1].x) {
-            const int minY = (int)SDL_min(points[i].y, points[i+1].y);
-            const int maxY = (int)SDL_max(points[i].y, points[i+1].y);
+            const float minY = SDL_min(points[i].y, points[i+1].y);
+            const float maxY = SDL_max(points[i].y, points[i+1].y);
 
             frect = &frects[nrects++];
             frect->x = points[i].x * renderer->scale.x;
@@ -2882,8 +2823,8 @@ RenderDrawLinesWithRectsF(SDL_Renderer * renderer,
             frect->w = renderer->scale.x;
             frect->h = (maxY - minY + 1) * renderer->scale.y;
         } else if (points[i].y == points[i+1].y) {
-            const int minX = (int)SDL_min(points[i].x, points[i+1].x);
-            const int maxX = (int)SDL_max(points[i].x, points[i+1].x);
+            const float minX = SDL_min(points[i].x, points[i+1].x);
+            const float maxX = SDL_max(points[i].x, points[i+1].x);
 
             frect = &frects[nrects++];
             frect->x = minX * renderer->scale.x;
@@ -2909,7 +2850,7 @@ RenderDrawLinesWithRectsF(SDL_Renderer * renderer,
     if (retval < 0) {
         retval = -1;
     }
-    return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
+    return retval;
 }
 
 int
@@ -2937,10 +2878,6 @@ SDL_RenderDrawLines(SDL_Renderer * renderer,
     }
 #endif
 
-    if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
-        return RenderDrawLinesWithRects(renderer, points, count);
-    }
-
     fpoints = SDL_small_alloc(SDL_FPoint, count, &isstack);
     if (!fpoints) {
         return SDL_OutOfMemory();
@@ -2981,13 +2918,11 @@ SDL_RenderDrawLinesF(SDL_Renderer * renderer,
     }
 #endif
 
-    if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
-        return RenderDrawLinesWithRectsF(renderer, points, count);
-    }
-    
     use_rendergeometry = (renderer->QueueDrawLines == NULL);
 
-    if (use_rendergeometry) {
+    if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
+        retval = RenderDrawLinesWithRectsF(renderer, points, count);
+    } else if (use_rendergeometry) {
         SDL_bool isstack1;
         SDL_bool isstack2;
         float *xy = SDL_small_alloc(float, 4 * 2 * count, &isstack1);