From 061319425b816907f4277c545d679a878b07fe3d Mon Sep 17 00:00:00 2001 From: Ana Gelez Date: Mon, 6 May 2024 14:30:41 +0200 Subject: [PATCH] Handle RTL text correctly in TextItemView (#4060) Co-authored-by: Laurenz --- crates/typst/src/text/item.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/typst/src/text/item.rs b/crates/typst/src/text/item.rs index 4bc6dd212..3ad481cf7 100644 --- a/crates/typst/src/text/item.rs +++ b/crates/typst/src/text/item.rs @@ -89,10 +89,9 @@ impl<'a> TextItemView<'a> { /// the original text so that it is relative to the start of the slice pub fn glyph_at(&self, index: usize) -> Glyph { let g = &self.item.glyphs[self.glyph_range.start + index]; - let text_range = self.text_range(); + let base = self.text_range().start as u16; Glyph { - range: (g.range.start - text_range.start as u16) - ..(g.range.end - text_range.start as u16), + range: g.range.start - base..g.range.end - base, ..*g } } @@ -122,8 +121,8 @@ impl<'a> TextItemView<'a> { /// The range of text in the original TextItem that this slice corresponds /// to. fn text_range(&self) -> Range { - let text_start = self.item.glyphs[self.glyph_range.start].range().start; - let text_end = self.item.glyphs[self.glyph_range.end - 1].range().end; - text_start..text_end + let first = self.item.glyphs[self.glyph_range.start].range(); + let last = self.item.glyphs[self.glyph_range.end - 1].range(); + first.start.min(last.start)..first.end.max(last.end) } }