Parcourir la source

LibWeb: Add some helpers to PositionStyleValue

Both of these are needed by the gradient style values.
Sam Atkins il y a 1 an
Parent
commit
2ae53bc5eb

+ 20 - 0
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()));

+ 8 - 0
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<PositionStyleValue> 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<EdgeStyleValue> edge_x() const { return m_properties.edge_x; }
     ValueComparingNonnullRefPtr<EdgeStyleValue> 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;