• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from fontTools.misc import sstruct
2from fontTools.misc.fixedTools import floatToFixedToStr
3from fontTools.misc.textTools import safeEval
4from . import DefaultTable
5from . import grUtils
6import struct
7
8Sill_hdr = """
9    >
10    version:    16.16F
11"""
12
13
14class table_S__i_l_l(DefaultTable.DefaultTable):
15    def __init__(self, tag=None):
16        DefaultTable.DefaultTable.__init__(self, tag)
17        self.langs = {}
18
19    def decompile(self, data, ttFont):
20        (_, data) = sstruct.unpack2(Sill_hdr, data, self)
21        self.version = float(floatToFixedToStr(self.version, precisionBits=16))
22        (numLangs,) = struct.unpack(">H", data[:2])
23        data = data[8:]
24        maxsetting = 0
25        langinfo = []
26        for i in range(numLangs):
27            (langcode, numsettings, offset) = struct.unpack(
28                ">4sHH", data[i * 8 : (i + 1) * 8]
29            )
30            offset = int(offset / 8) - (numLangs + 1)
31            langcode = langcode.replace(b"\000", b"")
32            langinfo.append((langcode.decode("utf-8"), numsettings, offset))
33            maxsetting = max(maxsetting, offset + numsettings)
34        data = data[numLangs * 8 :]
35        finfo = []
36        for i in range(maxsetting):
37            (fid, val, _) = struct.unpack(">LHH", data[i * 8 : (i + 1) * 8])
38            finfo.append((fid, val))
39        self.langs = {}
40        for c, n, o in langinfo:
41            self.langs[c] = []
42            for i in range(o, o + n):
43                self.langs[c].append(finfo[i])
44
45    def compile(self, ttFont):
46        ldat = b""
47        fdat = b""
48        offset = len(self.langs)
49        for c, inf in sorted(self.langs.items()):
50            ldat += struct.pack(">4sHH", c.encode("utf8"), len(inf), 8 * offset + 20)
51            for fid, val in inf:
52                fdat += struct.pack(">LHH", fid, val, 0)
53            offset += len(inf)
54        ldat += struct.pack(">LHH", 0x80808080, 0, 8 * offset + 20)
55        return (
56            sstruct.pack(Sill_hdr, self)
57            + grUtils.bininfo(len(self.langs))
58            + ldat
59            + fdat
60        )
61
62    def toXML(self, writer, ttFont):
63        writer.simpletag("version", version=self.version)
64        writer.newline()
65        for c, inf in sorted(self.langs.items()):
66            writer.begintag("lang", name=c)
67            writer.newline()
68            for fid, val in inf:
69                writer.simpletag("feature", fid=grUtils.num2tag(fid), val=val)
70                writer.newline()
71            writer.endtag("lang")
72            writer.newline()
73
74    def fromXML(self, name, attrs, content, ttFont):
75        if name == "version":
76            self.version = float(safeEval(attrs["version"]))
77        elif name == "lang":
78            c = attrs["name"]
79            self.langs[c] = []
80            for element in content:
81                if not isinstance(element, tuple):
82                    continue
83                tag, a, subcontent = element
84                if tag == "feature":
85                    self.langs[c].append(
86                        (grUtils.tag2num(a["fid"]), int(safeEval(a["val"])))
87                    )
88