SDL: testcolorspace: add optional cycling of colorspaces

From 0d21a1aa7a3d972a237afaac8d4b24be85097ec3 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 21 Jul 2026 16:42:38 -0700
Subject: [PATCH] testcolorspace: add optional cycling of colorspaces

---
 test/testcolorspace.c | 49 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 40 insertions(+), 9 deletions(-)

diff --git a/test/testcolorspace.c b/test/testcolorspace.c
index 1dac709cfa3a6..f4f79881b6b79 100644
--- a/test/testcolorspace.c
+++ b/test/testcolorspace.c
@@ -25,11 +25,22 @@
 static SDL_Window *window;
 static SDL_Renderer *renderer;
 static const char *renderer_name;
+static const char *colorspace_names[] = {
+       "sRGB",
+       "linear",
+       "HDR10"
+};
+static SDL_Colorspace colorspaces[] = {
+       SDL_COLORSPACE_SRGB,
+       SDL_COLORSPACE_SRGB_LINEAR,
+       SDL_COLORSPACE_HDR10
+};
+static int colorspace_count = SDL_arraysize(colorspaces);
+static int colorspace_index = 0;
 static SDL_Colorspace colorspace = SDL_COLORSPACE_SRGB;
 static const char *colorspace_name = "sRGB";
 static int renderer_count = 0;
 static int renderer_index = 0;
-static int stage_index = 0;
 static float SDR_white_level = 1.0f;
 static float HDR_headroom = 1.0f;
 
@@ -46,6 +57,7 @@ enum
     StageHDR10Texture,
     StageCount
 };
+static int stage_index = StageClearBackground;
 
 static void FreeRenderer(void)
 {
@@ -58,7 +70,6 @@ static void UpdateHDRState(void)
 {
     SDL_PropertiesID props;
     bool HDR_enabled;
-    SDL_Colorspace colorspace;
 
     props = SDL_GetWindowProperties(window);
     HDR_enabled = SDL_GetBooleanProperty(props, SDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN, false);
@@ -107,10 +118,19 @@ static void NextRenderer( void )
         return;
     }
 
+#ifdef CYCLE_COLORSPACES
+    ++colorspace_index;
+    if (colorspace_index == colorspace_count) {
+        colorspace_index = 0;
+    }
+    colorspace = colorspaces[colorspace_index];
+    colorspace_name = colorspace_names[colorspace_index];
+#else
     ++renderer_index;
     if (renderer_index == renderer_count) {
         renderer_index = 0;
     }
+#endif
     FreeRenderer();
     CreateRenderer();
 }
@@ -121,10 +141,19 @@ static void PrevRenderer(void)
         return;
     }
 
+#ifdef CYCLE_COLORSPACES
+    --colorspace_index;
+    if (colorspace_index == -1) {
+        colorspace_index += colorspace_count;
+    }
+    colorspace = colorspaces[colorspace_index];
+    colorspace_name = colorspace_names[colorspace_index];
+#else
     --renderer_index;
     if (renderer_index == -1) {
         renderer_index += renderer_count;
     }
+#endif
     FreeRenderer();
     CreateRenderer();
 }
@@ -815,13 +844,15 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
         } else if (SDL_strcmp(argv[i], "--colorspace") == 0) {
             if (argv[i + 1]) {
                 colorspace_name = argv[i + 1];
-                if (SDL_strcasecmp(colorspace_name, "sRGB") == 0) {
-                    colorspace = SDL_COLORSPACE_SRGB;
-                } else if (SDL_strcasecmp(colorspace_name, "linear") == 0) {
-                    colorspace = SDL_COLORSPACE_SRGB_LINEAR;
-                } else if (SDL_strcasecmp(colorspace_name, "HDR10") == 0) {
-                    colorspace = SDL_COLORSPACE_HDR10;
-                } else {
+                colorspace = SDL_COLORSPACE_UNKNOWN;
+                for (int j = 0; j < colorspace_count; ++j) {
+                    if (SDL_strcasecmp(colorspace_name, colorspace_names[j]) == 0) {
+                        colorspace_index = j;
+                        colorspace = colorspaces[j];
+                        break;
+                    }
+                }
+                if (colorspace == SDL_COLORSPACE_UNKNOWN) {
                     SDL_Log("Unknown colorspace %s", argv[i + 1]);
                     return SDL_APP_FAILURE;
                 }