from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * from fontTools.misc import sstruct from fontTools.misc.textTools import safeEval from . import DefaultTable vheaFormat = """ > # big endian tableVersion: 16.16F ascent: h descent: h lineGap: h advanceHeightMax: H minTopSideBearing: h minBottomSideBearing: h yMaxExtent: h caretSlopeRise: h caretSlopeRun: h reserved0: h reserved1: h reserved2: h reserved3: h reserved4: h metricDataFormat: h numberOfVMetrics: H """ class table__v_h_e_a(DefaultTable.DefaultTable): dependencies = ['vmtx', 'glyf'] def decompile(self, data, ttFont): sstruct.unpack(vheaFormat, data, self) def compile(self, ttFont): self.recalc(ttFont) return sstruct.pack(vheaFormat, self) def recalc(self, ttFont): vtmxTable = ttFont['vmtx'] if 'glyf' in ttFont: if not ttFont.isLoaded('glyf'): return glyfTable = ttFont['glyf'] advanceHeightMax = -100000 # arbitrary big negative number minTopSideBearing = 100000 # arbitrary big number minBottomSideBearing = 100000 # arbitrary big number yMaxExtent = -100000 # arbitrary big negative number for name in ttFont.getGlyphOrder(): height, tsb = vtmxTable[name] g = glyfTable[name] if g.numberOfContours <= 0: continue advanceHeightMax = max(advanceHeightMax, height) minTopSideBearing = min(minTopSideBearing, tsb) rsb = height - tsb - (g.yMax - g.yMin) minBottomSideBearing = min(minBottomSideBearing, rsb) extent = tsb + (g.yMax - g.yMin) yMaxExtent = max(yMaxExtent, extent) self.advanceHeightMax = advanceHeightMax self.minTopSideBearing = minTopSideBearing self.minBottomSideBearing = minBottomSideBearing self.yMaxExtent = yMaxExtent else: # XXX CFF recalc... pass def toXML(self, writer, ttFont): formatstring, names, fixes = sstruct.getformat(vheaFormat) for name in names: value = getattr(self, name) writer.simpletag(name, value=value) writer.newline() def fromXML(self, name, attrs, content, ttFont): setattr(self, name, safeEval(attrs["value"]))