aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/inline/construct.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2024-06-13 22:12:14 +0200
committerGitHub <noreply@github.com>2024-06-13 20:12:14 +0000
commitbae9f6d84424accb9db8d82ebf1ef087b7b400f6 (patch)
tree599c0f7db8d4d0024ef1b1d897a9d00f0e75b17e /components/layout_2020/flow/inline/construct.rs
parent43a7dd5da08d01234805c1298469f883a362f55d (diff)
downloadservo-bae9f6d84424accb9db8d82ebf1ef087b7b400f6.tar.gz
servo-bae9f6d84424accb9db8d82ebf1ef087b7b400f6.zip
layout: Linebreak the entire InlineFormattingContext at once (#32483)
Instead of linebreaking inside each single-font text segment, linebreak the entire inline formatting context at once. This has several benefits: 1. It allows us to use `icu_segmenter` (already in use from style), which is written against a newer version of the Unicode spec -- preventing breaking emoji clusters. 2. Opens up the possibility of changing the way that linebreaking and shaping work -- eventually allowing shaping across inline box boundaries and line breaking *after* shaping. Co-authored-by: Rakhi Sharma <atbrakhi@igalia.com>
Diffstat (limited to 'components/layout_2020/flow/inline/construct.rs')
-rw-r--r--components/layout_2020/flow/inline/construct.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/components/layout_2020/flow/inline/construct.rs b/components/layout_2020/flow/inline/construct.rs
index b88b5014f01..e3f4d8055a0 100644
--- a/components/layout_2020/flow/inline/construct.rs
+++ b/components/layout_2020/flow/inline/construct.rs
@@ -131,8 +131,16 @@ impl InlineFormattingContextBuilder {
ArcRefCell::new(InlineLevelBox::Atomic(independent_formatting_context));
self.current_inline_level_boxes()
.push(inline_level_box.clone());
+
+ // Push an object replacement character for this atomic, which will ensure that the line breaker
+ // inserts a line breaking opportunity here.
+ let string_to_push = "\u{fffc}";
+ self.text_segments.push(string_to_push.to_owned());
+ self.current_text_offset += string_to_push.len();
+
self.last_inline_box_ended_with_collapsible_white_space = false;
self.on_word_boundary = true;
+
inline_level_box
}