mirror of
https://github.com/servo/servo.git
synced 2025-08-07 14:35:33 +01:00
layout: Remove IndependentNonReplacedContents
(#37971)
With the work to unify the layout logic for replaced and non-replaced boxes (#37942), I think the `IndependentNonReplacedContents` enum does no longer make much sense. Therefore, this removes `IndependentNonReplacedContents`, merging its values into `IndependentFormattingContextContents`. The methods defined on `IndependentFormattingContextContents` can now be on `IndependentFormattingContext`, in particular this implies that the layout results of a replaced box will now be cached. Testing: Unneeded (no behavior change) This part of #37942 Signed-off-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
07247cd4fd
commit
ff050b71fa
7 changed files with 245 additions and 323 deletions
|
@ -136,6 +136,7 @@ impl taffy::LayoutPartialTree for TaffyContainerContext<'_> {
|
|||
// TODO: re-evaluate sizing constraint conversions in light of recent layout changes
|
||||
let containing_block = &self.content_box_size_override;
|
||||
let style = independent_context.style();
|
||||
let writing_mode = style.writing_mode;
|
||||
|
||||
// Adjust known_dimensions from border box to content box
|
||||
let pbm = independent_context
|
||||
|
@ -154,43 +155,44 @@ impl taffy::LayoutPartialTree for TaffyContainerContext<'_> {
|
|||
.height
|
||||
.map(|height| height - pb_sum.block),
|
||||
};
|
||||
let preferred_aspect_ratio =
|
||||
independent_context.preferred_aspect_ratio(&pbm.padding_border_sums);
|
||||
|
||||
match &independent_context.contents {
|
||||
IndependentFormattingContextContents::Replaced(replaced) => {
|
||||
let content_box_size = replaced
|
||||
.used_size_as_if_inline_element_from_content_box_sizes(
|
||||
containing_block,
|
||||
style,
|
||||
independent_context
|
||||
.preferred_aspect_ratio(&pbm.padding_border_sums),
|
||||
LogicalVec2 {
|
||||
block: &Sizes::new(
|
||||
option_f32_to_size(content_box_known_dimensions.height),
|
||||
Size::Initial,
|
||||
Size::Initial,
|
||||
),
|
||||
inline: &Sizes::new(
|
||||
option_f32_to_size(content_box_known_dimensions.width),
|
||||
Size::Initial,
|
||||
Size::Initial,
|
||||
),
|
||||
},
|
||||
Size::FitContent.into(),
|
||||
pbm.padding_border_sums + pbm.margin.auto_is(Au::zero).sum(),
|
||||
)
|
||||
.to_physical_size(self.style.writing_mode);
|
||||
// TODO: unify the replaced and non-replaced logic.
|
||||
if let IndependentFormattingContextContents::Replaced(replaced) =
|
||||
&independent_context.contents
|
||||
{
|
||||
let content_box_size = replaced
|
||||
.used_size_as_if_inline_element_from_content_box_sizes(
|
||||
containing_block,
|
||||
style,
|
||||
preferred_aspect_ratio,
|
||||
LogicalVec2 {
|
||||
block: &Sizes::new(
|
||||
option_f32_to_size(content_box_known_dimensions.height),
|
||||
Size::Initial,
|
||||
Size::Initial,
|
||||
),
|
||||
inline: &Sizes::new(
|
||||
option_f32_to_size(content_box_known_dimensions.width),
|
||||
Size::Initial,
|
||||
Size::Initial,
|
||||
),
|
||||
},
|
||||
Size::FitContent.into(),
|
||||
pbm.padding_border_sums + pbm.margin.auto_is(Au::zero).sum(),
|
||||
)
|
||||
.to_physical_size(writing_mode);
|
||||
|
||||
// Create fragments if the RunMode if PerformLayout
|
||||
// If the RunMode is ComputeSize then only the returned size will be used
|
||||
if inputs.run_mode == RunMode::PerformLayout {
|
||||
child.child_fragments = replaced.make_fragments(
|
||||
self.layout_context,
|
||||
style,
|
||||
content_box_size,
|
||||
);
|
||||
}
|
||||
// Create fragments if the RunMode if PerformLayout
|
||||
// If the RunMode is ComputeSize then only the returned size will be used
|
||||
if inputs.run_mode == RunMode::PerformLayout {
|
||||
child.child_fragments =
|
||||
replaced.make_fragments(self.layout_context, style, content_box_size);
|
||||
}
|
||||
|
||||
let computed_size = taffy::Size {
|
||||
let computed_size =
|
||||
taffy::Size {
|
||||
width: inputs.known_dimensions.width.unwrap_or_else(|| {
|
||||
content_box_size.width.to_f32_px() + pb_sum.inline
|
||||
}),
|
||||
|
@ -198,98 +200,96 @@ impl taffy::LayoutPartialTree for TaffyContainerContext<'_> {
|
|||
content_box_size.height.to_f32_px() + pb_sum.block
|
||||
}),
|
||||
};
|
||||
let size = inputs.known_dimensions.unwrap_or(computed_size);
|
||||
taffy::LayoutOutput {
|
||||
size,
|
||||
..taffy::LayoutOutput::DEFAULT
|
||||
}
|
||||
},
|
||||
|
||||
IndependentFormattingContextContents::NonReplaced(non_replaced) => {
|
||||
// Compute inline size
|
||||
let inline_size = content_box_known_dimensions.width.unwrap_or_else(|| {
|
||||
let constraint_space = ConstraintSpace {
|
||||
// TODO: pass min- and max- size
|
||||
block_size: SizeConstraint::new(
|
||||
inputs.parent_size.height.map(Au::from_f32_px),
|
||||
Au::zero(),
|
||||
None,
|
||||
),
|
||||
writing_mode: self.style.writing_mode,
|
||||
preferred_aspect_ratio: non_replaced.preferred_aspect_ratio(),
|
||||
};
|
||||
|
||||
let result = independent_context
|
||||
.inline_content_sizes(self.layout_context, &constraint_space);
|
||||
let adjusted_available_space = inputs
|
||||
.available_space
|
||||
.width
|
||||
.map_definite_value(|width| width - content_box_inset.inline);
|
||||
|
||||
resolve_content_size(adjusted_available_space, result.sizes)
|
||||
});
|
||||
|
||||
// Return early if only inline content sizes are requested
|
||||
if inputs.run_mode == RunMode::ComputeSize &&
|
||||
inputs.axis == RequestedAxis::Horizontal
|
||||
{
|
||||
return taffy::LayoutOutput::from_outer_size(taffy::Size {
|
||||
width: inline_size + pb_sum.inline,
|
||||
// If RequestedAxis is Horizontal then height will be ignored.
|
||||
height: 0.0,
|
||||
});
|
||||
}
|
||||
|
||||
let content_box_size_override = ContainingBlock {
|
||||
size: ContainingBlockSize {
|
||||
inline: Au::from_f32_px(inline_size),
|
||||
block: content_box_known_dimensions
|
||||
.height
|
||||
.map(Au::from_f32_px)
|
||||
.map_or_else(SizeConstraint::default, SizeConstraint::Definite),
|
||||
},
|
||||
style,
|
||||
let size = inputs.known_dimensions.unwrap_or(computed_size);
|
||||
taffy::LayoutOutput {
|
||||
size,
|
||||
..taffy::LayoutOutput::DEFAULT
|
||||
}
|
||||
} else {
|
||||
// Compute inline size
|
||||
let inline_size = content_box_known_dimensions.width.unwrap_or_else(|| {
|
||||
let constraint_space = ConstraintSpace {
|
||||
// TODO: pass min- and max- size
|
||||
block_size: SizeConstraint::new(
|
||||
inputs.parent_size.height.map(Au::from_f32_px),
|
||||
Au::zero(),
|
||||
None,
|
||||
),
|
||||
writing_mode,
|
||||
preferred_aspect_ratio,
|
||||
};
|
||||
|
||||
let lazy_block_size = match content_box_known_dimensions.height {
|
||||
// FIXME: use the correct min/max sizes.
|
||||
None => LazySize::intrinsic(),
|
||||
Some(height) => Au::from_f32_px(height).into(),
|
||||
};
|
||||
let result = independent_context
|
||||
.inline_content_sizes(self.layout_context, &constraint_space);
|
||||
let adjusted_available_space = inputs
|
||||
.available_space
|
||||
.width
|
||||
.map_definite_value(|width| width - content_box_inset.inline);
|
||||
|
||||
child.positioning_context = PositioningContext::default();
|
||||
let layout = non_replaced.layout_without_caching(
|
||||
self.layout_context,
|
||||
&mut child.positioning_context,
|
||||
&content_box_size_override,
|
||||
containing_block,
|
||||
false, /* depends_on_block_constraints */
|
||||
&lazy_block_size,
|
||||
);
|
||||
resolve_content_size(adjusted_available_space, result.sizes)
|
||||
});
|
||||
|
||||
child.child_fragments = layout.fragments;
|
||||
self.child_specific_layout_infos[usize::from(node_id)] =
|
||||
layout.specific_layout_info;
|
||||
|
||||
let block_size = lazy_block_size
|
||||
.resolve(|| layout.content_block_size)
|
||||
.to_f32_px();
|
||||
|
||||
let computed_size = taffy::Size {
|
||||
// Return early if only inline content sizes are requested
|
||||
if inputs.run_mode == RunMode::ComputeSize &&
|
||||
inputs.axis == RequestedAxis::Horizontal
|
||||
{
|
||||
return taffy::LayoutOutput::from_outer_size(taffy::Size {
|
||||
width: inline_size + pb_sum.inline,
|
||||
height: block_size + pb_sum.block,
|
||||
};
|
||||
let size = inputs.known_dimensions.unwrap_or(computed_size);
|
||||
// If RequestedAxis is Horizontal then height will be ignored.
|
||||
height: 0.0,
|
||||
});
|
||||
}
|
||||
|
||||
taffy::LayoutOutput {
|
||||
size,
|
||||
first_baselines: taffy::Point {
|
||||
x: None,
|
||||
y: layout.baselines.first.map(|au| au.to_f32_px()),
|
||||
},
|
||||
..taffy::LayoutOutput::DEFAULT
|
||||
}
|
||||
},
|
||||
let content_box_size_override = ContainingBlock {
|
||||
size: ContainingBlockSize {
|
||||
inline: Au::from_f32_px(inline_size),
|
||||
block: content_box_known_dimensions
|
||||
.height
|
||||
.map(Au::from_f32_px)
|
||||
.map_or_else(SizeConstraint::default, SizeConstraint::Definite),
|
||||
},
|
||||
style,
|
||||
};
|
||||
|
||||
let lazy_block_size = match content_box_known_dimensions.height {
|
||||
// FIXME: use the correct min/max sizes.
|
||||
None => LazySize::intrinsic(),
|
||||
Some(height) => Au::from_f32_px(height).into(),
|
||||
};
|
||||
|
||||
child.positioning_context = PositioningContext::default();
|
||||
let layout = independent_context.layout_without_caching(
|
||||
self.layout_context,
|
||||
&mut child.positioning_context,
|
||||
&content_box_size_override,
|
||||
containing_block,
|
||||
preferred_aspect_ratio,
|
||||
false, /* depends_on_block_constraints */
|
||||
&lazy_block_size,
|
||||
);
|
||||
|
||||
child.child_fragments = layout.fragments;
|
||||
self.child_specific_layout_infos[usize::from(node_id)] =
|
||||
layout.specific_layout_info;
|
||||
|
||||
let block_size = lazy_block_size
|
||||
.resolve(|| layout.content_block_size)
|
||||
.to_f32_px();
|
||||
|
||||
let computed_size = taffy::Size {
|
||||
width: inline_size + pb_sum.inline,
|
||||
height: block_size + pb_sum.block,
|
||||
};
|
||||
let size = inputs.known_dimensions.unwrap_or(computed_size);
|
||||
|
||||
taffy::LayoutOutput {
|
||||
size,
|
||||
first_baselines: taffy::Point {
|
||||
x: None,
|
||||
y: layout.baselines.first.map(|au| au.to_f32_px()),
|
||||
},
|
||||
..taffy::LayoutOutput::DEFAULT
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
|
@ -19,9 +19,7 @@ use crate::construct_modern::{ModernContainerBuilder, ModernItemKind};
|
|||
use crate::context::LayoutContext;
|
||||
use crate::dom::LayoutBox;
|
||||
use crate::dom_traversal::{NodeAndStyleInfo, NonReplacedContents};
|
||||
use crate::formatting_contexts::{
|
||||
IndependentFormattingContext, IndependentFormattingContextContents,
|
||||
};
|
||||
use crate::formatting_contexts::IndependentFormattingContext;
|
||||
use crate::fragment_tree::Fragment;
|
||||
use crate::positioned::{AbsolutelyPositionedBox, PositioningContext};
|
||||
|
||||
|
@ -178,10 +176,7 @@ impl TaffyItemBox {
|
|||
|
||||
fn is_in_flow_replaced(&self) -> bool {
|
||||
match &self.taffy_level_box {
|
||||
TaffyItemBoxInner::InFlowBox(fc) => match fc.contents {
|
||||
IndependentFormattingContextContents::NonReplaced(_) => false,
|
||||
IndependentFormattingContextContents::Replaced(_) => true,
|
||||
},
|
||||
TaffyItemBoxInner::InFlowBox(fc) => fc.is_replaced(),
|
||||
TaffyItemBoxInner::OutOfFlowAbsolutelyPositionedBox(_) => false,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue