1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 11:57:35 +00:00

LibGfx: Implement alternative Rect right/bottom edge calculations

For `IntRect`, we assume that the right/bottom edge is offset by minus
one. This obviously will not work for `FloatRect`, since those edges are
infinitely small.

Specialize `right()` and `bottom()` and add a `FIXME` to get rid of the
offset in the future.
This commit is contained in:
Jelle Raaijmakers 2023-05-19 00:22:28 +02:00 committed by Andreas Kling
parent 902ceb1675
commit 88a7bb5ba7

View file

@ -353,30 +353,54 @@ public:
return right(); return right();
} }
// FIXME: for integral types of T, we assume that the right/bottom edges are offset by minus one.
// Although there are cases where this makes sense, for consistency it would be best if we
// can drop the `- 1` altogether and not specialize these methods.
[[nodiscard]] ALWAYS_INLINE T left() const { return x(); } [[nodiscard]] ALWAYS_INLINE T left() const { return x(); }
[[nodiscard]] ALWAYS_INLINE T right() const { return x() + width() - 1; } [[nodiscard]] ALWAYS_INLINE T right() const
requires(IsIntegral<T>)
{
return x() + width() - 1;
}
[[nodiscard]] ALWAYS_INLINE T right() const
requires(!IsIntegral<T>)
{
return x() + width();
}
[[nodiscard]] ALWAYS_INLINE T top() const { return y(); } [[nodiscard]] ALWAYS_INLINE T top() const { return y(); }
[[nodiscard]] ALWAYS_INLINE T bottom() const { return y() + height() - 1; } [[nodiscard]] ALWAYS_INLINE T bottom() const
requires(IsIntegral<T>)
ALWAYS_INLINE void set_left(T left)
{ {
set_x(left); return y() + height() - 1;
} }
[[nodiscard]] ALWAYS_INLINE T bottom() const
ALWAYS_INLINE void set_top(T top) requires(!IsIntegral<T>)
{ {
set_y(top); return y() + height();
} }
ALWAYS_INLINE void set_left(T left) { set_x(left); }
ALWAYS_INLINE void set_right(T right) ALWAYS_INLINE void set_right(T right)
requires(IsIntegral<T>)
{ {
set_width(right - x() + 1); set_width(right - x() + 1);
} }
ALWAYS_INLINE void set_right(T right)
requires(!IsIntegral<T>)
{
set_width(right - x());
}
ALWAYS_INLINE void set_top(T top) { set_y(top); }
ALWAYS_INLINE void set_bottom(T bottom) ALWAYS_INLINE void set_bottom(T bottom)
requires(IsIntegral<T>)
{ {
set_height(bottom - y() + 1); set_height(bottom - y() + 1);
} }
ALWAYS_INLINE void set_bottom(T bottom)
requires(!IsIntegral<T>)
{
set_height(bottom - y());
}
void set_right_without_resize(T new_right) void set_right_without_resize(T new_right)
{ {
@ -505,10 +529,10 @@ public:
return; return;
} }
m_location.set_x(l); set_x(l);
m_location.set_y(t); set_y(t);
m_size.set_width((r - l) + 1); set_right(r);
m_size.set_height((b - t) + 1); set_bottom(b);
} }
[[nodiscard]] static Rect<T> centered_on(Point<T> const& center, Size<T> const& size) [[nodiscard]] static Rect<T> centered_on(Point<T> const& center, Size<T> const& size)