mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
155 lines
3.9 KiB
Python
155 lines
3.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
import bise
|
|
import datasize
|
|
import partitions
|
|
import quantize
|
|
import sys
|
|
|
|
|
|
def safe_head(lst, default):
|
|
try:
|
|
return lst[0]
|
|
except:
|
|
return default
|
|
|
|
|
|
def compute_dimensions(array):
|
|
if isinstance(array, list):
|
|
yield len(array)
|
|
yield from compute_dimensions(array[-1])
|
|
|
|
|
|
def pretty_array(element, fmt):
|
|
if isinstance(element, int):
|
|
return fmt % element
|
|
elif isinstance(element, tuple) or isinstance(element, list):
|
|
return pretty_array(iter(element), fmt)
|
|
else:
|
|
first = next(element)
|
|
|
|
out = "{"
|
|
out += pretty_array(first, fmt)
|
|
for x in element:
|
|
out += ","
|
|
out += pretty_array(x, fmt)
|
|
out += "}"
|
|
return out
|
|
|
|
|
|
def pretty_dimensions(dimensions):
|
|
out = ""
|
|
for dimension in dimensions:
|
|
out += "[" + str(dimension) + "]"
|
|
return out
|
|
|
|
header_template = """#ifndef {guard}
|
|
#define {guard}
|
|
|
|
{content}
|
|
|
|
#endif
|
|
"""
|
|
|
|
array_template = "const {type} {name}{dimensions} = {array};"
|
|
|
|
|
|
def build_header(guard, content):
|
|
return header_template.format(guard=guard, content=content)
|
|
|
|
|
|
def build_array(type, name, array):
|
|
return array_template.format(
|
|
name=name,
|
|
type=type,
|
|
dimensions=pretty_dimensions(compute_dimensions(array)),
|
|
array=pretty_array(array, "%d"),
|
|
)
|
|
|
|
|
|
def print_bise_tables(file):
|
|
trits_from_integer = bise.trits_from_integer_table()
|
|
integer_from_trits = bise.integer_from_trits_table(trits_from_integer)
|
|
quints_from_integer = bise.quints_from_integer_table()
|
|
integer_from_quints = bise.integer_from_quints_table(quints_from_integer)
|
|
|
|
file.write(build_header(
|
|
"ASTC_TABLES_INTEGER_SEQUENCE_ENCODING_H_",
|
|
build_array("uint8_t", "integer_from_trits", integer_from_trits) +
|
|
'\n' +
|
|
build_array("uint8_t", "integer_from_quints", integer_from_quints)
|
|
))
|
|
|
|
|
|
def print_partitions_tables(file):
|
|
table = list(partitions.compute_partitioning_table(
|
|
partition_count=2,
|
|
block_width=4,
|
|
block_height=4))
|
|
lookup_table = partitions.compute_partitioning_lookup_table(table)
|
|
|
|
file.write(build_header(
|
|
"ASTC_TABLES_PARTITIONS_H_",
|
|
build_array(
|
|
"uint16_t",
|
|
"partition_2_4x4_mask_table",
|
|
[part.partition_mask for part in table]
|
|
) + '\n' +
|
|
build_array(
|
|
"int16_t",
|
|
"partition_2_4x4_lookup_table",
|
|
[safe_head(parts, -1) for parts in lookup_table]
|
|
)
|
|
))
|
|
|
|
|
|
def print_data_size_table(file, block_width, block_height):
|
|
table = datasize.color_endpoint_range_table(block_width, block_height)
|
|
file.write(build_header(
|
|
"ASTC_TABLES_DATA_SIZE_H_",
|
|
build_array("int8_t", "color_endpoint_range_table", table)
|
|
))
|
|
|
|
|
|
def print_color_quantization_tables(file):
|
|
unquantize_table = quantize.color_unquantize_table()
|
|
quantize_table = quantize.color_quantize_table(unquantize_table)
|
|
|
|
file.write(build_header(
|
|
"ASTC_TABLES_COLOR_QUANTIZATION_H_",
|
|
build_array("uint8_t", "color_unquantize_table", unquantize_table) +
|
|
'\n' +
|
|
build_array("uint8_t", "color_quantize_table", quantize_table)
|
|
))
|
|
|
|
|
|
def print_usage(prog):
|
|
sys.stderr.write(
|
|
("Usage: %s COMMAND\n"
|
|
" Commands:\n"
|
|
" bise\n"
|
|
" partitions\n"
|
|
" datasize\n"
|
|
" quantize\n") % prog)
|
|
|
|
|
|
def main(kind, path):
|
|
file = open(path, 'w') if path != '-' else sys.stdout
|
|
if kind == "bise":
|
|
print_bise_tables(file)
|
|
elif kind == "partitions":
|
|
print_partitions_tables(file)
|
|
elif kind == "datasize":
|
|
print_data_size_table(file, 4, 4)
|
|
elif kind == "quantize":
|
|
print_color_quantization_tables(file)
|
|
else:
|
|
sys.stderr.write("Error: unknown mode {}\n".format(kind))
|
|
sys.exit(1)
|
|
|
|
|
|
if len(sys.argv) != 3:
|
|
print_usage(sys.argv[0])
|
|
else:
|
|
main(sys.argv[1], sys.argv[2])
|