diff options
author | Rasmus Andersson <rasmus@notion.se> | 2018-09-17 20:05:45 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2018-10-11 09:37:53 +0300 |
commit | c163658d674a10090eb81b5c0c5025594b321ca9 (patch) | |
tree | bd161069d7038ebdb9a547276931a8d384961261 /misc | |
parent | 287f146a06afe96e191a4be3d047cfee594dfd2f (diff) | |
download | inter-c163658d674a10090eb81b5c0c5025594b321ca9.tar.xz |
tooling: decompose and remove overlaps of SVG glyphs generated for the website
Diffstat (limited to 'misc')
-rwxr-xr-x | misc/tools/gen-metrics-and-svgs.py | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/misc/tools/gen-metrics-and-svgs.py b/misc/tools/gen-metrics-and-svgs.py index 109dca4d9..88b691d7d 100755 --- a/misc/tools/gen-metrics-and-svgs.py +++ b/misc/tools/gen-metrics-and-svgs.py @@ -18,9 +18,11 @@ from collections import OrderedDict from math import ceil, floor from defcon import Font from svg import SVGPathPen +from ufo2ft.filters.decomposeComponents import DecomposeComponentsFilter +from ufo2ft.filters.removeOverlaps import RemoveOverlapsFilter -font = None # RFont +ufo = None ufopath = '' effectiveAscender = 0 scale = 0.1 @@ -30,31 +32,6 @@ def num(s): return int(s) if s.find('.') == -1 else float(s) -def decomposeGlyph(font, glyph): - """Moves the components of a glyph to its outline.""" - if len(glyph.components): - deepCopyContours(font, glyph, glyph, (0, 0), (1, 1)) - glyph.clearComponents() - - -def deepCopyContours(font, parent, component, offset, scale): - """Copy contours to parent from component, including nested components.""" - - for nested in component.components: - deepCopyContours( - font, parent, font[nested.baseGlyph], - (offset[0] + nested.offset[0], offset[1] + nested.offset[1]), - (scale[0] * nested.scale[0], scale[1] * nested.scale[1])) - - if component == parent: - return - for contour in component: - contour = contour.copy() - contour.scale(scale) - contour.move(offset) - parent.appendContour(contour) - - def glyphToSVGPath(g, yMul): pen = SVGPathPen(g.getParent(), yMul) @@ -82,16 +59,16 @@ def glyphToSVG(g): ''' % { 'name': g.name, 'width': int(ceil(width * scale)), - 'height': int(ceil((effectiveAscender - font.info.descender) * scale)), + 'height': int(ceil((effectiveAscender - ufo.info.descender) * scale)), 'xoffs': -(xoffs * scale), 'yoffs': effectiveAscender * scale, # 'leftMargin': g.leftMargin * scale, # 'rightMargin': g.rightMargin * scale, 'glyphSVGPath': glyphToSVGPath(g, -1), - # 'ascender': font.info.ascender * scale, - # 'descender': font.info.descender * scale, - # 'baselineOffset': (font.info.unitsPerEm + font.info.descender) * scale, - # 'unitsPerEm': font.info.unitsPerEm, + # 'ascender': ufo.info.ascender * scale, + # 'descender': ufo.info.descender * scale, + # 'baselineOffset': (ufo.info.unitsPerEm + ufo.info.descender) * scale, + # 'unitsPerEm': ufo.info.unitsPerEm, 'scale': scale, # 'margin': [g.leftMargin * scale, g.rightMargin * scale], @@ -173,7 +150,7 @@ def findGlifFile(glyphname): usedSVGNames = set() def genGlyph(glyphName): - g = font[glyphName] + g = ufo[glyphName] return glyphToSVG(g) @@ -188,11 +165,11 @@ def genGlyphIDs(glyphnames): return nameToIdMap, idToNameMap -def genKerningInfo(font, glyphnames, nameToIdMap): - kerning = font.kerning +def genKerningInfo(ufo, glyphnames, nameToIdMap): + kerning = ufo.kerning # load groups - filename = os.path.join(font.path, 'groups.plist') + filename = os.path.join(ufo.path, 'groups.plist') groups = plistlib.readPlist(filename) pairs = [] @@ -269,16 +246,27 @@ if len(args.scale): ufopath = args.ufopath.rstrip('/') -font = Font(ufopath) -effectiveAscender = max(font.info.ascender, font.info.unitsPerEm) +ufo = Font(ufopath) +effectiveAscender = max(ufo.info.ascender, ufo.info.unitsPerEm) + +print('preprocessing glyphs') +filters = [ + DecomposeComponentsFilter(), + RemoveOverlapsFilter(backend=RemoveOverlapsFilter.Backend.SKIA_PATHOPS), +] +glyphSet = {g.name: g for g in ufo} +for func in filters: + func(ufo, glyphSet) + +print('generating SVGs and metrics data') -# print('\n'.join(font.keys())) +# print('\n'.join(ufo.keys())) # sys.exit(0) deleteNames.add('.notdef') deleteNames.add('.null') -glyphnames = args.glyphs if len(args.glyphs) else font.keys() +glyphnames = args.glyphs if len(args.glyphs) else ufo.keys() glyphnameSet = set(glyphnames) glyphnames = [gn for gn in glyphnames if gn not in deleteNames] @@ -321,7 +309,7 @@ if startPos == -1 or endPos == -1: print(msg % relfilename, file=sys.stderr) sys.exit(1) -kerning = genKerningInfo(font, glyphnames, nameToIdMap) +kerning = genKerningInfo(ufo, glyphnames, nameToIdMap) metaJson = '{\n' metaJson += '"nameids":' + fmtJsonDict(idToNameMap) + ',\n' metaJson += '"metrics":' + fmtJsonDict(glyphMetrics) + ',\n' |