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