_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