def bzs_to_glyph(bzs, glyph): coordinates = [] flags = [] endPtsOfContours = [] for sp in bzs: for i in range(len(sp)): lastbz = sp[i - 1] bz = sp[i] if len(bz) != 3 or len(lastbz) != 3 or lerppt(0.5, lastbz[1], bz[1]) != bz[0]: coordinates.append(pt_to_int(bz[0])) flags.append(1) if len(bz) == 3: coordinates.append(pt_to_int(bz[1])) flags.append(0) endPtsOfContours.append(len(coordinates) - 1) glyph.coordinates = _g_l_y_f.GlyphCoordinates(coordinates) glyph.flags = flags glyph.endPtsOfContours = endPtsOfContours
def instantiateGvarGlyph(varfont, glyphname, location, optimize=True): glyf = varfont["glyf"] coordinates, ctrl = glyf.getCoordinatesAndControls(glyphname, varfont) endPts = ctrl.endPts gvar = varfont["gvar"] # when exporting to TTX, a glyph with no variations is omitted; thus when loading # a TTFont from TTX, a glyph that's present in glyf table may be missing from gvar. tupleVarStore = gvar.variations.get(glyphname) if tupleVarStore: defaultDeltas = instantiateTupleVariationStore( tupleVarStore, location, coordinates, endPts ) if defaultDeltas: coordinates += _g_l_y_f.GlyphCoordinates(defaultDeltas) # setCoordinates also sets the hmtx/vmtx advance widths and sidebearings from # the four phantom points and glyph bounding boxes. # We call it unconditionally even if a glyph has no variations or no deltas are # applied at this location, in case the glyph's xMin and in turn its sidebearing # have changed. E.g. a composite glyph has no deltas for the component's (x, y) # offset nor for the 4 phantom points (e.g. it's monospaced). Thus its entry in # gvar table is empty; however, the composite's base glyph may have deltas # applied, hence the composite's bbox and left/top sidebearings may need updating # in the instanced font. glyf.setCoordinates(glyphname, coordinates, varfont) if not tupleVarStore: if glyphname in gvar.variations: del gvar.variations[glyphname] return if optimize: isComposite = glyf[glyphname].isComposite() for var in tupleVarStore: var.optimize(coordinates, endPts, isComposite)