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
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
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)
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)
def splice(self, stream, offset, value): return substr(stream, 0, offset) + value + substr( stream, offset + strlen(value))
def splice(self, stream, offset, value): return substr(stream,0,offset) + value + substr(stream,offset+strlen(value))