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/construct.rs35
-rw-r--r--components/layout_2020/flow/inline.rs45
-rw-r--r--components/layout_2020/flow/mod.rs8
3 files changed, 64 insertions, 24 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs
index bd2d0bce23d..f72bbf1ad13 100644
--- a/components/layout_2020/flow/construct.rs
+++ b/components/layout_2020/flow/construct.rs
@@ -21,6 +21,7 @@ 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;
@@ -67,7 +68,12 @@ impl BlockFormattingContext {
inline_level_boxes,
text_decoration_line,
};
- let content_sizes = content_sizes.compute(|| ifc.inline_content_sizes(context));
+ // 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,
@@ -203,10 +209,13 @@ 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)
+ .inline_content_sizes(context, not_actually_containing_block_writing_mode)
});
let container = BlockContainer::InlineFormattingContext(
builder.ongoing_inline_formatting_context,
@@ -678,6 +687,9 @@ where
max_assign_in_flow_outer_content_sizes_to: Option<&mut ContentSizes>,
) -> (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(
@@ -689,7 +701,10 @@ where
),
);
if let Some(to) = max_assign_in_flow_outer_content_sizes_to {
- to.max_assign(&box_content_sizes.outer_inline(&info.style))
+ to.max_assign(
+ &box_content_sizes
+ .outer_inline(&info.style, not_actually_containing_block_writing_mode),
+ )
}
let block_level_box = ArcRefCell::new(BlockLevelBox::SameFormattingContextBlock {
tag: Tag::from_node_and_style_info(info),
@@ -716,7 +731,12 @@ where
propagated_text_decoration_line,
);
if let Some(to) = max_assign_in_flow_outer_content_sizes_to {
- to.max_assign(&contents.content_sizes.outer_inline(&contents.style))
+ to.max_assign(
+ &contents.content_sizes.outer_inline(
+ &contents.style,
+ not_actually_containing_block_writing_mode,
+ ),
+ )
}
(
ArcRefCell::new(BlockLevelBox::Independent(contents)),
@@ -771,7 +791,12 @@ impl IntermediateBlockContainer {
)
},
IntermediateBlockContainer::InlineFormattingContext(ifc) => {
- let content_sizes = content_sizes.compute(|| ifc.inline_content_sizes(context));
+ // 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.
diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs
index 47d9deacfbf..c1ca982d41b 100644
--- a/components/layout_2020/flow/inline.rs
+++ b/components/layout_2020/flow/inline.rs
@@ -23,6 +23,7 @@ use app_units::Au;
use atomic_refcell::AtomicRef;
use gfx::text::text_run::GlyphRun;
use servo_arc::Arc;
+use style::logical_geometry::WritingMode;
use style::properties::ComputedValues;
use style::values::computed::{Length, LengthPercentage, Percentage};
use style::values::specified::text::TextAlignKeyword;
@@ -139,24 +140,30 @@ impl InlineFormattingContext {
// This works on an already-constructed `InlineFormattingContext`,
// Which would have to change if/when
// `BlockContainer::construct` parallelize their construction.
- pub(super) fn inline_content_sizes(&self, layout_context: &LayoutContext) -> ContentSizes {
- struct Computation {
+ pub(super) fn inline_content_sizes(
+ &self,
+ layout_context: &LayoutContext,
+ containing_block_writing_mode: WritingMode,
+ ) -> ContentSizes {
+ struct Computation<'a> {
+ layout_context: &'a LayoutContext<'a>,
+ containing_block_writing_mode: WritingMode,
paragraph: ContentSizes,
current_line: ContentSizes,
current_line_percentages: Percentage,
}
- impl Computation {
- fn traverse(
- &mut self,
- layout_context: &LayoutContext,
- inline_level_boxes: &[ArcRefCell<InlineLevelBox>],
- ) {
+ impl Computation<'_> {
+ fn traverse(&mut self, inline_level_boxes: &[ArcRefCell<InlineLevelBox>]) {
for inline_level_box in inline_level_boxes {
match &*inline_level_box.borrow() {
InlineLevelBox::InlineBox(inline_box) => {
- let padding = inline_box.style.padding();
- let border = inline_box.style.border_width();
- let margin = inline_box.style.margin();
+ let padding =
+ inline_box.style.padding(self.containing_block_writing_mode);
+ let border = inline_box
+ .style
+ .border_width(self.containing_block_writing_mode);
+ let margin =
+ inline_box.style.margin(self.containing_block_writing_mode);
macro_rules! add {
($condition: ident, $side: ident) => {
if inline_box.$condition {
@@ -170,7 +177,7 @@ impl InlineFormattingContext {
}
add!(first_fragment, inline_start);
- self.traverse(layout_context, &inline_box.children);
+ self.traverse(&inline_box.children);
add!(last_fragment, inline_end);
},
InlineLevelBox::TextRun(text_run) => {
@@ -178,7 +185,7 @@ impl InlineFormattingContext {
runs,
break_at_start,
..
- } = text_run.break_and_shape(layout_context);
+ } = text_run.break_and_shape(self.layout_context);
if break_at_start {
self.line_break_opportunity()
}
@@ -193,9 +200,10 @@ impl InlineFormattingContext {
}
},
InlineLevelBox::Atomic(atomic) => {
- let (outer, pc) = atomic
- .content_sizes
- .outer_inline_and_percentages(&atomic.style);
+ let (outer, pc) = atomic.content_sizes.outer_inline_and_percentages(
+ &atomic.style,
+ self.containing_block_writing_mode,
+ );
self.current_line.min_content += outer.min_content;
self.current_line.max_content += outer.max_content;
self.current_line_percentages += pc;
@@ -239,11 +247,13 @@ impl InlineFormattingContext {
std::mem::replace(x, T::zero())
}
let mut computation = Computation {
+ layout_context,
+ containing_block_writing_mode,
paragraph: ContentSizes::zero(),
current_line: ContentSizes::zero(),
current_line_percentages: Percentage::zero(),
};
- computation.traverse(layout_context, &self.inline_level_boxes);
+ computation.traverse(&self.inline_level_boxes);
computation.forced_line_break();
computation.paragraph
}
@@ -308,6 +318,7 @@ impl InlineFormattingContext {
box_.clone(),
initial_start_corner,
tree_rank,
+ ifc.containing_block,
);
let hoisted_fragment = hoisted_box.fragment.clone();
ifc.push_hoisted_box_to_positioning_context(hoisted_box);
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs
index 4f22b857e84..8558d7a68bd 100644
--- a/components/layout_2020/flow/mod.rs
+++ b/components/layout_2020/flow/mod.rs
@@ -316,8 +316,12 @@ impl BlockLevelBox {
))
},
BlockLevelBox::OutOfFlowAbsolutelyPositionedBox(box_) => {
- let hoisted_box =
- AbsolutelyPositionedBox::to_hoisted(box_.clone(), Vec2::zero(), tree_rank);
+ let hoisted_box = AbsolutelyPositionedBox::to_hoisted(
+ box_.clone(),
+ Vec2::zero(),
+ tree_rank,
+ containing_block,
+ );
let hoisted_fragment = hoisted_box.fragment.clone();
positioning_context.push(hoisted_box);
Fragment::AbsoluteOrFixedPositioned(AbsoluteOrFixedPositionedFragment {