Skip to content

Commit

Permalink
Separate stacking context collection and display list building state
Browse files Browse the repository at this point in the history
These are two different passes during layout, but previously they
shared a state object. While some of the members are the same, many are
different so we separate them out into two separate objects. We also
change the HashMaps of these state objects to use the FnvHashMap.
  • Loading branch information
mrobinson committed Sep 12, 2017
1 parent bffe158 commit ee46bc5
Show file tree
Hide file tree
Showing 15 changed files with 153 additions and 94 deletions.
3 changes: 2 additions & 1 deletion components/layout/block.rs
Expand Up @@ -31,6 +31,7 @@ use app_units::{Au, MAX_AU};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, BorderPaintingMode};
use display_list_builder::{DisplayListBuildState, EstablishContainingBlock};
use display_list_builder::StackingContextCollectionState;
use euclid::{Point2D, Rect, SideOffsets2D, Size2D};
use floats::{ClearType, FloatKind, Floats, PlacementInfo};
use flow::{self, BaseFlow, EarlyAbsolutePositionInfo, Flow, FlowClass, ForceNonfloatedFlag};
Expand Down Expand Up @@ -2150,7 +2151,7 @@ impl Flow for BlockFlow {
}
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.collect_stacking_contexts_for_block(state, EstablishContainingBlock::Yes);
}

Expand Down
192 changes: 121 additions & 71 deletions components/layout/display_list_builder.rs

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion components/layout/flex.rs
Expand Up @@ -10,6 +10,7 @@ use app_units::{Au, MAX_AU};
use block::{AbsoluteAssignBSizesTraversal, BlockFlow, MarginsMayCollapseFlag};
use context::LayoutContext;
use display_list_builder::{DisplayListBuildState, FlexFlowDisplayListBuilding};
use display_list_builder::StackingContextCollectionState;
use euclid::Point2D;
use floats::FloatKind;
use flow;
Expand Down Expand Up @@ -988,7 +989,7 @@ impl Flow for FlexFlow {
self.build_display_list_for_flex(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts(state);
}

Expand Down
7 changes: 4 additions & 3 deletions components/layout/flow.rs
Expand Up @@ -28,7 +28,7 @@
use app_units::Au;
use block::{BlockFlow, FormattingContextType};
use context::LayoutContext;
use display_list_builder::DisplayListBuildState;
use display_list_builder::{DisplayListBuildState, StackingContextCollectionState};
use euclid::{Transform3D, Point2D, Vector2D, Rect, Size2D};
use flex::FlexFlow;
use floats::{Floats, SpeculatedFloatPlacement};
Expand Down Expand Up @@ -223,7 +223,7 @@ pub trait Flow: fmt::Debug + Sync + Send + 'static {
None
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState);
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState);

/// If this is a float, places it. The default implementation does nothing.
fn place_float_if_applicable<'a>(&mut self) {}
Expand Down Expand Up @@ -1106,7 +1106,8 @@ impl BaseFlow {
return self as *const BaseFlow as usize;
}

