diff options
author | Dmitrii Desiatkin <47791504+d-desiatkin@users.noreply.github.com> | 2024-12-12 22:39:50 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-12 14:39:50 +0000 |
commit | 5cb75a84a35effcbdd18fb61c7a557a9587745fd (patch) | |
tree | 43ebc37ef1a109d47bf7937eafdb2b4897b06af1 /components | |
parent | acf0074f8af540eb1f9c6513970753be0f6f6b49 (diff) | |
download | servo-5cb75a84a35effcbdd18fb61c7a557a9587745fd.tar.gz servo-5cb75a84a35effcbdd18fb61c7a557a9587745fd.zip |
layout: Fix ordering of padding, border, and margin in inline BiDi (#34572)
* [fix](inline flow): Create PBM items in inline context in propper visual order
Signed-off-by: Desiatkin Dmitrii <d.desyatkin@innopolis.university>
* Rename left/right pbm terms in inline layout to logical nomenclature
- LineItem::LeftInlineBoxPaddingBorderMargin(_) is renamed to
LineItem::InlineStartBoxPaddingBorderMargin(_)
- LineItem::RightInlineBoxPaddingBorderMargin(_) is renamed to
LineItem::InlineEndBoxPaddingBorderMargin(_)
- LineLayoutInlineContainerFlags::HAD_LEFT_PBM is renamed to
LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM
- LineLayoutInlineContainerFlags::HAD_RIGHT_PBM is renamed to
LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
* Update test expectations
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
---------
Signed-off-by: Desiatkin Dmitrii <d.desyatkin@innopolis.university>
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components')
-rw-r--r-- | components/layout_2020/flow/inline/line.rs | 55 | ||||
-rw-r--r-- | components/layout_2020/flow/inline/mod.rs | 8 |
2 files changed, 29 insertions, 34 deletions
diff --git a/components/layout_2020/flow/inline/line.rs b/components/layout_2020/flow/inline/line.rs index a0836c30ea9..ed86cf54a54 100644 --- a/components/layout_2020/flow/inline/line.rs +++ b/components/layout_2020/flow/inline/line.rs @@ -49,10 +49,10 @@ bitflags! { const HAD_ANY_LINE_ITEMS = 1 << 0; /// Whether or not the starting inline border, padding, or margin of the inline box /// was encountered. - const HAD_LEFT_PBM = 1 << 2; + const HAD_INLINE_START_PBM = 1 << 2; /// Whether or not the ending inline border, padding, or margin of the inline box /// was encountered. - const HAD_RIGHT_PBM = 1 << 3; + const HAD_INLINE_END_PBM = 1 << 3; /// Whether or not any floats were encountered while laying out this inline box. const HAD_ANY_FLOATS = 1 << 4; } @@ -213,8 +213,8 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> { // TODO: This level needs either to be last_level, or if there were // unicode characters inserted for the inline box, we need to get the // level from them. - LineItem::LeftInlineBoxPaddingBorderMargin(_) => last_level, - LineItem::RightInlineBoxPaddingBorderMargin(_) => last_level, + LineItem::InlineStartBoxPaddingBorderMargin(_) => last_level, + LineItem::InlineEndBoxPaddingBorderMargin(_) => last_level, LineItem::Atomic(_, atomic) => atomic.bidi_level, LineItem::AbsolutelyPositioned(..) => last_level, LineItem::Float(..) => { @@ -261,15 +261,15 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> { .flags .insert(LineLayoutInlineContainerFlags::HAD_ANY_LINE_ITEMS); match item { - LineItem::LeftInlineBoxPaddingBorderMargin(_) => { + LineItem::InlineStartBoxPaddingBorderMargin(_) => { self.current_state .flags - .insert(LineLayoutInlineContainerFlags::HAD_LEFT_PBM); + .insert(LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM); }, - LineItem::RightInlineBoxPaddingBorderMargin(_) => { + LineItem::InlineEndBoxPaddingBorderMargin(_) => { self.current_state .flags - .insert(LineLayoutInlineContainerFlags::HAD_RIGHT_PBM); + .insert(LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM); }, LineItem::TextRun(_, text_run) => self.layout_text_run(text_run), LineItem::Atomic(_, atomic) => self.layout_atomic(atomic), @@ -369,24 +369,19 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> { let mut border = inline_box_state.pbm.border; let mut margin = inline_box_state.pbm.margin.auto_is(Au::zero); - let had_left = inner_state + let mut had_start = inner_state .flags - .contains(LineLayoutInlineContainerFlags::HAD_LEFT_PBM); - let had_right = inner_state + .contains(LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM); + let mut had_end = inner_state .flags - .contains(LineLayoutInlineContainerFlags::HAD_RIGHT_PBM); + .contains(LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM); - let (had_start, had_end) = if self - .layout - .containing_block - .style - .writing_mode - .is_bidi_ltr() + let containing_block_writing_mode = self.layout.containing_block.style.writing_mode; + if containing_block_writing_mode.is_bidi_ltr() != + inline_box.style.writing_mode.is_bidi_ltr() { - (had_left, had_right) - } else { - (had_right, had_left) - }; + std::mem::swap(&mut had_start, &mut had_end) + } if !had_start { padding.inline_start = Au::zero(); @@ -718,8 +713,8 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> { } pub(super) enum LineItem { - LeftInlineBoxPaddingBorderMargin(InlineBoxIdentifier), - RightInlineBoxPaddingBorderMargin(InlineBoxIdentifier), + InlineStartBoxPaddingBorderMargin(InlineBoxIdentifier), + InlineEndBoxPaddingBorderMargin(InlineBoxIdentifier), TextRun(Option<InlineBoxIdentifier>, TextRunLineItem), Atomic(Option<InlineBoxIdentifier>, AtomicLineItem), AbsolutelyPositioned(Option<InlineBoxIdentifier>, AbsolutelyPositionedLineItem), @@ -729,8 +724,8 @@ pub(super) enum LineItem { impl LineItem { fn inline_box_identifier(&self) -> Option<InlineBoxIdentifier> { match self { - LineItem::LeftInlineBoxPaddingBorderMargin(identifier) => Some(*identifier), - LineItem::RightInlineBoxPaddingBorderMargin(identifier) => Some(*identifier), + LineItem::InlineStartBoxPaddingBorderMargin(identifier) => Some(*identifier), + LineItem::InlineEndBoxPaddingBorderMargin(identifier) => Some(*identifier), LineItem::TextRun(identifier, _) => *identifier, LineItem::Atomic(identifier, _) => *identifier, LineItem::AbsolutelyPositioned(identifier, _) => *identifier, @@ -740,8 +735,8 @@ impl LineItem { pub(super) fn trim_whitespace_at_end(&mut self, whitespace_trimmed: &mut Au) -> bool { match self { - LineItem::LeftInlineBoxPaddingBorderMargin(_) => true, - LineItem::RightInlineBoxPaddingBorderMargin(_) => true, + LineItem::InlineStartBoxPaddingBorderMargin(_) => true, + LineItem::InlineEndBoxPaddingBorderMargin(_) => true, LineItem::TextRun(_, ref mut item) => item.trim_whitespace_at_end(whitespace_trimmed), LineItem::Atomic(..) => false, LineItem::AbsolutelyPositioned(..) => true, @@ -751,8 +746,8 @@ impl LineItem { pub(super) fn trim_whitespace_at_start(&mut self, whitespace_trimmed: &mut Au) -> bool { match self { - LineItem::LeftInlineBoxPaddingBorderMargin(_) => true, - LineItem::RightInlineBoxPaddingBorderMargin(_) => true, + LineItem::InlineStartBoxPaddingBorderMargin(_) => true, + LineItem::InlineEndBoxPaddingBorderMargin(_) => true, LineItem::TextRun(_, ref mut item) => item.trim_whitespace_at_start(whitespace_trimmed), LineItem::Atomic(..) => false, LineItem::AbsolutelyPositioned(..) => true, diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs index 6fde268818e..2bf8732f85e 100644 --- a/components/layout_2020/flow/inline/mod.rs +++ b/components/layout_2020/flow/inline/mod.rs @@ -48,8 +48,8 @@ //! a linear series of items that describe the line's hierarchy of inline boxes and content. The //! item types are: //! -//! - [`LineItem::LeftInlineBoxPaddingBorderMargin`] -//! - [`LineItem::RightInlineBoxPaddingBorderMargin`] +//! - [`LineItem::InlineStartBoxPaddingBorderMargin`] +//! - [`LineItem::InlineEndBoxPaddingBorderMargin`] //! - [`LineItem::TextRun`] //! - [`LineItem::Atomic`] //! - [`LineItem::AbsolutelyPositioned`] @@ -733,7 +733,7 @@ impl<'layout_dta> InlineFormattingContextLayout<'layout_dta> { inline_box_state.pbm.margin.inline_start.auto_is(Au::zero); self.current_line_segment .line_items - .push(LineItem::LeftInlineBoxPaddingBorderMargin( + .push(LineItem::InlineStartBoxPaddingBorderMargin( inline_box.identifier, )); } @@ -778,7 +778,7 @@ impl<'layout_dta> InlineFormattingContextLayout<'layout_dta> { self.current_line_segment.inline_size += pbm_end; self.current_line_segment .line_items - .push(LineItem::RightInlineBoxPaddingBorderMargin( + .push(LineItem::InlineEndBoxPaddingBorderMargin( inline_box_state.identifier, )) } |