コード例 #1
0
def calcHeadCheckSumAdjustment(flavor, tables):
    numTables = len(tables)
    # build the sfnt header
    searchRange, entrySelector, rangeShift = getSearchRange(numTables)
    sfntDirectoryData = dict(sfntVersion=flavor,
                             numTables=numTables,
                             searchRange=searchRange,
                             entrySelector=entrySelector,
                             rangeShift=rangeShift)
    # build the sfnt directory
    directory = sstruct.pack(sfntDirectoryFormat, sfntDirectoryData)
    for tag, entry in sorted(tables.items()):
        entry = tables[tag]
        sfntEntry = SFNTDirectoryEntry()
        sfntEntry.tag = tag
        sfntEntry.checkSum = entry["checkSum"]
        sfntEntry.offset = entry["offset"]
        sfntEntry.length = entry["length"]
        directory += sfntEntry.toString()
    # calculate the checkSumAdjustment
    checkSums = [entry["checkSum"] for entry in tables.values()]
    checkSums.append(calcChecksum(directory))
    checkSumAdjustment = sum(checkSums)
    checkSumAdjustment = (0xB1B0AFBA - checkSumAdjustment) & 0xffffffff
    # done
    return checkSumAdjustment
コード例 #2
0
 def _writeTableDirectory(self):
     if self.verbose:
         debugmsg("writing table directory")
     self.file.seek(woffHeaderSize)
     for tag, (index, entry, data) in sorted(self.tables.items()):
         entry = sstruct.pack(woffDirectoryEntryFormat, entry)
         self.file.write(entry)
コード例 #3
0
 def close(self):
     if self.numTables != len(self.tables):
         raise WOFFLibError(
             "wrong number of tables; expected %d, found %d" %
             (self.numTables, len(self.tables)))
     # first, handle the checkSumAdjustment
     if self.recalculateHeadChecksum and "head" in self.tables:
         self._handleHeadChecksum()
     # check the table directory conformance
     for tag, (index, entry, data) in sorted(self.tables.items()):
         self._checkTableConformance(entry, data)
     # write the header
     header = sstruct.pack(woffHeaderFormat, self)
     self.file.seek(0)
     self.file.write(header)
     # update the directory offsets
     offset = woffHeaderSize + (woffDirectoryEntrySize * self.numTables)
     order = self._tableOrder()
     for tag in order:
         index, entry, data = self.tables[tag]
         entry.offset = offset
         offset += calc4BytePaddedLength(
             entry.compLength)  # ensure byte alignment
     # write the directory
     self._writeTableDirectory()
     # write the table data
     self._writeTableData()
     # write the metadata
     self._writeMetadata()
     # write the private data
     self._writePrivateData()
     # write the header
     self._writeHeader()
     # go to the beginning of the file
     self.file.seek(0)
コード例 #4
0
 def toString(self):
     return sstruct.pack(woffDirectoryEntryFormat, self)
コード例 #5
0
 def _writeHeader(self):
     header = sstruct.pack(woffHeaderFormat, self)
     self.file.seek(0)
     self.file.write(header)