_h_h_e_a.py revision 3e097c609540944dd9290ad58df346ca86492031
17842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport DefaultTable
27842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport sstruct
37842e56b97ce677b83bdab09cda48bc2d89ac75aJustfrom fontTools.misc.textTools import safeEval
47842e56b97ce677b83bdab09cda48bc2d89ac75aJust
57842e56b97ce677b83bdab09cda48bc2d89ac75aJusthheaFormat = """
67842e56b97ce677b83bdab09cda48bc2d89ac75aJust		>	# big endian
77842e56b97ce677b83bdab09cda48bc2d89ac75aJust		tableVersion:			16.16F
87842e56b97ce677b83bdab09cda48bc2d89ac75aJust		ascent:					h
97842e56b97ce677b83bdab09cda48bc2d89ac75aJust		descent:				h
107842e56b97ce677b83bdab09cda48bc2d89ac75aJust		lineGap:				h
117842e56b97ce677b83bdab09cda48bc2d89ac75aJust		advanceWidthMax:		H
127842e56b97ce677b83bdab09cda48bc2d89ac75aJust		minLeftSideBearing:		h
137842e56b97ce677b83bdab09cda48bc2d89ac75aJust		minRightSideBearing:	h
147842e56b97ce677b83bdab09cda48bc2d89ac75aJust		xMaxExtent:				h
157842e56b97ce677b83bdab09cda48bc2d89ac75aJust		caretSlopeRise:			h
167842e56b97ce677b83bdab09cda48bc2d89ac75aJust		caretSlopeRun:			h
177842e56b97ce677b83bdab09cda48bc2d89ac75aJust		reserved0:				h
187842e56b97ce677b83bdab09cda48bc2d89ac75aJust		reserved1:				h
197842e56b97ce677b83bdab09cda48bc2d89ac75aJust		reserved2:				h
207842e56b97ce677b83bdab09cda48bc2d89ac75aJust		reserved3:				h
217842e56b97ce677b83bdab09cda48bc2d89ac75aJust		reserved4:				h
227842e56b97ce677b83bdab09cda48bc2d89ac75aJust		metricDataFormat:		h
237842e56b97ce677b83bdab09cda48bc2d89ac75aJust		numberOfHMetrics:		H
247842e56b97ce677b83bdab09cda48bc2d89ac75aJust"""
257842e56b97ce677b83bdab09cda48bc2d89ac75aJust
267842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__h_h_e_a(DefaultTable.DefaultTable):
277842e56b97ce677b83bdab09cda48bc2d89ac75aJust
287842e56b97ce677b83bdab09cda48bc2d89ac75aJust	dependencies = ['hmtx', 'glyf']
297842e56b97ce677b83bdab09cda48bc2d89ac75aJust
307842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def decompile(self, data, ttFont):
317842e56b97ce677b83bdab09cda48bc2d89ac75aJust		sstruct.unpack(hheaFormat, data, self)
327842e56b97ce677b83bdab09cda48bc2d89ac75aJust
337842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def compile(self, ttFont):
343e097c609540944dd9290ad58df346ca86492031Just		if ttFont.isLoaded('glyf') and ttFont.recalcBBoxes:
353e097c609540944dd9290ad58df346ca86492031Just			self.recalc(ttFont)
367842e56b97ce677b83bdab09cda48bc2d89ac75aJust		return sstruct.pack(hheaFormat, self)
377842e56b97ce677b83bdab09cda48bc2d89ac75aJust
387842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def recalc(self, ttFont):
397842e56b97ce677b83bdab09cda48bc2d89ac75aJust		hmtxTable = ttFont['hmtx']
407842e56b97ce677b83bdab09cda48bc2d89ac75aJust		if ttFont.has_key('glyf'):
417842e56b97ce677b83bdab09cda48bc2d89ac75aJust			glyfTable = ttFont['glyf']
427842e56b97ce677b83bdab09cda48bc2d89ac75aJust			advanceWidthMax = -100000    # arbitrary big negative number
437842e56b97ce677b83bdab09cda48bc2d89ac75aJust			minLeftSideBearing = 100000  # arbitrary big number
447842e56b97ce677b83bdab09cda48bc2d89ac75aJust			minRightSideBearing = 100000 # arbitrary big number
457842e56b97ce677b83bdab09cda48bc2d89ac75aJust			xMaxExtent = -100000         # arbitrary big negative number
467842e56b97ce677b83bdab09cda48bc2d89ac75aJust
477842e56b97ce677b83bdab09cda48bc2d89ac75aJust			for name in ttFont.getGlyphOrder():
487842e56b97ce677b83bdab09cda48bc2d89ac75aJust				width, lsb = hmtxTable[name]
497842e56b97ce677b83bdab09cda48bc2d89ac75aJust				g = glyfTable[name]
507842e56b97ce677b83bdab09cda48bc2d89ac75aJust				if g.numberOfContours <= 0:
517842e56b97ce677b83bdab09cda48bc2d89ac75aJust					continue
527842e56b97ce677b83bdab09cda48bc2d89ac75aJust				advanceWidthMax = max(advanceWidthMax, width)
537842e56b97ce677b83bdab09cda48bc2d89ac75aJust				minLeftSideBearing = min(minLeftSideBearing, lsb)
547842e56b97ce677b83bdab09cda48bc2d89ac75aJust				rsb = width - lsb - (g.xMax - g.xMin)
557842e56b97ce677b83bdab09cda48bc2d89ac75aJust				minRightSideBearing = min(minRightSideBearing, rsb)
567842e56b97ce677b83bdab09cda48bc2d89ac75aJust				extent = lsb + (g.xMax - g.xMin)
577842e56b97ce677b83bdab09cda48bc2d89ac75aJust				xMaxExtent = max(xMaxExtent, extent)
587842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.advanceWidthMax = advanceWidthMax
597842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.minLeftSideBearing = minLeftSideBearing
607842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.minRightSideBearing = minRightSideBearing
617842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.xMaxExtent = xMaxExtent
627842e56b97ce677b83bdab09cda48bc2d89ac75aJust		else:
637842e56b97ce677b83bdab09cda48bc2d89ac75aJust			# XXX CFF recalc...
647842e56b97ce677b83bdab09cda48bc2d89ac75aJust			pass
657842e56b97ce677b83bdab09cda48bc2d89ac75aJust
667842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def toXML(self, writer, ttFont):
677842e56b97ce677b83bdab09cda48bc2d89ac75aJust		formatstring, names, fixes = sstruct.getformat(hheaFormat)
687842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for name in names:
697842e56b97ce677b83bdab09cda48bc2d89ac75aJust			value = getattr(self, name)
707842e56b97ce677b83bdab09cda48bc2d89ac75aJust			if type(value) == type(0L):
717842e56b97ce677b83bdab09cda48bc2d89ac75aJust				value = int(value)
727842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.simpletag(name, value=value)
737842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.newline()
747842e56b97ce677b83bdab09cda48bc2d89ac75aJust
757842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def fromXML(self, (name, attrs, content), ttFont):
767842e56b97ce677b83bdab09cda48bc2d89ac75aJust		setattr(self, name, safeEval(attrs["value"]))
777842e56b97ce677b83bdab09cda48bc2d89ac75aJust
78