def generate(height, codepoints, font_file_path, output_file_name, packed, code, smoke): font = Font(font_file_path, height) if smoke: glyphs = [chr(x) for x in codepoints] f = sys.stdout.buffer if output_file_name is not None: f = open(output_file_name, 'wt') for cur_glyph in glyphs: ch = font.render_character(cur_glyph) f.write(cur_glyph + '\n') f.write(repr(ch)) f.write('\n\n') f.close() return ili9341_t3_font = OrderedDict() ili9341_t3_font['index'] = 0 ili9341_t3_font['unicode'] = 0 ili9341_t3_font['data'] = 0 ili9341_t3_font['version'] = 1 ili9341_t3_font['reserved'] = 0 ili9341_t3_font['index1_first'] = (len(codepoints) & 0xff00) >> 8 ili9341_t3_font['index1_last'] = len(codepoints) & 0xff ili9341_t3_font['index2_first'] = 0 ili9341_t3_font['index2_last'] = 0 ili9341_t3_font['bits_index'] = 0 ili9341_t3_font['bits_width'] = 0 ili9341_t3_font['bits_height'] = 0 ili9341_t3_font['bits_xoffset'] = 0 ili9341_t3_font['bits_yoffset'] = 0 ili9341_t3_font['bits_delta'] = 0 ili9341_t3_font['line_space'] = font.height e_cap = font.glyph_for_character('E') ili9341_t3_font['cap_height'] = e_cap.height - e_cap.descent max_width = 1 max_height = 1 max_xoffset = 1 max_yoffset = 1 max_delta = 1 glyph_data = dict() for codepoint in codepoints: cur_glyph = chr(codepoint) glyph_header = build_glyph(cur_glyph, font, glyph_data) max_width = max(max_width, glyph_header['width']) max_height = max(max_height, glyph_header['height']) max_xoffset = max(abs(max_xoffset), abs(glyph_header['xoffset'])) max_yoffset = max(abs(max_yoffset), abs(glyph_header['yoffset'])) max_delta = max(max_delta, glyph_header['delta']) ili9341_t3_font['bits_width'] = int(math.floor(math.log(max_width, 2))) + 1 ili9341_t3_font['bits_height'] = int(math.floor(math.log(max_height, 2))) + 1 ili9341_t3_font['bits_xoffset'] = int(math.floor(math.log(max_xoffset, 2))) + 2 ili9341_t3_font['bits_yoffset'] = int(math.floor(math.log(max_yoffset, 2))) + 2 ili9341_t3_font['bits_delta'] = int(math.floor(math.log(max_delta, 2))) + 1 output_data = bytearray() index = list() total_size = 0 for codepoint in codepoints: ch = chr(codepoint) index.append(total_size) glyph = glyph_data[ch] glyph_bytes = pack_glyph(glyph, ili9341_t3_font) output_data.extend(glyph_bytes) total_size += len(glyph_bytes) ili9341_t3_font['bits_index'] = int(math.floor(math.log(total_size, 2))) + 1 index_bits = BitString() for idx in index: index_bits.append(Bits(uint=idx, length=ili9341_t3_font['bits_index'])) codepoint_table = BitString() for codepoint in codepoints: codepoint_table.append(Bits(uint=codepoint, length=21)) if packed: f = sys.stdout.buffer if output_file_name is not None: f = open(output_file_name, 'wb') f.write(struct.pack('<3I14Bxx', *tuple(ili9341_t3_font.values()))) index_bits.tofile(f) codepoint_table.tofile(f) f.write(output_data) f.close() if code: f = sys.stdout.buffer if output_file_name is not None: f = open(output_file_name, 'wb') variable_name = os.path.splitext(os.path.basename(font_file_path))[0] + '_' + str(height) c = io.StringIO() c.write('// extern const ILI9341_t3_font_t {};\n\n'.format(variable_name)) c.write('static const unsigned char {}_data[] = {{\n'.format(variable_name)) data_byte_array = ['0x' + binascii.hexlify(bytes([x])).decode() for x in output_data] for i in range(0, len(data_byte_array), 10): c.write(','.join(data_byte_array[i:i + 10]) + ',\n') c.write('};\n') c.write('/* font data size: {} bytes */\n\n'.format(len(data_byte_array))) c.write('static const unsigned char {}_index[] = {{\n'.format(variable_name)) index_byte_array = ['0x' + binascii.hexlify(bytes([x])).decode() for x in index_bits.tobytes()] for i in range(0, len(index_byte_array), 10): c.write(','.join(index_byte_array[i:i + 10]) + ',\n') c.write('};\n') c.write('/* font index size: {} bytes */\n\n'.format(len(index_byte_array))) c.write('static const unsigned char {}_codepoints[] = {{\n'.format(variable_name)) codepoint_byte_array = ['0x' + binascii.hexlify(bytes([x])).decode() for x in codepoint_table.tobytes()] for i in range(0, len(codepoint_byte_array), 10): c.write(','.join(codepoint_byte_array[i:i + 10]) + ',\n') c.write('};\n') c.write('/* Unicode codepoint table size: {} bytes */\n\n'.format(len(codepoint_byte_array))) c.write('const ILI9341_t3_font_t {} = {{\n'.format(variable_name)) c.write(' {}_index,\n'.format(variable_name)) c.write(' {}_codepoints,\n'.format(variable_name)) c.write(' {}_data,\n'.format(variable_name)) c.write(' {},\n'.format(ili9341_t3_font['version'])) c.write(' {},\n'.format(ili9341_t3_font['reserved'])) c.write(' {},\n'.format(ili9341_t3_font['index1_first'])) c.write(' {},\n'.format(ili9341_t3_font['index1_last'])) c.write(' {},\n'.format(ili9341_t3_font['index2_first'])) c.write(' {},\n'.format(ili9341_t3_font['index2_last'])) c.write(' {},\n'.format(ili9341_t3_font['bits_index'])) c.write(' {},\n'.format(ili9341_t3_font['bits_width'])) c.write(' {},\n'.format(ili9341_t3_font['bits_height'])) c.write(' {},\n'.format(ili9341_t3_font['bits_xoffset'])) c.write(' {},\n'.format(ili9341_t3_font['bits_yoffset'])) c.write(' {},\n'.format(ili9341_t3_font['bits_delta'])) c.write(' {},\n'.format(ili9341_t3_font['line_space'])) c.write(' {}\n'.format(ili9341_t3_font['cap_height'])) c.write('};\n') f.write(c.getvalue().encode('ascii'))