pub fn collect_stacking_contexts_for_children(&mut self, state: &mut DisplayListBuildState) {
pub fn collect_stacking_contexts_for_children(&mut self,
state: &mut StackingContextCollectionState) {
for kid in self.children.iter_mut() {
kid.collect_stacking_contexts(state);
}
Expand Down
3 changes: 2 additions & 1 deletion components/layout/inline.rs
Expand Up @@ -9,6 +9,7 @@ use app_units::{Au, MIN_AU};
use block::AbsoluteAssignBSizesTraversal;
use context::LayoutContext;
use display_list_builder::{DisplayListBuildState, InlineFlowDisplayListBuilding};
use display_list_builder::StackingContextCollectionState;
use euclid::{Point2D, Size2D};
use floats::{FloatKind, Floats, PlacementInfo};
use flow::{self, BaseFlow, Flow, FlowClass, ForceNonfloatedFlag};
Expand Down Expand Up @@ -1655,7 +1656,7 @@ impl Flow for InlineFlow {

fn update_late_computed_block_position_if_necessary(&mut self, _: Au) {}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.collect_stacking_contexts_for_inline(state);
}

Expand Down
3 changes: 2 additions & 1 deletion components/layout/list_item.rs
Expand Up @@ -11,6 +11,7 @@ use app_units::Au;
use block::BlockFlow;
use context::{LayoutContext, with_thread_local_font_context};
use display_list_builder::{DisplayListBuildState, ListItemFlowDisplayListBuilding};
use display_list_builder::StackingContextCollectionState;
use euclid::Point2D;
use floats::FloatKind;
use flow::{Flow, FlowClass, OpaqueFlow};
Expand Down Expand Up @@ -147,7 +148,7 @@ impl Flow for ListItemFlow {
self.build_display_list_for_list_item(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts(state);
}

Expand Down
6 changes: 3 additions & 3 deletions components/layout/multicol.rs
Expand Up @@ -10,7 +10,7 @@ use ServoArc;
use app_units::Au;
use block::BlockFlow;
use context::LayoutContext;
use display_list_builder::DisplayListBuildState;
use display_list_builder::{DisplayListBuildState, StackingContextCollectionState};
use euclid::{Point2D, Vector2D};
use floats::FloatKind;
use flow::{Flow, FlowClass, OpaqueFlow, mut_base, FragmentationContext};
Expand Down Expand Up @@ -189,7 +189,7 @@ impl Flow for MulticolFlow {
self.block_flow.build_display_list(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts(state);
}

Expand Down Expand Up @@ -279,7 +279,7 @@ impl Flow for MulticolColumnFlow {
self.block_flow.build_display_list(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts(state);
}

Expand Down
5 changes: 3 additions & 2 deletions components/layout/sequential.rs
Expand Up @@ -6,7 +6,7 @@

use app_units::Au;
use context::LayoutContext;
use display_list_builder::DisplayListBuildState;
use display_list_builder::{DisplayListBuildState, StackingContextCollectionState};
use euclid::{Point2D, Vector2D};
use floats::SpeculatedFloatPlacement;
use flow::{self, Flow, ImmutableFlowUtils, IS_ABSOLUTELY_POSITIONED};
Expand Down Expand Up @@ -69,9 +69,10 @@ pub fn reflow(root: &mut Flow, layout_context: &LayoutContext, relayout_mode: Re
pub fn build_display_list_for_subtree<'a>(flow_root: &mut Flow,
layout_context: &'a LayoutContext)
-> DisplayListBuildState<'a> {
let mut state = DisplayListBuildState::new(layout_context);
let mut state = StackingContextCollectionState::new(layout_context.id);
flow_root.collect_stacking_contexts(&mut state);

let state = DisplayListBuildState::new(layout_context, state);
let mut build_display_list = BuildDisplayList {
state: state,
};
Expand Down
3 changes: 2 additions & 1 deletion components/layout/table.rs
Expand Up @@ -12,6 +12,7 @@ use block::{ISizeConstraintInput, ISizeConstraintSolution};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, BorderPaintingMode};
use display_list_builder::{DisplayListBuildState, EstablishContainingBlock};
use display_list_builder::StackingContextCollectionState;
use euclid::Point2D;
use flow;
use flow::{BaseFlow, EarlyAbsolutePositionInfo, Flow, FlowClass, ImmutableFlowUtils, OpaqueFlow};
Expand Down Expand Up @@ -503,7 +504,7 @@ impl Flow for TableFlow {
self.block_flow.build_display_list_for_block(state, border_painting_mode);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::Yes);
}

Expand Down
4 changes: 2 additions & 2 deletions components/layout/table_caption.rs
Expand Up @@ -10,7 +10,7 @@ use app_units::Au;
use block::BlockFlow;
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, DisplayListBuildState};
use display_list_builder::EstablishContainingBlock;
use display_list_builder::{EstablishContainingBlock, StackingContextCollectionState};
use euclid::Point2D;
use flow::{Flow, FlowClass, OpaqueFlow};
use fragment::{Fragment, FragmentBorderBoxIterator, Overflow};
Expand Down Expand Up @@ -80,7 +80,7 @@ impl Flow for TableCaptionFlow {
self.block_flow.build_display_list(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::No);
}

Expand Down
3 changes: 2 additions & 1 deletion components/layout/table_cell.rs
Expand Up @@ -11,6 +11,7 @@ use block::{BlockFlow, ISizeAndMarginsComputer, MarginsMayCollapseFlag};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, BorderPaintingMode};
use display_list_builder::{DisplayListBuildState, EstablishContainingBlock};
use display_list_builder::StackingContextCollectionState;
use euclid::{Point2D, Rect, SideOffsets2D, Size2D};
use flow::{self, Flow, FlowClass, IS_ABSOLUTELY_POSITIONED, OpaqueFlow};
use fragment::{Fragment, FragmentBorderBoxIterator, Overflow};
Expand Down Expand Up @@ -261,7 +262,7 @@ impl Flow for TableCellFlow {
self.block_flow.build_display_list_for_block(state, border_painting_mode)
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::No);
}

Expand Down
4 changes: 2 additions & 2 deletions components/layout/table_colgroup.rs
Expand Up @@ -8,7 +8,7 @@

use app_units::Au;
use context::LayoutContext;
use display_list_builder::DisplayListBuildState;
use display_list_builder::{DisplayListBuildState, StackingContextCollectionState};
use euclid::Point2D;
use flow::{BaseFlow, Flow, FlowClass, ForceNonfloatedFlag, OpaqueFlow};
use fragment::{Fragment, FragmentBorderBoxIterator, Overflow, SpecificFragmentInfo};
Expand Down Expand Up @@ -92,7 +92,7 @@ impl Flow for TableColGroupFlow {
// Table columns are invisible.
fn build_display_list(&mut self, _: &mut DisplayListBuildState) { }

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.base.stacking_context_id = state.current_stacking_context_id;
self.base.clip_and_scroll_info = Some(state.current_clip_and_scroll_info);
}
Expand Down
3 changes: 2 additions & 1 deletion components/layout/table_row.rs
Expand Up @@ -11,6 +11,7 @@ use block::{BlockFlow, ISizeAndMarginsComputer};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, BorderPaintingMode};
use display_list_builder::{DisplayListBuildState, EstablishContainingBlock};
use display_list_builder::StackingContextCollectionState;
use euclid::Point2D;
use flow::{self, EarlyAbsolutePositionInfo, Flow, FlowClass, ImmutableFlowUtils, OpaqueFlow};
use flow_list::MutFlowListIterator;
Expand Down Expand Up @@ -478,7 +479,7 @@ impl Flow for TableRowFlow {
self.block_flow.build_display_list_for_block(state, border_painting_mode);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::No);
}

