def fix_pua(font): unencoded_glyphs = get_unencoded_glyphs(font) if not unencoded_glyphs: return ucs2cmap = None cmap = font["cmap"] # Check if an UCS-2 cmap exists for ucs2cmapid in ((3, 1), (0, 3), (3, 0)): ucs2cmap = cmap.getcmap(ucs2cmapid[0], ucs2cmapid[1]) if ucs2cmap: break # Create UCS-4 cmap and copy the contents of UCS-2 cmap # unless UCS 4 cmap already exists ucs4cmap = cmap.getcmap(3, 10) if not ucs4cmap: cmapModule = getTableModule('cmap') ucs4cmap = cmapModule.cmap_format_12(12) ucs4cmap.platformID = 3 ucs4cmap.platEncID = 10 ucs4cmap.language = 0 if ucs2cmap: ucs4cmap.cmap = deepcopy(ucs2cmap.cmap) cmap.tables.append(ucs4cmap) # Map all glyphs to UCS-4 cmap Supplementary PUA-A codepoints # by 0xF0000 + glyphID ucs4cmap = cmap.getcmap(3, 10) for glyphID, glyph in enumerate(font.getGlyphOrder()): if glyph in unencoded_glyphs: ucs4cmap.cmap[0xF0000 + glyphID] = glyph font['cmap'] = cmap return True
def main(): args = parser.parse_args() for path in args.ttf_font: if not os.path.exists(path): continue if args.autofix: FontFixer(path, fixes=[fix_pua], verbose=True).fix() else: font = ttLib.TTFont(path, 0) print(("\nThese are the unencoded glyphs in font file '{0}':\n" "{1}").format(path, '\n'.join(get_unencoded_glyphs(font))))