diff --git a/bin/gftools-fix-fsselection.py b/bin/gftools-fix-fsselection.py index 9d13f96ce..40f24a210 100755 --- a/bin/gftools-fix-fsselection.py +++ b/bin/gftools-fix-fsselection.py @@ -19,70 +19,62 @@ import os import sys -from fontTools import ttLib +from fontTools.ttLib import TTFont import tabulate from gftools.utils import get_fsSelection_byte1, get_fsSelection_byte2 from gftools.util.styles import STYLE_NAMES, is_filename_canonical from gftools.fix import fix_fs_selection, FontFixer -parser = argparse.ArgumentParser(description='Print out fsSelection' - ' bitmask of the fonts') -parser.add_argument('font', nargs="+") -parser.add_argument('--csv', default=False, action='store_true') -parser.add_argument('--usetypometrics', default=False, action='store_true') -parser.add_argument('--autofix', default=False, action='store_true') +parser = argparse.ArgumentParser( + description="Print out fsSelection" " bitmask of the fonts" +) +parser.add_argument("fonts", nargs="+") +parser.add_argument("--csv", default=False, action="store_true") +parser.add_argument("--usetypometrics", default=False, action="store_true") +parser.add_argument("--autofix", default=False, action="store_true") def printInfo(fonts, print_csv=False): - rows = [] - headers = ['filename', 'fsSelection'] - for font in fonts: - ttfont = ttLib.TTFont(font) - row = [os.path.basename(font)] - row.append(('{:#010b} ' - '{:#010b}' - '').format(get_fsSelection_byte2(ttfont), - get_fsSelection_byte1(ttfont)).replace('0b', '')) - rows.append(row) + rows = [] + headers = ["filename", "fsSelection"] + for font in fonts: + row = [os.path.basename(font.reader.file.name)] + row.append( + ("{:#010b} " "{:#010b}" "") + .format(get_fsSelection_byte2(font), get_fsSelection_byte1(font)) + .replace("0b", "") + ) + rows.append(row) - def as_csv(rows): - writer = csv.writer(sys.stdout) - writer.writerows([headers]) - writer.writerows(rows) - sys.exit(0) + def as_csv(rows): + writer = csv.writer(sys.stdout) + writer.writerows([headers]) + writer.writerows(rows) + sys.exit(0) - if print_csv: - as_csv(rows) - else: - print(tabulate.tabulate(rows, headers, tablefmt="pipe")) + if print_csv: + as_csv(rows) + else: + print(tabulate.tabulate(rows, headers, tablefmt="pipe")) -def main(): - args = parser.parse_args() - if args.autofix: - fixed_fonts = [] - for font in args.font: - filename = os.path.basename(font) - - if not is_filename_canonical(filename): - print(f"Font filename '{filename}' is not canonical!\n\n" - f"Filename must be structured as familyname-style.ttf and " - f"the style must be any of the following {STYLE_NAMES}") - exit(-1) - - fixer = FontFixer(font) - fixer.fixes = [fix_fs_selection] - fixer.fix() - if fixer.saveit: - fixed_fonts.append(font) - - if len(fixed_fonts) > 0: - printInfo([f + '.fix' for f in fixed_fonts], print_csv=args.csv) - sys.exit(0) - - printInfo(args.font, print_csv=args.csv) +def main(): + args = parser.parse_args() + fonts = [TTFont(f) for f in args.fonts] + for font in fonts: + os2 = font["OS/2"] + old_fs = font["OS/2"].fsSelection + if args.usetypometrics: + os2.fsSelection |= 1 << 7 + if args.autofix: + fix_fs_selection(font) + new_fs = os2.fsSelection + if new_fs != old_fs: + out_fp = font.reader.file.name + ".fix" + print(f"Saving {out_fp}") + font.save(out_fp) + printInfo(fonts, print_csv=args.csv) -if __name__ == '__main__': +if __name__ == "__main__": main() -