diff options
| author | Peng Guanwen <pg999w@outlook.com> | 2023-06-01 21:14:56 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-01 15:14:56 +0200 |
| commit | a54cde71cbbc349f2abfd6e1db31a4d1c9091de8 (patch) | |
| tree | 1b6c8f0c77f09fc0ed070dc13fb402e2df2820c6 /library/src/text | |
| parent | 3093b566ab4c82032064d525d10d7c72494aa957 (diff) | |
Bugfix of CJK punctuation adjustment (#1384)
Diffstat (limited to 'library/src/text')
| -rw-r--r-- | library/src/text/shaping.rs | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/library/src/text/shaping.rs b/library/src/text/shaping.rs index 9f514e9a..3610e0c0 100644 --- a/library/src/text/shaping.rs +++ b/library/src/text/shaping.rs @@ -98,7 +98,7 @@ impl ShapedGlyph { matches!(self.c.script(), Hiragana | Katakana | Han) || self.c == '\u{30FC}' } - pub fn is_cjk_adjustable(&self) -> bool { + pub fn is_cjk_punctuation(&self) -> bool { self.is_cjk_left_aligned_punctuation(true) || self.is_cjk_right_aligned_punctuation() || self.is_cjk_center_aligned_punctuation(true) @@ -353,7 +353,7 @@ impl<'a> ShapedText<'a> { pub fn cjk_justifiable_at_last(&self) -> bool { self.glyphs .last() - .map(|g| g.is_cjk_script() || g.is_cjk_adjustable()) + .map(|g| g.is_cjk_script() || g.is_cjk_punctuation()) .unwrap_or(false) } @@ -763,12 +763,14 @@ pub fn is_gb_style(lang: Lang, region: Option<Region>) -> bool { fn calculate_adjustability(ctx: &mut ShapingContext, lang: Lang, region: Option<Region>) { let gb_style = is_gb_style(lang, region); - let mut glyphs = ctx.glyphs.iter_mut().peekable(); - while let Some(glyph) = glyphs.next() { + for glyph in &mut ctx.glyphs { glyph.adjustability = glyph.base_adjustability(gb_style); + } + let mut glyphs = ctx.glyphs.iter_mut().peekable(); + while let Some(glyph) = glyphs.next() { // Only GB style needs further adjustment. - if glyph.is_cjk_adjustable() && !gb_style { + if glyph.is_cjk_punctuation() && !gb_style { continue; } @@ -778,7 +780,8 @@ fn calculate_adjustability(ctx: &mut ShapingContext, lang: Lang, region: Option< let Some(next) = glyphs.peek_mut() else { continue }; let width = glyph.x_advance; let delta = width / 2.0; - if next.is_cjk_adjustable() + if glyph.is_cjk_punctuation() + && next.is_cjk_punctuation() && (glyph.shrinkability().1 + next.shrinkability().0) >= delta { let left_delta = glyph.shrinkability().1.min(delta); |
