Skip to content

Instantly share code, notes, and snippets.

@anthrotype
Created April 13, 2022 15:11
Show Gist options
  • Save anthrotype/a1498f5eefd747ffa47ae4d421e905a7 to your computer and use it in GitHub Desktop.
Save anthrotype/a1498f5eefd747ffa47ae4d421e905a7 to your computer and use it in GitHub Desktop.
Print all the glyph 'master' locations from a variable TTF (user-scale coordinates).
"""Print all the glyph 'master' locations from a variable TTF (user-scale coordinates).
A 'master' along a given axis is where a delta-set region peaks.
"""
from fontTools.varLib.models import piecewiseLinearMap
def map_axis_values(axis_mappings, location):
return {
axis: piecewiseLinearMap(value, axis_mappings[axis])
for axis, value in location.items()
}
def get_gvar_glyph_masters(gvar, axisTags, glyphName):
default = {axisTag: 0.0 for axisTag in axisTags}
masters = [default]
for var in gvar.variations[glyphName]:
masters.append(
{
**default,
**{axis: peak for axis, (start, peak, end) in var.axes.items()},
}
)
return masters
def get_all_gvar_masters(ttf, asUserSpace=True):
fvar = ttf["fvar"]
reverseFvarMaps = {
a.axisTag: {-1: a.minValue, 0: a.defaultValue, 1: a.maxValue} for a in fvar.axes
}
axisTags = list(reverseFvarMaps.keys())
reverseAvarMaps = None
if asUserSpace and "avar" in ttf:
avar = ttf["avar"]
reverseAvarMaps = {
k: {v: k for k, v in avar.segments[k].items()} for k in avar.segments.keys()
}
gvar = ttf["gvar"]
result = {}
for glyphName in gvar.variations.keys():
masters = get_gvar_glyph_masters(gvar, axisTags, glyphName)
if asUserSpace:
if reverseAvarMaps:
masters = (map_axis_values(reverseAvarMaps, loc) for loc in masters)
masters = [map_axis_values(reverseFvarMaps, loc) for loc in masters]
result[glyphName] = masters
return result
if __name__ == "__main__":
import sys
from pprint import pprint
from fontTools.ttLib import TTFont
ttf = TTFont(sys.argv[1])
gvar_masters = get_all_gvar_masters(ttf, asUserSpace=True)
max_per_glyph_masters = max(len(masters) for masters in gvar_masters.values())
print(max_per_glyph_masters)
pprint(gvar_masters)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment