96dddeb20b
- fix(test): 添加 useSearchParams mock,修正联系链接断言 - style(nav): 将"联系我们"改为"联系" - chore(deploy): 更新 Nginx 配置和部署文档 - style(logo): 更新 Logo SVG 文件 - feat(scripts): 添加字体处理和站点配置脚本
69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""验证字体子集与原始字体的字形一致性"""
|
|
|
|
from fontTools.ttLib import TTFont
|
|
from fontTools.ttLib.tables import _h_m_t_x, _g_a_s_p
|
|
import os
|
|
|
|
# 修补表解析
|
|
original_hmtx = _h_m_t_x.table__h_m_t_x.decompile
|
|
def patched_hmtx(self, data, ttFont):
|
|
try: return original_hmtx(self, data, ttFont)
|
|
except: self.metrics = {}
|
|
_h_m_t_x.table__h_m_t_x.decompile = patched_hmtx
|
|
|
|
original_gasp = _g_a_s_p.table__g_a_s_p.decompile
|
|
def patched_gasp(self, data, ttFont):
|
|
try: return original_gasp(self, data, ttFont)
|
|
except: self.gaspRanges = {}
|
|
_g_a_s_p.table__g_a_s_p.decompile = patched_gasp
|
|
|
|
base = 'src/app/fonts'
|
|
|
|
# 加载字体
|
|
original = TTFont(f'{base}/AoyagiReisho.ttf')
|
|
subset = TTFont(f'{base}/AoyagiReisho-subset.ttf')
|
|
|
|
print("=" * 50)
|
|
print("字体对比验证")
|
|
print("=" * 50)
|
|
|
|
# 文件大小
|
|
orig_size = os.path.getsize(f'{base}/AoyagiReisho.ttf')
|
|
sub_size = os.path.getsize(f'{base}/AoyagiReisho-subset.ttf')
|
|
print(f"\n原始字体大小: {orig_size / 1024:.1f} KB ({orig_size} bytes)")
|
|
print(f"子集字体大小: {sub_size / 1024:.1f} KB ({sub_size} bytes)")
|
|
|
|
# CMAP 对比
|
|
orig_cmap = original.getBestCmap()
|
|
sub_cmap = subset.getBestCmap()
|
|
|
|
target_chars = [0x20, 0x777f, 0x65b0, 0x81f4, 0x9060]
|
|
char_names = {0x20: '空格', 0x777f: '睿', 0x65b0: '新', 0x81f4: '致', 0x9060: '遠'}
|
|
|
|
print("\n字符映射对比:")
|
|
for code in target_chars:
|
|
name = char_names[code]
|
|
orig_glyph = orig_cmap.get(code, 'MISSING')
|
|
sub_glyph = sub_cmap.get(code, 'MISSING')
|
|
match = "✓" if orig_glyph == sub_glyph else "✗"
|
|
print(f" U+{code:04X} ({name}): 原始={orig_glyph}, 子集={sub_glyph} {match}")
|
|
|
|
# 字形数量
|
|
print(f"\n字形数量:")
|
|
print(f" 原始: {len(original.getGlyphOrder())}")
|
|
print(f" 子集: {len(subset.getGlyphOrder())}")
|
|
|
|
# 表对比
|
|
print("\n字体表:")
|
|
orig_tables = set(original.keys())
|
|
sub_tables = set(subset.keys())
|
|
print(f" 原始表: {sorted(orig_tables)}")
|
|
print(f" 子集表: {sorted(sub_tables)}")
|
|
|
|
original.close()
|
|
subset.close()
|
|
|
|
print("\n" + "=" * 50)
|