Browse Source

render: Clip lines before Bresenham algorithm generates points.

Otherwise, a massive line might generate gigabytes worth of points to render,
which the backend would simply throw away anyhow.

Fixes #8113.
Ryan C. Gordon 1 year ago
parent
commit
4339647d90
1 changed files with 12 additions and 0 deletions
  1. 12 0
      src/render/SDL_render.c

+ 12 - 0
src/render/SDL_render.c

@@ -2810,6 +2810,18 @@ static int RenderDrawLineBresenham(SDL_Renderer *renderer, int x1, int y1, int x
     int retval;
     SDL_bool isstack;
     SDL_FPoint *points;
+    SDL_Rect clip_rect;
+
+    /* the backend might clip this further to the clipping rect, but we
+       just want a basic safety against generating millions of points for
+       massive lines. */
+    clip_rect.x = (int) renderer->viewport.x;
+    clip_rect.y = (int) renderer->viewport.y;
+    clip_rect.w = (int) renderer->viewport.w;
+    clip_rect.h = (int) renderer->viewport.h;
+    if (!SDL_IntersectRectAndLine(&clip_rect, &x1, &y1, &x2, &y2)) {
+        return 0;
+    }
 
     deltax = SDL_abs(x2 - x1);
     deltay = SDL_abs(y2 - y1);