You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.6 KiB
Python

from fontTools.misc.roundTools import noRound
from fontTools.ttLib import TTFont, newTable
from fontTools.ttLib.tables import otTables as ot
from fontTools.ttLib.tables.otBase import OTTableWriter
from fontTools.varLib import HVAR_FIELDS, VVAR_FIELDS, _add_VHVAR
from fontTools.varLib import builder, models, varStore
from fontTools.misc.fixedTools import fixedToFloat as fi2fl
from fontTools.misc.cliTools import makeOutputFileName
from functools import partial
import logging
log = logging.getLogger("fontTools.varLib.avar")
def _get_advance_metrics(font, axisTags, tableFields):
# There's two ways we can go from here:
# 1. For each glyph, at each master peak, compute the value of the
# advance width at that peak. Then pass these all to a VariationModel
# builder to compute back the deltas.
# 2. For each master peak, pull out the deltas of the advance width directly,
# and feed these to the VarStoreBuilder, forgoing the remodeling step.
# We'll go with the second option, as it's simpler, faster, and more direct.
gvar = font["gvar"]
vhAdvanceDeltasAndSupports = {}
glyphOrder = font.getGlyphOrder()
phantomIndex = tableFields.phantomIndex
for glyphName in glyphOrder:
supports = []
deltas = []
variations = gvar.variations.get(glyphName, [])
for tv in variations:
supports.append(tv.axes)
phantoms = tv.coordinates[-4:]
phantoms = phantoms[phantomIndex * 2 : phantomIndex * 2 + 2]
assert len(phantoms) == 2
phantoms[0] = phantoms[0][phantomIndex] if phantoms[0] is not None else 0
phantoms[1] = phantoms[1][phantomIndex] if phantoms[1] is not None else 0
deltas.append(phantoms[1] - phantoms[0])
vhAdvanceDeltasAndSupports[glyphName] = (deltas, supports)
vOrigDeltasAndSupports = None # TODO
return vhAdvanceDeltasAndSupports, vOrigDeltasAndSupports
def add_HVAR(font):
if "HVAR" in font:
del font["HVAR"]
axisTags = [axis.axisTag for axis in font["fvar"].axes]
getAdvanceMetrics = partial(_get_advance_metrics, font, axisTags, HVAR_FIELDS)
_add_VHVAR(font, axisTags, HVAR_FIELDS, getAdvanceMetrics)
def add_VVAR(font):
if "VVAR" in font:
del font["VVAR"]
getAdvanceMetrics = partial(_get_advance_metrics, font, axisTags, VVAR_FIELDS)
axisTags = [axis.axisTag for axis in font["fvar"].axes]
_add_VHVAR(font, axisTags, VVAR_FIELDS, getAdvanceMetrics)
def main(args=None):
"""Add `HVAR` table to variable font."""
if args is None:
import sys
args = sys.argv[1:]
from fontTools import configLogger
from fontTools.designspaceLib import DesignSpaceDocument
import argparse
parser = argparse.ArgumentParser(
"fonttools varLib.hvar",
description="Add `HVAR` table from to variable font.",
)
parser.add_argument("font", metavar="varfont.ttf", help="Variable-font file.")
parser.add_argument(
"-o",
"--output-file",
type=str,
help="Output font file name.",
)
options = parser.parse_args(args)
configLogger(level="WARNING")
font = TTFont(options.font)
if not "fvar" in font:
log.error("Not a variable font.")
return 1
add_HVAR(font)
if "vmtx" in font:
add_VVAR(font)
if options.output_file is None:
outfile = makeOutputFileName(options.font, overWrite=True, suffix=".hvar")
else:
outfile = options.output_file
if outfile:
log.info("Saving %s", outfile)
font.save(outfile)
if __name__ == "__main__":
import sys
sys.exit(main())