add glyph width checking functionality to ensure monospace compliance #314

This commit is contained in:
subframe7536 2025-01-20 17:12:38 +08:00
parent 5dd2c2ea3d
commit 070b3a52f9
2 changed files with 30 additions and 0 deletions

View file

@ -16,6 +16,7 @@ from fontTools.feaLib.builder import addOpenTypeFeatures
from fontTools.merge import Merger
from source.py.utils import (
check_font_patcher,
check_glyph_width,
download_cn_base_font,
get_font_forge_bin,
get_font_name,
@ -930,6 +931,7 @@ def build_cn(f: str, font_config: FontConfig, build_option: BuildOption):
}
cn_font["meta"] = meta
# check_char_width(cn_font, [0, 600, 1200])
target_path = joinPaths(
build_option.output_cn,
f"{font_config.family_name_compact}-{build_option.cn_suffix_compact}-{style_compact_cn}.ttf",
@ -955,6 +957,8 @@ def main():
build_option = BuildOption(font_config)
build_option.load_cn_dir_and_suffix(font_config.should_build_nf_cn())
glyph_width = 600
if parsed_args.dry:
print("font_config:", json.dumps(font_config.__dict__, indent=4))
if not is_ci():
@ -1020,6 +1024,8 @@ def main():
3,
)
check_glyph_width(font, [0, glyph_width])
font.save(
input_file.replace(build_option.src_dir, build_option.output_variable)
)
@ -1120,6 +1126,13 @@ def main():
build_option.is_cn_built = True
check_glyph_width(
TTFont(
joinPaths(build_option.output_cn, listdir(build_option.output_cn)[0])
),
[0, glyph_width, glyph_width * 2]
)
# write config to output path
with open(
joinPaths(build_option.output_dir, "build-config.json"), "w", encoding="utf-8"

View file

@ -187,3 +187,20 @@ def match_unicode_names(file_path: str) -> dict[str, str]:
result[unicode_str] = glyph_name
return result
def check_glyph_width(font: TTFont, matched_width: tuple[int]):
print("Checking glyph width...")
result: tuple[str, int] = []
for name in font.getGlyphOrder():
width, _ = font["hmtx"][name]
if width not in matched_width:
result.append([name, width])
if result.__len__() > 0:
print("Exist unmatched width:")
for item in result:
print(f"{item[0]}\t{item[1]}")
raise Exception(
f"The font may contain glyphs that are not {matched_width} wide, which may broke monospace rule."
)