aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorDmitrii Desiatkin <47791504+d-desiatkin@users.noreply.github.com>2024-12-12 22:39:50 +0800
committerGitHub <noreply@github.com>2024-12-12 14:39:50 +0000
commit5cb75a84a35effcbdd18fb61c7a557a9587745fd (patch)
tree43ebc37ef1a109d47bf7937eafdb2b4897b06af1 /components
parentacf0074f8af540eb1f9c6513970753be0f6f6b49 (diff)
downloadservo-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.rs55
-rw-r--r--components/layout_2020/flow/inline/mod.rs8
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,
))
}