aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/construct.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r--components/layout_2020/flow/construct.rs143
1 files changed, 22 insertions, 121 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs
index 7d72209c6e8..d4151e13c51 100644
--- a/components/layout_2020/flow/construct.rs
+++ b/components/layout_2020/flow/construct.rs
@@ -14,14 +14,12 @@ use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox};
use crate::formatting_contexts::IndependentFormattingContext;
use crate::fragments::Tag;
use crate::positioned::AbsolutelyPositionedBox;
-use crate::sizing::{self, BoxContentSizes, ContentSizes, ContentSizesRequest};
-use crate::style_ext::{ComputedValuesExt, DisplayGeneratingBox, DisplayInside, DisplayOutside};
+use crate::style_ext::{DisplayGeneratingBox, DisplayInside, DisplayOutside};
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use rayon_croissant::ParallelIteratorExt;
use servo_arc::Arc;
use std::borrow::Cow;
use std::convert::{TryFrom, TryInto};
-use style::logical_geometry::WritingMode;
use style::properties::ComputedValues;
use style::selector_parser::PseudoElement;
use style::values::specified::text::TextDecorationLine;
@@ -31,34 +29,24 @@ impl BlockFormattingContext {
context: &LayoutContext,
info: &NodeAndStyleInfo<Node>,
contents: NonReplacedContents,
- content_sizes: ContentSizesRequest,
propagated_text_decoration_line: TextDecorationLine,
- ) -> (Self, BoxContentSizes)
+ ) -> Self
where
Node: NodeExt<'dom>,
{
- let (contents, contains_floats, inline_content_sizes) = BlockContainer::construct(
- context,
- info,
- contents,
- content_sizes,
- propagated_text_decoration_line,
- );
- // FIXME: add contribution to `inline_content_sizes` of floats in this formatting context
- // https://dbaron.org/css/intrinsic/#intrinsic
+ let (contents, contains_floats) =
+ BlockContainer::construct(context, info, contents, propagated_text_decoration_line);
let bfc = Self {
contents,
contains_floats: contains_floats == ContainsFloats::Yes,
};
- (bfc, inline_content_sizes)
+ bfc
}
pub fn construct_for_text_runs<'dom>(
- context: &LayoutContext,
runs: impl Iterator<Item = TextRun>,
- content_sizes: ContentSizesRequest,
text_decoration_line: TextDecorationLine,
- ) -> (Self, BoxContentSizes) {
+ ) -> Self {
// FIXME: do white space collapsing
let inline_level_boxes = runs
.map(|run| ArcRefCell::new(InlineLevelBox::TextRun(run)))
@@ -68,18 +56,12 @@ impl BlockFormattingContext {
inline_level_boxes,
text_decoration_line,
};
- // FIXME: this is the wrong writing mode
- // but we plan to remove eager content size computation.
- let not_actually_containing_block_writing_mode = WritingMode::empty();
- let content_sizes = content_sizes.compute(|| {
- ifc.inline_content_sizes(context, not_actually_containing_block_writing_mode)
- });
let contents = BlockContainer::InlineFormattingContext(ifc);
let bfc = Self {
contents,
contains_floats: false,
};
- (bfc, content_sizes)
+ bfc
}
}
@@ -181,9 +163,8 @@ impl BlockContainer {
context: &LayoutContext,
info: &NodeAndStyleInfo<Node>,
contents: NonReplacedContents,
- content_sizes: ContentSizesRequest,
propagated_text_decoration_line: TextDecorationLine,
- ) -> (BlockContainer, ContainsFloats, BoxContentSizes)
+ ) -> (BlockContainer, ContainsFloats)
where
Node: NodeExt<'dom>,
{
@@ -209,36 +190,18 @@ impl BlockContainer {
.is_empty()
{
if builder.block_level_boxes.is_empty() {
- // FIXME: this is the wrong writing mode
- // but we plan to remove eager content size computation.
- let not_actually_containing_block_writing_mode = info.style.writing_mode;
- let content_sizes = content_sizes.compute(|| {
- builder
- .ongoing_inline_formatting_context
- .inline_content_sizes(context, not_actually_containing_block_writing_mode)
- });
let container = BlockContainer::InlineFormattingContext(
builder.ongoing_inline_formatting_context,
);
- return (container, builder.contains_floats, content_sizes);
+ return (container, builder.contains_floats);
}
builder.end_ongoing_inline_formatting_context();
}
- struct Accumulator {
- contains_floats: ContainsFloats,
- outer_content_sizes_of_children: ContentSizes,
- }
- let mut acc = Accumulator {
- contains_floats: builder.contains_floats,
- outer_content_sizes_of_children: ContentSizes::zero(),
- };
- let mapfold = |acc: &mut Accumulator, creator: BlockLevelJob<'dom, _>| {
- let (block_level_box, box_contains_floats) = creator.finish(
- context,
- content_sizes.if_requests_inline(|| &mut acc.outer_content_sizes_of_children),
- );
- acc.contains_floats |= box_contains_floats;
+ let mut contains_floats = builder.contains_floats;
+ let mapfold = |contains_floats: &mut ContainsFloats, creator: BlockLevelJob<'dom, _>| {
+ let (block_level_box, box_contains_floats) = creator.finish(context);
+ *contains_floats |= box_contains_floats;
block_level_box
};
let block_level_boxes = if context.use_rayon {
@@ -246,18 +209,11 @@ impl BlockContainer {
.block_level_boxes
.into_par_iter()
.mapfold_reduce_into(
- &mut acc,
+ &mut contains_floats,
mapfold,
- || Accumulator {
- contains_floats: ContainsFloats::No,
- outer_content_sizes_of_children: ContentSizes::zero(),
- },
+ || ContainsFloats::No,
|left, right| {
- left.contains_floats |= right.contains_floats;
- if content_sizes.requests_inline() {
- left.outer_content_sizes_of_children
- .max_assign(&right.outer_content_sizes_of_children)
- }
+ *left |= right;
},
)
.collect()
@@ -265,17 +221,12 @@ impl BlockContainer {
builder
.block_level_boxes
.into_iter()
- .map(|x| mapfold(&mut acc, x))
+ .map(|x| mapfold(&mut contains_floats, x))
.collect()
};
let container = BlockContainer::BlockLevelBoxes(block_level_boxes);
- let Accumulator {
- contains_floats,
- outer_content_sizes_of_children,
- } = acc;
- let content_sizes = content_sizes.compute(|| outer_content_sizes_of_children);
- (container, contains_floats, content_sizes)
+ (container, contains_floats)
}
}
@@ -439,7 +390,6 @@ where
display_inside: DisplayInside,
contents: Contents,
) -> ArcRefCell<InlineLevelBox> {
- let style = &info.style;
let box_ = if display_inside == DisplayInside::Flow && !contents.is_replaced() {
// We found un inline box.
// Whatever happened before, all we need to do before recurring
@@ -464,14 +414,12 @@ where
inline_box.last_fragment = true;
ArcRefCell::new(InlineLevelBox::InlineBox(inline_box))
} else {
- let content_sizes = ContentSizesRequest::inline_if(!style.inline_size_is_length());
ArcRefCell::new(InlineLevelBox::Atomic(
IndependentFormattingContext::construct(
self.context,
info,
display_inside,
contents,
- content_sizes,
// Text decorations are not propagated to atomic inline-level descendants.
TextDecorationLine::NONE,
),
@@ -681,32 +629,11 @@ impl<'dom, Node> BlockLevelJob<'dom, Node>
where
Node: NodeExt<'dom>,
{
- fn finish(
- self,
- context: &LayoutContext,
- max_assign_in_flow_outer_content_sizes_to: Option<&mut ContentSizes>,
- ) -> (ArcRefCell<BlockLevelBox>, ContainsFloats) {
+ fn finish(self, context: &LayoutContext) -> (ArcRefCell<BlockLevelBox>, ContainsFloats) {
let info = &self.info;
- // FIXME: this is the wrong writing mode
- // but we plan to remove eager content size computation.
- let not_actually_containing_block_writing_mode = info.style.writing_mode;
let (block_level_box, contains_floats) = match self.kind {
BlockLevelCreator::SameFormattingContextBlock(contents) => {
- let (contents, contains_floats, box_content_sizes) = contents.finish(
- context,
- info,
- ContentSizesRequest::inline_if(
- max_assign_in_flow_outer_content_sizes_to.is_some() &&
- !info.style.inline_size_is_length(),
- ),
- );
- if let Some(to) = max_assign_in_flow_outer_content_sizes_to {
- to.max_assign(&sizing::outer_inline(
- &info.style,
- not_actually_containing_block_writing_mode,
- || box_content_sizes.expect_inline().clone(),
- ))
- }
+ let (contents, contains_floats) = contents.finish(context, info);
let block_level_box = ArcRefCell::new(BlockLevelBox::SameFormattingContextBlock {
tag: Tag::from_node_and_style_info(info),
contents,
@@ -719,25 +646,13 @@ where
contents,
propagated_text_decoration_line,
} => {
- let content_sizes = ContentSizesRequest::inline_if(
- max_assign_in_flow_outer_content_sizes_to.is_some() &&
- !info.style.inline_size_is_length(),
- );
let context = IndependentFormattingContext::construct(
context,
info,
display_inside,
contents,
- content_sizes,
propagated_text_decoration_line,
);
- if let Some(to) = max_assign_in_flow_outer_content_sizes_to {
- to.max_assign(&sizing::outer_inline(
- &context.style(),
- not_actually_containing_block_writing_mode,
- || context.content_sizes(),
- ))
- }
(
ArcRefCell::new(BlockLevelBox::Independent(context)),
ContainsFloats::No,
@@ -775,35 +690,21 @@ impl IntermediateBlockContainer {
self,
context: &LayoutContext,
info: &NodeAndStyleInfo<Node>,
- content_sizes: ContentSizesRequest,
- ) -> (BlockContainer, ContainsFloats, BoxContentSizes)
+ ) -> (BlockContainer, ContainsFloats)
where
Node: NodeExt<'dom>,
{
match self {
IntermediateBlockContainer::Deferred(contents, propagated_text_decoration_line) => {
- BlockContainer::construct(
- context,
- info,
- contents,
- content_sizes,
- propagated_text_decoration_line,
- )
+ BlockContainer::construct(context, info, contents, propagated_text_decoration_line)
},
IntermediateBlockContainer::InlineFormattingContext(ifc) => {
- // FIXME: this is the wrong writing mode
- // but we plan to remove eager content size computation.
- let not_actually_containing_block_writing_mode = info.style.writing_mode;
- let content_sizes = content_sizes.compute(|| {
- ifc.inline_content_sizes(context, not_actually_containing_block_writing_mode)
- });
// If that inline formatting context contained any float, those
// were already taken into account during the first phase of
// box construction.
(
BlockContainer::InlineFormattingContext(ifc),
ContainsFloats::No,
- content_sizes,
)
},
}