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