Browse Source

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

Ryan C. Gordon 6 months ago
parent
commit
7a6a0becb8
2 changed files with 11 additions and 1 deletions
  1. 8 0
      include/SDL3/SDL_render.h
  2. 3 1
      src/render/SDL_render.c

+ 8 - 0
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

+ 3 - 1
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;