aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/inline.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/flow/inline.rs')
-rw-r--r--components/layout_2020/flow/inline.rs45
1 files changed, 28 insertions, 17 deletions
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);