11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import 230e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.py23 import * 38413c108d21e8cf0e9059bbfffde8d13f2616340Behdad Esfahbodfrom fontTools.misc import sstruct 47842e56b97ce677b83bdab09cda48bc2d89ac75aJustfrom fontTools.misc.textTools import safeEval 530e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom . import DefaultTable 67842e56b97ce677b83bdab09cda48bc2d89ac75aJust 77842e56b97ce677b83bdab09cda48bc2d89ac75aJustvheaFormat = """ 87842e56b97ce677b83bdab09cda48bc2d89ac75aJust > # big endian 97842e56b97ce677b83bdab09cda48bc2d89ac75aJust tableVersion: 16.16F 107842e56b97ce677b83bdab09cda48bc2d89ac75aJust ascent: h 117842e56b97ce677b83bdab09cda48bc2d89ac75aJust descent: h 127842e56b97ce677b83bdab09cda48bc2d89ac75aJust lineGap: h 137842e56b97ce677b83bdab09cda48bc2d89ac75aJust advanceHeightMax: H 147842e56b97ce677b83bdab09cda48bc2d89ac75aJust minTopSideBearing: h 157842e56b97ce677b83bdab09cda48bc2d89ac75aJust minBottomSideBearing: h 167842e56b97ce677b83bdab09cda48bc2d89ac75aJust yMaxExtent: h 177842e56b97ce677b83bdab09cda48bc2d89ac75aJust caretSlopeRise: h 187842e56b97ce677b83bdab09cda48bc2d89ac75aJust caretSlopeRun: h 197842e56b97ce677b83bdab09cda48bc2d89ac75aJust reserved0: h 207842e56b97ce677b83bdab09cda48bc2d89ac75aJust reserved1: h 217842e56b97ce677b83bdab09cda48bc2d89ac75aJust reserved2: h 227842e56b97ce677b83bdab09cda48bc2d89ac75aJust reserved3: h 237842e56b97ce677b83bdab09cda48bc2d89ac75aJust reserved4: h 247842e56b97ce677b83bdab09cda48bc2d89ac75aJust metricDataFormat: h 257842e56b97ce677b83bdab09cda48bc2d89ac75aJust numberOfVMetrics: H 267842e56b97ce677b83bdab09cda48bc2d89ac75aJust""" 277842e56b97ce677b83bdab09cda48bc2d89ac75aJust 287842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__v_h_e_a(DefaultTable.DefaultTable): 297842e56b97ce677b83bdab09cda48bc2d89ac75aJust 307842e56b97ce677b83bdab09cda48bc2d89ac75aJust dependencies = ['vmtx', 'glyf'] 317842e56b97ce677b83bdab09cda48bc2d89ac75aJust 327842e56b97ce677b83bdab09cda48bc2d89ac75aJust def decompile(self, data, ttFont): 337842e56b97ce677b83bdab09cda48bc2d89ac75aJust sstruct.unpack(vheaFormat, data, self) 347842e56b97ce677b83bdab09cda48bc2d89ac75aJust 357842e56b97ce677b83bdab09cda48bc2d89ac75aJust def compile(self, ttFont): 367842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.recalc(ttFont) 377842e56b97ce677b83bdab09cda48bc2d89ac75aJust return sstruct.pack(vheaFormat, self) 387842e56b97ce677b83bdab09cda48bc2d89ac75aJust 397842e56b97ce677b83bdab09cda48bc2d89ac75aJust def recalc(self, ttFont): 407842e56b97ce677b83bdab09cda48bc2d89ac75aJust vtmxTable = ttFont['vmtx'] 41bc5e1cb195c0bfa1c8e7507326d5a9ad05aecb4bBehdad Esfahbod if 'glyf' in ttFont: 427842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not ttFont.isLoaded('glyf'): 437842e56b97ce677b83bdab09cda48bc2d89ac75aJust return 447842e56b97ce677b83bdab09cda48bc2d89ac75aJust glyfTable = ttFont['glyf'] 457842e56b97ce677b83bdab09cda48bc2d89ac75aJust advanceHeightMax = -100000 # arbitrary big negative number 467842e56b97ce677b83bdab09cda48bc2d89ac75aJust minTopSideBearing = 100000 # arbitrary big number 477842e56b97ce677b83bdab09cda48bc2d89ac75aJust minBottomSideBearing = 100000 # arbitrary big number 487842e56b97ce677b83bdab09cda48bc2d89ac75aJust yMaxExtent = -100000 # arbitrary big negative number 497842e56b97ce677b83bdab09cda48bc2d89ac75aJust 507842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in ttFont.getGlyphOrder(): 517842e56b97ce677b83bdab09cda48bc2d89ac75aJust height, tsb = vtmxTable[name] 527842e56b97ce677b83bdab09cda48bc2d89ac75aJust g = glyfTable[name] 537842e56b97ce677b83bdab09cda48bc2d89ac75aJust if g.numberOfContours <= 0: 547842e56b97ce677b83bdab09cda48bc2d89ac75aJust continue 557842e56b97ce677b83bdab09cda48bc2d89ac75aJust advanceHeightMax = max(advanceHeightMax, height) 567842e56b97ce677b83bdab09cda48bc2d89ac75aJust minTopSideBearing = min(minTopSideBearing, tsb) 577842e56b97ce677b83bdab09cda48bc2d89ac75aJust rsb = height - tsb - (g.yMax - g.yMin) 587842e56b97ce677b83bdab09cda48bc2d89ac75aJust minBottomSideBearing = min(minBottomSideBearing, rsb) 597842e56b97ce677b83bdab09cda48bc2d89ac75aJust extent = tsb + (g.yMax - g.yMin) 607842e56b97ce677b83bdab09cda48bc2d89ac75aJust yMaxExtent = max(yMaxExtent, extent) 617842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.advanceHeightMax = advanceHeightMax 627842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.minTopSideBearing = minTopSideBearing 637842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.minBottomSideBearing = minBottomSideBearing 647842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.yMaxExtent = yMaxExtent 657842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 667842e56b97ce677b83bdab09cda48bc2d89ac75aJust # XXX CFF recalc... 677842e56b97ce677b83bdab09cda48bc2d89ac75aJust pass 687842e56b97ce677b83bdab09cda48bc2d89ac75aJust 697842e56b97ce677b83bdab09cda48bc2d89ac75aJust def toXML(self, writer, ttFont): 707842e56b97ce677b83bdab09cda48bc2d89ac75aJust formatstring, names, fixes = sstruct.getformat(vheaFormat) 717842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in names: 727842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = getattr(self, name) 737842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.simpletag(name, value=value) 747842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 757842e56b97ce677b83bdab09cda48bc2d89ac75aJust 763a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod def fromXML(self, name, attrs, content, ttFont): 777842e56b97ce677b83bdab09cda48bc2d89ac75aJust setattr(self, name, safeEval(attrs["value"])) 787842e56b97ce677b83bdab09cda48bc2d89ac75aJust 79