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