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, None,
/// Wraps at a glyph level /// Wraps at a glyph level
Glyph, Glyph,
/// Word Wrapping /// Wraps at the word level
Word, 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 { impl Display for Wrap {
@ -113,6 +115,7 @@ impl Display for Wrap {
match self { match self {
Self::None => write!(f, "No Wrap"), Self::None => write!(f, "No Wrap"),
Self::Word => write!(f, "Word Wrap"), Self::Word => write!(f, "Word Wrap"),
Self::WordOrGlyph => write!(f, "Word Wrap or Character"),
Self::Glyph => write!(f, "Character"), Self::Glyph => write!(f, "Character"),
} }
} }

View file

@ -994,10 +994,13 @@ impl ShapeLine {
continue; continue;
} else if wrap == Wrap::Glyph } 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. // 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. // 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( add_to_visual_line(
&mut current_visual_line, &mut current_visual_line,
span_index, span_index,
@ -1041,7 +1044,7 @@ impl ShapeLine {
} }
} }
} else { } else {
// Wrap::Word // Wrap::Word, Wrap::WordOrGlyph
// TODO: What if the previous span ended with whitespace and the next // TODO: What if the previous span ended with whitespace and the next
// span wraps a new line? Is that possible? // span wraps a new line? Is that possible?
@ -1117,10 +1120,13 @@ impl ShapeLine {
continue; continue;
} else if wrap == Wrap::Glyph } 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. // 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. // 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( add_to_visual_line(
&mut current_visual_line, &mut current_visual_line,
span_index, span_index,
@ -1164,7 +1170,7 @@ impl ShapeLine {
} }
} }
} else { } else {
// Wrap::Word // Wrap::Word, Wrap::WordOrGlyph
// Current word causing a wrap is not whitespace, so we ignore the // Current word causing a wrap is not whitespace, so we ignore the
// previous word if it's a whitespace // previous word if it's a whitespace

View file

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

View file

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

View file

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

View file

@ -11,7 +11,7 @@ fn wrap_word_fallback() {
let mut buffer = buffer.borrow_with(&mut font_system); 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_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); buffer.set_size(50.0, 1000.0);