diff --git a/Libraries/LibWeb/CSS/PercentageOr.h b/Libraries/LibWeb/CSS/PercentageOr.h index 19ac15a1832..7c8899aef5d 100644 --- a/Libraries/LibWeb/CSS/PercentageOr.h +++ b/Libraries/LibWeb/CSS/PercentageOr.h @@ -18,7 +18,7 @@ namespace Web::CSS { -template +template class PercentageOr { public: PercentageOr(T t) @@ -38,13 +38,13 @@ public: ~PercentageOr() = default; - PercentageOr& operator=(T t) + PercentageOr& operator=(T t) { m_value = move(t); return *this; } - PercentageOr& operator=(Percentage percentage) + PercentageOr& operator=(Percentage percentage) { m_value = move(percentage); return *this; @@ -128,7 +128,7 @@ public: return m_value.template get().to_string(); } - bool operator==(PercentageOr const& other) const + bool operator==(PercentageOr const& other) const { if (is_calculated() != other.is_calculated()) return false; @@ -141,6 +141,21 @@ public: return (m_value.template get() == other.m_value.template get()); } + Self absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const + { + return m_value.visit( + [&](T const& value) { + if constexpr (IsSame) + return Self { value.absolutized(viewport_rect, font_metrics, root_font_metrics) }; + else + return *static_cast(this); + }, + [&](Percentage const&) { return *static_cast(this); }, + [&](NonnullRefPtr const& value) { + return Self { value->absolutized(viewport_rect, font_metrics, root_font_metrics)->as_calculated() }; + }); + } + protected: bool is_t() const { return m_value.template has(); } T const& get_t() const { return m_value.template get(); } @@ -149,49 +164,49 @@ private: Variant> m_value; }; -template -bool operator==(PercentageOr const& percentage_or, T const& t) +template +bool operator==(PercentageOr const& percentage_or, T const& t) { - return percentage_or == PercentageOr { t }; + return percentage_or == PercentageOr { t }; } -template -bool operator==(T const& t, PercentageOr const& percentage_or) +template +bool operator==(T const& t, PercentageOr const& percentage_or) { return t == percentage_or; } -template -bool operator==(PercentageOr const& percentage_or, Percentage const& percentage) +template +bool operator==(PercentageOr const& percentage_or, Percentage const& percentage) { - return percentage_or == PercentageOr { percentage }; + return percentage_or == PercentageOr { percentage }; } -template -bool operator==(Percentage const& percentage, PercentageOr const& percentage_or) +template +bool operator==(Percentage const& percentage, PercentageOr const& percentage_or) { return percentage == percentage_or; } -class AnglePercentage : public PercentageOr { +class AnglePercentage : public PercentageOr { public: - using PercentageOr::PercentageOr; + using PercentageOr::PercentageOr; bool is_angle() const { return is_t(); } Angle const& angle() const { return get_t(); } }; -class FrequencyPercentage : public PercentageOr { +class FrequencyPercentage : public PercentageOr { public: - using PercentageOr::PercentageOr; + using PercentageOr::PercentageOr; bool is_frequency() const { return is_t(); } Frequency const& frequency() const { return get_t(); } }; -class LengthPercentage : public PercentageOr { +class LengthPercentage : public PercentageOr { public: - using PercentageOr::PercentageOr; + using PercentageOr::PercentageOr; bool is_auto() const { return is_length() && length().is_auto(); } @@ -199,17 +214,17 @@ public: Length const& length() const { return get_t(); } }; -class TimePercentage : public PercentageOr