/
layout_task.rs
61 lines (51 loc) · 1.72 KB
/
layout_task.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#[doc = "
The layout task. Performs layout on the DOM, builds display lists and sends them to be
rendered.
"];
import arc::arc;
import display_list_builder::build_display_list;
import dom::base::{Node};
import dom::style::Stylesheet;
import gfx::geometry::px_to_au;
import gfx::renderer::Renderer;
import base::{NodeMethods, layout_methods};
import layout::style::style::style_methods;
import box_builder::box_builder_methods;
import layout::style::apply::ApplyStyleBoxMethods;
import task::*;
import comm::*;
type Layout = chan<Msg>;
enum Msg {
BuildMsg(Node, Stylesheet),
PingMsg(chan<content::PingMsg>),
ExitMsg
}
fn Layout(renderer: Renderer) -> Layout {
spawn_listener::<Msg>(|request| {
loop {
alt request.recv() {
PingMsg(ping_channel) {
ping_channel.send(content::PongMsg);
}
ExitMsg {
#debug("layout: ExitMsg received");
break;
}
BuildMsg(node, styles) {
#debug("layout: received layout request for:");
node.dump();
do util::time::time(~"layout") {
node.initialize_style_for_subtree();
node.recompute_style_for_subtree(arc(copy styles));
let this_box = node.construct_boxes();
this_box.dump();
this_box.apply_css_style();
this_box.reflow(px_to_au(800));
let dlist = build_display_list(this_box);
renderer.send(renderer::RenderMsg(dlist));
}
}
}
}
})
}