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, num2binary, binary2num 530e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom . import DefaultTable 630e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodimport time 765d3a02d165c43fa681f4c90d12a5210da53908cBehdad Esfahbodimport calendar 87842e56b97ce677b83bdab09cda48bc2d89ac75aJust 97842e56b97ce677b83bdab09cda48bc2d89ac75aJust 107842e56b97ce677b83bdab09cda48bc2d89ac75aJustheadFormat = """ 117842e56b97ce677b83bdab09cda48bc2d89ac75aJust > # big endian 12df22c27d923417c2cd2682704145ca81f3a7aaf3jvr tableVersion: 16.16F 13df22c27d923417c2cd2682704145ca81f3a7aaf3jvr fontRevision: 16.16F 14df22c27d923417c2cd2682704145ca81f3a7aaf3jvr checkSumAdjustment: I 15df22c27d923417c2cd2682704145ca81f3a7aaf3jvr magicNumber: I 16df22c27d923417c2cd2682704145ca81f3a7aaf3jvr flags: H 17df22c27d923417c2cd2682704145ca81f3a7aaf3jvr unitsPerEm: H 18b8e1afa809d19202c1f1e405aa4c7312625947d1Behdad Esfahbod created: Q 19b8e1afa809d19202c1f1e405aa4c7312625947d1Behdad Esfahbod modified: Q 20df22c27d923417c2cd2682704145ca81f3a7aaf3jvr xMin: h 21df22c27d923417c2cd2682704145ca81f3a7aaf3jvr yMin: h 22df22c27d923417c2cd2682704145ca81f3a7aaf3jvr xMax: h 23df22c27d923417c2cd2682704145ca81f3a7aaf3jvr yMax: h 24df22c27d923417c2cd2682704145ca81f3a7aaf3jvr macStyle: H 25df22c27d923417c2cd2682704145ca81f3a7aaf3jvr lowestRecPPEM: H 26df22c27d923417c2cd2682704145ca81f3a7aaf3jvr fontDirectionHint: h 27df22c27d923417c2cd2682704145ca81f3a7aaf3jvr indexToLocFormat: h 28df22c27d923417c2cd2682704145ca81f3a7aaf3jvr glyphDataFormat: h 297842e56b97ce677b83bdab09cda48bc2d89ac75aJust""" 307842e56b97ce677b83bdab09cda48bc2d89ac75aJust 317842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table__h_e_a_d(DefaultTable.DefaultTable): 327842e56b97ce677b83bdab09cda48bc2d89ac75aJust 337842e56b97ce677b83bdab09cda48bc2d89ac75aJust dependencies = ['maxp', 'loca'] 347842e56b97ce677b83bdab09cda48bc2d89ac75aJust 357842e56b97ce677b83bdab09cda48bc2d89ac75aJust def decompile(self, data, ttFont): 367268e24408586e5a52d716149cd214a301924778Just dummy, rest = sstruct.unpack2(headFormat, data, self) 377268e24408586e5a52d716149cd214a301924778Just if rest: 387268e24408586e5a52d716149cd214a301924778Just # this is quite illegal, but there seem to be fonts out there that do this 397268e24408586e5a52d716149cd214a301924778Just assert rest == "\0\0" 407842e56b97ce677b83bdab09cda48bc2d89ac75aJust 417842e56b97ce677b83bdab09cda48bc2d89ac75aJust def compile(self, ttFont): 42497863a190b70a51e9f6c8013e19e2424a69acfbBehdad Esfahbod if ttFont.recalcTimestamp: 43497863a190b70a51e9f6c8013e19e2424a69acfbBehdad Esfahbod self.modified = int(time.time() - mac_epoch_diff) 447842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = sstruct.pack(headFormat, self) 457842e56b97ce677b83bdab09cda48bc2d89ac75aJust return data 467842e56b97ce677b83bdab09cda48bc2d89ac75aJust 477842e56b97ce677b83bdab09cda48bc2d89ac75aJust def toXML(self, writer, ttFont): 487842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.comment("Most of this table will be recalculated by the compiler") 497842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 507842e56b97ce677b83bdab09cda48bc2d89ac75aJust formatstring, names, fixes = sstruct.getformat(headFormat) 517842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in names: 527842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = getattr(self, name) 537842e56b97ce677b83bdab09cda48bc2d89ac75aJust if name in ("created", "modified"): 5483f069d66c3165a8899c35296053f7fbd350a9f6fcoiffie try: 5583f069d66c3165a8899c35296053f7fbd350a9f6fcoiffie value = time.asctime(time.gmtime(max(0, value + mac_epoch_diff))) 5683f069d66c3165a8899c35296053f7fbd350a9f6fcoiffie except ValueError: 5783f069d66c3165a8899c35296053f7fbd350a9f6fcoiffie value = time.asctime(time.gmtime(0)) 587842e56b97ce677b83bdab09cda48bc2d89ac75aJust if name in ("magicNumber", "checkSumAdjustment"): 59f34c6f393799c77de669dab4ad84f299b11f0875jvr if value < 0: 60ecbe4c87b5b4b57ee965c3f9c0302cb4044a6875Behdad Esfahbod value = value + 0x100000000 617842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = hex(value) 621332d3e5491140c90fde2dfac5225ce820c64e20jvr if value[-1:] == "L": 631332d3e5491140c90fde2dfac5225ce820c64e20jvr value = value[:-1] 64c3403cfbd4ceb9f5cea0080745ea091aff9f4fbdjvr elif name in ("macStyle", "flags"): 657842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = num2binary(value, 16) 667842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.simpletag(name, value=value) 677842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 687842e56b97ce677b83bdab09cda48bc2d89ac75aJust 693a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod def fromXML(self, name, attrs, content, ttFont): 707842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = attrs["value"] 717842e56b97ce677b83bdab09cda48bc2d89ac75aJust if name in ("created", "modified"): 7265d3a02d165c43fa681f4c90d12a5210da53908cBehdad Esfahbod value = calendar.timegm(time.strptime(value)) - mac_epoch_diff 73c3403cfbd4ceb9f5cea0080745ea091aff9f4fbdjvr elif name in ("macStyle", "flags"): 747842e56b97ce677b83bdab09cda48bc2d89ac75aJust value = binary2num(value) 757842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 767cc6d271ac955782d730161b27e728001fb5f347Behdad Esfahbod value = safeEval(value) 777842e56b97ce677b83bdab09cda48bc2d89ac75aJust setattr(self, name, value) 787842e56b97ce677b83bdab09cda48bc2d89ac75aJust 797842e56b97ce677b83bdab09cda48bc2d89ac75aJust 801112495ae59542ad76d1cc72f40ab91e7e562f1cBehdad Esfahbod# Difference between the original Mac epoch (1904) to the epoch on this machine. 811112495ae59542ad76d1cc72f40ab91e7e562f1cBehdad Esfahbodmac_epoch_diff = calendar.timegm((1904, 1, 1, 0, 0, 0, 0, 0, 0)) 82