First Commit
This commit is contained in:
149
libraries/ssd1306/tools/modules/fontgenerator.py
Normal file
149
libraries/ssd1306/tools/modules/fontgenerator.py
Normal file
@@ -0,0 +1,149 @@
|
||||
# -*- 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("};")
|
||||
|
||||
Reference in New Issue
Block a user