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;