diff options
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r-- | components/layout_2020/flow/construct.rs | 91 |
1 files changed, 44 insertions, 47 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs index 5d9cd433434..606628d5744 100644 --- a/components/layout_2020/flow/construct.rs +++ b/components/layout_2020/flow/construct.rs @@ -10,7 +10,7 @@ use crate::flow::inline::{InlineBox, InlineFormattingContext, InlineLevelBox, Te use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox}; use crate::formatting_contexts::IndependentFormattingContext; use crate::positioned::AbsolutelyPositionedBox; -use crate::sizing::{outer_inline_content_sizes, ContentSizes}; +use crate::sizing::{outer_inline_content_sizes, ContentSizes, ContentSizesRequest}; use crate::style_ext::{ComputedValuesExt, DisplayGeneratingBox, DisplayInside, DisplayOutside}; use rayon::iter::{IntoParallelIterator, ParallelIterator}; use rayon_croissant::ParallelIteratorExt; @@ -24,17 +24,17 @@ impl BlockFormattingContext { context: &LayoutContext, style: &Arc<ComputedValues>, contents: NonReplacedContents<impl NodeExt<'dom>>, - request_content_sizes: bool, + content_sizes: ContentSizesRequest, ) -> (Self, Option<ContentSizes>) { - let (contents, contains_floats, content_sizes) = - BlockContainer::construct(context, style, contents, request_content_sizes); - // FIXME: add contribution to `content_sizes` of floats in this formatting context + let (contents, contains_floats, inline_content_sizes) = + BlockContainer::construct(context, style, contents, content_sizes); + // FIXME: add contribution to `inline_content_sizes` of floats in this formatting context // https://dbaron.org/css/intrinsic/#intrinsic let bfc = Self { contents, contains_floats: contains_floats == ContainsFloats::Yes, }; - (bfc, content_sizes) + (bfc, inline_content_sizes) } } @@ -133,7 +133,7 @@ impl BlockContainer { context: &LayoutContext, block_container_style: &Arc<ComputedValues>, contents: NonReplacedContents<impl NodeExt<'dom>>, - request_content_sizes: bool, + content_sizes: ContentSizesRequest, ) -> (BlockContainer, ContainsFloats, Option<ContentSizes>) { let mut builder = BlockContainerBuilder { context, @@ -155,19 +155,15 @@ impl BlockContainer { .is_empty() { if builder.block_level_boxes.is_empty() { - let content_sizes = if request_content_sizes { - Some( - builder - .ongoing_inline_formatting_context - .inline_content_sizes(context), - ) - } else { - None - }; + let inline_content_sizes = content_sizes.if_requests_inline(|| { + builder + .ongoing_inline_formatting_context + .inline_content_sizes(context) + }); let container = BlockContainer::InlineFormattingContext( builder.ongoing_inline_formatting_context, ); - return (container, builder.contains_floats, content_sizes); + return (container, builder.contains_floats, inline_content_sizes); } builder.end_ongoing_inline_formatting_context(); } @@ -195,11 +191,8 @@ impl BlockContainer { |target, (intermediate, box_slot): (Intermediate<_>, BoxSlot<'_>)| { let (block_level_box, box_contains_floats) = intermediate.finish( context, - if request_content_sizes { - Some(&mut target.outer_content_sizes_of_children) - } else { - None - }, + content_sizes + .if_requests_inline(|| &mut target.outer_content_sizes_of_children), ); target.contains_floats |= box_contains_floats; box_slot.set(LayoutBox::BlockLevel(block_level_box.clone())); @@ -207,19 +200,21 @@ impl BlockContainer { }, |left, right| { left.contains_floats |= right.contains_floats; - if request_content_sizes { + if content_sizes.requests_inline() { left.outer_content_sizes_of_children .max_assign(&right.outer_content_sizes_of_children) } }, ); let container = BlockContainer::BlockLevelBoxes(iter.collect()); - let content_sizes = if request_content_sizes { - Some(target.outer_content_sizes_of_children) - } else { - None - }; - (container, target.contains_floats, content_sizes) + + let Target { + contains_floats, + outer_content_sizes_of_children, + } = target; + let inline_content_sizes = + content_sizes.if_requests_inline(|| outer_content_sizes_of_children); + (container, contains_floats, inline_content_sizes) } } @@ -393,14 +388,13 @@ where inline_box.last_fragment = true; Arc::new(InlineLevelBox::InlineBox(inline_box)) } else { - let request_content_sizes = style.inline_size_is_auto(); Arc::new(InlineLevelBox::Atomic( IndependentFormattingContext::construct( self.context, style.clone(), display_inside, contents, - request_content_sizes, + ContentSizesRequest::inline_if(style.inline_size_is_auto()), ), )) }; @@ -592,12 +586,16 @@ where ) -> (Arc<BlockLevelBox>, ContainsFloats) { match self { IntermediateBlockLevelBox::SameFormattingContextBlock { style, contents } => { - let request_content_sizes = max_assign_in_flow_outer_content_sizes_to.is_some() && - style.inline_size_is_auto(); - let (contents, contains_floats, content_sizes) = - contents.finish(context, &style, request_content_sizes); + let (contents, contains_floats, inline_content_sizes) = contents.finish( + context, + &style, + ContentSizesRequest::inline_if( + max_assign_in_flow_outer_content_sizes_to.is_some() && + style.inline_size_is_auto(), + ), + ); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { - to.max_assign(&outer_inline_content_sizes(&style, &content_sizes)) + to.max_assign(&outer_inline_content_sizes(&style, &inline_content_sizes)) } let block_level_box = Arc::new(BlockLevelBox::SameFormattingContextBlock { contents, style }); @@ -608,14 +606,16 @@ where display_inside, contents, } => { - let request_content_sizes = max_assign_in_flow_outer_content_sizes_to.is_some() && - style.inline_size_is_auto(); + let content_sizes = ContentSizesRequest::inline_if( + max_assign_in_flow_outer_content_sizes_to.is_some() && + style.inline_size_is_auto(), + ); let contents = IndependentFormattingContext::construct( context, style, display_inside, contents, - request_content_sizes, + content_sizes, ); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { to.max_assign(&outer_inline_content_sizes( @@ -660,25 +660,22 @@ where self, context: &LayoutContext, style: &Arc<ComputedValues>, - request_content_sizes: bool, + content_sizes: ContentSizesRequest, ) -> (BlockContainer, ContainsFloats, Option<ContentSizes>) { match self { IntermediateBlockContainer::Deferred { contents } => { - BlockContainer::construct(context, style, contents, request_content_sizes) + BlockContainer::construct(context, style, contents, content_sizes) }, IntermediateBlockContainer::InlineFormattingContext(ifc) => { - let content_sizes = if request_content_sizes { - Some(ifc.inline_content_sizes(context)) - } else { - None - }; + let inline_content_sizes = + content_sizes.if_requests_inline(|| ifc.inline_content_sizes(context)); // 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, + inline_content_sizes, ) }, } |