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