#pragma once #include #include #include #include #include class Node; class LayoutBlock; class StyledNode; class LayoutNode : public TreeNode { public: virtual ~LayoutNode(); const Rect& rect() const { return m_rect; } Rect& rect() { return m_rect; } void set_rect(const Rect& rect) { m_rect = rect; } ComputedStyle& style() { return m_style; } const ComputedStyle& style() const { return m_style; } bool is_anonymous() const { return !m_node; } const Node* node() const { return m_node; } template inline void for_each_child(Callback callback) const { for (auto* node = first_child(); node; node = node->next_sibling()) callback(*node); } template inline void for_each_child(Callback callback) { for (auto* node = first_child(); node; node = node->next_sibling()) callback(*node); } virtual const char* class_name() const { return "LayoutNode"; } virtual bool is_text() const { return false; } virtual bool is_block() const { return false; } virtual bool is_inline() const { return false; } virtual void layout(); const LayoutBlock* containing_block() const; virtual LayoutNode& inline_wrapper() { return *this; } StyledNode* styled_node() { return m_styled_node; } const StyledNode* styled_node() const { return m_styled_node; } protected: explicit LayoutNode(const Node*, const StyledNode*); private: const Node* m_node { nullptr }; RefPtr m_styled_node; ComputedStyle m_style; Rect m_rect; };