Expand Down
4 changes: 2 additions & 2 deletions components/layout/table_rowgroup.rs
Expand Up @@ -10,7 +10,7 @@ use app_units::Au;
use block::{BlockFlow, ISizeAndMarginsComputer};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, DisplayListBuildState};
use display_list_builder::EstablishContainingBlock;
use display_list_builder::{EstablishContainingBlock, StackingContextCollectionState};
use euclid::Point2D;
use flow::{Flow, FlowClass, OpaqueFlow};
use fragment::{Fragment, FragmentBorderBoxIterator, Overflow};
Expand Down Expand Up @@ -183,7 +183,7 @@ impl Flow for TableRowGroupFlow {
self.block_flow.build_display_list(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::No);
}

Expand Down
4 changes: 2 additions & 2 deletions components/layout/table_wrapper.rs
Expand Up @@ -18,7 +18,7 @@ use block::{AbsoluteNonReplaced, BlockFlow, FloatNonReplaced, ISizeAndMarginsCom
use block::{ISizeConstraintSolution, MarginsMayCollapseFlag};
use context::LayoutContext;
use display_list_builder::{BlockFlowDisplayListBuilding, DisplayListBuildState};
use display_list_builder::EstablishContainingBlock;
use display_list_builder::{EstablishContainingBlock, StackingContextCollectionState};
use euclid::Point2D;
use floats::FloatKind;
use flow::{Flow, FlowClass, ImmutableFlowUtils, INLINE_POSITION_IS_STATIC, OpaqueFlow};
Expand Down Expand Up @@ -457,7 +457,7 @@ impl Flow for TableWrapperFlow {
self.block_flow.build_display_list(state);
}

fn collect_stacking_contexts(&mut self, state: &mut DisplayListBuildState) {
fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) {
self.block_flow.collect_stacking_contexts_for_block(state, EstablishContainingBlock::No);
}

Expand Down

0 comments on commit ee46bc5

Please sign in to comment.