diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h index 3d7167ea22..1f90102df0 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 a7c534fdea..6868611a25 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;