11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import 27ed91eca1eaa96b79eae780778e89bb9ec44c1eeBehdad Esfahbodfrom fontTools.misc.py23 import * 330e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom . import DefaultTable 47842e56b97ce677b83bdab09cda48bc2d89ac75aJust 57842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table_T_S_I__1(DefaultTable.DefaultTable): 67842e56b97ce677b83bdab09cda48bc2d89ac75aJust 77842e56b97ce677b83bdab09cda48bc2d89ac75aJust extras = {0xfffa: "ppgm", 0xfffb: "cvt", 0xfffc: "reserved", 0xfffd: "fpgm"} 87842e56b97ce677b83bdab09cda48bc2d89ac75aJust 97842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = "TSI0" 107842e56b97ce677b83bdab09cda48bc2d89ac75aJust 117842e56b97ce677b83bdab09cda48bc2d89ac75aJust def decompile(self, data, ttFont): 127842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = ttFont[self.indextable] 137842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms = {} 147842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(indextable.indices)): 157842e56b97ce677b83bdab09cda48bc2d89ac75aJust glyphID, textLength, textOffset = indextable.indices[i] 167842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength == 0x8000: 177842e56b97ce677b83bdab09cda48bc2d89ac75aJust # Ugh. Hi Beat! 187842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = indextable.indices[i+1][1] 197842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength > 0x8000: 207842e56b97ce677b83bdab09cda48bc2d89ac75aJust pass # XXX Hmmm. 217842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = data[textOffset:textOffset+textLength] 227842e56b97ce677b83bdab09cda48bc2d89ac75aJust assert len(text) == textLength 237842e56b97ce677b83bdab09cda48bc2d89ac75aJust if text: 247842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms[ttFont.getGlyphName(glyphID)] = text 257842e56b97ce677b83bdab09cda48bc2d89ac75aJust 267842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms = {} 277842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(indextable.extra_indices)): 287842e56b97ce677b83bdab09cda48bc2d89ac75aJust extraCode, textLength, textOffset = indextable.extra_indices[i] 297842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength == 0x8000: 3086331951040a6585bce9b33ba5d63784e64d0741jvr if self.extras[extraCode] == "fpgm": # this is the last one 317842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = len(data) - textOffset 327842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 337842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = indextable.extra_indices[i+1][1] 347842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = data[textOffset:textOffset+textLength] 357842e56b97ce677b83bdab09cda48bc2d89ac75aJust assert len(text) == textLength 367842e56b97ce677b83bdab09cda48bc2d89ac75aJust if text: 377842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms[self.extras[extraCode]] = text 387842e56b97ce677b83bdab09cda48bc2d89ac75aJust 397842e56b97ce677b83bdab09cda48bc2d89ac75aJust def compile(self, ttFont): 40b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust if not hasattr(self, "glyphPrograms"): 41b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust self.glyphPrograms = {} 42b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust self.extraPrograms = {} 435e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod data = b'' 447842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = ttFont[self.indextable] 457842e56b97ce677b83bdab09cda48bc2d89ac75aJust glyphNames = ttFont.getGlyphOrder() 467842e56b97ce677b83bdab09cda48bc2d89ac75aJust 477842e56b97ce677b83bdab09cda48bc2d89ac75aJust indices = [] 487842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(glyphNames)): 497842e56b97ce677b83bdab09cda48bc2d89ac75aJust if len(data) % 2: 505e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod data = data + b"\015" # align on 2-byte boundaries, fill with return chars. Yum. 517842e56b97ce677b83bdab09cda48bc2d89ac75aJust name = glyphNames[i] 52bc5e1cb195c0bfa1c8e7507326d5a9ad05aecb4bBehdad Esfahbod if name in self.glyphPrograms: 537842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.glyphPrograms[name] 547842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 555e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod text = b"" 567842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = len(text) 577842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength >= 0x8000: 587842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = 0x8000 # XXX ??? 597842e56b97ce677b83bdab09cda48bc2d89ac75aJust indices.append((i, textLength, len(data))) 607842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = data + text 617842e56b97ce677b83bdab09cda48bc2d89ac75aJust 627842e56b97ce677b83bdab09cda48bc2d89ac75aJust extra_indices = [] 63ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod codes = sorted(self.extras.items()) 647842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(codes)): 657842e56b97ce677b83bdab09cda48bc2d89ac75aJust if len(data) % 2: 665e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod data = data + b"\015" # align on 2-byte boundaries, fill with return chars. 677842e56b97ce677b83bdab09cda48bc2d89ac75aJust code, name = codes[i] 68bc5e1cb195c0bfa1c8e7507326d5a9ad05aecb4bBehdad Esfahbod if name in self.extraPrograms: 697842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.extraPrograms[name] 707842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 715e1e8f6890f4bc9d14126185b3ee3b160594574dBehdad Esfahbod text = b"" 727842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = len(text) 737842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength >= 0x8000: 747842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = 0x8000 # XXX ??? 757842e56b97ce677b83bdab09cda48bc2d89ac75aJust extra_indices.append((code, textLength, len(data))) 767842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = data + text 777842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable.set(indices, extra_indices) 787842e56b97ce677b83bdab09cda48bc2d89ac75aJust return data 797842e56b97ce677b83bdab09cda48bc2d89ac75aJust 807842e56b97ce677b83bdab09cda48bc2d89ac75aJust def toXML(self, writer, ttFont): 81ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod names = sorted(self.glyphPrograms.keys()) 827842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 837842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in names: 847842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.glyphPrograms[name] 857842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not text: 867842e56b97ce677b83bdab09cda48bc2d89ac75aJust continue 877842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.begintag("glyphProgram", name=name) 887842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 8914fb031125b773f0a15eb19be4f02ed8540b2db6Behdad Esfahbod writer.write_noindent(text.replace("\r", "\n")) 907842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 917842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.endtag("glyphProgram") 927842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 937842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 94af1c9968b2edc827ee9115355a72b3c56c4fbe61Denis Jacquerye extra_names = sorted(self.extraPrograms.keys()) 957842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in extra_names: 967842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.extraPrograms[name] 977842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not text: 987842e56b97ce677b83bdab09cda48bc2d89ac75aJust continue 997842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.begintag("extraProgram", name=name) 1007842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 10114fb031125b773f0a15eb19be4f02ed8540b2db6Behdad Esfahbod writer.write_noindent(text.replace("\r", "\n")) 1027842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1037842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.endtag("extraProgram") 1047842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1057842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1067842e56b97ce677b83bdab09cda48bc2d89ac75aJust 1073a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod def fromXML(self, name, attrs, content, ttFont): 1087842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not hasattr(self, "glyphPrograms"): 1097842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms = {} 1107842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms = {} 11118316aa769566eeb6f3f4a6ed2685fa8f8e861c2Behdad Esfahbod lines = strjoin(content).replace("\r", "\n").split("\n") 11214fb031125b773f0a15eb19be4f02ed8540b2db6Behdad Esfahbod text = '\r'.join(lines[1:-1]) 1137842e56b97ce677b83bdab09cda48bc2d89ac75aJust if name == "glyphProgram": 1147842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms[attrs["name"]] = text 1157842e56b97ce677b83bdab09cda48bc2d89ac75aJust elif name == "extraProgram": 1167842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms[attrs["name"]] = text 1177842e56b97ce677b83bdab09cda48bc2d89ac75aJust 118