v.0.4.3 fonts_check jetzt über kompletten Fonts

This commit is contained in:
tiijay
2025-10-24 17:33:03 +02:00
parent 37d5276537
commit 3c30018893
3 changed files with 74 additions and 40 deletions

View File

@@ -84,17 +84,64 @@ def shift_letter_right(char, letter, debug=False) -> bool:
return shifted return shifted
def align_font(font): def align_font(font, debug=False):
chars = [char for char in font] chars = [char for char in font]
print(chars) print(chars)
# Print the dictionary # Print the dictionary
print('font_pretty = {') print('font_pretty = {')
for char in sorted(font.keys()): for char in sorted(font.keys()):
shifted = shift_letter_right(char=char, letter=font[char]) shifted = shift_letter_right(char=char, letter=font[char], debug=debug)
hex_values = [f'0x{val:02X}' for val in shifted] hex_values = [f'0x{val:02X}' for val in shifted]
print(f"\t'{char}': [{', '.join(hex_values)}],") print(f"\t'{char}': [{', '.join(hex_values)}],")
print('}') print('}')
# return f'#keys: {len(list(font.keys()))}' # return f'#keys: {len(list(font.keys()))}'
return f'#keys: {len(font)}' return f'#keys: {len(font)}'
def screen_text(text: str, font, screen_height: int, screen_width: int):
"""Text für einen Screen anpassen,
Anzahl der Zeichen je Zeile begrenzen,
ebenso wird die Höhe des Screen brücksichtigt
Args:
text (str): Text der ausgegeben werden soll
font: Berechnungen für den Font
height (int): Pixel
width (int): Pixel
"""
def text_per_row(txt):
pixs = 0
visible_text = ''
for a in txt:
pixs += char_width(font[a]) + 1
if pixs > screen_width:
# Zeilenende erreicht
break
visible_text += a
return visible_text
f_height: int = font_height(font)
# Ganzzahl Division
max_visible_rows = screen_height // f_height
print(f'rows_visible: {max_visible_rows}')
text_left = text
scn_txt = []
for _ in range(max_visible_rows):
visible_text = text_per_row(text_left)
visible_text_len = len(visible_text)
text_left = text_left[visible_text_len:]
scn_txt.append(visible_text)
if not text_left:
break
scr_txt_dict = {'visible': scn_txt, 'invisible': text_left}
return scr_txt_dict

View File

@@ -68,21 +68,14 @@ class NeoPixel_64x64(NeoPixel):
self.write() self.write()
def clear_row(self, row: int, effect: bool = False) -> None: def clear_row(self, row: int, effect: bool = False) -> None:
""" """löscht eine Zeile im Display entsprechend des eingestellten Fonts
Clear one row of the display (turn off all pixels)\n Args:
PRESUMING: font_5x7\n row (int): in Pixel start bei 0 !!!
rows: range(0,3) [row-height: 8 pixels, row-length: MATRIX_WIDTH(64)]\n effect (bool, optional): zeilenweise bzw. pixelweise löschen. Defaults to False.
\n
row-0: 0 - 511 (Pixel 0 bis Pixel 8 * MATRIX_WIDTH(64)-1)\n
row-1: 512 - 1023\n
row-2: 1024 - 1535\n
row-3: 1536 - 2047\n
etc. ...
""" """
start = row * self.MATRIX_WIDTH
start = row * 8 * self.MATRIX_WIDTH ende = start + self.font_height * self.MATRIX_WIDTH - 1
ende = start + 8 * self.MATRIX_WIDTH - 1
print(f'clear row: {row} --> pixels {start} to {ende}') print(f'clear row: {row} --> pixels {start} to {ende}')
for i in range(start, ende): for i in range(start, ende):

View File

@@ -1,41 +1,35 @@
from app.display.fonts.fonts_utils import align_font, font_height from app.display.fonts.fonts_utils import align_font, font_height, char_width, screen_text
from app.display.neopixel_64x64 import NeoPixel_64x64
import app.utils as utils import app.utils as utils
from app.utils import colors
def font_pretty(font): def font_pretty(font):
pretty_font = align_font(font) pretty_font = align_font(font, debug=False)
print(pretty_font) print(pretty_font)
def fonts_check(display, font, pretty=False) -> None: def fonts_check(display: NeoPixel_64x64, font, pretty=False) -> None:
display.clear() display.clear()
display.set_font(font) display.set_font(font)
height = font_height(font) height = font_height(font)
alphabet: str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' alphanum: str = ''.join(sorted(font.keys()))
char_line_1 = alphabet[:11]
char_line_2 = alphabet[11:22]
char_line_3 = alphabet[21:]
num_line = '0123456789'
row = 0 text_left = alphanum
incr = height while text_left:
display.write_text(num_line, 0, row) # Text entsprechend des Display splitten
row += incr scr_txt_dict = screen_text(text=text_left, screen_width=display.MATRIX_WIDTH, screen_height=display.MATRIX_HEIGHT, font=font)
display.write_text(char_line_1.upper(), 0, row, utils.colors.YELLOW) print(f'scr_txt: {scr_txt_dict}')
# row += incr
# display.write_text(char_line_2.upper(), 0, row, colors.YELLOW) display.clear()
# row += incr for idx, row_text in enumerate(scr_txt_dict['visible']):
# display.write_text(char_line_3.upper(), 0, row, colors.YELLOW) ypos = height * idx
row += incr # display.clear_row(ypos)
display.write_text(char_line_1.lower(), 0, row, utils.colors.YELLOW) display.write_text(row_text, 0, ypos, colors.RAINBOW[idx])
# row += incr
# display.write_text(char_line_2.lower(), 0, row, colors.YELLOW) text_left = scr_txt_dict['invisible']
# row += incr
# display.write_text(char_line_3.lower(), 0, row, colors.YELLOW)
row += incr
display.write_text('!.,:;\'"-_+=*/\\()~°•', 0, row, utils.colors.ORANGE)
if pretty: if pretty:
font_pretty(font) font_pretty(font)