#!/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)