from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * from . import DefaultTable class table_T_S_I__1(DefaultTable.DefaultTable): extras = {0xfffa: "ppgm", 0xfffb: "cvt", 0xfffc: "reserved", 0xfffd: "fpgm"} indextable = "TSI0" def decompile(self, data, ttFont): indextable = ttFont[self.indextable] self.glyphPrograms = {} for i in range(len(indextable.indices)): glyphID, textLength, textOffset = indextable.indices[i] if textLength == 0x8000: # Ugh. Hi Beat! textLength = indextable.indices[i+1][1] if textLength > 0x8000: pass # XXX Hmmm. text = data[textOffset:textOffset+textLength] assert len(text) == textLength if text: self.glyphPrograms[ttFont.getGlyphName(glyphID)] = text self.extraPrograms = {} for i in range(len(indextable.extra_indices)): extraCode, textLength, textOffset = indextable.extra_indices[i] if textLength == 0x8000: if self.extras[extraCode] == "fpgm": # this is the last one textLength = len(data) - textOffset else: textLength = indextable.extra_indices[i+1][1] text = data[textOffset:textOffset+textLength] assert len(text) == textLength if text: self.extraPrograms[self.extras[extraCode]] = text def compile(self, ttFont): if not hasattr(self, "glyphPrograms"): self.glyphPrograms = {} self.extraPrograms = {} data = b'' indextable = ttFont[self.indextable] glyphNames = ttFont.getGlyphOrder() indices = [] for i in range(len(glyphNames)): if len(data) % 2: data = data + b"\015" # align on 2-byte boundaries, fill with return chars. Yum. name = glyphNames[i] if name in self.glyphPrograms: text = self.glyphPrograms[name] else: text = b"" textLength = len(text) if textLength >= 0x8000: textLength = 0x8000 # XXX ??? indices.append((i, textLength, len(data))) data = data + text extra_indices = [] codes = sorted(self.extras.items()) for i in range(len(codes)): if len(data) % 2: data = data + b"\015" # align on 2-byte boundaries, fill with return chars. code, name = codes[i] if name in self.extraPrograms: text = self.extraPrograms[name] else: text = b"" textLength = len(text) if textLength >= 0x8000: textLength = 0x8000 # XXX ??? extra_indices.append((code, textLength, len(data))) data = data + text indextable.set(indices, extra_indices) return data def toXML(self, writer, ttFont): names = sorted(self.glyphPrograms.keys()) writer.newline() for name in names: text = self.glyphPrograms[name] if not text: continue writer.begintag("glyphProgram", name=name) writer.newline() writer.write_noindent(text.replace("\r", "\n")) writer.newline() writer.endtag("glyphProgram") writer.newline() writer.newline() extra_names = sorted(self.extraPrograms.keys()) for name in extra_names: text = self.extraPrograms[name] if not text: continue writer.begintag("extraProgram", name=name) writer.newline() writer.write_noindent(text.replace("\r", "\n")) writer.newline() writer.endtag("extraProgram") writer.newline() writer.newline() def fromXML(self, name, attrs, content, ttFont): if not hasattr(self, "glyphPrograms"): self.glyphPrograms = {} self.extraPrograms = {} lines = strjoin(content).replace("\r", "\n").split("\n") text = '\r'.join(lines[1:-1]) if name == "glyphProgram": self.glyphPrograms[attrs["name"]] = text elif name == "extraProgram": self.extraPrograms[attrs["name"]] = text