diff --git a/servo/components/layout/parallel.rs b/servo/components/layout/parallel.rs index 9e1009ce8350..fcef3b54f985 100644 --- a/servo/components/layout/parallel.rs +++ b/servo/components/layout/parallel.rs @@ -10,7 +10,7 @@ use context::{LayoutContext, SharedLayoutContext}; use flow::{self, Flow, MutableFlowUtils, PostorderFlowTraversal, PreorderFlowTraversal}; -use flow_ref::{self, FlowRef}; +use flow_ref::FlowRef; use profile_traits::time::{self, TimerMetadata, profile}; use std::mem; use std::sync::atomic::{AtomicIsize, Ordering}; @@ -220,7 +220,7 @@ fn assign_block_sizes_and_store_overflow( } pub fn traverse_flow_tree_preorder( - root: &mut FlowRef, + root: &mut Flow, profiler_metadata: Option, time_profiler_chan: time::ProfilerChan, shared_layout_context: &SharedLayoutContext, @@ -228,7 +228,7 @@ pub fn traverse_flow_tree_preorder( if opts::get().bubble_inline_sizes_separately { let layout_context = LayoutContext::new(shared_layout_context); let bubble_inline_sizes = BubbleISizes { layout_context: &layout_context }; - flow_ref::deref_mut(root).traverse_postorder(&bubble_inline_sizes); + root.traverse_postorder(&bubble_inline_sizes); } run_queue_with_custom_work_data_type(queue, |queue| { @@ -236,7 +236,7 @@ pub fn traverse_flow_tree_preorder( time_profiler_chan, || { queue.push(WorkUnit { fun: assign_inline_sizes, - data: (box vec![mut_owned_flow_to_unsafe_flow(root)], 0), + data: (box vec![borrowed_flow_to_unsafe_flow(root)], 0), }) }); }, shared_layout_context); diff --git a/servo/components/layout/query.rs b/servo/components/layout/query.rs index 3f45941e93a9..c92af15582f6 100644 --- a/servo/components/layout/query.rs +++ b/servo/components/layout/query.rs @@ -9,8 +9,7 @@ use construct::ConstructionResult; use euclid::point::Point2D; use euclid::rect::Rect; use euclid::size::Size2D; -use flow; -use flow_ref::FlowRef; +use flow::{self, Flow}; use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo}; use gfx::display_list::{DisplayItemMetadata, DisplayList, OpaqueNode, ScrollOffsetMap}; use gfx_traits::LayerId; @@ -375,7 +374,7 @@ impl FragmentBorderBoxIterator for MarginRetrievingFragmentBorderBoxIterator { } pub fn process_content_box_request( - requested_node: N, layout_root: &mut FlowRef) -> Rect { + requested_node: N, layout_root: &mut Flow) -> Rect { // FIXME(pcwalton): This has not been updated to handle the stacking context relative // stuff. So the position is wrong in most cases. let mut iterator = UnioningFragmentBorderBoxIterator::new(requested_node.opaque()); @@ -386,7 +385,7 @@ pub fn process_content_box_request( } } -pub fn process_content_boxes_request(requested_node: N, layout_root: &mut FlowRef) +pub fn process_content_boxes_request(requested_node: N, layout_root: &mut Flow) -> Vec> { // FIXME(pcwalton): This has not been updated to handle the stacking context relative // stuff. So the position is wrong in most cases. @@ -581,7 +580,7 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { } } -pub fn process_node_geometry_request(requested_node: N, layout_root: &mut FlowRef) +pub fn process_node_geometry_request(requested_node: N, layout_root: &mut Flow) -> Rect { let mut iterator = FragmentLocatingFragmentIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); @@ -593,7 +592,7 @@ pub fn process_node_layer_id_request(requested_node: N) -> LayerI layout_node.layer_id() } -pub fn process_node_scroll_area_request< N: LayoutNode>(requested_node: N, layout_root: &mut FlowRef) +pub fn process_node_scroll_area_request< N: LayoutNode>(requested_node: N, layout_root: &mut Flow) -> Rect { let mut iterator = UnioningFragmentScrollAreaIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); @@ -643,7 +642,7 @@ pub fn process_resolved_style_request<'a, N, C>(requested_node: N, style_context: &'a C, pseudo: &Option, property: &Atom, - layout_root: &mut FlowRef) -> Option + layout_root: &mut Flow) -> Option where N: LayoutNode, C: StyleContext<'a> { @@ -695,7 +694,7 @@ pub fn process_resolved_style_request<'a, N, C>(requested_node: N, fn used_value_for_position_property( layout_node: N::ConcreteThreadSafeLayoutNode, - layout_root: &mut FlowRef, + layout_root: &mut Flow, requested_node: N, property: &Atom) -> Option { let maybe_data = layout_node.borrow_layout_data(); @@ -774,7 +773,7 @@ pub fn process_resolved_style_request<'a, N, C>(requested_node: N, } } -pub fn process_offset_parent_query(requested_node: N, layout_root: &mut FlowRef) +pub fn process_offset_parent_query(requested_node: N, layout_root: &mut Flow) -> OffsetParentResponse { let mut iterator = ParentOffsetBorderBoxIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); diff --git a/servo/components/layout/sequential.rs b/servo/components/layout/sequential.rs index 48a4c3b3889b..f75768fefe98 100644 --- a/servo/components/layout/sequential.rs +++ b/servo/components/layout/sequential.rs @@ -12,7 +12,6 @@ use floats::SpeculatedFloatPlacement; use flow::IS_ABSOLUTELY_POSITIONED; use flow::{PostorderFlowTraversal, PreorderFlowTraversal}; use flow::{self, Flow, ImmutableFlowUtils, InorderFlowTraversal, MutableFlowUtils}; -use flow_ref::{self, FlowRef}; use fragment::FragmentBorderBoxIterator; use generated_content::ResolveGeneratedContent; use gfx::display_list::{DisplayItem, StackingContext}; @@ -23,7 +22,7 @@ use util::opts; pub use style::sequential::traverse_dom; -pub fn resolve_generated_content(root: &mut FlowRef, shared_layout_context: &SharedLayoutContext) { +pub fn resolve_generated_content(root: &mut Flow, shared_layout_context: &SharedLayoutContext) { fn doit(flow: &mut Flow, level: u32, traversal: &mut ResolveGeneratedContent) { if !traversal.should_process(flow) { return @@ -38,10 +37,10 @@ pub fn resolve_generated_content(root: &mut FlowRef, shared_layout_context: &Sha let layout_context = LayoutContext::new(shared_layout_context); let mut traversal = ResolveGeneratedContent::new(&layout_context); - doit(flow_ref::deref_mut(root), 0, &mut traversal) + doit(root, 0, &mut traversal) } -pub fn traverse_flow_tree_preorder(root: &mut FlowRef, +pub fn traverse_flow_tree_preorder(root: &mut Flow, shared_layout_context: &SharedLayoutContext) { fn doit(flow: &mut Flow, assign_inline_sizes: AssignISizes, @@ -61,8 +60,6 @@ pub fn traverse_flow_tree_preorder(root: &mut FlowRef, let layout_context = LayoutContext::new(shared_layout_context); - let root = flow_ref::deref_mut(root); - if opts::get().bubble_inline_sizes_separately { let bubble_inline_sizes = BubbleISizes { layout_context: &layout_context }; { @@ -77,11 +74,10 @@ pub fn traverse_flow_tree_preorder(root: &mut FlowRef, doit(root, assign_inline_sizes, assign_block_sizes); } -pub fn build_display_list_for_subtree(root: &mut FlowRef, +pub fn build_display_list_for_subtree(flow_root: &mut Flow, root_stacking_context: &mut StackingContext, shared_layout_context: &SharedLayoutContext) -> Vec { - let flow_root = flow_ref::deref_mut(root); flow_root.traverse_preorder(&ComputeAbsolutePositions { layout_context: shared_layout_context }); let mut children = vec![]; flow_root.collect_stacking_contexts(root_stacking_context.id, @@ -89,13 +85,13 @@ pub fn build_display_list_for_subtree(root: &mut FlowRef, root_stacking_context.add_children(children); let mut build_display_list = BuildDisplayList { state: DisplayListBuildState::new(shared_layout_context, - flow::base(&*flow_root).stacking_context_id), + flow::base(flow_root).stacking_context_id), }; - build_display_list.traverse(&mut *flow_root); + build_display_list.traverse(flow_root); build_display_list.state.items } -pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut FlowRef, +pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut Flow, iterator: &mut FragmentBorderBoxIterator) { fn doit(flow: &mut Flow, level: i32, @@ -117,7 +113,7 @@ pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut FlowRef, } } - doit(flow_ref::deref_mut(root), 0, iterator, &Point2D::zero()); + doit(root, 0, iterator, &Point2D::zero()); } pub fn store_overflow(layout_context: &LayoutContext, flow: &mut Flow) { diff --git a/servo/components/layout_thread/lib.rs b/servo/components/layout_thread/lib.rs index 8d01b9b0a74b..05a983b274d0 100644 --- a/servo/components/layout_thread/lib.rs +++ b/servo/components/layout_thread/lib.rs @@ -872,7 +872,7 @@ impl LayoutThread { /// This corresponds to `Reflow()` in Gecko and `layout()` in WebKit/Blink and should be /// benchmarked against those two. It is marked `#[inline(never)]` to aid profiling. #[inline(never)] - fn solve_constraints(layout_root: &mut FlowRef, + fn solve_constraints(layout_root: &mut Flow, shared_layout_context: &SharedLayoutContext) { let _scope = layout_debug_scope!("solve_constraints"); sequential::traverse_flow_tree_preorder(layout_root, shared_layout_context); @@ -884,7 +884,7 @@ impl LayoutThread { /// benchmarked against those two. It is marked `#[inline(never)]` to aid profiling. #[inline(never)] fn solve_constraints_parallel(traversal: &mut WorkQueue, - layout_root: &mut FlowRef, + layout_root: &mut Flow, profiler_metadata: Option, time_profiler_chan: time::ProfilerChan, shared_layout_context: &SharedLayoutContext) { @@ -901,23 +901,23 @@ impl LayoutThread { fn compute_abs_pos_and_build_display_list(&mut self, data: &Reflow, - layout_root: &mut FlowRef, + layout_root: &mut Flow, shared_layout_context: &mut SharedLayoutContext, rw_data: &mut LayoutThreadData) { - let writing_mode = flow::base(&**layout_root).writing_mode; + let writing_mode = flow::base(layout_root).writing_mode; let (metadata, sender) = (self.profiler_metadata(), self.time_profiler_chan.clone()); profile(time::ProfilerCategory::LayoutDispListBuild, metadata.clone(), sender.clone(), || { - flow::mut_base(flow_ref::deref_mut(layout_root)).stacking_relative_position = + flow::mut_base(layout_root).stacking_relative_position = LogicalPoint::zero(writing_mode).to_physical(writing_mode, self.viewport_size); - flow::mut_base(flow_ref::deref_mut(layout_root)).clip = + flow::mut_base(layout_root).clip = ClippingRegion::from_rect(&data.page_clip_rect); - if flow::base(&**layout_root).restyle_damage.contains(REPAINT) || + if flow::base(layout_root).restyle_damage.contains(REPAINT) || rw_data.display_list.is_none() { let mut root_stacking_context = StackingContext::new(StackingContextId::new(0), StackingContextType::Real, @@ -939,10 +939,9 @@ impl LayoutThread { debug!("Done building display list."); - let root_background_color = get_root_flow_background_color( - flow_ref::deref_mut(layout_root)); + let root_background_color = get_root_flow_background_color(layout_root); let root_size = { - let root_flow = flow::base(&**layout_root); + let root_flow = flow::base(layout_root); if rw_data.stylist.viewport_constraints().is_some() { root_flow.position.size.to_physical(root_flow.writing_mode) } else { @@ -992,8 +991,7 @@ impl LayoutThread { epoch, Some(root_scroll_layer_id), &mut frame_builder); - let root_background_color = get_root_flow_background_color( - flow_ref::deref_mut(layout_root)); + let root_background_color = get_root_flow_background_color(layout_root); let root_background_color = webrender_traits::ColorF::new(root_background_color.r, root_background_color.g, @@ -1211,14 +1209,15 @@ impl LayoutThread { &mut shared_layout_context); if let Some(mut root_flow) = self.root_flow.clone() { + let root_flow = flow_ref::deref_mut(&mut root_flow); match data.query_type { ReflowQueryType::ContentBoxQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; - rw_data.content_box_response = process_content_box_request(node, &mut root_flow); + rw_data.content_box_response = process_content_box_request(node, root_flow); }, ReflowQueryType::ContentBoxesQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; - rw_data.content_boxes_response = process_content_boxes_request(node, &mut root_flow); + rw_data.content_boxes_response = process_content_boxes_request(node, root_flow); }, ReflowQueryType::HitTestQuery(translated_point, client_point, update_cursor) => { let translated_point = @@ -1239,11 +1238,11 @@ impl LayoutThread { }, ReflowQueryType::NodeGeometryQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; - rw_data.client_rect_response = process_node_geometry_request(node, &mut root_flow); + rw_data.client_rect_response = process_node_geometry_request(node, root_flow); }, ReflowQueryType::NodeScrollGeometryQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; - rw_data.scroll_area_response = process_node_scroll_area_request(node, &mut root_flow); + rw_data.scroll_area_response = process_node_scroll_area_request(node, root_flow); }, ReflowQueryType::NodeOverflowQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; @@ -1261,11 +1260,11 @@ impl LayoutThread { &layout_context, pseudo, property, - &mut root_flow); + root_flow); }, ReflowQueryType::OffsetParentQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; - rw_data.offset_parent_response = process_offset_parent_query(node, &mut root_flow); + rw_data.offset_parent_response = process_offset_parent_query(node, root_flow); }, ReflowQueryType::MarginStyleQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; @@ -1446,7 +1445,7 @@ impl LayoutThread { profile(time::ProfilerCategory::LayoutGeneratedContent, self.profiler_metadata(), self.time_profiler_chan.clone(), - || sequential::resolve_generated_content(&mut root_flow, &layout_context)); + || sequential::resolve_generated_content(flow_ref::deref_mut(&mut root_flow), &layout_context)); // Guess float placement. profile(time::ProfilerCategory::LayoutFloatPlacementSpeculation, @@ -1465,15 +1464,15 @@ impl LayoutThread { match self.parallel_traversal { None => { // Sequential mode. - LayoutThread::solve_constraints(&mut root_flow, &layout_context) + LayoutThread::solve_constraints(flow_ref::deref_mut(&mut root_flow), &layout_context) } Some(ref mut parallel) => { // Parallel mode. LayoutThread::solve_constraints_parallel(parallel, - &mut root_flow, - profiler_metadata, - self.time_profiler_chan.clone(), - &*layout_context); + flow_ref::deref_mut(&mut root_flow), + profiler_metadata, + self.time_profiler_chan.clone(), + &*layout_context); } } }); @@ -1499,7 +1498,7 @@ impl LayoutThread { // Build the display list if necessary, and send it to the painter. if let Some(mut root_flow) = self.root_flow.clone() { self.compute_abs_pos_and_build_display_list(data, - &mut root_flow, + flow_ref::deref_mut(&mut root_flow), &mut *layout_context, rw_data); self.first_reflow = false;