diff options
-rw-r--r-- | Userland/Applications/PixelPaint/EllipseTool.cpp | 2 | ||||
-rw-r--r-- | Userland/Applications/PixelPaint/RectangleTool.cpp | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/Point.cpp | 19 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/Point.h | 2 |
4 files changed, 15 insertions, 10 deletions
diff --git a/Userland/Applications/PixelPaint/EllipseTool.cpp b/Userland/Applications/PixelPaint/EllipseTool.cpp index 6acb156b35..74816e1afe 100644 --- a/Userland/Applications/PixelPaint/EllipseTool.cpp +++ b/Userland/Applications/PixelPaint/EllipseTool.cpp @@ -90,7 +90,7 @@ void EllipseTool::on_mousemove(Layer*, MouseEvent& event) m_draw_mode = event.layer_event().alt() ? DrawMode::FromCenter : DrawMode::FromCorner; if (event.layer_event().shift()) - m_ellipse_end_position = m_ellipse_start_position.end_point_for_square_aspect_ratio(event.layer_event().position()); + m_ellipse_end_position = m_ellipse_start_position.end_point_for_aspect_ratio(event.layer_event().position(), 1.0); else m_ellipse_end_position = event.layer_event().position(); diff --git a/Userland/Applications/PixelPaint/RectangleTool.cpp b/Userland/Applications/PixelPaint/RectangleTool.cpp index a5fdde2923..6ff2b57d98 100644 --- a/Userland/Applications/PixelPaint/RectangleTool.cpp +++ b/Userland/Applications/PixelPaint/RectangleTool.cpp @@ -96,7 +96,7 @@ void RectangleTool::on_mousemove(Layer* layer, MouseEvent& event) m_draw_mode = event.layer_event().alt() ? DrawMode::FromCenter : DrawMode::FromCorner; if (event.layer_event().shift()) - m_rectangle_end_position = m_rectangle_start_position.end_point_for_square_aspect_ratio(event.layer_event().position()); + m_rectangle_end_position = m_rectangle_start_position.end_point_for_aspect_ratio(event.layer_event().position(), 1.0); else m_rectangle_end_position = event.layer_event().position(); diff --git a/Userland/Libraries/LibGfx/Point.cpp b/Userland/Libraries/LibGfx/Point.cpp index 4add10a72f..c91c980735 100644 --- a/Userland/Libraries/LibGfx/Point.cpp +++ b/Userland/Libraries/LibGfx/Point.cpp @@ -20,14 +20,19 @@ void Point<T>::constrain(Rect<T> const& rect) } template<typename T> -[[nodiscard]] Point<T> Point<T>::end_point_for_square_aspect_ratio(Point<T> const& previous_end_point) const +[[nodiscard]] Point<T> Point<T>::end_point_for_aspect_ratio(Point<T> const& previous_end_point, float aspect_ratio) const { - const T dx = previous_end_point.x() - x(); - const T dy = previous_end_point.y() - y(); - const T x_sign = dx >= 0 ? 1 : -1; - const T y_sign = dy >= 0 ? 1 : -1; - const T abs_size = AK::max(AK::abs(dx), AK::abs(dy)); - return { x() + x_sign * abs_size, y() + y_sign * abs_size }; + VERIFY(aspect_ratio > 0); + const T x_sign = previous_end_point.x() >= x() ? 1 : -1; + const T y_sign = previous_end_point.y() >= y() ? 1 : -1; + T dx = AK::abs(previous_end_point.x() - x()); + T dy = AK::abs(previous_end_point.y() - y()); + if (dx > dy) { + dy = (T)((float)dx / aspect_ratio); + } else { + dx = (T)((float)dy * aspect_ratio); + } + return { x() + x_sign * dx, y() + y_sign * dy }; } template<> diff --git a/Userland/Libraries/LibGfx/Point.h b/Userland/Libraries/LibGfx/Point.h index 44776a4d7b..7b9faebe16 100644 --- a/Userland/Libraries/LibGfx/Point.h +++ b/Userland/Libraries/LibGfx/Point.h @@ -231,7 +231,7 @@ public: return { AK::abs(dx_relative_to(other)), AK::abs(dy_relative_to(other)) }; } - [[nodiscard]] Point end_point_for_square_aspect_ratio(Point const&) const; + [[nodiscard]] Point end_point_for_aspect_ratio(Point const& previous_end_point, float aspect_ratio) const; template<typename U> [[nodiscard]] Point<U> to_type() const |