Ignore the last space when wrapping.

This commit is contained in:
Hojjat 2022-12-16 21:58:26 -07:00 committed by Jeremy Soller
parent cb958c63f8
commit 3ef56b7112

View file

@ -633,35 +633,42 @@ impl ShapeLine {
if self.rtl != span.level.is_rtl() { if self.rtl != span.level.is_rtl() {
let mut fit_x = x; let mut fit_x = x;
let mut fitting_end = span.words.len(); let mut fitting_end = span.words.len();
for i in (0..span.words.len()).rev() { if !span.words.is_empty() {
let word = &span.words[i]; let mut i = span.words.len()-1;
let word_size = font_size as f32 * word.x_advance; loop {
let word = &span.words[i];
let word_size = font_size as f32 * word.x_advance;
let wrap = if self.rtl { let wrap = if self.rtl {
fit_x - word_size < end_x fit_x - word_size < end_x
} else { } else {
fit_x + word_size > end_x fit_x + word_size > end_x
}; };
if wrap { if wrap {
let mut fitting_start = i + 1; let mut fitting_start = i + 1;
while fitting_start < fitting_end { while fitting_start < fitting_end {
if span.words[fitting_start].blank { if span.words[fitting_start].blank {
fitting_start += 1; fitting_start += 1;
} else { } else {
break; break;
}
} }
}
word_ranges.push((fitting_start..fitting_end, true)); word_ranges.push((fitting_start..fitting_end, true));
fitting_end = i + 1; fitting_end = i + 1;
fit_x = start_x; fit_x = start_x;
} }
if self.rtl { if self.rtl {
fit_x -= word_size; fit_x -= word_size;
} else { } else {
fit_x += word_size; fit_x += word_size;
}
if i == 0 {
break;
}
i -= 1;
} }
} }
if !word_ranges.is_empty() { if !word_ranges.is_empty() {
@ -677,28 +684,39 @@ impl ShapeLine {
} else { } else {
let mut fit_x = x; let mut fit_x = x;
let mut fitting_start = 0; let mut fitting_start = 0;
for i in 0..span.words.len() { if !span.words.is_empty() {
let word = &span.words[i]; let mut i = 0;
let word_size = font_size as f32 * word.x_advance; loop {
let word = &span.words[i];
let word_size = font_size as f32 * word.x_advance;
let wrap = if self.rtl { let wrap = if self.rtl {
fit_x - word_size < end_x fit_x - word_size < end_x
} else { } else {
fit_x + word_size > end_x fit_x + word_size > end_x
}; };
if wrap { if wrap {
//TODO: skip blanks word_ranges.push((fitting_start..i, true));
word_ranges.push((fitting_start..i, true));
fitting_start = i;
fit_x = start_x; if word.blank {
} i += 1;
}
fitting_start = i;
if self.rtl { fit_x = start_x;
fit_x -= word_size; }
} else {
fit_x += word_size; if self.rtl {
fit_x -= word_size;
} else {
fit_x += word_size;
}
i += 1;
if i >= span.words.len() {
break;
}
} }
} }
word_ranges.push((fitting_start..span.words.len(), false)); word_ranges.push((fitting_start..span.words.len(), false));