فهرست منبع

LibWeb: Copy various flags from layout node to paintable

This removes indirection when asking if a paintable is positioned,
floating, etc.

Removes a bunch of 1-1.5% items in the profile when hovering links
on ziglang.org.
Andreas Kling 1 سال پیش
والد
کامیت
881e7fcee1
2فایلهای تغییر یافته به همراه28 افزوده شده و 21 حذف شده
  1. 15 15
      Userland/Libraries/LibWeb/Painting/Paintable.cpp
  2. 13 6
      Userland/Libraries/LibWeb/Painting/Paintable.h

+ 15 - 15
Userland/Libraries/LibWeb/Painting/Paintable.cpp

@@ -16,6 +16,21 @@ Paintable::Paintable(Layout::Node const& layout_node)
     : m_layout_node(layout_node)
     , m_browsing_context(const_cast<HTML::BrowsingContext&>(layout_node.browsing_context()))
 {
+    auto& computed_values = layout_node.computed_values();
+    m_visible = computed_values.visibility() == CSS::Visibility::Visible && computed_values.opacity() != 0;
+
+    if (layout_node.is_grid_item() && computed_values.z_index().has_value()) {
+        // https://www.w3.org/TR/css-grid-2/#z-order
+        // grid items with z_index should behave as if position were "relative"
+        m_positioned = true;
+    } else {
+        m_positioned = computed_values.position() != CSS::Positioning::Static;
+    }
+
+    m_fixed_position = computed_values.position() == CSS::Positioning::Fixed;
+    m_absolutely_positioned = computed_values.position() == CSS::Positioning::Absolute;
+    m_floating = layout_node.is_floating();
+    m_inline = layout_node.is_inline();
 }
 
 Paintable::~Paintable()
@@ -33,21 +48,6 @@ void Paintable::visit_edges(Cell::Visitor& visitor)
         visitor.visit(m_containing_block.value());
 }
 
-bool Paintable::is_visible() const
-{
-    return computed_values().visibility() == CSS::Visibility::Visible && computed_values().opacity() != 0;
-}
-
-bool Paintable::is_positioned() const
-{
-    if (layout_node().is_grid_item() && computed_values().z_index().has_value()) {
-        // https://www.w3.org/TR/css-grid-2/#z-order
-        // grid items with z_index should behave as if position were "relative"
-        return true;
-    }
-    return computed_values().position() != CSS::Positioning::Static;
-}
-
 void Paintable::set_dom_node(JS::GCPtr<DOM::Node> dom_node)
 {
     m_dom_node = dom_node;

+ 13 - 6
Userland/Libraries/LibWeb/Painting/Paintable.h

@@ -56,12 +56,12 @@ class Paintable
 public:
     virtual ~Paintable();
 
-    [[nodiscard]] bool is_visible() const;
-    [[nodiscard]] bool is_positioned() const;
-    [[nodiscard]] bool is_fixed_position() const { return layout_node().is_fixed_position(); }
-    [[nodiscard]] bool is_absolutely_positioned() const { return layout_node().is_absolutely_positioned(); }
-    [[nodiscard]] bool is_floating() const { return layout_node().is_floating(); }
-    [[nodiscard]] bool is_inline() const { return layout_node().is_inline(); }
+    [[nodiscard]] bool is_visible() const { return m_visible; }
+    [[nodiscard]] bool is_positioned() const { return m_positioned; }
+    [[nodiscard]] bool is_fixed_position() const { return m_fixed_position; }
+    [[nodiscard]] bool is_absolutely_positioned() const { return m_absolutely_positioned; }
+    [[nodiscard]] bool is_floating() const { return m_floating; }
+    [[nodiscard]] bool is_inline() const { return m_inline; }
     [[nodiscard]] CSS::Display display() const { return layout_node().display(); }
 
     template<typename U, typename Callback>
@@ -217,6 +217,13 @@ private:
     Optional<JS::GCPtr<PaintableBox>> mutable m_containing_block;
 
     OwnPtr<StackingContext> m_stacking_context;
+
+    bool m_visible : 1 { false };
+    bool m_positioned : 1 { false };
+    bool m_fixed_position : 1 { false };
+    bool m_absolutely_positioned : 1 { false };
+    bool m_floating : 1 { false };
+    bool m_inline : 1 { false };
 };
 
 inline DOM::Node* HitTestResult::dom_node()