11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import
230e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.py23 import *
330e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc import sstruct
430e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.textTools import safeEval, readHex
52b06aaa2a6bcd363c25fb0c43f6bb906906594bdBehdad Esfahbodfrom . import DefaultTable
67ed91eca1eaa96b79eae780778e89bb9ec44c1eeBehdad Esfahbodimport sys
74cc0051c087e7e9c294559a21540e296cfe9ef4ajvrimport array
84cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
94cc0051c087e7e9c294559a21540e296cfe9ef4ajvrGPKGFormat = """
104cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		>	# big endian
114cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		version:	H
124cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		flags:	H
134cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		numGMAPs:		H
144cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		numGlyplets:		H
154cc0051c087e7e9c294559a21540e296cfe9ef4ajvr"""
164cc0051c087e7e9c294559a21540e296cfe9ef4ajvr# psFontName is a byte string which follows the record above. This is zero padded
174cc0051c087e7e9c294559a21540e296cfe9ef4ajvr# to the beginning of the records array. The recordsOffsst is 32 bit aligned.
184cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
194cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
204cc0051c087e7e9c294559a21540e296cfe9ef4ajvrclass table_G_P_K_G_(DefaultTable.DefaultTable):
214cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
224cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def decompile(self, data, ttFont):
234cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dummy, newData = sstruct.unpack2(GPKGFormat, data, self)
244cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
254ffd404449cf4bbe74f30dbad87b9ca808bb98bcBehdad Esfahbod		GMAPoffsets = array.array("I")
264cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		endPos = (self.numGMAPs+1) * 4
274cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		GMAPoffsets.fromstring(newData[:endPos])
28180ace6a5ff1399ec53bc696e8bef7cce6eef39aBehdad Esfahbod		if sys.byteorder != "big":
294cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			GMAPoffsets.byteswap()
304cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.GMAPs = []
314cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for i in range(self.numGMAPs):
324cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			start = GMAPoffsets[i]
334cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			end = GMAPoffsets[i+1]
344cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.GMAPs.append(data[start:end])
354cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		pos = endPos
364cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		endPos = pos + (self.numGlyplets + 1)*4
374ffd404449cf4bbe74f30dbad87b9ca808bb98bcBehdad Esfahbod		glyphletOffsets = array.array("I")
384cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		glyphletOffsets.fromstring(newData[pos:endPos])
39180ace6a5ff1399ec53bc696e8bef7cce6eef39aBehdad Esfahbod		if sys.byteorder != "big":
404cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			glyphletOffsets.byteswap()
414cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.glyphlets = []
424cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for i in range(self.numGlyplets):
434cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			start = glyphletOffsets[i]
444cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			end = glyphletOffsets[i+1]
454cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.glyphlets.append(data[start:end])
464cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
474cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
484cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def compile(self, ttFont):
494cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.numGMAPs = len(self.GMAPs)
504cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.numGlyplets = len(self.glyphlets)
514cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		GMAPoffsets = [0]*(self.numGMAPs + 1)
524cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		glyphletOffsets = [0]*(self.numGlyplets + 1)
534cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
544cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dataList =[ sstruct.pack(GPKGFormat, self)]
554cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
564cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		pos = len(dataList[0]) + (self.numGMAPs + 1)*4 + (self.numGlyplets + 1)*4
574cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		GMAPoffsets[0] = pos
584cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for i in range(1, self.numGMAPs +1):
594cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			pos += len(self.GMAPs[i-1])
604cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			GMAPoffsets[i] = pos
61b1a7f87c2f424e27e0e0db6112098d7c87b53787Behdad Esfahbod		gmapArray = array.array("I", GMAPoffsets)
62180ace6a5ff1399ec53bc696e8bef7cce6eef39aBehdad Esfahbod		if sys.byteorder != "big":
63b1a7f87c2f424e27e0e0db6112098d7c87b53787Behdad Esfahbod			gmapArray.byteswap()
644cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dataList.append(gmapArray.tostring())
654cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
664cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		glyphletOffsets[0] = pos
674cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for i in range(1, self.numGlyplets +1):
684cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			pos += len(self.glyphlets[i-1])
694cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			glyphletOffsets[i] = pos
70b1a7f87c2f424e27e0e0db6112098d7c87b53787Behdad Esfahbod		glyphletArray = array.array("I", glyphletOffsets)
71180ace6a5ff1399ec53bc696e8bef7cce6eef39aBehdad Esfahbod		if sys.byteorder != "big":
72b1a7f87c2f424e27e0e0db6112098d7c87b53787Behdad Esfahbod			glyphletArray.byteswap()
734cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dataList.append(glyphletArray.tostring())
744cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dataList += self.GMAPs
754cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dataList += self.glyphlets
7618316aa769566eeb6f3f4a6ed2685fa8f8e861c2Behdad Esfahbod		data = bytesjoin(dataList)
774cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		return data
784cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
794cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def toXML(self, writer, ttFont):
804cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.comment("Most of this table will be recalculated by the compiler")
814cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
824cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		formatstring, names, fixes = sstruct.getformat(GPKGFormat)
834cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for name in names:
844cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			value = getattr(self, name)
854cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.simpletag(name, value=value)
864cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
874cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
884cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.begintag("GMAPs")
894cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
904cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for gmapData in self.GMAPs:
914cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.begintag("hexdata")
924cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
934cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.dumphex(gmapData)
944cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.endtag("hexdata")
954cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
964cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.endtag("GMAPs")
974cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
984cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
994cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.begintag("glyphlets")
1004cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
1014cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for glyphletData in self.glyphlets:
1024cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.begintag("hexdata")
1034cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
1044cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.dumphex(glyphletData)
1054cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.endtag("hexdata")
1064cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
1074cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.endtag("glyphlets")
1084cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
1094cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
1103a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod	def fromXML(self, name, attrs, content, ttFont):
1114cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		if name == "GMAPs":
1124cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			if not hasattr(self, "GMAPs"):
1134cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				self.GMAPs = []
1144cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			for element in content:
115faaca764a1cd62d376f783df20cd1edce21ca816Behdad Esfahbod				if isinstance(element, basestring):
1164cc0051c087e7e9c294559a21540e296cfe9ef4ajvr					continue
1174cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				itemName, itemAttrs, itemContent = element
1184cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				if itemName == "hexdata":
1194cc0051c087e7e9c294559a21540e296cfe9ef4ajvr					self.GMAPs.append(readHex(itemContent))
1204cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		elif name == "glyphlets":
1214cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			if not hasattr(self, "glyphlets"):
1224cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				self.glyphlets = []
1234cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			for element in content:
124faaca764a1cd62d376f783df20cd1edce21ca816Behdad Esfahbod				if isinstance(element, basestring):
1254cc0051c087e7e9c294559a21540e296cfe9ef4ajvr					continue
1264cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				itemName, itemAttrs, itemContent = element
1274cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				if itemName == "hexdata":
1284cc0051c087e7e9c294559a21540e296cfe9ef4ajvr					self.glyphlets.append(readHex(itemContent))
1294cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		else:
1307cc6d271ac955782d730161b27e728001fb5f347Behdad Esfahbod			setattr(self, name, safeEval(value))
131