def _calcMasterChecksum(self): """Calculate checkSumAdjustment.""" tags = list(self.tables.keys()) checksums = [] for i in range(len(tags)): checksums.append(self.tables[tags[i]].checkSum) # Create a SFNT directory for checksum calculation purposes self.searchRange, self.entrySelector, self.rangeShift = getSearchRange( self.numTables, 16) directory = sstruct.pack(sfntDirectoryFormat, self) tables = sorted(self.tables.items()) for tag, entry in tables: sfntEntry = SFNTDirectoryEntry() 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 assert directory_end == len(directory) checksums.append(calcChecksum(directory)) checksum = sum(checksums) & 0xffffffff # BiboAfba! checksumadjustment = (0xB1B0AFBA - checksum) & 0xffffffff return checksumadjustment
def packSFNT(header, directory, tableData, flavor="cff", calcCheckSum=True, applyPadding=True, sortDirectory=True, searchRange=None, entrySelector=None, rangeShift=None): # update the checkSum if calcCheckSum: if flavor == "cff": f = "OTTO" else: f = "\000\001\000\000" calcHeadCheckSumAdjustmentSFNT(directory, tableData, flavor=f) # update the header cSearchRange, cEntrySelector, cRangeShift = getSearchRange( len(directory), 16) if searchRange is None: searchRange = cSearchRange if entrySelector is None: entrySelector = cEntrySelector if rangeShift is None: rangeShift = cRangeShift if flavor == "cff": header["sfntVersion"] = "OTTO" else: header["sfntVersion"] = "\000\001\000\000" header["searchRange"] = searchRange header["entrySelector"] = entrySelector header["rangeShift"] = rangeShift # version and num tables should already be set sfntData = sstruct.pack(sfntDirectoryFormat, header) # compile the directory sfntDirectoryEntries = {} entryOrder = [] for entry in directory: sfntEntry = SFNTDirectoryEntry() sfntEntry.tag = entry["tag"] sfntEntry.checkSum = entry["checksum"] sfntEntry.offset = entry["offset"] sfntEntry.length = entry["length"] sfntDirectoryEntries[entry["tag"]] = sfntEntry entryOrder.append(entry["tag"]) if sortDirectory: entryOrder = sorted(entryOrder) for tag in entryOrder: entry = sfntDirectoryEntries[tag] sfntData += entry.toString() # compile the data directory = [(entry["offset"], entry["tag"]) for entry in directory] for o, tag in sorted(directory): data = tableData[tag] if applyPadding: data = padData(data) sfntData += data # done return sfntData
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
def _calcMasterChecksum(self): """Calculate checkSumAdjustment.""" tags = list(self.tables.keys()) checksums = [] for i in range(len(tags)): checksums.append(self.tables[tags[i]].checkSum) # Create a SFNT directory for checksum calculation purposes self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(self.numTables, 16) directory = sstruct.pack(sfntDirectoryFormat, self) tables = sorted(self.tables.items()) for tag, entry in tables: sfntEntry = SFNTDirectoryEntry() 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 assert directory_end == len(directory) checksums.append(calcChecksum(directory)) checksum = sum(checksums) & 0xffffffff # BiboAfba! checksumadjustment = (0xB1B0AFBA - checksum) & 0xffffffff return checksumadjustment
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
def packSFNT(header, directory, tableData, flavor="cff", calcCheckSum=True, applyPadding=True, sortDirectory=True, searchRange=None, entrySelector=None, rangeShift=None): # update the checkSum if calcCheckSum: if flavor == "cff": f = "OTTO" else: f = "\000\001\000\000" calcHeadCheckSumAdjustmentSFNT(directory, tableData, flavor=f) # update the header cSearchRange, cEntrySelector, cRangeShift = getSearchRange(len(directory), 16) if searchRange is None: searchRange = cSearchRange if entrySelector is None: entrySelector = cEntrySelector if rangeShift is None: rangeShift = cRangeShift if flavor == "cff": header["sfntVersion"] = "OTTO" else: header["sfntVersion"] = "\000\001\000\000" header["searchRange"] = searchRange header["entrySelector"] = entrySelector header["rangeShift"] = rangeShift # version and num tables should already be set sfntData = sstruct.pack(sfntDirectoryFormat, header) # compile the directory sfntDirectoryEntries = {} entryOrder = [] for entry in directory: sfntEntry = SFNTDirectoryEntry() sfntEntry.tag = entry["tag"] sfntEntry.checkSum = entry["checksum"] sfntEntry.offset = entry["offset"] sfntEntry.length = entry["length"] sfntDirectoryEntries[entry["tag"]] = sfntEntry entryOrder.append(entry["tag"]) if sortDirectory: entryOrder = sorted(entryOrder) for tag in entryOrder: entry = sfntDirectoryEntries[tag] sfntData += entry.toString() # compile the data directory = [(entry["offset"], entry["tag"]) for entry in directory] for o, tag in sorted(directory): data = tableData[tag] if applyPadding: data = padData(data) sfntData += data # done return sfntData
def calcHeadCheckSumAdjustmentSFNT(directory, tableData, flavor=None): """ Set the checkSumAdjustment in the head table data. Grumble. """ # if the flavor is None, guess. if flavor is None: flavor = "\000\001\000\000" for entry in directory: if entry["tag"] == "CFF ": flavor = "OTTO" break assert flavor in ("OTTO", "\000\001\000\000") # make the sfnt header searchRange, entrySelector, rangeShift = getSearchRange(len(directory), 16) sfntHeaderData = dict( sfntVersion=flavor, numTables=len(directory), searchRange=searchRange, entrySelector=entrySelector, rangeShift=rangeShift, ) sfntData = sstruct.pack(sfntDirectoryFormat, sfntHeaderData) # make a SFNT table directory directory = [(entry["tag"], entry) for entry in directory] for tag, entry in sorted(directory): sfntEntry = SFNTDirectoryEntry() sfntEntry.tag = entry["tag"] sfntEntry.checkSum = entry["checksum"] sfntEntry.offset = entry["offset"] sfntEntry.length = entry["length"] sfntData += sfntEntry.toString() # calculate the checksum sfntDataChecksum = calcChecksum(sfntData) # gather all of the checksums checksums = [entry["checksum"] for o, entry in directory] checksums.append(sfntDataChecksum) # calculate the checksum checkSumAdjustment = sum(checksums) checkSumAdjustment = (0xB1B0AFBA - checkSumAdjustment) & 0xFFFFFFFF # set the value in the head table headTableData = tableData["head"] newHeadTableData = headTableData[:8] newHeadTableData += struct.pack(">L", checkSumAdjustment) newHeadTableData += headTableData[12:] tableData["head"] = newHeadTableData
def calcHeadCheckSumAdjustmentSFNT(directory, tableData, flavor=None): """ Set the checkSumAdjustment in the head table data. Grumble. """ # if the flavor is None, guess. if flavor is None: flavor = "\000\001\000\000" for entry in directory: if entry["tag"] == "CFF ": flavor = "OTTO" break assert flavor in ("OTTO", "\000\001\000\000") # make the sfnt header searchRange, entrySelector, rangeShift = getSearchRange(len(directory), 16) sfntHeaderData = dict( sfntVersion=flavor, numTables=len(directory), searchRange=searchRange, entrySelector=entrySelector, rangeShift=rangeShift ) sfntData = sstruct.pack(sfntDirectoryFormat, sfntHeaderData) # make a SFNT table directory directory = [(entry["tag"], entry) for entry in directory] for tag, entry in sorted(directory): sfntEntry = SFNTDirectoryEntry() sfntEntry.tag = entry["tag"] sfntEntry.checkSum = entry["checksum"] sfntEntry.offset = entry["offset"] sfntEntry.length = entry["length"] sfntData += sfntEntry.toString() # calculate the checksum sfntDataChecksum = calcChecksum(sfntData) # gather all of the checksums checksums = [entry["checksum"] for o, entry in directory] checksums.append(sfntDataChecksum) # calculate the checksum checkSumAdjustment = sum(checksums) checkSumAdjustment = (0xB1B0AFBA - checkSumAdjustment) & 0xffffffff # set the value in the head table headTableData = tableData["head"] newHeadTableData = headTableData[:8] newHeadTableData += struct.pack(">L", checkSumAdjustment) newHeadTableData += headTableData[12:] tableData["head"] = newHeadTableData