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