From e3a3079fb2a6addf61849375f8c400a00c88b5f2 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 27 Feb 2026 05:25:25 +0900 Subject: [PATCH] cjk baseline fix --- OTFbuild/calligra_font_tests.odt | Bin 14708 -> 14878 bytes OTFbuild/font_builder.py | 7 +++++++ 2 files changed, 7 insertions(+) diff --git a/OTFbuild/calligra_font_tests.odt b/OTFbuild/calligra_font_tests.odt index bc904ae0ad26fe84a48795f35bdc1d5dbc4fd950..6e7f6bac9ce2538a8be31df9a667b39ff95839c9 100644 GIT binary patch delta 8016 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 delta 7807 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 diff --git a/OTFbuild/font_builder.py b/OTFbuild/font_builder.py index f7e161c..83c0d26 100644 --- a/OTFbuild/font_builder.py +++ b/OTFbuild/font_builder.py @@ -246,6 +246,8 @@ def build_font(assets_dir, output_path, no_bitmap=False, no_features=False): pen.closePath() charstrings[".notdef"] = pen.getCharString() + _unihan_cps = set(SC.CODE_RANGE[SC.SHEET_UNIHAN]) + traced_count = 0 for cp in sorted_cps: g = glyphs[cp] @@ -289,6 +291,11 @@ def build_font(assets_dir, output_path, no_bitmap=False, no_features=False): else: y_offset = -g.props.nudge_y * SCALE + # Unihan glyphs are 16px tall in a 20px cell; the bitmap engine + # centres them vertically with offsetUnihan = (H - H_UNIHAN) / 2. + if cp in _unihan_cps: + y_offset -= ((SC.H - SC.H_UNIHAN) // 2) * SCALE + contours = trace_bitmap(g.bitmap, g.props.width) pen = T2CharStringPen(advance, None)