summaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorPeng Guanwen <pg999w@outlook.com>2023-06-01 21:14:56 +0800
committerGitHub <noreply@github.com>2023-06-01 15:14:56 +0200
commita54cde71cbbc349f2abfd6e1db31a4d1c9091de8 (patch)
tree1b6c8f0c77f09fc0ed070dc13fb402e2df2820c6 /library
parent3093b566ab4c82032064d525d10d7c72494aa957 (diff)
Bugfix of CJK punctuation adjustment (#1384)
Diffstat (limited to 'library')
-rw-r--r--library/src/text/shaping.rs15
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);