From 624d77b2ffc8bf2b70668f318fb3124fb59b8cb4 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 10 May 2012 14:03:41 -0700 Subject: [PATCH] Move the box builder to a separate module --- src/servo/layout/base.rs | 22 ------------------- src/servo/layout/box_builder.rs | 39 +++++++++++++++++++++++++++++++++ src/servo/layout/layout.rs | 10 ++++----- src/servo/servo.rc | 1 + 4 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 src/servo/layout/box_builder.rs diff --git a/src/servo/layout/base.rs b/src/servo/layout/base.rs index 7b4ea6835ca..ab758daa409 100644 --- a/src/servo/layout/base.rs +++ b/src/servo/layout/base.rs @@ -50,28 +50,6 @@ impl of tree::wr_tree_ops<@box> for btree { } } -fn new_box(n: node) -> @box { - @box({tree: tree::empty(), - node: n, - mut display: di_block, - mut bounds: geom::zero_rect_au()}) -} - -fn linked_box(n: node) -> @box { - let b = new_box(n); - n.set_aux(b); - ret b; -} - -fn linked_subtree(p: node) -> @box { - let p_box = linked_box(p); - for ntree.each_child(p) { |c| - let c_box = linked_subtree(c); - btree.add_child(p_box, c_box); - } - ret p_box; -} - impl block_layout_methods for @box { #[doc="The main reflow routine."] fn reflow(available_width: au) { diff --git a/src/servo/layout/box_builder.rs b/src/servo/layout/box_builder.rs new file mode 100644 index 00000000000..814ae32b372 --- /dev/null +++ b/src/servo/layout/box_builder.rs @@ -0,0 +1,39 @@ +#[doc="Creates CSS boxes from a DOM."] + +import dom::base::node; +import dom::rcu::reader_methods; +import gfx::geom; +import /*layout::*/base::{box, btree, di_block, di_inline, ntree, rd_tree_ops}; +import /*layout::*/base::wr_tree_ops; +import util::tree; + +export box_builder_methods; + +fn new_box(n: node) -> @box { + @box({tree: tree::empty(), + node: n, + mut display: di_block, + mut bounds: geom::zero_rect_au()}) +} + +impl box_builder_priv_methods for node { + fn construct_boxes() -> @box { + let b = new_box(self); + self.set_aux(b); + ret b; + } +} + +impl box_builder_methods for node { + #[doc="Creates boxes for a subtree. This is the entry point."] + fn construct_boxes_for_subtree() -> @box { + let p_box = self.construct_boxes(); + for ntree.each_child(self) { + |c| + let c_box = c.construct_boxes_for_subtree(); + btree.add_child(p_box, c_box); + } + ret p_box; + } +} + diff --git a/src/servo/layout/layout.rs b/src/servo/layout/layout.rs index 2d13c3e8251..a50edbde92f 100644 --- a/src/servo/layout/layout.rs +++ b/src/servo/layout/layout.rs @@ -11,8 +11,8 @@ import gfx::geom; import gfx::renderer; import dom::base::node; import dom::rcu::scope; -import base::{btree, rd_tree_ops, wr_tree_ops, linked_subtree}; -import base::block_layout_methods; +import base::*; +import box_builder::box_builder_methods; import dl = display_list; enum msg { @@ -29,9 +29,9 @@ fn layout(to_renderer: chan) -> chan { exit { break; } build(node) { #debug("layout: received layout request"); - let box = linked_subtree(node); - box.reflow(geom::px_to_au(800)); - let dlist = build_display_list(box); + let this_box = node.construct_boxes_for_subtree(); + this_box.reflow(geom::px_to_au(800)); + let dlist = build_display_list(this_box); to_renderer.send(renderer::render(dlist)); } } diff --git a/src/servo/servo.rc b/src/servo/servo.rc index eb47d9990e2..e432ffa16f1 100755 --- a/src/servo/servo.rc +++ b/src/servo/servo.rc @@ -31,6 +31,7 @@ mod image { mod layout { mod base; + mod box_builder; mod display_list; mod inline; mod layout;