Files
Arduino_Projects/libraries/ssd1306/tools/modules/fontgenerator.py
MindCreeper03 e490df1715 First Commit
2025-02-27 19:31:50 +01:00

150 lines
6.8 KiB
Python

# -*- coding: UTF-8 -*-
# MIT License
#
# Copyright (c) 2018-2020, Alexey Dynda
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
###################################################################################
# Fixing pip
# curl https://bootstrap.pypa.io/get-pip.py | python2
# sudo pip install freetype-py
#
# Get fonts
# wget https://ftp.gnu.org/gnu/freefont/freefont-ttf-20120503.zip
from __future__ import print_function
import sys
class Generator:
source = None
def __init__(self, source):
self.source = source
def generate_fixed_old(self):
self.source.expand_chars()
print("extern const uint8_t {0}[] PROGMEM;".format(self.source.name))
print("const uint8_t {0}[] PROGMEM =".format(self.source.name))
print("{")
print("#ifdef CONFIG_SSD1306_UNICODE_ENABLE")
print("// type|width|height|first char")
print(" 0x%02X, 0x%02X, 0x%02X, 0x%02X," % (1, self.source.width, self.source.height, self.source.first_char))
print("// unicode(2B)|count")
print(" 0x%02X, 0x%02X, 0x%02X, // unicode record" % \
((self.source.first_char >> 8) & 0xFF, self.source.first_char & 0xFF, \
len(self.source.get_group_chars()) & 0xFF))
print("#else")
print("// type|width|height|first char")
print(" 0x%02X, 0x%02X, 0x%02X, 0x%02X," % (0, self.source.width, self.source.height, self.source.first_char))
print("#endif")
char_code = self.source.first_char
for char in self.source.get_group_chars():
print(" ", end='')
for row in range(self.source.rows()):
for x in range(self.source.width):
data = 0
for i in range(8):
y = row * 8 + i
if y >= self.source.height:
break
data |= (self.source.charBitmap(char)[y][x] << i)
print("0x%02X," % data, end=' ')
if sys.version_info < (3, 0):
print("// char '%s' (0x%04X/%d)" % (char.encode("utf-8"), char_code, char_code))
else:
print("// char '%s' (0x%04X/%d)" % (char, char_code, char_code))
char_code = char_code + 1
print("#ifdef CONFIG_SSD1306_UNICODE_ENABLE")
print(" 0x00, 0x00, 0x00, // end of unicode tables")
print("#endif")
print("};")
def generate_new_format(self):
total_size = 4
self.source.expand_chars_top()
print("extern const uint8_t %s[] PROGMEM;" % ("free_" + self.source.name))
print("const uint8_t %s[] PROGMEM =" % ("free_" + self.source.name))
print("{")
print("// type|width|height|first char")
print(" 0x%02X, 0x%02X, 0x%02X, 0x%02X," % (2, self.source.width, self.source.height, 0x00))
for group in range(self.source.groups_count()):
chars = self.source.get_group_chars(group)
total_size += 3
if sys.version_info < (3, 0):
print("// GROUP first '%s' total %d chars" % (chars[0].encode("utf-8"), len(chars)))
else:
chars = list(chars)
print("// GROUP first '%s' total %d chars" % (chars[0], len(chars)))
print("// unicode(LSB,MSB)|count")
print(" 0x%02X, 0x%02X, 0x%02X, // unicode record" % \
((ord(chars[0]) >> 8) & 0xFF, ord(chars[0]) & 0xFF, len(chars) & 0xFF))
# jump table
offset = 0
heights = []
sizes = []
for char in chars:
bitmap = self.source.charBitmap(char)
print(" ", end = '')
width = len(bitmap[0])
height = len(bitmap)
while (height > 0) and (sum(bitmap[height -1]) == 0):
height -= 1
heights.append( height )
size = int((height + 7) / 8) * width
sizes.append( size )
total_size += 4
print("0x%02X, 0x%02X, 0x%02X, 0x%02X," % (offset >> 8, offset & 0xFF, width, height), end = '')
if sys.version_info < (3, 0):
print("// char '%s' (0x%04X/%d)" % (char.encode("utf-8"), ord(char), ord(char)))
else:
print("// char '%s' (0x%04X/%d)" % (char, ord(char), ord(char)))
offset += size
total_size += 2
print(" 0x%02X, 0x%02X," % (offset >> 8, offset & 0xFF))
# char data
for index in range(len(chars)):
char = chars[index]
bitmap = self.source.charBitmap(char)
print (" ", end='')
size = 0
for row in range(int((heights[index] + 7) / 8)):
for x in range(len(bitmap[0])):
data = 0
for i in range(8):
y = row * 8 + i
if y >= len(bitmap):
break
data |= (self.source.charBitmap(char)[y][x] << i)
total_size += 1
size += 1
print("0x%02X," % data, end=' ')
if sys.version_info < (3, 0):
print("// char '%s' (0x%04X/%d)" % (char.encode("utf-8"), ord(char), ord(char)))
else:
print("// char '%s' (0x%04X/%d)" % (char, ord(char), ord(char)))
if size != sizes[index]:
print("ERROR!!!!")
exit(1)
total_size += 3
print(" 0x00, 0x00, 0x00, // end of unicode tables")
print(" // FONT REQUIRES %d BYTES" % (total_size))
print("};")