SDL: render: Fixed a FIXME for SDL_SetRenderViewport with a negative size.

From 7a6a0becb85b991702ca8ad460df0646f13fd627 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Wed, 25 Sep 2024 12:32:50 -0400
Subject: [PATCH] render: Fixed a FIXME for SDL_SetRenderViewport with a
 negative size.

---
 include/SDL3/SDL_render.h | 8 ++++++++
 src/render/SDL_render.c   | 4 +++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h
index 3d7167ea22f08..1f90102df09ad 100644
--- a/include/SDL3/SDL_render.h
+++ b/include/SDL3/SDL_render.h
@@ -1400,12 +1400,20 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertEventToRenderCoordinates(SDL_Rendere
 /**
  * Set the drawing area for rendering on the current target.
  *
+ * Drawing will clip to this area (separately from any clipping done with
+ * SDL_SetRenderClipRect), and the top left of the area will become
+ * coordinate (0, 0) for future drawing commands.
+ *
+ * The area's width and height must be >= 0.
+ *
  * \param renderer the rendering context.
  * \param rect the SDL_Rect structure representing the drawing area, or NULL
  *             to set the viewport to the entire target.
  * \returns true on success or false on failure; call SDL_GetError() for more
  *          information.
  *
+ * \threadsafety You may only call this function from the main thread.
+ *
  * \since This function is available since SDL 3.0.0.
  *
  * \sa SDL_GetRenderViewport
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index a7c534fdea0df..6868611a25f97 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -2932,7 +2932,9 @@ bool SDL_SetRenderViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
     CHECK_RENDERER_MAGIC(renderer, false);
 
     if (rect) {
-        // !!! FIXME: fail if rect->w or rect->h are negative (we use this to mean "the whole viewport").
+        if ((rect->w < 0) || (rect->h < 0)) {
+            return SDL_SetError("rect has a negative size");
+        }
         SDL_copyp(&renderer->view->viewport, rect);
     } else {
         renderer->view->viewport.x = 0;