11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import
230e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.py23 import *
38413c108d21e8cf0e9059bbfffde8d13f2616340Behdad Esfahbodfrom fontTools.misc import sstruct
47ed91eca1eaa96b79eae780778e89bb9ec44c1eeBehdad Esfahbodfrom fontTools.misc.textTools import safeEval
530e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom . import DefaultTable
64cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
74cc0051c087e7e9c294559a21540e296cfe9ef4ajvrGMAPFormat = """
84cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		>	# big endian
94cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		tableVersionMajor:	H
104cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		tableVersionMinor: 	H
114cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		flags:	H
124cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		recordsCount:		H
134cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		recordsOffset:		H
144cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		fontNameLength:		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
194cc0051c087e7e9c294559a21540e296cfe9ef4ajvrGMAPRecordFormat1 = """
204cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		>	# big endian
214cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		UV:			L
224cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		cid:		H
234cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		gid:		H
244cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		ggid:		H
254cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		name:		32s
264cc0051c087e7e9c294559a21540e296cfe9ef4ajvr"""
274cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
284cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
294cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
30e388db566b9ba42669c7e353db4293cf27bc2a5bBehdad Esfahbodclass GMAPRecord(object):
314cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def __init__(self, uv = 0, cid = 0, gid = 0, ggid = 0, name = ""):
324cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.UV = uv
334cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.cid = cid
344cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.gid = gid
354cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.ggid = ggid
364cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.name = name
374cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
384cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def toXML(self, writer, ttFont):
394cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.begintag("GMAPRecord")
404cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
414cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("UV", value=self.UV)
424cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
434cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("cid", value=self.cid)
444cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
454cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("gid", value=self.gid)
464cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
474cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("glyphletGid", value=self.gid)
484cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
494cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("GlyphletName", value=self.name)
504cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
514cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.endtag("GMAPRecord")
524cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
534cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
544cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
553a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod	def fromXML(self, name, attrs, content, ttFont):
564cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		value = attrs["value"]
574cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		if name == "GlyphletName":
584cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.name = value
594cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		else:
607cc6d271ac955782d730161b27e728001fb5f347Behdad Esfahbod			setattr(self, name, safeEval(value))
614cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
624cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
634cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def compile(self, ttFont):
649e6ef94b5554c5b7dda2de9c863c11ed4b996b7aBehdad Esfahbod		if 	self.UV is None:
654cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.UV = 0
664cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		nameLen =  len(self.name)
674cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		if nameLen < 32:
684cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.name = self.name + "\0"*(32 - nameLen)
694cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		data = sstruct.pack(GMAPRecordFormat1, self)
704cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		return data
714cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
724cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def __repr__(self):
734cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		return "GMAPRecord[ UV: " + str(self.UV) + ", cid: " + str(self.cid) + ", gid: " + str(self.gid) + ", ggid: " + str(self.ggid) + ", Glyphlet Name: " + str(self.name) + " ]"
744cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
754cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
764cc0051c087e7e9c294559a21540e296cfe9ef4ajvrclass table_G_M_A_P_(DefaultTable.DefaultTable):
774cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
784cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	dependencies = []
794cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
804cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def decompile(self, data, ttFont):
814cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		dummy, newData = sstruct.unpack2(GMAPFormat, data, self)
825e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod		self.psFontName = tostr(newData[:self.fontNameLength])
834cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		assert (self.recordsOffset % 4) == 0, "GMAP error: recordsOffset is not 32 bit aligned."
844cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		newData = data[self.recordsOffset:]
854cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.gmapRecords = []
864cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for i in range (self.recordsCount):
874cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			gmapRecord, newData = sstruct.unpack2(GMAPRecordFormat1, newData, GMAPRecord())
884cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			gmapRecord.name = gmapRecord.name.strip('\0')
894cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.gmapRecords.append(gmapRecord)
904cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
914cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
924cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def compile(self, ttFont):
934cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.recordsCount = len(self.gmapRecords)
944cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		self.fontNameLength = len(self.psFontName)
9532c10eecffb4923e0721c395e4b80fb732543f18Behdad Esfahbod		self.recordsOffset = 4 *(((self.fontNameLength + 12)  + 3) // 4)
964cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		data = sstruct.pack(GMAPFormat, self)
975e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod		data = data + tobytes(self.psFontName)
985e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod		data = data + b"\0" * (self.recordsOffset - len(data))
994cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for record in self.gmapRecords:
1004cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			data = data + record.compile(ttFont)
1014cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		return data
1024cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
1034cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
1044cc0051c087e7e9c294559a21540e296cfe9ef4ajvr	def toXML(self, writer, ttFont):
1054cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.comment("Most of this table will be recalculated by the compiler")
1064cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
1074cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		formatstring, names, fixes = sstruct.getformat(GMAPFormat)
1084cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for name in names:
1094cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			value = getattr(self, name)
1104cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.simpletag(name, value=value)
1114cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			writer.newline()
1124cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.simpletag("PSFontName", value=self.psFontName)
1134cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		writer.newline()
1144cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		for gmapRecord in self.gmapRecords:
1154cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			gmapRecord.toXML(writer, ttFont)
1164cc0051c087e7e9c294559a21540e296cfe9ef4ajvr
1173a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod	def fromXML(self, name, attrs, content, ttFont):
1184cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		if name == "GMAPRecord":
1194cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			if not hasattr(self, "gmapRecords"):
1204cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				self.gmapRecords = []
1214cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			gmapRecord = GMAPRecord()
1224cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			self.gmapRecords.append(gmapRecord)
1234cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			for element in content:
124faaca764a1cd62d376f783df20cd1edce21ca816Behdad Esfahbod				if isinstance(element, basestring):
1254cc0051c087e7e9c294559a21540e296cfe9ef4ajvr					continue
1263a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod				name, attrs, content = element
1273a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod				gmapRecord.fromXML(name, attrs, content, ttFont)
1284cc0051c087e7e9c294559a21540e296cfe9ef4ajvr		else:
1294cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			value = attrs["value"]
1304cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			if name == "PSFontName":
1314cc0051c087e7e9c294559a21540e296cfe9ef4ajvr				self.psFontName = value
1324cc0051c087e7e9c294559a21540e296cfe9ef4ajvr			else:
1337cc6d271ac955782d730161b27e728001fb5f347Behdad Esfahbod				setattr(self, name, safeEval(value))
134