From d52a2ff10e4faec4348e11ef58090ee4fca01427 Mon Sep 17 00:00:00 2001 From: Sebastian Zaha Date: Wed, 28 Jun 2023 23:42:56 +0200 Subject: [PATCH] LibGfx: Fix error & crash in Rect::closest_to Assertion fails if the point is outside of the rect. This was introduced in introduced in #18970 and causes serenity to crash when changing to 2x resolution for a monitor, if the cursor after resizing is outside of the new screen. Added test to reproduce. --- Tests/LibGfx/TestRect.cpp | 11 +++++++++++ Userland/Libraries/LibGfx/Rect.h | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Tests/LibGfx/TestRect.cpp b/Tests/LibGfx/TestRect.cpp index 3d6ccc2d20..dfeeb3b20b 100644 --- a/Tests/LibGfx/TestRect.cpp +++ b/Tests/LibGfx/TestRect.cpp @@ -45,3 +45,14 @@ TEST_CASE(rect_shatter) EXPECT_EQ(glass_plate.size().area() - hammer.size().area(), total_shard_area); } + +TEST_CASE(rect_closest_to) +{ + Gfx::IntRect const screen_rect = { 0, 0, 960, 540 }; + Gfx::Point p = { 460, 592 }; // point is below the rect + Gfx::Point closest = screen_rect.closest_to(p); + EXPECT_EQ(screen_rect.side(closest), Gfx::IntRect::Side::Bottom); + p = { 960, 0 }; // point exactly on top right corner + closest = screen_rect.closest_to(p); + EXPECT_EQ(screen_rect.side(closest), Gfx::IntRect::Side::Top); +} diff --git a/Userland/Libraries/LibGfx/Rect.h b/Userland/Libraries/LibGfx/Rect.h index ffb009ca53..37584d11a5 100644 --- a/Userland/Libraries/LibGfx/Rect.h +++ b/Userland/Libraries/LibGfx/Rect.h @@ -656,8 +656,8 @@ public: } }; - check_distance({ top_left(), top_right() }); - check_distance({ bottom_left(), bottom_right() }); + check_distance({ top_left(), top_right().moved_left(1) }); + check_distance({ bottom_left().moved_up(1), bottom_right().translated(-1) }); if (height() > 2) { check_distance({ { x(), y() + 1 }, { x(), bottom() - 2 } }); check_distance({ { right() - 1, y() + 1 }, { right() - 1, bottom() - 2 } });