Introduce PositioningContext

This commit is contained in:
Simon Sapin 2019-12-12 15:37:01 +01:00
parent 06e3d13795
commit b43a3de51d
5 changed files with 90 additions and 69 deletions

View file

@ -12,7 +12,8 @@ use crate::formatting_contexts::IndependentFormattingContext;
use crate::fragments::Fragment;
use crate::geom;
use crate::geom::flow_relative::Vec2;
use crate::positioned::{AbsolutelyPositionedBox, AbsolutelyPositionedFragment};
use crate::positioned::PositioningContext;
use crate::positioned::{AbsolutelyPositionedBox, CollectedAbsolutelyPositionedBox};
use crate::replaced::ReplacedContent;
use crate::sizing::ContentSizesRequest;
use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside};
@ -110,24 +111,25 @@ impl BoxTreeRoot {
};
let dummy_tree_rank = 0;
let mut absolutely_positioned_fragments = vec![];
let mut positioning_context = PositioningContext { abspos: Vec::new() };
let mut independent_layout = self.0.layout(
layout_context,
&mut positioning_context,
&(&initial_containing_block).into(),
dummy_tree_rank,
&mut absolutely_positioned_fragments,
);
let map =
|a: &AbsolutelyPositionedFragment| a.layout(layout_context, &initial_containing_block);
let map = |a: &CollectedAbsolutelyPositionedBox| {
a.layout(layout_context, &initial_containing_block)
};
if layout_context.use_rayon {
independent_layout
.fragments
.par_extend(absolutely_positioned_fragments.par_iter().map(map))
.par_extend(positioning_context.abspos.par_iter().map(map))
} else {
independent_layout
.fragments
.extend(absolutely_positioned_fragments.iter().map(map))
.extend(positioning_context.abspos.iter().map(map))
}
FragmentTreeRoot(independent_layout.fragments)