SDL: SDL_test_font.c: add ability to draw on different SDL_Renderers

From 70f7ebe6352922dff847ecc172e9767edbe512af Mon Sep 17 00:00:00 2001
From: Eric Wasylishen <[EMAIL REDACTED]>
Date: Sun, 7 Nov 2021 01:46:04 -0600
Subject: [PATCH] SDL_test_font.c: add ability to draw on different
 SDL_Renderers

fixes `testwm2 --windows 2`
---
 src/test/SDL_test_font.c | 60 +++++++++++++++++++++++++++++++---------
 1 file changed, 47 insertions(+), 13 deletions(-)

diff --git a/src/test/SDL_test_font.c b/src/test/SDL_test_font.c
index a3c0e95fa6..044b0df5b6 100644
--- a/src/test/SDL_test_font.c
+++ b/src/test/SDL_test_font.c
@@ -3109,10 +3109,16 @@ static unsigned char SDLTest_FontData[SDL_TESTFONTDATAMAX] = {
 
 /* ---- Character */
 
+struct SDLTest_CharTextureCache {
+    SDL_Renderer* renderer;
+    SDL_Texture* charTextureCache[256];
+    struct SDLTest_CharTextureCache* next;
+};
+
 /*!
-\brief Global cache for 8x8 pixel font textures created at runtime.
+\brief List of per-renderer caches for 8x8 pixel font textures created at runtime.
 */
-static SDL_Texture *SDLTest_CharTextureCache[256];
+static SDL_Texture *SDLTest_CharTextureCacheList;
 
 int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)
 {
@@ -3131,6 +3137,7 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)
     SDL_Surface *character;
     Uint32 ci;
     Uint8 r, g, b, a;
+    struct SDLTest_CharTextureCache *cache;
 
     /*
      * Setup source rectangle
@@ -3151,10 +3158,25 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)
     /* Character index in cache */
     ci = (unsigned char)c;
 
+    /* Search for this renderer's cache */
+    for (cache = SDLTest_CharTextureCacheList; cache != NULL; cache = cache->next) {
+        if (cache->renderer == renderer) {
+            break;
+        }
+    }
+
+    /* Allocate a new cache for this renderer if needed */
+    if (cache == NULL) {        
+        cache = (struct SDLTest_CharTextureCache*)SDL_calloc(1, sizeof(struct SDLTest_CharTextureCache));
+        cache->renderer = renderer;
+        cache->next = SDLTest_CharTextureCacheList;
+        SDLTest_CharTextureCacheList = cache;
+    }
+
     /*
      * Create new charWidth x charHeight bitmap surface if not already present.
      */
-    if (SDLTest_CharTextureCache[ci] == NULL) {
+    if (cache->charTextureCache[ci] == NULL) {
         /*
          * Redraw character into surface
          */
@@ -3191,14 +3213,15 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)
             linepos += pitch;
         }
 
+
         /* Convert temp surface into texture */
-        SDLTest_CharTextureCache[ci] = SDL_CreateTextureFromSurface(renderer, character);
+        cache->charTextureCache[ci] = SDL_CreateTextureFromSurface(renderer, character);
         SDL_FreeSurface(character);
 
         /*
          * Check pointer
          */
-        if (SDLTest_CharTextureCache[ci] == NULL) {
+        if (cache->charTextureCache[ci] == NULL) {
             return (-1);
         }
     }
@@ -3208,13 +3231,13 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, char c)
      */
     result = 0;
     result |= SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);
-    result |= SDL_SetTextureColorMod(SDLTest_CharTextureCache[ci], r, g, b);
-    result |= SDL_SetTextureAlphaMod(SDLTest_CharTextureCache[ci], a);
+    result |= SDL_SetTextureColorMod(cache->charTextureCache[ci], r, g, b);
+    result |= SDL_SetTextureAlphaMod(cache->charTextureCache[ci], a);
 
     /*
      * Draw texture onto destination
      */
-    result |= SDL_RenderCopy(renderer, SDLTest_CharTextureCache[ci], &srect, &drect);
+    result |= SDL_RenderCopy(renderer, cache->charTextureCache[ci], &srect, &drect);
 
     return (result);
 }
@@ -3239,12 +3262,23 @@ int SDLTest_DrawString(SDL_Renderer * renderer, int x, int y, const char *s)
 void SDLTest_CleanupTextDrawing(void)
 {
     unsigned int i;
-    for (i = 0; i < SDL_arraysize(SDLTest_CharTextureCache); ++i) {
-        if (SDLTest_CharTextureCache[i]) {
-            SDL_DestroyTexture(SDLTest_CharTextureCache[i]);
-            SDLTest_CharTextureCache[i] = NULL;
+    struct SDLTest_CharTextureCache* cache, *next;
+
+    cache = SDLTest_CharTextureCacheList;
+    do {
+        for (i = 0; i < SDL_arraysize(cache->charTextureCache); ++i) {
+            if (cache->charTextureCache[i]) {
+                SDL_DestroyTexture(cache->charTextureCache[i]);
+                cache->charTextureCache[i] = NULL;
+            }
         }
-    }
+
+        next = cache->next;
+        SDL_free(cache);
+        cache = next;
+    } while (cache);
+
+    SDLTest_CharTextureCacheList = NULL;
 }
 
 /* vi: set ts=4 sw=4 expandtab: */