blob: d9177e0ac1c42ada9efe768a77fe1f139974ce5e [file] [log] [blame]
Behdad Esfahbod1ae29592014-01-14 15:07:50 +08001from __future__ import print_function, division, absolute_import
Behdad Esfahbod30e691e2013-11-27 17:27:45 -05002from fontTools.misc.py23 import *
Behdad Esfahbod8413c102013-09-17 16:59:39 -04003from fontTools.misc import sstruct
Behdad Esfahbod7ed91ec2013-11-27 15:16:28 -05004from fontTools.misc.textTools import safeEval
Behdad Esfahbod30e691e2013-11-27 17:27:45 -05005from . import DefaultTable
jvr4cc00512006-10-21 13:27:25 +00006
7SINGFormat = """
8 > # big endian
9 tableVersionMajor: H
10 tableVersionMinor: H
11 glyphletVersion: H
12 permissions: h
13 mainGID: H
14 unitsPerEm: H
15 vertAdvance: h
16 vertOrigin: h
17 uniqueName: 28s
18 METAMD5: 16s
19 nameLength: 1s
20"""
21# baseGlyphName is a byte string which follows the record above.
22
23
24
25class table_S_I_N_G_(DefaultTable.DefaultTable):
26
27 dependencies = []
28
29 def decompile(self, data, ttFont):
30 dummy, rest = sstruct.unpack2(SINGFormat, data, self)
31 self.uniqueName = self.decompileUniqueName(self.uniqueName)
Behdad Esfahbod319c5fd2013-11-27 18:13:48 -050032 self.nameLength = byteord(self.nameLength)
jvr4cc00512006-10-21 13:27:25 +000033 assert len(rest) == self.nameLength
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050034 self.baseGlyphName = tostr(rest)
jvr4cc00512006-10-21 13:27:25 +000035
36 rawMETAMD5 = self.METAMD5
Behdad Esfahbod319c5fd2013-11-27 18:13:48 -050037 self.METAMD5 = "[" + hex(byteord(self.METAMD5[0]))
jvr4cc00512006-10-21 13:27:25 +000038 for char in rawMETAMD5[1:]:
Behdad Esfahbod319c5fd2013-11-27 18:13:48 -050039 self.METAMD5 = self.METAMD5 + ", " + hex(byteord(char))
jvr4cc00512006-10-21 13:27:25 +000040 self.METAMD5 = self.METAMD5 + "]"
41
42 def decompileUniqueName(self, data):
43 name = ""
44 for char in data:
Behdad Esfahbod319c5fd2013-11-27 18:13:48 -050045 val = byteord(char)
jvr4cc00512006-10-21 13:27:25 +000046 if val == 0:
47 break
48 if (val > 31) or (val < 128):
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050049 name += chr(val)
jvr4cc00512006-10-21 13:27:25 +000050 else:
51 octString = oct(val)
52 if len(octString) > 3:
53 octString = octString[1:] # chop off that leading zero.
54 elif len(octString) < 3:
55 octString.zfill(3)
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050056 name += "\\" + octString
jvr4cc00512006-10-21 13:27:25 +000057 return name
58
59
60 def compile(self, ttFont):
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050061 d = self.__dict__.copy()
62 d["nameLength"] = bytechr(len(self.baseGlyphName))
63 d["uniqueName"] = self.compilecompileUniqueName(self.uniqueName, 28)
jvr4cc00512006-10-21 13:27:25 +000064 METAMD5List = eval(self.METAMD5)
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050065 d["METAMD5"] = b""
jvr4cc00512006-10-21 13:27:25 +000066 for val in METAMD5List:
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050067 d["METAMD5"] += bytechr(val)
68 assert (len(d["METAMD5"]) == 16), "Failed to pack 16 byte MD5 hash in SING table"
69 data = sstruct.pack(SINGFormat, d)
70 data = data + tobytes(self.baseGlyphName)
jvr4cc00512006-10-21 13:27:25 +000071 return data
72
73 def compilecompileUniqueName(self, name, length):
74 nameLen = len(name)
75 if length <= nameLen:
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050076 name = name[:length-1] + "\000"
jvr4cc00512006-10-21 13:27:25 +000077 else:
Behdad Esfahbodfd68c9d2013-11-28 15:04:23 -050078 name += (nameLen - length) * "\000"
jvr4cc00512006-10-21 13:27:25 +000079 return name
80
81
82 def toXML(self, writer, ttFont):
83 writer.comment("Most of this table will be recalculated by the compiler")
84 writer.newline()
85 formatstring, names, fixes = sstruct.getformat(SINGFormat)
86 for name in names:
87 value = getattr(self, name)
88 writer.simpletag(name, value=value)
89 writer.newline()
90 writer.simpletag("baseGlyphName", value=self.baseGlyphName)
91 writer.newline()
92
Behdad Esfahbod3a9fd302013-11-27 03:19:32 -050093 def fromXML(self, name, attrs, content, ttFont):
jvr4cc00512006-10-21 13:27:25 +000094 value = attrs["value"]
95 if name in ["uniqueName", "METAMD5", "baseGlyphName"]:
96 setattr(self, name, value)
97 else:
Behdad Esfahbod7cc6d272013-11-27 04:00:15 -050098 setattr(self, name, safeEval(value))