121 lines
3.9 KiB
Python
121 lines
3.9 KiB
Python
import freetype
|
|
import os
|
|
|
|
FONT_FILE = "/Users/jeremygan/Desktop/python_dev/epaper2/websocket_server/GB2312.ttf"
|
|
OUTPUT_FILE = "../static_font_data.py"
|
|
FONT_SIZE = 16
|
|
|
|
# Fixed strings from the project
|
|
FIXED_STRINGS = [
|
|
"语音识别",
|
|
"松开停止",
|
|
"说完了吗?",
|
|
"未识别到文字",
|
|
"短按确认",
|
|
"长按重录",
|
|
"AI 生成中",
|
|
"正在思考...",
|
|
"优化提示词中",
|
|
"正在绘画...",
|
|
"AI作画中",
|
|
"生成完成!",
|
|
"生成失败",
|
|
"提示词:",
|
|
"返回录音",
|
|
"重试",
|
|
"长按返回",
|
|
"连接服务器...",
|
|
"服务器连接失败",
|
|
"离线模式",
|
|
"量迹AI贴纸生成",
|
|
"正在启动...",
|
|
"WiFi连接中...",
|
|
"WiFi连接成功!",
|
|
"WiFi连接失败",
|
|
"请重试"
|
|
]
|
|
|
|
def generate_static_font():
|
|
# Extract unique characters
|
|
chars = set()
|
|
for s in FIXED_STRINGS:
|
|
for c in s:
|
|
if ord(c) > 127: # Only non-ASCII
|
|
chars.add(c)
|
|
|
|
sorted_chars = sorted(list(chars))
|
|
print(f"Generating font data for {len(sorted_chars)} characters: {''.join(sorted_chars)}")
|
|
|
|
try:
|
|
face = freetype.Face(FONT_FILE)
|
|
except Exception as e:
|
|
print(f"Error loading font: {e}")
|
|
return
|
|
|
|
face.set_pixel_sizes(FONT_SIZE, FONT_SIZE)
|
|
|
|
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
|
|
f.write("# Static font data generated for specific characters\n")
|
|
f.write("import ubinascii\n\n")
|
|
f.write("FONTS = {\n")
|
|
|
|
for char in sorted_chars:
|
|
face.load_char(char, freetype.FT_LOAD_RENDER | freetype.FT_LOAD_TARGET_MONO)
|
|
bitmap = face.glyph.bitmap
|
|
|
|
# Create 32 bytes buffer (16x16 / 8)
|
|
# Similar logic to generate_font.py but simplified for single char
|
|
char_buffer = bytearray(32)
|
|
|
|
glyph_width = bitmap.width
|
|
glyph_rows = bitmap.rows
|
|
|
|
# Center the glyph
|
|
x_off = (FONT_SIZE - glyph_width) // 2
|
|
y_off = (FONT_SIZE - glyph_rows) // 2
|
|
|
|
# Adjust y_off based on baseline if needed, but let's stick to centering for consistency
|
|
# Usually for 16px font, baseline is around 12-13.
|
|
# bitmap_top is distance from baseline to top.
|
|
# We want to position it such that baseline is consistent.
|
|
# But let's use the simple centering logic from generate_font.py for now
|
|
# as it seems to be what was used before.
|
|
|
|
src_buf = bitmap.buffer
|
|
|
|
for row in range(glyph_rows):
|
|
dst_row = row + y_off
|
|
if dst_row < 0 or dst_row >= FONT_SIZE:
|
|
continue
|
|
|
|
for col in range(glyph_width):
|
|
dst_col = col + x_off
|
|
if dst_col < 0 or dst_col >= FONT_SIZE:
|
|
continue
|
|
|
|
# Extract bit from source
|
|
byte_idx = row * bitmap.pitch + (col >> 3)
|
|
bit_idx = 7 - (col & 7)
|
|
if byte_idx < len(src_buf):
|
|
pixel = (src_buf[byte_idx] >> bit_idx) & 1
|
|
|
|
if pixel:
|
|
# Set bit in destination
|
|
dst_byte_idx = dst_row * 2 + (dst_col >> 3)
|
|
dst_bit_idx = 7 - (dst_col & 7)
|
|
char_buffer[dst_byte_idx] |= (1 << dst_bit_idx)
|
|
|
|
# Write to file
|
|
hex_str = "".join([f"\\x{b:02x}" for b in char_buffer])
|
|
# Use ubinascii.unhexlify in generated code to save space?
|
|
# Or just bytes literal.
|
|
# bytes literal is fine.
|
|
f.write(f" {ord(char)}: b'{hex_str}', # {char}\n")
|
|
|
|
f.write("}\n")
|
|
|
|
print(f"Generated {OUTPUT_FILE}")
|
|
|
|
if __name__ == "__main__":
|
|
generate_static_font()
|