15
16
def decompile(self, data, ttFont):
17
self.getGlyphName = ttFont.getGlyphName # for use in get/set item functions, for access by GID
16
18
self.majorVersion, self.minorVersion, self.defaultVertOriginY, self.numVertOriginYMetrics = struct.unpack(">HHhH", data[:8])
17
assert (self.majorVersion <= 1), "Major version of VORG table is higher than I knwo how to handle"
19
assert (self.majorVersion <= 1), "Major version of VORG table is higher than I know how to handle"
19
self.VOriginRecords = {}
20
24
for i in range(self.numVertOriginYMetrics):
21
gid, vOrigin = struct.unpack(">Hh", data[:4])
22
glyphName = ttFont.getGlyphName(gid)
23
self.VOriginRecords[glyphName] = vOrigin
25
gid, vOrigin = struct.unpack(">Hh", data[pos:pos+4])
30
self.VOriginRecords = vOrig = {}
31
glyphOrder = ttFont.getGlyphOrder()
33
names = map(operator.getitem, [glyphOrder]*self.numVertOriginYMetrics, gids )
35
getGlyphName = self.getGlyphName
36
names = map(getGlyphName, gids )
38
map(operator.setitem, [vOrig]*self.numVertOriginYMetrics, names, vids)
26
41
def compile(self, ttFont):
27
glyphNames = self.VOriginRecords.keys()
28
self.numVertOriginYMetrics = len(glyphNames)
29
data = struct.pack(">HHhH", self.majorVersion, self.minorVersion, self.defaultVertOriginY, self.numVertOriginYMetrics)
31
for glyphName in glyphNames:
33
gid = ttFont.getGlyphID(glyphName)
35
assert 0, "VORG table contains a glyph name not in ttFont.getGlyphNames(): " + str(glyphName)
36
vOriginTable.append([gid, self.VOriginRecords[glyphName]])
38
for entry in vOriginTable:
39
data = data + struct.pack(">Hh", entry[0], entry[1])
42
vorgs = self.VOriginRecords.values()
43
names = self.VOriginRecords.keys()
44
nameMap = ttFont.getReverseGlyphMap()
45
lenRecords = len(vorgs)
47
gids = map(operator.getitem, [nameMap]*lenRecords, names)
49
nameMap = ttFont.getReverseGlyphMap(rebuild=1)
50
gids = map(operator.getitem, [nameMap]*lenRecords, names)
51
vOriginTable = map(None, gids, vorgs)
52
self.numVertOriginYMetrics = lenRecords
53
vOriginTable.sort() # must be in ascending GID order
54
dataList = [ struct.pack(">Hh", rec[0], rec[1]) for rec in vOriginTable]
55
header = struct.pack(">HHhH", self.majorVersion, self.minorVersion, self.defaultVertOriginY, self.numVertOriginYMetrics)
56
dataList.insert(0, header)
57
data = "".join(dataList)
42
60
def toXML(self, writer, ttFont):
62
80
vOriginRec.toXML(writer, ttFont)
64
82
def fromXML(self, (name, attrs, content), ttFont):
83
if not hasattr(self, "VOriginRecords"):
84
self.VOriginRecords = {}
85
self.getGlyphName = ttFont.getGlyphName # for use in get/set item functions, for access by GID
65
86
if name == "VOriginRecord":
66
87
for element in content:
67
88
if isinstance(element, StringType):
69
if not hasattr(self, "VOriginRecords"):
70
self.VOriginRecords = {}
71
90
vOriginRec = VOriginRecord()
72
91
for element in content:
73
92
if isinstance(element, StringType):
78
97
value = safeEval(attrs["value"])
79
98
setattr(self, name, value)
81
def __getitem__(self, name):
82
if not self.VOriginRecords.has_key(name):
101
def __getitem__(self, glyphSelector):
102
if type(glyphSelector) == IntType:
103
# its a gid, convert to glyph name
104
glyphSelector = self.getGlyphName(glyphSelector)
106
if not self.VOriginRecords.has_key(glyphSelector):
83
107
return self.defaultVertOriginY
85
return self.VOriginRecords[name]
87
def __setitem__(self, name, value):
109
return self.VOriginRecords[glyphSelector]
111
def __setitem__(self, glyphSelector, value):
112
if type(glyphSelector) == IntType:
113
# its a gid, convert to glyph name
114
glyphSelector = self.getGlyphName(glyphSelector)
88
116
if value != self.defaultVertOriginY:
89
self.VOriginRecords[name] = value
90
elif self.VOriginRecords.has_key(name):
91
del self.VOriginRecords[name]
117
self.VOriginRecords[glyphSelector] = value
118
elif self.VOriginRecords.has_key(glyphSelector):
119
del self.VOriginRecords[glyphSelector]
94
121
class VOriginRecord: