summaryrefslogtreecommitdiff
path: root/Libraries/LibHTML/Layout/LayoutBox.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-10-15 16:48:38 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-10-15 16:48:38 +0200
commit4814253589e87e23de4d4472bd09d8f32d7fb459 (patch)
tree15b28229e60027e6c1e4370960fffc88689b4652 /Libraries/LibHTML/Layout/LayoutBox.h
parentf4f5ede10a908d204b80db3a8d33ac156ea9b28b (diff)
downloadserenity-4814253589e87e23de4d4472bd09d8f32d7fb459.zip
LibHTML: Introduce LayoutBox and LayoutNodeWithStyleAndBoxModelMetrics
To streamline the layout tree and remove irrelevant data from classes that don't need it, this patch adds two new LayoutNode subclasses. LayoutNodeWithStyleAndBoxModelMetrics should be inherited by any layout node that cares about box model metrics (margin, border, and padding.) LayoutBox should be inherited by any layout node that can have a rect. This makes LayoutText significantly smaller (from 140 to 40 bytes) and clarifies a lot of things about the layout tree. I'm also adding next_sibling() and previous_sibling() overloads to LayoutBlock that return a LayoutBlock*. This is okay since blocks only ever have block siblings. Do also note that the semantics of is<T> slightly change in this patch: is<T>(nullptr) now returns true, to facilitate allowing to<T>(nullptr).
Diffstat (limited to 'Libraries/LibHTML/Layout/LayoutBox.h')
-rw-r--r--Libraries/LibHTML/Layout/LayoutBox.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/Libraries/LibHTML/Layout/LayoutBox.h b/Libraries/LibHTML/Layout/LayoutBox.h
new file mode 100644
index 0000000000..f66be67571
--- /dev/null
+++ b/Libraries/LibHTML/Layout/LayoutBox.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include <LibHTML/Layout/LayoutNode.h>
+
+class LayoutBox : public LayoutNodeWithStyleAndBoxModelMetrics {
+public:
+ const Rect& rect() const { return m_rect; }
+ Rect& rect() { return m_rect; }
+ void set_rect(const Rect& rect) { m_rect = rect; }
+
+ int x() const { return rect().x(); }
+ int y() const { return rect().y(); }
+ int width() const { return rect().width(); }
+ int height() const { return rect().height(); }
+ Size size() const { return rect().size(); }
+ Point position() const { return rect().location(); }
+
+ virtual HitTestResult hit_test(const Point& position) const override;
+ virtual void set_needs_display() override;
+
+protected:
+ LayoutBox(const Node* node, NonnullRefPtr<StyleProperties> style)
+ : LayoutNodeWithStyleAndBoxModelMetrics(node, move(style))
+ {
+ }
+
+ virtual void render(RenderingContext&) override;
+
+private:
+ virtual bool is_box() const override { return true; }
+
+ Rect m_rect;
+};
+
+template<>
+inline bool is<LayoutBox>(const LayoutNode& node)
+{
+ return node.is_box();
+}