From 881e7fcee1f583cf2aeca62c4c66063846309d30 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 2 Mar 2024 11:03:02 +0100 Subject: [PATCH] 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. --- .../Libraries/LibWeb/Painting/Paintable.cpp | 30 +++++++++---------- .../Libraries/LibWeb/Painting/Paintable.h | 19 ++++++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/Paintable.cpp b/Userland/Libraries/LibWeb/Painting/Paintable.cpp index 65c7d21e8e..244fbe8566 100644 --- a/Userland/Libraries/LibWeb/Painting/Paintable.cpp +++ b/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(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) { m_dom_node = dom_node; diff --git a/Userland/Libraries/LibWeb/Painting/Paintable.h b/Userland/Libraries/LibWeb/Painting/Paintable.h index e9cedc03d9..670f240446 100644 --- a/Userland/Libraries/LibWeb/Painting/Paintable.h +++ b/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 @@ -217,6 +217,13 @@ private: Optional> mutable m_containing_block; OwnPtr 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()