From ab8295c07dd1883f9c19d3e075e7a4971fec0de0 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 17 Sep 2024 17:35:56 +0200 Subject: [PATCH] Fix repetition of Thai characters (#4977) Co-authored-by: Martin Haug --- crates/typst/src/layout/inline/shaping.rs | 21 ++++++++++----------- tests/ref/issue-4468-linebreak-thai.png | Bin 0 -> 247 bytes tests/ref/linebreak-thai.png | Bin 6968 -> 6877 bytes tests/suite/layout/inline/linebreak.typ | 8 ++++++++ 4 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 tests/ref/issue-4468-linebreak-thai.png diff --git a/crates/typst/src/layout/inline/shaping.rs b/crates/typst/src/layout/inline/shaping.rs index 43dc351a5..0b4a17d75 100644 --- a/crates/typst/src/layout/inline/shaping.rs +++ b/crates/typst/src/layout/inline/shaping.rs @@ -515,14 +515,14 @@ impl<'a> ShapedText<'a> { std::mem::swap(&mut start, &mut end); } - let left = self.find_safe_to_break(start, Side::Left)?; - let right = self.find_safe_to_break(end, Side::Right)?; + let left = self.find_safe_to_break(start)?; + let right = self.find_safe_to_break(end)?; Some(&self.glyphs[left..right]) } /// Find the glyph offset matching the text index that is most towards the - /// given side and safe-to-break. - fn find_safe_to_break(&self, text_index: usize, towards: Side) -> Option { + /// start of the text and safe-to-break. + fn find_safe_to_break(&self, text_index: usize) -> Option { let ltr = self.dir.is_positive(); // Handle edge cases. @@ -542,6 +542,7 @@ impl<'a> ShapedText<'a> { ordering.reverse() } }); + let mut idx = match found { Ok(idx) => idx, Err(idx) => { @@ -565,13 +566,11 @@ impl<'a> ShapedText<'a> { } }; - let next = match towards { - Side::Left => usize::checked_sub, - Side::Right => usize::checked_add, - }; - - // Search for the outermost glyph with the text index. - while let Some(next) = next(idx, 1) { + // Search for the start-most glyph with the text index. This means + // we take empty range glyphs at the start and leave those at the end + // for the next line. + let dec = if ltr { usize::checked_sub } else { usize::checked_add }; + while let Some(next) = dec(idx, 1) { if self.glyphs.get(next).map_or(true, |g| g.range.start != text_index) { break; } diff --git a/tests/ref/issue-4468-linebreak-thai.png b/tests/ref/issue-4468-linebreak-thai.png new file mode 100644 index 0000000000000000000000000000000000000000..6257c56077f5867ed801473c4b697925552914aa GIT binary patch literal 247 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 UIsiIIr2qf`07*qoM6N<$g5)oNod5s; delta 6966 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