Behdad Esfahbod 8413c108d2 Move sstruct under fontTools.misc
Our footprint in the Python module namespace is all under
fontTools now.  User code importing sstruct should be updated
to say "from fontTools.misc import sstruct".
2013-09-17 16:59:39 -04:00

80 lines
2.2 KiB
Python

import DefaultTable
from fontTools.misc import sstruct
from fontTools.misc.textTools import safeEval
hheaFormat = """
> # big endian
tableVersion: 16.16F
ascent: h
descent: h
lineGap: h
advanceWidthMax: H
minLeftSideBearing: h
minRightSideBearing: h
xMaxExtent: h
caretSlopeRise: h
caretSlopeRun: h
caretOffset: h
reserved0: h
reserved1: h
reserved2: h
reserved3: h
metricDataFormat: h
numberOfHMetrics: H
"""
class table__h_h_e_a(DefaultTable.DefaultTable):
dependencies = ['hmtx', 'glyf']
def decompile(self, data, ttFont):
sstruct.unpack(hheaFormat, data, self)
def compile(self, ttFont):
if ttFont.isLoaded('glyf') and ttFont.recalcBBoxes:
self.recalc(ttFont)
return sstruct.pack(hheaFormat, self)
def recalc(self, ttFont):
hmtxTable = ttFont['hmtx']
if ttFont.has_key('glyf'):
glyfTable = ttFont['glyf']
advanceWidthMax = -100000 # arbitrary big negative number
minLeftSideBearing = 100000 # arbitrary big number
minRightSideBearing = 100000 # arbitrary big number
xMaxExtent = -100000 # arbitrary big negative number
for name in ttFont.getGlyphOrder():
width, lsb = hmtxTable[name]
g = glyfTable[name]
if g.numberOfContours <= 0:
continue
advanceWidthMax = max(advanceWidthMax, width)
minLeftSideBearing = min(minLeftSideBearing, lsb)
rsb = width - lsb - (g.xMax - g.xMin)
minRightSideBearing = min(minRightSideBearing, rsb)
extent = lsb + (g.xMax - g.xMin)
xMaxExtent = max(xMaxExtent, extent)
self.advanceWidthMax = advanceWidthMax
self.minLeftSideBearing = minLeftSideBearing
self.minRightSideBearing = minRightSideBearing
self.xMaxExtent = xMaxExtent
else:
# XXX CFF recalc...
pass
def toXML(self, writer, ttFont):
formatstring, names, fixes = sstruct.getformat(hheaFormat)
for name in names:
value = getattr(self, name)
if type(value) == type(0L):
value = int(value)
writer.simpletag(name, value=value)
writer.newline()
def fromXML(self, (name, attrs, content), ttFont):
setattr(self, name, safeEval(attrs["value"]))