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