1from __future__ import print_function, division, absolute_import
2from fontTools.misc.py23 import *
3from fontTools.misc import sstruct
4from fontTools.misc.textTools import safeEval, num2binary, binary2num
5from . import DefaultTable
6import time
7import calendar
8
9
10headFormat = """
11		>	# big endian
12		tableVersion:       16.16F
13		fontRevision:       16.16F
14		checkSumAdjustment: I
15		magicNumber:        I
16		flags:              H
17		unitsPerEm:         H
18		created:            Q
19		modified:           Q
20		xMin:               h
21		yMin:               h
22		xMax:               h
23		yMax:               h
24		macStyle:           H
25		lowestRecPPEM:      H
26		fontDirectionHint:  h
27		indexToLocFormat:   h
28		glyphDataFormat:    h
29"""
30
31class table__h_e_a_d(DefaultTable.DefaultTable):
32
33	dependencies = ['maxp', 'loca']
34
35	def decompile(self, data, ttFont):
36		dummy, rest = sstruct.unpack2(headFormat, data, self)
37		if rest:
38			# this is quite illegal, but there seem to be fonts out there that do this
39			assert rest == "\0\0"
40
41	def compile(self, ttFont):
42		if ttFont.recalcTimestamp:
43			self.modified = int(time.time() - mac_epoch_diff)
44		data = sstruct.pack(headFormat, self)
45		return data
46
47	def toXML(self, writer, ttFont):
48		writer.comment("Most of this table will be recalculated by the compiler")
49		writer.newline()
50		formatstring, names, fixes = sstruct.getformat(headFormat)
51		for name in names:
52			value = getattr(self, name)
53			if name in ("created", "modified"):
54				try:
55					value = time.asctime(time.gmtime(max(0, value + mac_epoch_diff)))
56				except ValueError:
57					value = time.asctime(time.gmtime(0))
58			if name in ("magicNumber", "checkSumAdjustment"):
59				if value < 0:
60					value = value + 0x100000000
61				value = hex(value)
62				if value[-1:] == "L":
63					value = value[:-1]
64			elif name in ("macStyle", "flags"):
65				value = num2binary(value, 16)
66			writer.simpletag(name, value=value)
67			writer.newline()
68
69	def fromXML(self, name, attrs, content, ttFont):
70		value = attrs["value"]
71		if name in ("created", "modified"):
72			value = calendar.timegm(time.strptime(value)) - mac_epoch_diff
73		elif name in ("macStyle", "flags"):
74			value = binary2num(value)
75		else:
76			value = safeEval(value)
77		setattr(self, name, value)
78
79
80# Difference between the original Mac epoch (1904) to the epoch on this machine.
81mac_epoch_diff = calendar.timegm((1904, 1, 1, 0, 0, 0, 0, 0, 0))
82