示例#1
0
def _testJunkAtTheBeginningOfTheFile(header):
    """
    >>> test = dict(numTables=5, searchRange=64, entrySelector=2, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    False
    >>> test = dict(numTables=5, searchRange=0, entrySelector=2, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    >>> test = dict(numTables=5, searchRange=64, entrySelector=0, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    >>> test = dict(numTables=5, searchRange=64, entrySelector=2, rangeShift=0)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    """
    errors = []
    numTables = header["numTables"]
    searchRange, entrySelector, rangeShift = getSearchRange(numTables)
    if header["searchRange"] != searchRange:
        errors.append("The searchRange value is incorrect.")
    if header["entrySelector"] != entrySelector:
        errors.append("The entrySelector value is incorrect.")
    if header["rangeShift"] != rangeShift:
        errors.append("The rangeShift value is incorrect.")
    return errors
示例#2
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
示例#3
0
def _testJunkAtTheBeginningOfTheFile(header):
    """
    >>> test = dict(numTables=5, searchRange=64, entrySelector=2, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    False
    >>> test = dict(numTables=5, searchRange=0, entrySelector=2, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    >>> test = dict(numTables=5, searchRange=64, entrySelector=0, rangeShift=16)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    >>> test = dict(numTables=5, searchRange=64, entrySelector=2, rangeShift=0)
    >>> bool(_testJunkAtTheBeginningOfTheFile(test))
    True
    """
    errors = []
    numTables = header["numTables"]
    searchRange, entrySelector, rangeShift = getSearchRange(numTables)
    if header["searchRange"] != searchRange:
        errors.append("The searchRange value is incorrect.")
    if header["entrySelector"] != entrySelector:
        errors.append("The entrySelector value is incorrect.")
    if header["rangeShift"] != rangeShift:
        errors.append("The rangeShift value is incorrect.")
    return errors
示例#4
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
示例#5
0
文件: sfnt.py 项目: w3c/woff
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))
    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
示例#6
0
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))
    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