T_S_I__1.py revision 3a9fd301808f5a8991ca9ac44028d1ecb22d307f
12b06aaa2a6bcd363c25fb0c43f6bb906906594bdBehdad Esfahbodfrom . import DefaultTable 27842e56b97ce677b83bdab09cda48bc2d89ac75aJustimport string 37842e56b97ce677b83bdab09cda48bc2d89ac75aJust 47842e56b97ce677b83bdab09cda48bc2d89ac75aJustclass table_T_S_I__1(DefaultTable.DefaultTable): 57842e56b97ce677b83bdab09cda48bc2d89ac75aJust 67842e56b97ce677b83bdab09cda48bc2d89ac75aJust extras = {0xfffa: "ppgm", 0xfffb: "cvt", 0xfffc: "reserved", 0xfffd: "fpgm"} 77842e56b97ce677b83bdab09cda48bc2d89ac75aJust 87842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = "TSI0" 97842e56b97ce677b83bdab09cda48bc2d89ac75aJust 107842e56b97ce677b83bdab09cda48bc2d89ac75aJust def decompile(self, data, ttFont): 117842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = ttFont[self.indextable] 127842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms = {} 137842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(indextable.indices)): 147842e56b97ce677b83bdab09cda48bc2d89ac75aJust glyphID, textLength, textOffset = indextable.indices[i] 157842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength == 0x8000: 167842e56b97ce677b83bdab09cda48bc2d89ac75aJust # Ugh. Hi Beat! 177842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = indextable.indices[i+1][1] 187842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength > 0x8000: 197842e56b97ce677b83bdab09cda48bc2d89ac75aJust pass # XXX Hmmm. 207842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = data[textOffset:textOffset+textLength] 217842e56b97ce677b83bdab09cda48bc2d89ac75aJust assert len(text) == textLength 227842e56b97ce677b83bdab09cda48bc2d89ac75aJust if text: 237842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms[ttFont.getGlyphName(glyphID)] = text 247842e56b97ce677b83bdab09cda48bc2d89ac75aJust 257842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms = {} 267842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(indextable.extra_indices)): 277842e56b97ce677b83bdab09cda48bc2d89ac75aJust extraCode, textLength, textOffset = indextable.extra_indices[i] 287842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength == 0x8000: 2986331951040a6585bce9b33ba5d63784e64d0741jvr if self.extras[extraCode] == "fpgm": # this is the last one 307842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = len(data) - textOffset 317842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 327842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = indextable.extra_indices[i+1][1] 337842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = data[textOffset:textOffset+textLength] 347842e56b97ce677b83bdab09cda48bc2d89ac75aJust assert len(text) == textLength 357842e56b97ce677b83bdab09cda48bc2d89ac75aJust if text: 367842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms[self.extras[extraCode]] = text 377842e56b97ce677b83bdab09cda48bc2d89ac75aJust 387842e56b97ce677b83bdab09cda48bc2d89ac75aJust def compile(self, ttFont): 39b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust if not hasattr(self, "glyphPrograms"): 40b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust self.glyphPrograms = {} 41b0860a8c2b778c580aa2ddb5fa71f04555dcbbeaJust self.extraPrograms = {} 427842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = '' 437842e56b97ce677b83bdab09cda48bc2d89ac75aJust indextable = ttFont[self.indextable] 447842e56b97ce677b83bdab09cda48bc2d89ac75aJust glyphNames = ttFont.getGlyphOrder() 457842e56b97ce677b83bdab09cda48bc2d89ac75aJust 467842e56b97ce677b83bdab09cda48bc2d89ac75aJust indices = [] 477842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(glyphNames)): 487842e56b97ce677b83bdab09cda48bc2d89ac75aJust if len(data) % 2: 497842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = data + "\015" # align on 2-byte boundaries, fill with return chars. Yum. 507842e56b97ce677b83bdab09cda48bc2d89ac75aJust name = glyphNames[i] 51bc5e1cb195c0bfa1c8e7507326d5a9ad05aecb4bBehdad Esfahbod if name in self.glyphPrograms: 527842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.glyphPrograms[name] 537842e56b97ce677b83bdab09cda48bc2d89ac75aJust else: 547842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = "" 557842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = len(text) 567842e56b97ce677b83bdab09cda48bc2d89ac75aJust if textLength >= 0x8000: 577842e56b97ce677b83bdab09cda48bc2d89ac75aJust textLength = 0x8000 # XXX ??? 587842e56b97ce677b83bdab09cda48bc2d89ac75aJust indices.append((i, textLength, len(data))) 597842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = data + text 607842e56b97ce677b83bdab09cda48bc2d89ac75aJust 617842e56b97ce677b83bdab09cda48bc2d89ac75aJust extra_indices = [] 627842e56b97ce677b83bdab09cda48bc2d89ac75aJust codes = self.extras.items() 637842e56b97ce677b83bdab09cda48bc2d89ac75aJust codes.sort() 647842e56b97ce677b83bdab09cda48bc2d89ac75aJust for i in range(len(codes)): 657842e56b97ce677b83bdab09cda48bc2d89ac75aJust if len(data) % 2: 667842e56b97ce677b83bdab09cda48bc2d89ac75aJust data = data + "\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: 717842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = "" 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): 817842e56b97ce677b83bdab09cda48bc2d89ac75aJust names = self.glyphPrograms.keys() 827842e56b97ce677b83bdab09cda48bc2d89ac75aJust names.sort() 837842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 847842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in names: 857842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.glyphPrograms[name] 867842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not text: 877842e56b97ce677b83bdab09cda48bc2d89ac75aJust continue 887842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.begintag("glyphProgram", name=name) 897842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 907842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.write_noindent(string.replace(text, "\r", "\n")) 917842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 927842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.endtag("glyphProgram") 937842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 947842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 957842e56b97ce677b83bdab09cda48bc2d89ac75aJust extra_names = self.extraPrograms.keys() 967842e56b97ce677b83bdab09cda48bc2d89ac75aJust extra_names.sort() 977842e56b97ce677b83bdab09cda48bc2d89ac75aJust for name in extra_names: 987842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = self.extraPrograms[name] 997842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not text: 1007842e56b97ce677b83bdab09cda48bc2d89ac75aJust continue 1017842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.begintag("extraProgram", name=name) 1027842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1037842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.write_noindent(string.replace(text, "\r", "\n")) 1047842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1057842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.endtag("extraProgram") 1067842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1077842e56b97ce677b83bdab09cda48bc2d89ac75aJust writer.newline() 1087842e56b97ce677b83bdab09cda48bc2d89ac75aJust 1093a9fd301808f5a8991ca9ac44028d1ecb22d307fBehdad Esfahbod def fromXML(self, name, attrs, content, ttFont): 1107842e56b97ce677b83bdab09cda48bc2d89ac75aJust if not hasattr(self, "glyphPrograms"): 1117842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms = {} 1127842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms = {} 1137842e56b97ce677b83bdab09cda48bc2d89ac75aJust lines = string.split(string.replace(string.join(content, ""), "\r", "\n"), "\n") 1147842e56b97ce677b83bdab09cda48bc2d89ac75aJust text = string.join(lines[1:-1], "\r") 1157842e56b97ce677b83bdab09cda48bc2d89ac75aJust if name == "glyphProgram": 1167842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.glyphPrograms[attrs["name"]] = text 1177842e56b97ce677b83bdab09cda48bc2d89ac75aJust elif name == "extraProgram": 1187842e56b97ce677b83bdab09cda48bc2d89ac75aJust self.extraPrograms[attrs["name"]] = text 1197842e56b97ce677b83bdab09cda48bc2d89ac75aJust 120