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