SDL: Added an SDL render logical size test

From d9b53399fed5631d9c8fc9700d595c0a3aa34e3a Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 26 Jan 2023 14:49:23 -0800
Subject: [PATCH] Added an SDL render logical size test

---
 test/testautomation_render.c | 90 ++++++++++++++++++++++++++++++++++--
 1 file changed, 85 insertions(+), 5 deletions(-)

diff --git a/test/testautomation_render.c b/test/testautomation_render.c
index 510edbb49e96..e167a61771e0 100644
--- a/test/testautomation_render.c
+++ b/test/testautomation_render.c
@@ -13,9 +13,7 @@
 
 
 #define RENDER_COMPARE_FORMAT SDL_PIXELFORMAT_ARGB8888
-#define RENDER_COLOR_CLEAR  0x00000000
-#define RENDER_COLOR_BLACK  0xFF000000
-#define RENDER_COLOR_WHITE  0xFFFFFFFF
+#define RENDER_COLOR_CLEAR  0xFF000000
 #define RENDER_COLOR_GREEN  0xFF00FF00
 
 #define ALLOWABLE_ERROR_OPAQUE  0
@@ -838,7 +836,83 @@ int render_testViewport(void *arg)
     SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderViewport, expected: 0, got: %i", ret);
 
     /* Check to see if final image matches. */
-    compare(referenceSurface, ALLOWABLE_ERROR_BLENDED);
+    compare(referenceSurface, ALLOWABLE_ERROR_OPAQUE);
+
+    /* Make current */
+    SDL_RenderPresent(renderer);
+
+    SDL_DestroySurface(referenceSurface);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * @brief Test logical size
+ */
+int render_testLogicalSize(void *arg)
+{
+    int ret;
+	SDL_Surface *referenceSurface;
+	SDL_Rect viewport;
+    SDL_FRect rect;
+    int w, h;
+    const int factor = 2;
+
+	viewport.x = ((TESTRENDER_SCREEN_W / 4) / factor) * factor;
+	viewport.y = ((TESTRENDER_SCREEN_H / 4) / factor) * factor;
+	viewport.w = ((TESTRENDER_SCREEN_W / 2) / factor) * factor;
+	viewport.h = ((TESTRENDER_SCREEN_H / 2) / factor) * factor;
+
+	/* Create expected result */
+	referenceSurface = SDL_CreateSurface(TESTRENDER_SCREEN_W, TESTRENDER_SCREEN_H, RENDER_COMPARE_FORMAT);
+	ret = SDL_FillSurfaceRect(referenceSurface, NULL, RENDER_COLOR_CLEAR);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_FillSurfaceRect, expected: 0, got: %i", ret);
+	ret = SDL_FillSurfaceRect(referenceSurface, &viewport, RENDER_COLOR_GREEN);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_FillSurfaceRect, expected: 0, got: %i", ret);
+    
+    /* Clear surface. */
+    clearScreen();
+
+	/* Set the logical size and do a fill operation */
+	ret = SDL_GetRendererOutputSize(renderer, &w, &h);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_GetRendererOutputSize, expected: 0, got: %i", ret);
+	ret = SDL_SetRenderLogicalSize(renderer, w / factor, h / factor);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderLogicalSize, expected: 0, got: %i", ret);
+    ret = SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
+    rect.x = (float)viewport.x / factor;
+    rect.y = (float)viewport.y / factor;
+    rect.w = (float)viewport.w / factor;
+    rect.h = (float)viewport.h / factor;
+    ret = SDL_RenderFillRect(renderer, &rect);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
+
+    /* Check to see if final image matches. */
+    compare(referenceSurface, ALLOWABLE_ERROR_OPAQUE);
+
+    /* Clear surface. */
+    clearScreen();
+
+	/* Set the logical size and viewport and do a fill operation */
+	ret = SDL_GetRendererOutputSize(renderer, &w, &h);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_GetRendererOutputSize, expected: 0, got: %i", ret);
+	ret = SDL_SetRenderLogicalSize(renderer, w / factor, h / factor);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderLogicalSize, expected: 0, got: %i", ret);
+	viewport.x = (TESTRENDER_SCREEN_W / 4) / factor;
+	viewport.y = (TESTRENDER_SCREEN_H / 4) / factor;
+	viewport.w = (TESTRENDER_SCREEN_W / 2) / factor;
+	viewport.h = (TESTRENDER_SCREEN_H / 2) / factor;
+	ret = SDL_SetRenderViewport(renderer, &viewport);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderViewport, expected: 0, got: %i", ret);
+    ret = SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
+	ret = SDL_RenderFillRect(renderer, NULL);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
+    ret = SDL_SetRenderViewport(renderer, NULL);
+    SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderViewport, expected: 0, got: %i", ret);
+
+    /* Check to see if final image matches. */
+    compare(referenceSurface, ALLOWABLE_ERROR_OPAQUE);
 
     /* Make current */
     SDL_RenderPresent(renderer);
@@ -1208,9 +1282,15 @@ static const SDLTest_TestCaseReference renderTest8 = {
     (SDLTest_TestCaseFp)render_testViewport, "render_testViewport", "Tests viewport", TEST_ENABLED
 };
 
+static const SDLTest_TestCaseReference renderTest9 = {
+    (SDLTest_TestCaseFp)render_testLogicalSize, "render_testLogicalSize", "Tests logical size", TEST_ENABLED
+};
+
 /* Sequence of Render test cases */
 static const SDLTest_TestCaseReference *renderTests[] = {
-    &renderTest1, &renderTest2, &renderTest3, &renderTest4, &renderTest5, &renderTest6, &renderTest7, &renderTest8, NULL
+    &renderTest1, &renderTest2, &renderTest3, &renderTest4,
+	&renderTest5, &renderTest6, &renderTest7, &renderTest8,
+	&renderTest9, NULL
 };
 
 /* Render test suite (global) */