On Mon, 12 Aug 2024, Jocelyn Falempe <jfalempe@xxxxxxxxxx> wrote: > Check if two rectangles overlap. > It's a bit similar to drm_rect_intersect() but this won't modify > the rectangle. > Simplifies a bit drm_panic. Based on the name, I'd expect drm_rect_overlap() to return true for *any* overlap, while this one seems to mean if one rectangle is completely within another, with no adjacent borders. I'd expect a drm_rect_overlap() to return true for this: +-------+ | +---+---+ | | | +---+ | | | +-------+ While this seems to be required instead: +-------+ | +---+ | | | | | | +---+ | +-------+ IOW, I find the name misleading. BR, Jani. > > Signed-off-by: Jocelyn Falempe <jfalempe@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_panic.c | 3 +-- > include/drm/drm_rect.h | 15 +++++++++++++++ > 2 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c > index 0a047152f88b8..59fba23e5fd7a 100644 > --- a/drivers/gpu/drm/drm_panic.c > +++ b/drivers/gpu/drm/drm_panic.c > @@ -529,8 +529,7 @@ static void draw_panic_static_user(struct drm_scanout_buffer *sb) > /* Fill with the background color, and draw text on top */ > drm_panic_fill(sb, &r_screen, bg_color); > > - if ((r_msg.x1 >= logo_width || r_msg.y1 >= logo_height) && > - logo_width <= sb->width && logo_height <= sb->height) { > + if (!drm_rect_overlap(&r_logo, &r_msg)) { > if (logo_mono) > drm_panic_blit(sb, &r_logo, logo_mono->data, DIV_ROUND_UP(logo_width, 8), > fg_color); > diff --git a/include/drm/drm_rect.h b/include/drm/drm_rect.h > index 73fcb899a01da..7bafde747d560 100644 > --- a/include/drm/drm_rect.h > +++ b/include/drm/drm_rect.h > @@ -238,6 +238,21 @@ static inline void drm_rect_fp_to_int(struct drm_rect *dst, > drm_rect_height(src) >> 16); > } > > +/** > + * drm_rect_overlap - Check if two rectangles overlap > + * @r1: first rectangle > + * @r2: second rectangle > + * > + * RETURNS: > + * %true if the rectangles overlap, %false otherwise. > + */ > +static inline bool drm_rect_overlap(const struct drm_rect *r1, > + const struct drm_rect *r2) > +{ > + return (r1->x2 > r2->x1 && r2->x2 > r1->x1 && > + r1->y2 > r2->y1 && r2->y2 > r1->y1); > +} > + > bool drm_rect_intersect(struct drm_rect *r, const struct drm_rect *clip); > bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst, > const struct drm_rect *clip); -- Jani Nikula, Intel