Blame Lib/fontTools/ttLib/tables/S__i_l_l.py

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