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.
This commit is contained in:
Ryan C. Gordon 2023-11-24 19:31:30 -05:00
parent a391dd5fef
commit 4339647d90
No known key found for this signature in database
GPG key ID: FA148B892AB48044

View file

@ -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);