From ce658db2f39f8472c3525a18ed1cfead23781fbb Mon Sep 17 00:00:00 2001 From: bluebear94 Date: Tue, 3 Oct 2023 09:02:27 -0400 Subject: [PATCH] ShapedText::push_hyphen: Use self.base for default hyphen range (#2299) In the unlikely chance that we hyphenate after an empty line, we set the glyph range to self.base..self.base so that subtracting Fixes #2283. --- crates/typst-library/src/text/shaping.rs | 7 ++++++- tests/ref/text/shaping.png | Bin 3902 -> 3992 bytes tests/typ/text/shaping.typ | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/typst-library/src/text/shaping.rs b/crates/typst-library/src/text/shaping.rs index 2d9dae33c..57501c52f 100644 --- a/crates/typst-library/src/text/shaping.rs +++ b/crates/typst-library/src/text/shaping.rs @@ -446,7 +446,12 @@ impl<'a> ShapedText<'a> { .glyphs .last() .map(|g| g.range.end..g.range.end) - .unwrap_or_default(); + // In the unlikely chance that we hyphenate after an + // empty line, ensure that the glyph range still falls + // after self.base so that subtracting either of the + // endpoints by self.base doesn’t underflow. + // See . + .unwrap_or_else(|| self.base..self.base); self.width += x_advance.at(self.size); self.glyphs.to_mut().push(ShapedGlyph { font, diff --git a/tests/ref/text/shaping.png b/tests/ref/text/shaping.png index a77dda3ae3e2c81a449c9a228ae9eaa757270053..a3ee750e3e2747c88e7c80ae9cbe379bbecf4a47 100644 GIT binary patch literal 3992 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 literal 3902 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 diff --git a/tests/typ/text/shaping.typ b/tests/typ/text/shaping.typ index 3a8d54110..c794a105e 100644 --- a/tests/typ/text/shaping.typ +++ b/tests/typ/text/shaping.typ @@ -26,3 +26,9 @@ ABCअपार्टमेंट // doesn't exist in shaping output. #set text(dir: rtl, font: "Noto Serif Hebrew") \ ט + +--- +// Test that #2283 is fixed. +#set text(font: "test", lang: "de", hyphenate: true, fallback: false) +#set par(linebreaks: "simple") +- ensure