You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.5 KiB
Python

# -*- coding: utf-8 -*-
"""Utility to convert FontEdit files to GLCD format."""
from os import path
import sys
def process_file(font_width, font_height, input_file, output_file):
with open(input_file, 'r') as infile, open(output_file, 'w') as outfile:
for line in infile:
line = line.strip()
# Case 1: Comment Line
if line.startswith('//'):
outfile.write(line + '\n')
# Case 2: Blank Line
elif not line:
continue
# Case 3: Variable Definition
elif line.startswith('const'):
continue
# Case 4: Variable Closing
elif line.startswith('};'):
continue
# Case 5: Hex Value Lines
else:
parts = line.split('//')
hex_values = parts[0].split(',')
comment = '//' + parts[1] if len(parts) > 1 else ''
converted_values = convert_hex_value(
[val.strip() for val in hex_values if val.strip()],
font_width,
font_height)
outfile.write(', '.join(converted_values) + ', ' +
comment + '\n')
def hex_to_matrix(hex_values, font_width, font_height):
# Strip '0x' prefix and filter out invalid hex values
hex_values = [hv[2:] for hv in hex_values if hv.startswith('0x') and
all(c in '0123456789ABCDEFabcdef' for c in hv[2:])]
# Calculate the number of hex values per row
values_per_row = font_width // 8 + (1 if font_width % 8 != 0 else 0)
# Group hex values into rows based on values_per_row
rows = [hex_values[i:i + values_per_row] for i in range(
0, len(hex_values), values_per_row)]
# Verify the number of rows matches the expected font_height
if len(rows) != font_height:
raise ValueError(f"Expected {font_height} rows, but found {len(rows)}")
# Convert grouped hex values to binary rows
binary_matrix = []
for row in rows:
binary_row = ''
for hv in row:
# Reverse the order of bits in each byte
binary_byte = format(int(hv, 16), '08b')[::-1]
binary_row += binary_byte
binary_matrix.append(binary_row[:font_width])
return binary_matrix
def pad_matrix(matrix, font_width, font_height):
# Calculate the required height to make it divisible by 8
required_height = ((font_height + 7) // 8) * 8
# Pad the matrix with rows of zeros if needed
while len(matrix) < required_height:
binary_row = '0' * font_width
matrix.append(list(binary_row)) # Append a list of zeros
return matrix
def convert_hex_value(hex_values, font_width, font_height):
# Convert hex values to a binary matrix
matrix = hex_to_matrix(hex_values, font_width, font_height)
"""
for row in matrix:
print(' '.join(row))
print("---------------")
"""
# Pad matrix along bottom to be divisible by 8
matrix = pad_matrix(matrix, font_width, font_height)
"""
for row in matrix:
print(' '.join(row))
"""
return matrix_transposed_to_hex_values(matrix, font_width, font_height)
def matrix_transposed_to_hex_values(matrix, font_width, font_height):
hex_values = []
# Convert and prepend the width of the character
width_hex = '0x' + format(font_width, '02X')
hex_values.append(width_hex)
for col in range(font_width):
for row in range(0, font_height, 8):
# Extract a group of 8 pixels
pixel_group = [matrix[r][col] for r in range(row, row + 8)]
# Convert to binary string in little endian format
binary_str = ''.join(pixel_group[::-1])
# Convert binary string to hex value
hex_value = '0x' + format(int(binary_str, 2), '02X')
hex_values.append(hex_value)
return hex_values
if __name__ == '__main__':
args = sys.argv
if len(args) != 4:
error('Please specify font width, height & input file: ./fontedit2glcd.py 24 42 myfont.c')
width = int(args[1])
height = int(args[2])
in_path = args[3]
if not (1 <= width <= 254):
error("Width is not between 1 and 254.")
if not (1 <= height <= 254):
error("Height is not between 1 and 254.")
if not path.exists(in_path):
error('File Not Found: ' + in_path)
filename, ext = path.splitext(in_path)
out_path = filename + "_converted" + ext
process_file(width, height, in_path, out_path)