aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/main/layout/layout_task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/main/layout/layout_task.rs')
-rw-r--r--src/components/main/layout/layout_task.rs79
1 files changed, 46 insertions, 33 deletions
diff --git a/src/components/main/layout/layout_task.rs b/src/components/main/layout/layout_task.rs
index 4a10dac03c3..6ad34addd76 100644
--- a/src/components/main/layout/layout_task.rs
+++ b/src/components/main/layout/layout_task.rs
@@ -9,7 +9,7 @@ use css::matching::MatchMethods;
use css::select::new_stylist;
use css::node_style::StyledNode;
use layout::construct::{FlowConstructionResult, FlowConstructor, NoConstructionResult};
-use layout::context::{LayoutContext, SharedLayoutInfo};
+use layout::context::LayoutContext;
use layout::display_list_builder::{DisplayListBuilder, ToGfxColor};
use layout::extra::LayoutAuxMethods;
use layout::flow::{Flow, ImmutableFlowUtils, LeafSet, MutableFlowUtils, MutableOwnedFlowUtils};
@@ -17,7 +17,8 @@ use layout::flow::{PreorderFlowTraversal, PostorderFlowTraversal};
use layout::flow;
use layout::incremental::RestyleDamage;
use layout::parallel::{AssignHeightsAndStoreOverflowTraversalKind, BubbleWidthsTraversalKind};
-use layout::parallel::{ParallelPostorderFlowTraversal};
+use layout::parallel::{UnsafeFlow};
+use layout::parallel;
use layout::util::{LayoutDataAccess, OpaqueNode, LayoutDataWrapper};
use layout::wrapper::LayoutNode;
@@ -25,7 +26,7 @@ use extra::arc::{Arc, MutexArc, RWArc};
use geom::rect::Rect;
use geom::size::Size2D;
use gfx::display_list::{ClipDisplayItemClass, DisplayItem, DisplayItemIterator, DisplayList};
-use gfx::font_context::{FontContext, FontContextInfo};
+use gfx::font_context::FontContextInfo;
use gfx::opts::Opts;
use gfx::render_task::{RenderMsg, RenderChan, RenderLayer};
use gfx::{render_task, color};
@@ -46,10 +47,12 @@ use servo_util::geometry::Au;
use servo_util::time::{ProfilerChan, profile};
use servo_util::time;
use servo_util::task::spawn_named;
+use servo_util::workqueue::WorkQueue;
use std::cast::transmute;
use std::cast;
use std::cell::RefCell;
use std::comm::Port;
+use std::ptr;
use std::util;
use style::{AuthorOrigin, Stylesheet, Stylist};
@@ -91,7 +94,7 @@ pub struct LayoutTask {
stylist: RWArc<Stylist>,
/// The workers that we use for parallel operation.
- parallel_traversal: Option<ParallelPostorderFlowTraversal>,
+ parallel_traversal: Option<WorkQueue<*mut LayoutContext,UnsafeFlow>>,
/// The channel on which messages can be sent to the profiler.
profiler_chan: ProfilerChan,
@@ -142,12 +145,14 @@ impl PreorderFlowTraversal for PropagateDamageTraversal {
/// The bubble-widths traversal, the first part of layout computation. This computes preferred
/// and intrinsic widths and bubbles them up the tree.
-pub struct BubbleWidthsTraversal<'a>(&'a mut LayoutContext);
+pub struct BubbleWidthsTraversal<'a> {
+ layout_context: &'a mut LayoutContext,
+}
impl<'a> PostorderFlowTraversal for BubbleWidthsTraversal<'a> {
#[inline]
fn process(&mut self, flow: &mut Flow) -> bool {
- flow.bubble_widths(**self);
+ flow.bubble_widths(self.layout_context);
true
}
@@ -174,13 +179,15 @@ impl<'a> PreorderFlowTraversal for AssignWidthsTraversal<'a> {
/// The assign-heights-and-store-overflow traversal, the last (and most expensive) part of layout
/// computation. Determines the final heights for all layout objects, computes positions, and
/// computes overflow regions. In Gecko this corresponds to `FinishAndStoreOverflow`.
-pub struct AssignHeightsAndStoreOverflowTraversal<'a>(&'a mut LayoutContext);
+pub struct AssignHeightsAndStoreOverflowTraversal<'a> {
+ layout_context: &'a mut LayoutContext,
+}
impl<'a> PostorderFlowTraversal for AssignHeightsAndStoreOverflowTraversal<'a> {
#[inline]
fn process(&mut self, flow: &mut Flow) -> bool {
- flow.assign_height(**self);
- flow.store_overflow(**self);
+ flow.assign_height(self.layout_context);
+ flow.store_overflow(self.layout_context);
true
}
@@ -248,13 +255,8 @@ impl LayoutTask {
-> LayoutTask {
let local_image_cache = MutexArc::new(LocalImageCache(image_cache_task.clone()));
let screen_size = Size2D(Au(0), Au(0));
- let font_context_info = FontContextInfo {
- backend: opts.render_backend,
- needs_font_list: true,
- profiler_chan: profiler_chan.clone(),
- };
let parallel_traversal = if opts.layout_threads != 1 {
- Some(ParallelPostorderFlowTraversal::new(font_context_info, opts.layout_threads))
+ Some(WorkQueue::new(opts.layout_threads, ptr::mut_null()))
} else {
None
};
@@ -288,20 +290,18 @@ impl LayoutTask {
// Create a layout context for use in building display lists, hit testing, &c.
fn build_layout_context(&self) -> LayoutContext {
- let font_ctx = ~FontContext::new(FontContextInfo {
+ let font_context_info = FontContextInfo {
backend: self.opts.render_backend,
needs_font_list: true,
profiler_chan: self.profiler_chan.clone(),
- });
+ };
LayoutContext {
- shared: SharedLayoutInfo {
- image_cache: self.local_image_cache.clone(),
- screen_size: self.screen_size.clone(),
- constellation_chan: self.constellation_chan.clone(),
- leaf_set: self.leaf_set.clone(),
- },
- font_ctx: font_ctx,
+ image_cache: self.local_image_cache.clone(),
+ screen_size: self.screen_size.clone(),
+ constellation_chan: self.constellation_chan.clone(),
+ leaf_set: self.leaf_set.clone(),
+ font_context_info: font_context_info,
}
}
@@ -418,7 +418,12 @@ impl LayoutTask {
fn solve_constraints(&mut self,
layout_root: &mut Flow,
layout_context: &mut LayoutContext) {
- layout_root.traverse_postorder(&mut BubbleWidthsTraversal(layout_context));
+ {
+ let mut traversal = BubbleWidthsTraversal {
+ layout_context: layout_context,
+ };
+ layout_root.traverse_postorder(&mut traversal);
+ }
// FIXME(kmc): We want to prune nodes without the Reflow restyle damage
// bit, but FloatContext values can't be reused, so we need to
@@ -428,8 +433,12 @@ impl LayoutTask {
layout_root.traverse_preorder(&mut AssignWidthsTraversal(layout_context));
// FIXME(pcwalton): Prune this pass as well.
- layout_root.traverse_postorder(&mut AssignHeightsAndStoreOverflowTraversal(
- layout_context));
+ {
+ let mut traversal = AssignHeightsAndStoreOverflowTraversal {
+ layout_context: layout_context,
+ };
+ layout_root.traverse_postorder(&mut traversal);
+ }
}
/// Performs layout constraint solving in parallel.
@@ -443,9 +452,11 @@ impl LayoutTask {
match self.parallel_traversal {
None => fail!("solve_contraints_parallel() called with no parallel traversal ready"),
Some(ref mut traversal) => {
- traversal.start(BubbleWidthsTraversalKind,
- layout_context,
- self.profiler_chan.clone());
+ parallel::traverse_flow_tree(BubbleWidthsTraversalKind,
+ &self.leaf_set,
+ self.profiler_chan.clone(),
+ layout_context,
+ traversal);
// NOTE: this currently computes borders, so any pruning should separate that
// operation out.
@@ -453,9 +464,11 @@ impl LayoutTask {
// because this is a top-down traversal, unlike the others.
layout_root.traverse_preorder(&mut AssignWidthsTraversal(layout_context));
- traversal.start(AssignHeightsAndStoreOverflowTraversalKind,
- layout_context,
- self.profiler_chan.clone());
+ parallel::traverse_flow_tree(AssignHeightsAndStoreOverflowTraversalKind,
+ &self.leaf_set,
+ self.profiler_chan.clone(),
+ layout_context,
+ traversal);
}
}
}