_h_h_e_a.py revision 8413c108d21e8cf0e9059bbfffde8d13f2616340
17842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport DefaultTable
28413c108d21e8cf0e9059bbfffde8d13f2616340Behdad Esfahbodfrom fontTools.misc import sstruct
37842e56b97ce677b83bdab09cda48bc2d89ac75aJustfrom fontTools.misc.textTools import safeEval
47842e56b97ce677b83bdab09cda48bc2d89ac75aJust
5e69caf8771a0dd675ca3c4490625dac963a6b65cjvr
67842e56b97ce677b83bdab09cda48bc2d89ac75aJusthheaFormat = """
7e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		>  # big endian
8e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		tableVersion:           16.16F
9e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		ascent:                 h
10e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		descent:                h
11e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		lineGap:                h
12e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		advanceWidthMax:        H
13e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		minLeftSideBearing:     h
14e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		minRightSideBearing:    h
15e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		xMaxExtent:             h
16e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		caretSlopeRise:         h
17e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		caretSlopeRun:          h
185aaeac333388f2859191e2648e2b8287372a1637jvr		caretOffset:            h
19e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		reserved0:              h
20e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		reserved1:              h
21e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		reserved2:              h
22e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		reserved3:              h
23e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		metricDataFormat:       h
24e69caf8771a0dd675ca3c4490625dac963a6b65cjvr		numberOfHMetrics:       H
257842e56b97ce677b83bdab09cda48bc2d89ac75aJust"""
267842e56b97ce677b83bdab09cda48bc2d89ac75aJust
27e69caf8771a0dd675ca3c4490625dac963a6b65cjvr
287842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__h_h_e_a(DefaultTable.DefaultTable):
297842e56b97ce677b83bdab09cda48bc2d89ac75aJust
307842e56b97ce677b83bdab09cda48bc2d89ac75aJust	dependencies = ['hmtx', 'glyf']
317842e56b97ce677b83bdab09cda48bc2d89ac75aJust
327842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def decompile(self, data, ttFont):
336d73fdef1cd1e62a230647845d37915f0f8df792jvr		sstruct.unpack(hheaFormat, data, self)
347842e56b97ce677b83bdab09cda48bc2d89ac75aJust
357842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def compile(self, ttFont):
363e097c609540944dd9290ad58df346ca86492031Just		if ttFont.isLoaded('glyf') and ttFont.recalcBBoxes:
373e097c609540944dd9290ad58df346ca86492031Just			self.recalc(ttFont)
387842e56b97ce677b83bdab09cda48bc2d89ac75aJust		return sstruct.pack(hheaFormat, self)
397842e56b97ce677b83bdab09cda48bc2d89ac75aJust
407842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def recalc(self, ttFont):
417842e56b97ce677b83bdab09cda48bc2d89ac75aJust		hmtxTable = ttFont['hmtx']
427842e56b97ce677b83bdab09cda48bc2d89ac75aJust		if ttFont.has_key('glyf'):
437842e56b97ce677b83bdab09cda48bc2d89ac75aJust			glyfTable = ttFont['glyf']
447842e56b97ce677b83bdab09cda48bc2d89ac75aJust			advanceWidthMax = -100000    # arbitrary big negative number
457842e56b97ce677b83bdab09cda48bc2d89ac75aJust			minLeftSideBearing = 100000  # arbitrary big number
467842e56b97ce677b83bdab09cda48bc2d89ac75aJust			minRightSideBearing = 100000 # arbitrary big number
477842e56b97ce677b83bdab09cda48bc2d89ac75aJust			xMaxExtent = -100000         # arbitrary big negative number
487842e56b97ce677b83bdab09cda48bc2d89ac75aJust
497842e56b97ce677b83bdab09cda48bc2d89ac75aJust			for name in ttFont.getGlyphOrder():
507842e56b97ce677b83bdab09cda48bc2d89ac75aJust				width, lsb = hmtxTable[name]
517842e56b97ce677b83bdab09cda48bc2d89ac75aJust				g = glyfTable[name]
527842e56b97ce677b83bdab09cda48bc2d89ac75aJust				if g.numberOfContours <= 0:
537842e56b97ce677b83bdab09cda48bc2d89ac75aJust					continue
547842e56b97ce677b83bdab09cda48bc2d89ac75aJust				advanceWidthMax = max(advanceWidthMax, width)
557842e56b97ce677b83bdab09cda48bc2d89ac75aJust				minLeftSideBearing = min(minLeftSideBearing, lsb)
567842e56b97ce677b83bdab09cda48bc2d89ac75aJust				rsb = width - lsb - (g.xMax - g.xMin)
577842e56b97ce677b83bdab09cda48bc2d89ac75aJust				minRightSideBearing = min(minRightSideBearing, rsb)
587842e56b97ce677b83bdab09cda48bc2d89ac75aJust				extent = lsb + (g.xMax - g.xMin)
597842e56b97ce677b83bdab09cda48bc2d89ac75aJust				xMaxExtent = max(xMaxExtent, extent)
607842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.advanceWidthMax = advanceWidthMax
617842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.minLeftSideBearing = minLeftSideBearing
627842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.minRightSideBearing = minRightSideBearing
637842e56b97ce677b83bdab09cda48bc2d89ac75aJust			self.xMaxExtent = xMaxExtent
647842e56b97ce677b83bdab09cda48bc2d89ac75aJust		else:
657842e56b97ce677b83bdab09cda48bc2d89ac75aJust			# XXX CFF recalc...
667842e56b97ce677b83bdab09cda48bc2d89ac75aJust			pass
677842e56b97ce677b83bdab09cda48bc2d89ac75aJust
687842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def toXML(self, writer, ttFont):
697842e56b97ce677b83bdab09cda48bc2d89ac75aJust		formatstring, names, fixes = sstruct.getformat(hheaFormat)
707842e56b97ce677b83bdab09cda48bc2d89ac75aJust		for name in names:
717842e56b97ce677b83bdab09cda48bc2d89ac75aJust			value = getattr(self, name)
727842e56b97ce677b83bdab09cda48bc2d89ac75aJust			if type(value) == type(0L):
737842e56b97ce677b83bdab09cda48bc2d89ac75aJust				value = int(value)
747842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.simpletag(name, value=value)
757842e56b97ce677b83bdab09cda48bc2d89ac75aJust			writer.newline()
767842e56b97ce677b83bdab09cda48bc2d89ac75aJust
777842e56b97ce677b83bdab09cda48bc2d89ac75aJust	def fromXML(self, (name, attrs, content), ttFont):
787842e56b97ce677b83bdab09cda48bc2d89ac75aJust		setattr(self, name, safeEval(attrs["value"]))
797842e56b97ce677b83bdab09cda48bc2d89ac75aJust
80