aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/flow')
-rw-r--r--components/layout_2020/flow/inline/mod.rs18
-rw-r--r--components/layout_2020/flow/mod.rs49
-rw-r--r--components/layout_2020/flow/root.rs1
3 files changed, 38 insertions, 30 deletions
diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs
index a43a9333040..e9007ce2e45 100644
--- a/components/layout_2020/flow/inline/mod.rs
+++ b/components/layout_2020/flow/inline/mod.rs
@@ -109,15 +109,17 @@ use unicode_bidi::{BidiInfo, Level};
use webrender_api::FontInstanceKey;
use xi_unicode::linebreak_property;
-use super::IndependentFormattingContextContents;
use super::float::{Clear, PlacementAmongFloats};
+use super::{
+ CacheableLayoutResult, IndependentFloatOrAtomicLayoutResult,
+ IndependentFormattingContextContents,
+};
use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
+use crate::flow::CollapsibleWithParentStartMargin;
use crate::flow::float::{FloatBox, SequentialLayoutState};
-use crate::flow::{CollapsibleWithParentStartMargin, FlowLayout};
use crate::formatting_contexts::{
- Baselines, IndependentFormattingContext, IndependentLayoutResult,
- IndependentNonReplacedContents,
+ Baselines, IndependentFormattingContext, IndependentNonReplacedContents,
};
use crate::fragment_tree::{
BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment, FragmentFlags,
@@ -1585,7 +1587,7 @@ impl InlineFormattingContext {
containing_block: &ContainingBlock,
sequential_layout_state: Option<&mut SequentialLayoutState>,
collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
- ) -> FlowLayout {
+ ) -> CacheableLayoutResult {
let first_line_inline_start = if self.has_first_formatted_line {
containing_block
.style
@@ -1697,12 +1699,14 @@ impl InlineFormattingContext {
content_block_size == Au::zero() &&
collapsible_with_parent_start_margin.0;
- FlowLayout {
+ CacheableLayoutResult {
fragments: layout.fragments,
content_block_size,
collapsible_margins_in_children,
baselines: layout.baselines,
depends_on_block_constraints: layout.depends_on_block_constraints,
+ content_inline_size_for_table: None,
+ specific_layout_info: None,
}
}
@@ -1922,7 +1926,7 @@ impl IndependentFormattingContext {
// We need to know the inline size of the atomic before deciding whether to do the line break.
let mut child_positioning_context = PositioningContext::new_for_style(self.style())
.unwrap_or_else(|| PositioningContext::new_for_subtree(true));
- let IndependentLayoutResult {
+ let IndependentFloatOrAtomicLayoutResult {
mut fragment,
baselines,
pbm_sums,
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs
index 58e7310d6cd..8f38e0d4b23 100644
--- a/components/layout_2020/flow/mod.rs
+++ b/components/layout_2020/flow/mod.rs
@@ -26,7 +26,7 @@ use crate::flow::float::{
};
use crate::formatting_contexts::{
Baselines, IndependentFormattingContext, IndependentFormattingContextContents,
- IndependentLayout, IndependentLayoutResult, IndependentNonReplacedContents,
+ IndependentNonReplacedContents,
};
use crate::fragment_tree::{
BaseFragmentInfo, BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment, FragmentFlags,
@@ -35,7 +35,7 @@ use crate::geom::{
AuOrAuto, LogicalRect, LogicalSides, LogicalSides1D, LogicalVec2, PhysicalPoint, PhysicalRect,
PhysicalSides, Size, Sizes, ToLogical, ToLogicalWithContainingBlock,
};
-use crate::layout_box_base::LayoutBoxBase;
+use crate::layout_box_base::{CacheableLayoutResult, LayoutBoxBase};
use crate::positioned::{AbsolutelyPositionedBox, PositioningContext, PositioningContextLength};
use crate::replaced::ReplacedContents;
use crate::sizing::{self, ComputeInlineContentSizes, ContentSizes, InlineContentSizesResult};
@@ -219,18 +219,6 @@ impl BlockLevelBox {
}
}
-pub(crate) struct FlowLayout {
- pub fragments: Vec<Fragment>,
- pub content_block_size: Au,
- pub collapsible_margins_in_children: CollapsedBlockMargins,
- /// The offset of the baselines in this layout in the content area, if there were some. This is
- /// used to propagate inflow baselines to the ancestors of `display: inline-block` elements
- /// and table content.
- pub baselines: Baselines,
- /// Whether or not this layout depends on the block size of its containing block.
- pub depends_on_block_constraints: bool,
-}
-
#[derive(Clone, Copy)]
pub(crate) struct CollapsibleWithParentStartMargin(bool);
@@ -362,7 +350,8 @@ impl BlockFormattingContext {
layout_context: &LayoutContext,
positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
- ) -> IndependentLayout {
+ depends_on_block_constraints: bool,
+ ) -> CacheableLayoutResult {
let mut sequential_layout_state = if self.contains_floats || !layout_context.use_rayon {
Some(SequentialLayoutState::new(containing_block.size.inline))
} else {
@@ -395,15 +384,17 @@ impl BlockFormattingContext {
sequential_layout_state.calculate_clearance(Clear::Both, &CollapsedMargin::zero())
});
- IndependentLayout {
+ CacheableLayoutResult {
fragments: flow_layout.fragments,
content_block_size: flow_layout.content_block_size +
flow_layout.collapsible_margins_in_children.end.solve() +
clearance.unwrap_or_default(),
content_inline_size_for_table: None,
baselines: flow_layout.baselines,
- depends_on_block_constraints: flow_layout.depends_on_block_constraints,
+ depends_on_block_constraints: depends_on_block_constraints ||
+ flow_layout.depends_on_block_constraints,
specific_layout_info: None,
+ collapsible_margins_in_children: CollapsedBlockMargins::zero(),
}
}
@@ -573,7 +564,7 @@ impl BlockContainer {
sequential_layout_state: Option<&mut SequentialLayoutState>,
collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
ignore_block_margins_for_stretch: LogicalSides1D<bool>,
- ) -> FlowLayout {
+ ) -> CacheableLayoutResult {
match self {
BlockContainer::BlockLevelBoxes(child_boxes) => layout_block_level_children(
layout_context,
@@ -627,7 +618,7 @@ fn layout_block_level_children(
mut sequential_layout_state: Option<&mut SequentialLayoutState>,
collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
ignore_block_margins_for_stretch: LogicalSides1D<bool>,
-) -> FlowLayout {
+) -> CacheableLayoutResult {
let mut placement_state =
PlacementState::new(collapsible_with_parent_start_margin, containing_block);
@@ -660,12 +651,14 @@ fn layout_block_level_children(
});
let (content_block_size, collapsible_margins_in_children, baselines) = placement_state.finish();
- FlowLayout {
+ CacheableLayoutResult {
fragments,
content_block_size,
collapsible_margins_in_children,
baselines,
depends_on_block_constraints,
+ content_inline_size_for_table: None,
+ specific_layout_info: None,
}
}
@@ -1150,6 +1143,7 @@ impl IndependentNonReplacedContents {
positioning_context,
&containing_block_for_children,
containing_block,
+ false, /* depends_on_block_constraints */
);
let inline_size = layout
@@ -1299,7 +1293,7 @@ impl IndependentNonReplacedContents {
)
};
- let compute_block_size = |layout: &IndependentLayout| {
+ let compute_block_size = |layout: &CacheableLayoutResult| {
content_box_sizes.block.resolve(
Direction::Block,
Size::FitContent,
@@ -1335,6 +1329,7 @@ impl IndependentNonReplacedContents {
style,
},
containing_block,
+ false, /* depends_on_block_constraints */
);
content_size = LogicalVec2 {
@@ -1398,6 +1393,7 @@ impl IndependentNonReplacedContents {
style,
},
containing_block,
+ false, /* depends_on_block_constraints */
);
let inline_size = if let Some(inline_size) = layout.content_inline_size_for_table {
@@ -2162,6 +2158,12 @@ fn block_size_is_zero_or_intrinsic(size: &StyleSize, containing_block: &Containi
}
}
+pub(crate) struct IndependentFloatOrAtomicLayoutResult {
+ pub fragment: BoxFragment,
+ pub baselines: Option<Baselines>,
+ pub pbm_sums: LogicalSides<Au>,
+}
+
impl IndependentFormattingContext {
pub(crate) fn layout_in_flow_block_level(
&self,
@@ -2196,7 +2198,7 @@ impl IndependentFormattingContext {
layout_context: &LayoutContext,
child_positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
- ) -> IndependentLayoutResult {
+ ) -> IndependentFloatOrAtomicLayoutResult {
let style = self.style();
let container_writing_mode = containing_block.style.writing_mode;
let layout_style = self.layout_style();
@@ -2280,6 +2282,7 @@ impl IndependentFormattingContext {
child_positioning_context,
&containing_block_for_children,
containing_block,
+ false, /* depends_on_block_constraints */
);
let inline_size = independent_layout
.content_inline_size_for_table
@@ -2330,7 +2333,7 @@ impl IndependentFormattingContext {
CollapsedBlockMargins::zero(),
);
- IndependentLayoutResult {
+ IndependentFloatOrAtomicLayoutResult {
fragment,
baselines,
pbm_sums,
diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs
index 5b7cf077bab..4fb33bf71d4 100644
--- a/components/layout_2020/flow/root.rs
+++ b/components/layout_2020/flow/root.rs
@@ -365,6 +365,7 @@ impl BoxTree {
layout_context,
&mut positioning_context,
&(&initial_containing_block).into(),
+ false, /* depends_on_block_constraints */
);
let mut root_fragments = independent_layout.fragments.into_iter().collect::<Vec<_>>();