1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

move the bdf_font_converter to the lv_utils repo

This commit is contained in:
Gabor Kiss-Vamosi 2018-10-15 12:44:17 +02:00
parent a482132652
commit c6d8f8ee28

View File

@ -1,201 +0,0 @@
#!/user/bin/env python
'''
Small utility that converts 1bpp BDF fonts to a font compatible with littlevgl
'''
# General imports
import argparse
import math
class Glyph:
def __init__(self, props ):
for k, v in props.items():
setattr(self, k, v)
def __lt__(self, other):
return self.encoding < other.encoding
def get_width(self):
return self.dwidth[0]
def get_byte_width(self):
# Compute how many bytes wide the glyph will be
return math.ceil(self.dwidth[0] / 8.0)
def get_height(self):
return len(self.bitmap)
def get_encoding(self):
return self.encoding
def write_bitmap(self, f):
f.write('''/*Unicode: U+%04x ( %s ) , Width: %d */\n''' %
(self.encoding, self.name, self.dwidth[0]) )
for line in self.bitmap:
for i in range(0, len(line), 2):
f.write("0x%s," % line[i:i+2])
if(i > 0):
f.write(" ")
f.write("\n")
f.write("\n\n")
def parse_bdf(fn):
# Converts bdf file to a list of Glyphs
# Read in BDF File
with open(fn, "r") as f:
bdf = f.readlines()
bdf = [x.rstrip("\n") for x in bdf]
# Iterate through BDF Glyphs
glyphs = []
i = -1
while i < len(bdf):
props = {}
i += 1
tokens = bdf[i].split(' ')
if tokens[0] == 'ENDFONT':
break;
if tokens[0] != "STARTCHAR":
continue
props['name'] = tokens[1]
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "ENCODING":
continue
encoding = int(tokens[-1])
if encoding < 0: # skip glyphs with a negative encoding value
continue
props['encoding'] = encoding
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "SWIDTH":
continue
props['swidth'] = (int(tokens[1]), int(tokens[2]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "DWIDTH":
continue
props['dwidth'] = (int(tokens[1]), int(tokens[2]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "BBX":
continue
props['dwidth'] = (int(tokens[1]), int(tokens[2]),
int(tokens[3]), int(tokens[4]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "BITMAP":
continue
props['bitmap'] = []
while True:
i += 1
tokens = bdf[i].split(' ')
if tokens[0] == 'ENDCHAR':
break
props['bitmap'].append(tokens[0])
glyphs.append(Glyph(props))
return glyphs
def parse_args():
''' Parse CLI arguments into an object and a dictionary '''
parser = argparse.ArgumentParser()
parser.add_argument('bdf_fn', type=str, default='imgs',
help='BDF Filename')
parser.add_argument('font_name', type=str, default='font_name',
help='Name of the font to be generated')
args = parser.parse_args()
dargs = vars(args)
return (args, dargs)
def main():
args, dargs = parse_args()
glyphs = parse_bdf(args.bdf_fn)
glyphs.sort() # Sorts by encoding (utf8) value
################
# WRITE HEADER #
################
out = open(args.font_name + '.c', "w")
out.write('''
#include "../lv_misc/lv_font.h"
''')
#################
# WRITE BITMAPS #
#################
out.write(
'''
static const uint8_t %s_glyph_bitmap[] =
{
''' % args.font_name)
for glyph in glyphs:
glyph.write_bitmap(out)
out.write('''
};
''')
######################
# WRITE DESCRIPTIONS #
######################
out.write(
'''
/*Store the glyph descriptions*/
static const lv_font_glyph_dsc_t %s_glyph_dsc[] =
{
''' % args.font_name)
glyph_index = 0
for glyph in glyphs:
out.write('''
{.w_px = %d, .glyph_index = %d}, /*Unicode: U+%04x ( )*/
''' % (glyph.get_width(), glyph_index, glyph.get_encoding()) )
glyph_index += glyph.get_byte_width() * glyph.get_height()
out.write('''
};
''')
#####################
# WRITE FONT STRUCT #
#####################
out.write(
'''
lv_font_t %s =
{
.unicode_first = %d, /*First Unicode letter in this font*/
.unicode_last = %d, /*Last Unicode letter in this font*/
.h_px = %d, /*Font height in pixels*/
.glyph_bitmap = %s_glyph_bitmap, /*Bitmap of glyphs*/
.glyph_dsc = %s_glyph_dsc, /*Description of glyphs*/
.glyph_cnt = %d, /*Number of glyphs in the font*/
.unicode_list = NULL, /*Every character in the font from 'unicode_first' to 'unicode_last'*/
.get_bitmap = lv_font_get_bitmap_continuous, /*Function pointer to get glyph's bitmap*/
.get_width = lv_font_get_width_continuous, /*Function pointer to get glyph's width*/
.bpp = 1, /*Bit per pixel*/
.monospace = 0, /*Fix width (0: if not used)*/
.next_page = NULL, /*Pointer to a font extension*/
};
''' % (args.font_name,
glyphs[0].get_encoding(),
glyphs[-1].get_encoding(),
glyphs[0].get_height(),
args.font_name,
args.font_name,
len(glyphs),
) )
out.close()
if __name__=='__main__':
main()