88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
from fontTools.misc import sstruct
|
|
from fontTools.misc.fixedTools import floatToFixedToStr
|
|
from fontTools.misc.textTools import safeEval
|
|
from . import DefaultTable
|
|
from . import grUtils
|
|
import struct
|
|
|
|
Sill_hdr = """
|
|
>
|
|
version: 16.16F
|
|
"""
|
|
|
|
|
|
class table_S__i_l_l(DefaultTable.DefaultTable):
|
|
def __init__(self, tag=None):
|
|
DefaultTable.DefaultTable.__init__(self, tag)
|
|
self.langs = {}
|
|
|
|
def decompile(self, data, ttFont):
|
|
(_, data) = sstruct.unpack2(Sill_hdr, data, self)
|
|
self.version = float(floatToFixedToStr(self.version, precisionBits=16))
|
|
(numLangs,) = struct.unpack(">H", data[:2])
|
|
data = data[8:]
|
|
maxsetting = 0
|
|
langinfo = []
|
|
for i in range(numLangs):
|
|
(langcode, numsettings, offset) = struct.unpack(
|
|
">4sHH", data[i * 8 : (i + 1) * 8]
|
|
)
|
|
offset = int(offset / 8) - (numLangs + 1)
|
|
langcode = langcode.replace(b"\000", b"")
|
|
langinfo.append((langcode.decode("utf-8"), numsettings, offset))
|
|
maxsetting = max(maxsetting, offset + numsettings)
|
|
data = data[numLangs * 8 :]
|
|
finfo = []
|
|
for i in range(maxsetting):
|
|
(fid, val, _) = struct.unpack(">LHH", data[i * 8 : (i + 1) * 8])
|
|
finfo.append((fid, val))
|
|
self.langs = {}
|
|
for c, n, o in langinfo:
|
|
self.langs[c] = []
|
|
for i in range(o, o + n):
|
|
self.langs[c].append(finfo[i])
|
|
|
|
def compile(self, ttFont):
|
|
ldat = b""
|
|
fdat = b""
|
|
offset = len(self.langs)
|
|
for c, inf in sorted(self.langs.items()):
|
|
ldat += struct.pack(">4sHH", c.encode("utf8"), len(inf), 8 * offset + 20)
|
|
for fid, val in inf:
|
|
fdat += struct.pack(">LHH", fid, val, 0)
|
|
offset += len(inf)
|
|
ldat += struct.pack(">LHH", 0x80808080, 0, 8 * offset + 20)
|
|
return (
|
|
sstruct.pack(Sill_hdr, self)
|
|
+ grUtils.bininfo(len(self.langs))
|
|
+ ldat
|
|
+ fdat
|
|
)
|
|
|
|
def toXML(self, writer, ttFont):
|
|
writer.simpletag("version", version=self.version)
|
|
writer.newline()
|
|
for c, inf in sorted(self.langs.items()):
|
|
writer.begintag("lang", name=c)
|
|
writer.newline()
|
|
for fid, val in inf:
|
|
writer.simpletag("feature", fid=grUtils.num2tag(fid), val=val)
|
|
writer.newline()
|
|
writer.endtag("lang")
|
|
writer.newline()
|
|
|
|
def fromXML(self, name, attrs, content, ttFont):
|
|
if name == "version":
|
|
self.version = float(safeEval(attrs["version"]))
|
|
elif name == "lang":
|
|
c = attrs["name"]
|
|
self.langs[c] = []
|
|
for element in content:
|
|
if not isinstance(element, tuple):
|
|
continue
|
|
tag, a, subcontent = element
|
|
if tag == "feature":
|
|
self.langs[c].append(
|
|
(grUtils.tag2num(a["fid"]), int(safeEval(a["val"])))
|
|
)
|