summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendiadyoin1 <leon.a@serenityos.org>2022-04-13 21:51:27 +0200
committerLinus Groh <mail@linusgroh.de>2022-05-07 20:25:39 +0200
commit65f57efb5bcd4f85f6bbdfea682aa9266da15383 (patch)
tree00155a0cd7b028847e0af32fdb3ac1ed7cd2c4c2
parent37ff2b9bd2399004df46246294c102509b0f0db9 (diff)
downloadserenity-65f57efb5bcd4f85f6bbdfea682aa9266da15383.zip
LibGfx: Specialize Rect::to_rounded a bit more
We were always calling llround[fd], even for floating point targets. Also for rounding to integer, we don't need to have C99's rounding rules and can just cast, assuming the standard rounding mode.
-rw-r--r--Userland/Libraries/LibGfx/Rect.h42
1 files changed, 32 insertions, 10 deletions
diff --git a/Userland/Libraries/LibGfx/Rect.h b/Userland/Libraries/LibGfx/Rect.h
index 82534cae6f..9c6f63afaf 100644
--- a/Userland/Libraries/LibGfx/Rect.h
+++ b/Userland/Libraries/LibGfx/Rect.h
@@ -697,24 +697,46 @@ public:
return Rect<U>(*this);
}
- template<typename U>
+ template<FloatingPoint U>
[[nodiscard]] ALWAYS_INLINE Rect<U> to_rounded() const
{
+ // FIXME: We may get away with `rint[lf]?()` here.
+ // This would even give us some more control of these internals,
+ // while the break-tie algorithm does not really matter
if constexpr (IsSame<T, float>) {
return {
- static_cast<U>(llroundf(x())),
- static_cast<U>(llroundf(y())),
- static_cast<U>(llroundf(width())),
- static_cast<U>(llroundf(height())),
+ static_cast<U>(roundf(x())),
+ static_cast<U>(roundf(y())),
+ static_cast<U>(roundf(width())),
+ static_cast<U>(roundf(height())),
};
- } else {
+ }
+ if constexpr (IsSame<T, double>) {
return {
- static_cast<U>(llroundd(x())),
- static_cast<U>(llroundd(y())),
- static_cast<U>(llroundd(width())),
- static_cast<U>(llroundd(height())),
+ static_cast<U>(round(x())),
+ static_cast<U>(round(y())),
+ static_cast<U>(round(width())),
+ static_cast<U>(round(height())),
};
}
+
+ return {
+ static_cast<U>(roundl(x())),
+ static_cast<U>(roundl(y())),
+ static_cast<U>(roundl(width())),
+ static_cast<U>(roundl(height())),
+ };
+ }
+
+ template<Integral I>
+ ALWAYS_INLINE Rect<I> to_rounded() const
+ {
+ return {
+ round_to<I>(x()),
+ round_to<I>(y()),
+ round_to<I>(width()),
+ round_to<I>(height()),
+ };
}
[[nodiscard]] String to_string() const;