Fix bug in writing an empty INDEX table. This is supposed to contain only the two-bye count field. Code was also writing the final sentinel offset in the offset list, even though there were no items. This is harmless, but adds a couple useless bytes. Also fixed the calculation of the offset size in the CFF header. Again harmless, since this value isn't used anywhere, but makes it harder to compare CFF's built by different tools.

This commit is contained in:
ReadRoberts 2016-09-20 19:42:18 -07:00 committed by Behdad Esfahbod
parent fb22f64ab1
commit 8dc4edceda

View File

@ -155,6 +155,10 @@ class CFFWriter(object):
log.log(DEBUG, "CFFWriter.toFile() writing to file.")
begin = file.tell()
posList = [0]
cffOffSize = calcOffSize(lastPosList[-1])
headerBytes = self.data[0]
headerBytes = headerBytes[:-1] + chr(cffOffSize)
self.data[0] = headerBytes
for item in self.data:
if hasattr(item, "toFile"):
item.toFile(file)
@ -186,43 +190,53 @@ class IndexCompiler(object):
return items
def getOffsets(self):
pos = 1
offsets = [pos]
for item in self.items:
if hasattr(item, "getDataLength"):
pos = pos + item.getDataLength()
else:
pos = pos + len(item)
offsets.append(pos)
# An empty INDEX contains only the count field.
if self.items:
pos = 1
offsets = [pos]
for item in self.items:
if hasattr(item, "getDataLength"):
pos = pos + item.getDataLength()
else:
pos = pos + len(item)
offsets.append(pos)
else:
offsets = []
return offsets
def getDataLength(self):
lastOffset = self.getOffsets()[-1]
offSize = calcOffSize(lastOffset)
dataLength = (
2 + # count
1 + # offSize
(len(self.items) + 1) * offSize + # the offsets
lastOffset - 1 # size of object data
)
if self.items:
lastOffset = self.getOffsets()[-1]
offSize = calcOffSize(lastOffset)
dataLength = (
2 + # count
1 + # offSize
(len(self.items) + 1) * offSize + # the offsets
lastOffset - 1 # size of object data
)
else:
dataLength = 2 # count. For empty INDEX tables, this is the only entry.
return dataLength
def toFile(self, file):
offsets = self.getOffsets()
writeCard16(file, len(self.items))
offSize = calcOffSize(offsets[-1])
writeCard8(file, offSize)
offSize = -offSize
pack = struct.pack
for offset in offsets:
binOffset = pack(">l", offset)[offSize:]
assert len(binOffset) == -offSize
file.write(binOffset)
for item in self.items:
if hasattr(item, "toFile"):
item.toFile(file)
else:
file.write(tobytes(item, encoding="latin1"))
# An empty INDEX contains only the count field.
if self.items:
offSize = calcOffSize(offsets[-1])
writeCard8(file, offSize)
offSize = -offSize
pack = struct.pack
for offset in offsets:
binOffset = pack(">l", offset)[offSize:]
assert len(binOffset) == -offSize
file.write(binOffset)
for item in self.items:
if hasattr(item, "toFile"):
item.toFile(file)
else:
file.write(tobytes(item, encoding="latin1"))
class IndexedStringsCompiler(IndexCompiler):