diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.cpp index dfdb6d7786..6f0be5b02d 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.cpp @@ -11,6 +11,26 @@ namespace Web::CSS { +bool PositionStyleValue::is_center() const +{ + return (edge_x()->edge() == PositionEdge::Left + && edge_x()->offset().is_percentage() && edge_x()->offset().percentage() == Percentage { 50 }) + && (edge_y()->edge() == PositionEdge::Top + && edge_y()->offset().is_percentage() && edge_y()->offset().percentage() == Percentage { 50 }); +} + +CSSPixelPoint PositionStyleValue::resolved(Layout::Node const& node, CSSPixelRect const& rect) const +{ + // Note: A preset + a none default x/y_relative_to is impossible in the syntax (and makes little sense) + CSSPixels x = m_properties.edge_x->offset().to_px(node, rect.width()); + CSSPixels y = m_properties.edge_y->offset().to_px(node, rect.height()); + if (m_properties.edge_x->edge() == PositionEdge::Right) + x = rect.width() - x; + if (m_properties.edge_y->edge() == PositionEdge::Bottom) + y = rect.height() - y; + return CSSPixelPoint { rect.x() + x, rect.y() + y }; +} + String PositionStyleValue::to_string() const { return MUST(String::formatted("{} {}", m_properties.edge_x->to_string(), m_properties.edge_y->to_string())); diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.h index 24e73abf38..1b7775716a 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/PositionStyleValue.h @@ -22,10 +22,18 @@ public: { return adopt_ref(*new (nothrow) PositionStyleValue(move(edge_x), move(edge_y))); } + static ValueComparingNonnullRefPtr create_center() + { + return adopt_ref(*new (nothrow) PositionStyleValue( + EdgeStyleValue::create(PositionEdge::Left, Percentage { 50 }), + EdgeStyleValue::create(PositionEdge::Top, Percentage { 50 }))); + } virtual ~PositionStyleValue() override = default; ValueComparingNonnullRefPtr edge_x() const { return m_properties.edge_x; } ValueComparingNonnullRefPtr edge_y() const { return m_properties.edge_y; } + bool is_center() const; + CSSPixelPoint resolved(Layout::Node const&, CSSPixelRect const&) const; virtual String to_string() const override;