Adds a separate wrapping option to allow word to glyph fallback.

This commit is contained in:
dtzxporter 2024-02-01 21:51:36 -05:00 committed by Jeremy Soller
parent b7f150615d
commit cc75bb66b4
6 changed files with 23 additions and 14 deletions

View file

@ -104,8 +104,10 @@ pub enum Wrap {
None,
/// Wraps at a glyph level
Glyph,
/// Word Wrapping
/// Wraps at the word level
Word,
/// Wraps at the word level, or fallback to glyph level if a word can't fit on a line by itself
WordOrGlyph,
}
impl Display for Wrap {
@ -113,6 +115,7 @@ impl Display for Wrap {
match self {
Self::None => write!(f, "No Wrap"),
Self::Word => write!(f, "Word Wrap"),
Self::WordOrGlyph => write!(f, "Word Wrap or Character"),
Self::Glyph => write!(f, "Character"),
}
}

View file

@ -994,10 +994,13 @@ impl ShapeLine {
continue;
} else if wrap == Wrap::Glyph
// Make sure that the word is able to fit on it's own line, if not, fall back to Glyph wrapping.
|| word_width > line_width
|| (wrap == Wrap::WordOrGlyph && word_width > line_width)
{
// Commit the current line so that the word starts on the next line.
if word_range_width > 0. && word_width > line_width {
if word_range_width > 0.
&& wrap == Wrap::WordOrGlyph
&& word_width > line_width
{
add_to_visual_line(
&mut current_visual_line,
span_index,
@ -1041,7 +1044,7 @@ impl ShapeLine {
}
}
} else {
// Wrap::Word
// Wrap::Word, Wrap::WordOrGlyph
// TODO: What if the previous span ended with whitespace and the next
// span wraps a new line? Is that possible?
@ -1117,10 +1120,13 @@ impl ShapeLine {
continue;
} else if wrap == Wrap::Glyph
// Make sure that the word is able to fit on it's own line, if not, fall back to Glyph wrapping.
|| word_width > line_width
|| (wrap == Wrap::WordOrGlyph && word_width > line_width)
{
// Commit the current line so that the word starts on the next line.
if word_range_width > 0. && word_width > line_width {
if word_range_width > 0.
&& wrap == Wrap::WordOrGlyph
&& word_width > line_width
{
add_to_visual_line(
&mut current_visual_line,
span_index,
@ -1164,7 +1170,7 @@ impl ShapeLine {
}
}
} else {
// Wrap::Word
// Wrap::Word, Wrap::WordOrGlyph
// Current word causing a wrap is not whitespace, so we ignore the
// previous word if it's a whitespace

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d412b55f4c5e3ac27c1cf4ebd87adc08bf079a7afa8d385320b75f52ed34072f
size 3522
oid sha256:95bbe8f4db74914f6a124547f024463a3e434b3c7be3f86c1464af71ed39bba0
size 3512

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cd2cc96243d6e550162a5a51837d95598bcf57690b0851d59cf92e2e3bb9e157
size 3864
oid sha256:ba0219c8e226f4bd79e0681a3189013ed035459fd3ed90405ec53d595e70ab81
size 3851

View file

@ -11,7 +11,7 @@ fn test_hebrew_word_rendering() {
.font_size(36., 40.)
.font_attrs(attrs)
.text("בדיקה")
.canvas(120, 60)
.canvas(100, 60)
.validate_text_rendering();
}
@ -46,7 +46,7 @@ fn test_arabic_word_rendering() {
.font_size(36., 40.)
.font_attrs(attrs)
.text("خالصة")
.canvas(120, 60)
.canvas(100, 60)
.validate_text_rendering();
}

View file

@ -11,7 +11,7 @@ fn wrap_word_fallback() {
let mut buffer = buffer.borrow_with(&mut font_system);
buffer.set_wrap(Wrap::Word);
buffer.set_wrap(Wrap::WordOrGlyph);
buffer.set_text("Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", Attrs::new().family(cosmic_text::Family::Name("Inter")), Shaping::Advanced);
buffer.set_size(50.0, 1000.0);