diff options
Diffstat (limited to 'Lib/fontTools/otlLib/optimize/__init__.py')
-rw-r--r-- | Lib/fontTools/otlLib/optimize/__init__.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Lib/fontTools/otlLib/optimize/__init__.py b/Lib/fontTools/otlLib/optimize/__init__.py new file mode 100644 index 00000000..5c007e89 --- /dev/null +++ b/Lib/fontTools/otlLib/optimize/__init__.py @@ -0,0 +1,68 @@ +from argparse import RawTextHelpFormatter +from textwrap import dedent + +from fontTools.ttLib import TTFont +from fontTools.otlLib.optimize.gpos import compact, GPOS_COMPACT_MODE_DEFAULT + +def main(args=None): + """Optimize the layout tables of an existing font.""" + from argparse import ArgumentParser + from fontTools import configLogger + + parser = ArgumentParser(prog="otlLib.optimize", description=main.__doc__, formatter_class=RawTextHelpFormatter) + parser.add_argument("font") + parser.add_argument( + "-o", metavar="OUTPUTFILE", dest="outfile", default=None, help="output file" + ) + parser.add_argument( + "--gpos-compact-mode", + help=dedent( + f"""\ + GPOS Lookup type 2 (PairPos) compaction mode: + 0 = do not attempt to compact PairPos lookups; + 1 to 8 = create at most 1 to 8 new subtables for each existing + subtable, provided that it would yield a 50%% file size saving; + 9 = create as many new subtables as needed to yield a file size saving. + Default: {GPOS_COMPACT_MODE_DEFAULT}. + + This compaction aims to save file size, by splitting large class + kerning subtables (Format 2) that contain many zero values into + smaller and denser subtables. It's a trade-off between the overhead + of several subtables versus the sparseness of one big subtable. + + See the pull request: https://github.com/fonttools/fonttools/pull/2326 + """ + ), + default=int(GPOS_COMPACT_MODE_DEFAULT), + choices=list(range(10)), + type=int, + ) + logging_group = parser.add_mutually_exclusive_group(required=False) + logging_group.add_argument( + "-v", "--verbose", action="store_true", help="Run more verbosely." + ) + logging_group.add_argument( + "-q", "--quiet", action="store_true", help="Turn verbosity off." + ) + options = parser.parse_args(args) + + configLogger( + level=("DEBUG" if options.verbose else "ERROR" if options.quiet else "INFO") + ) + + font = TTFont(options.font) + # TODO: switch everything to have type(mode) = int when using the Config class + compact(font, str(options.gpos_compact_mode)) + font.save(options.outfile or options.font) + + + +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + sys.exit(main()) + import doctest + + sys.exit(doctest.testmod().failed) + |