Ejemplo n.º 1
0
    def endTTFile(self, stm):
        stm = ''
        numTables = count(self.otables)
        searchRange = 1
        entrySelector = 0
        while (searchRange * 2 <= numTables):
            searchRange = searchRange * 2
            entrySelector = entrySelector + 1

        searchRange = searchRange * 16
        rangeShift = numTables * 16 - searchRange

        # Header
        if (_TTF_MAC_HEADER):
            stm += (pack(">LHHHH", 0x74727565, numTables, searchRange,
                         entrySelector, rangeShift))  # Mac
        else:
            stm += (pack(">LHHHH", 0x00010000, numTables, searchRange,
                         entrySelector, rangeShift))  # Windows

        # Table directory
        tables = self.otables

        offset = 12 + numTables * 16
        sorted_tables = sorted(tables.items())
        for tag, data in sorted_tables:
            if (tag == 'head'):
                head_start = offset
            stm += tag
            checksum = calcChecksum(data)
            stm += pack(">HH", checksum[0], checksum[1])
            stm += pack(">LL", offset, strlen(data))
            paddedLength = (strlen(data) + 3) & ~3
            offset = offset + paddedLength

        # Table data
        for tag, data in sorted_tables:
            data += "\0\0\0"
            stm += substr(data, 0, (strlen(data) & ~3))

        checksum = calcChecksum(stm)
        checksum = sub32((0xB1B0, 0xAFBA), checksum)
        chk = pack(">HH", checksum[0], checksum[1])
        stm = self.splice(stm, (head_start + 8), chk)
        return stm
Ejemplo n.º 2
0
    def endTTFile(self, stm): 
        stm = ''
        numTables = count(self.otables)
        searchRange = 1
        entrySelector = 0
        while (searchRange * 2 <= numTables): 
            searchRange = searchRange * 2
            entrySelector = entrySelector + 1
        
        searchRange = searchRange * 16
        rangeShift = numTables * 16 - searchRange

        # Header
        if (_TTF_MAC_HEADER): 
            stm += (pack(">LHHHH", 0x74727565, numTables, searchRange, entrySelector, rangeShift))    # Mac
        else:
            stm += (pack(">LHHHH", 0x00010000 , numTables, searchRange, entrySelector, rangeShift))    # Windows

        
        # Table directory
        tables = self.otables

        offset = 12 + numTables * 16
        sorted_tables = sorted(tables.items())
        for tag, data in sorted_tables:
            if (tag == 'head'):
                head_start = offset 
            stm += tag
            checksum = calcChecksum(data)
            stm += pack(">HH", checksum[0],checksum[1])
            stm += pack(">LL", offset, strlen(data))
            paddedLength = (strlen(data)+3)&~3
            offset = offset + paddedLength

        # Table data
        for tag, data in sorted_tables: 
            data += "\0\0\0"
            stm += substr(data,0,(strlen(data)&~3))

        checksum = calcChecksum(stm)
        checksum = sub32((0xB1B0,0xAFBA), checksum)
        chk = pack(">HH", checksum[0],checksum[1])
        stm = self.splice(stm,(head_start + 8),chk)
        return stm 
Ejemplo n.º 3
0
def calcChecksum(data):
    if (strlen(data) % 4):
        data += str_repeat("\0", (4 - (len(data) % 4)))
    hi = 0x0000
    lo = 0x0000
    for i in range(0, len(data), 4):
        hi += (ord(data[i]) << 8) + ord(data[i + 1])
        lo += (ord(data[i + 2]) << 8) + ord(data[i + 3])
        hi += lo >> 16
        lo = lo & 0xFFFF
        hi = hi & 0xFFFF
    return (hi, lo)
Ejemplo n.º 4
0
def calcChecksum(data): 
    if (strlen(data) % 4):
        data += str_repeat("\0", (4-(len(data) % 4)))
    hi=0x0000
    lo=0x0000
    for i in range(0, len(data), 4): 
        hi += (ord(data[i])<<8) + ord(data[i+1])
        lo += (ord(data[i+2])<<8) + ord(data[i+3])
        hi += lo >> 16
        lo = lo & 0xFFFF
        hi = hi & 0xFFFF
    return (hi, lo)
Ejemplo n.º 5
0
 def splice(self, stream, offset, value):
     return substr(stream, 0, offset) + value + substr(
         stream, offset + strlen(value))
Ejemplo n.º 6
0
 def splice(self, stream, offset, value):
     return substr(stream,0,offset) + value + substr(stream,offset+strlen(value))