109 lines
2.6 KiB
Python
109 lines
2.6 KiB
Python
from .math_utils import show_byte_matrix
|
|
|
|
|
|
def text_width(text: str, font: dict[str, list[int]]) -> int:
|
|
text_width_overall: int = sum([char_width(font[char]) for char in text])
|
|
|
|
return text_width_overall + len(text) - 1
|
|
|
|
|
|
def char_width(char_matrix) -> int:
|
|
"""Berechnung der Bits für die Zeichenbreite
|
|
|
|
Args:
|
|
char_matrix (int): Zeichen als Array[int]
|
|
|
|
Returns:
|
|
int: Anzahl Bits für die Zeichenbreite
|
|
"""
|
|
max_val = max(char_matrix)
|
|
|
|
val = max_val
|
|
cw = 0
|
|
while 0xFFFFFFFF & val:
|
|
"""rechts shiften, bis alles Nullen da sind"""
|
|
val >>= 1
|
|
cw += 1
|
|
|
|
return cw
|
|
|
|
|
|
def shift_letter_right(char, letter, debug=False) -> bool:
|
|
"""Prüfe ob das Zeichen auch komplett nach rechts gezogen ist
|
|
|
|
Args:
|
|
letter (_type_): Array[0..nBytes]
|
|
|
|
Returns:
|
|
bool: _description_
|
|
"""
|
|
|
|
def isLetterRight(letter):
|
|
def isByteRight(byte):
|
|
return True if 1 & byte == 1 else False
|
|
|
|
for byte in letter:
|
|
if isByteRight(byte):
|
|
return True
|
|
|
|
return False
|
|
|
|
def shiftLetterRight(letter):
|
|
def shift(letter):
|
|
return [byte >> 1 for byte in letter]
|
|
|
|
shifted = letter
|
|
for i in range(8): # max 1 Bit's
|
|
shifted = shift(shifted)
|
|
if isLetterRight(shifted):
|
|
break
|
|
|
|
return shifted
|
|
|
|
if isLetterRight(letter):
|
|
return letter
|
|
|
|
# letter is not right shifted
|
|
shifted = shiftLetterRight(letter)
|
|
|
|
if debug:
|
|
print("origin:")
|
|
show_byte_matrix(char, letter)
|
|
print("shifted")
|
|
show_byte_matrix(char, shifted)
|
|
|
|
return shifted
|
|
|
|
|
|
def align_font(font, debug=False):
|
|
chars = [char for char in font]
|
|
print(chars)
|
|
|
|
# Print the dictionary
|
|
print("font_pretty = {")
|
|
for char in sorted(font.keys()):
|
|
shifted = shift_letter_right(char=char, letter=font[char], debug=debug)
|
|
hex_values = [f"0x{val:02X}" for val in shifted]
|
|
print(f"\t'{char}': [{', '.join(hex_values)}],")
|
|
print("}")
|
|
|
|
# return f'#keys: {len(list(font.keys()))}'
|
|
return f"#keys: {len(font)}"
|
|
|
|
|
|
def find_first_mismatch(str1: str, str2: str) -> int:
|
|
"""
|
|
Compare two strings of equal length and return the position of first mismatch.
|
|
|
|
Args:
|
|
str1 (str): First string
|
|
str2 (str): Second string (same length as str1)
|
|
|
|
Returns:
|
|
int: Position of first mismatch, or -1 if strings are identical
|
|
"""
|
|
for i in range(len(str1)):
|
|
if str1[i] != str2[i]:
|
|
return i
|
|
return -1
|