Created
April 13, 2022 15:11
-
-
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).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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