Просмотр исходного кода

render: an empty clip rect should clip all drawing

Added a test to validate this and fixed the Metal renderer

Fixes https://github.com/libsdl-org/SDL/issues/15434
Sam Lantinga 13 часов назад
Родитель
Сommit
e04bfb4c6e
2 измененных файлов с 22 добавлено и 8 удалено
  1. 8 8
      src/render/metal/SDL_render_metal.m
  2. 14 0
      test/testautomation_render.c

+ 8 - 8
src/render/metal/SDL_render_metal.m

@@ -1553,14 +1553,14 @@ static bool SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
             METAL_GetOutputSize(renderer, &output.w, &output.h);
         }
 
-        if (SDL_GetRectIntersection(&output, &clip, &clip)) {
-            MTLScissorRect mtlrect;
-            mtlrect.x = clip.x;
-            mtlrect.y = clip.y;
-            mtlrect.width = clip.w;
-            mtlrect.height = clip.h;
-            [data.mtlcmdencoder setScissorRect:mtlrect];
-        }
+        SDL_GetRectIntersection(&output, &clip, &clip);
+
+        MTLScissorRect mtlrect;
+        mtlrect.x = clip.x;
+        mtlrect.y = clip.y;
+        mtlrect.width = clip.w;
+        mtlrect.height = clip.h;
+        [data.mtlcmdencoder setScissorRect:mtlrect];
 
         statecache->cliprect_dirty = false;
     }

+ 14 - 0
test/testautomation_render.c

@@ -1361,6 +1361,20 @@ static int SDLCALL render_testClipRect(void *arg)
     /* Check to see if final image matches. */
     compare(referenceSurface, ALLOWABLE_ERROR_OPAQUE);
 
+    /*
+     * Verify that empty cliprect clips all drawing
+     */
+
+    /* Set the cliprect and do a fill operation */
+    cliprect.h = 0;
+    CHECK_FUNC(SDL_SetRenderClipRect, (renderer, &cliprect))
+    CHECK_FUNC(SDL_SetRenderDrawColor, (renderer, 255, 0, 0, SDL_ALPHA_OPAQUE))
+    CHECK_FUNC(SDL_RenderFillRect, (renderer, NULL))
+    CHECK_FUNC(SDL_SetRenderClipRect, (renderer, NULL))
+
+    /* Check to see if final image matches. */
+    compare(referenceSurface, ALLOWABLE_ERROR_OPAQUE);
+
     /*
      * Verify that clear ignores the cliprect
      */