from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc.textTools import safeEval
from . import DefaultTable
import struct
import array

# XXX I've lowered the strictness, to make sure Apple's own Chicago
# XXX gets through. They're looking into it, I hope to raise the standards
# XXX back to normal eventually.

class table_L_T_S_H_(DefaultTable.DefaultTable):
	
	def decompile(self, data, ttFont):
		version, numGlyphs = struct.unpack(">HH", data[:4])
		data = data[4:]
		assert version == 0, "unknown version: %s" % version
		assert (len(data) % numGlyphs) < 4, "numGlyphs doesn't match data length"
		# ouch: the assertion is not true in Chicago!
		#assert numGlyphs == ttFont['maxp'].numGlyphs
		yPels = array.array("B")
		yPels.fromstring(data)
		self.yPels = {}
		for i in range(numGlyphs):
			self.yPels[ttFont.getGlyphName(i)] = yPels[i]
	
	def compile(self, ttFont):
		version = 0
		names = list(self.yPels.keys())
		numGlyphs = len(names)
		yPels = [0] * numGlyphs
		# ouch: the assertion is not true in Chicago!
		#assert len(self.yPels) == ttFont['maxp'].numGlyphs == numGlyphs
		for name in names:
			yPels[ttFont.getGlyphID(name)] = self.yPels[name]
		yPels = array.array("B", yPels)
		return struct.pack(">HH", version, numGlyphs) + yPels.tostring()
	
	def toXML(self, writer, ttFont):
		names = sorted(self.yPels.keys())
		for name in names:
			writer.simpletag("yPel", name=name, value=self.yPels[name])
			writer.newline()
	
	def fromXML(self, name, attrs, content, ttFont):
		if not hasattr(self, "yPels"):
			self.yPels = {}
		if name != "yPel":
			return # ignore unknown tags
		self.yPels[attrs["name"]] = safeEval(attrs["value"])

