mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-11 04:38:13 +08:00
* rewrite * update submodule * make width height configurable * update dependency * update * update file * update dep * fix basic config layout * update plugin management * more stuff * add blacklist * fix todo * fix windows gethandle * update windows update guide * update windows build guide * include go mod tidy in script * update todo * fix source session * fix text output * add plugin play duration control * fix id diange not working * update todo * update version number
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
#First released as C++ program by Hiroyuki Tsutsumi as part of the free software suite “Beer”
|
||
#I thought porting it to Python could be both a challenge and useful
|
||
|
||
from sys import argv, exit, getsizeof
|
||
from struct import pack_into, unpack_from
|
||
|
||
def ceil4(n):
|
||
"""returns the next integer which is a multiple of 4"""
|
||
return (n + 3) & ~3
|
||
|
||
if len(argv)!=2:
|
||
print("Usage: %s FontCollection.ttc" % argv)
|
||
exit(2)
|
||
|
||
filename = argv[1]
|
||
in_file = open(filename, "rb")
|
||
buf = in_file.read()
|
||
in_file.close()
|
||
|
||
if filename.lower().endswith(".ttc"):
|
||
filename = filename[:-4]
|
||
|
||
|
||
if buf[:4] != b"ttcf":
|
||
out_filename = "%s.ttf" % filename
|
||
out_file = open(out_filename, "wb")
|
||
out_file.write(buf)
|
||
#end, so we don’t have to close the files or call exit() here
|
||
else:
|
||
ttf_count = unpack_from("!L", buf, 0x08)[0]
|
||
print("Anzahl enthaltener TTF-Dateien: %s" % ttf_count)
|
||
ttf_offset_array = unpack_from("!"+ttf_count*"L", buf, 0x0C)
|
||
for i in range(ttf_count):
|
||
print("Extrahiere TTF #%s:" % (i+1))
|
||
table_header_offset = ttf_offset_array[i]
|
||
print("\tHeader beginnt bei Byte %s" % table_header_offset)
|
||
table_count = unpack_from("!H", buf, table_header_offset+0x04)[0]
|
||
header_length = 0x0C + table_count * 0x10
|
||
print("\tHeaderlänge: %s Byte" % header_length)
|
||
|
||
table_length = 0
|
||
for j in range(table_count):
|
||
length = unpack_from("!L", buf, table_header_offset+0x0C+0x0C+j*0x10)[0]
|
||
table_length += ceil4(length)
|
||
|
||
total_length = header_length + table_length
|
||
new_buf = bytearray(total_length)
|
||
header = unpack_from(header_length*"c", buf, table_header_offset)
|
||
pack_into(header_length*"c", new_buf, 0, *header)
|
||
current_offset = header_length
|
||
|
||
for j in range(table_count):
|
||
offset = unpack_from("!L", buf, table_header_offset+0x0C+0x08+j*0x10)[0]
|
||
length = unpack_from("!L", buf, table_header_offset+0x0C+0x0C+j*0x10)[0]
|
||
pack_into("!L", new_buf, 0x0C+0x08+j*0x10, current_offset)
|
||
current_table = unpack_from(length*"c", buf, offset)
|
||
pack_into(length*"c", new_buf, current_offset, *current_table)
|
||
|
||
#table_checksum = sum(unpack_from("!"+("L"*length), new_buf, current_offset))
|
||
#pack_into("!L", new_buf, 0x0C+0x04+j*0x10, table_checksum)
|
||
|
||
current_offset += ceil4(length)
|
||
|
||
out_file = open("%s%d.ttf"%(filename, i), "wb")
|
||
out_file.write(new_buf)
|