From 4c4c65fac075024a333cddcb7ddb83bbd4672555 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Wed, 1 Apr 2015 10:25:06 +0100 Subject: [PATCH] [sfnt] fix WOFF checksum adjustment calculation Use 'origLength' and 'origChecksum', instead of 'length' and 'checksum', to calculate the checksum adjustment of WOFF. --- Lib/fontTools/ttLib/sfnt.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Lib/fontTools/ttLib/sfnt.py b/Lib/fontTools/ttLib/sfnt.py index 1a260c585..aa9e35cb3 100644 --- a/Lib/fontTools/ttLib/sfnt.py +++ b/Lib/fontTools/ttLib/sfnt.py @@ -111,6 +111,9 @@ class SFNTWriter(object): self.DirectoryEntry = WOFFDirectoryEntry self.signature = "wOFF" + + # to calculate WOFF checksum adjustment, we also need the original SFNT offsets + self.origNextTableOffset = sfntDirectorySize + numTables * sfntDirectoryEntrySize else: assert not self.flavor, "Unknown flavor '%s'" % self.flavor self.directoryFormat = sfntDirectoryFormat @@ -130,7 +133,7 @@ class SFNTWriter(object): """Write raw table data to disk.""" if tag in self.tables: from fontTools import ttLib - raise ttLib.TTLibError("cannot rewrite '%s' table: length does not match directory entry" % tag) + raise ttLib.TTLibError("cannot rewrite '%s' table" % tag) entry = self.DirectoryEntry() entry.tag = tag @@ -141,7 +144,11 @@ class SFNTWriter(object): entry.uncompressed = True else: entry.checkSum = calcChecksum(data) - entry.saveData (self.file, data) + entry.saveData(self.file, data) + + if self.flavor == "woff": + entry.origOffset = self.origNextTableOffset + self.origNextTableOffset += (entry.origLength + 3) & ~3 self.nextTableOffset = self.nextTableOffset + ((entry.length + 3) & ~3) # Add NUL bytes to pad the table data to a 4-byte boundary. @@ -228,8 +235,6 @@ class SFNTWriter(object): for i in range(len(tags)): checksums.append(self.tables[tags[i]].checkSum) - # TODO(behdad) I'm fairly sure the checksum for woff is not working correctly. - # Haven't debugged. if self.DirectoryEntry != SFNTDirectoryEntry: # Create a SFNT directory for checksum calculation purposes self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(self.numTables, 16) @@ -237,8 +242,10 @@ class SFNTWriter(object): tables = sorted(self.tables.items()) for tag, entry in tables: sfntEntry = SFNTDirectoryEntry() - for item in ['tag', 'checkSum', 'offset', 'length']: - setattr(sfntEntry, item, getattr(entry, item)) + sfntEntry.tag = entry.tag + sfntEntry.checkSum = entry.checkSum + sfntEntry.offset = entry.origOffset + sfntEntry.length = entry.origLength directory = directory + sfntEntry.toString() directory_end = sfntDirectorySize + len(self.tables) * sfntDirectoryEntrySize