diff options
Diffstat (limited to 'src/displayapp/fonts/generate.py')
-rw-r--r-- | src/displayapp/fonts/generate.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/displayapp/fonts/generate.py b/src/displayapp/fonts/generate.py new file mode 100644 index 00000000..fea0123b --- /dev/null +++ b/src/displayapp/fonts/generate.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +import io +import sys +import json +import typing +import os.path +import argparse +import subprocess + +class FontArg(object): + def __init__(self, d): + self.font = d['font'] + self.range = d.get('range') + self.symbols = d.get('symbols') + + +def gen_lvconv_line(dest: str, size: int, bpp: int, fonts: typing.List[FontArg], compress:bool=False): + args = ['lv_font_conv', '--size', str(size), '--output', dest, '--bpp', str(bpp), '--format', 'lvgl'] + if not compress: + args.append('--no-compress') + for font in fonts: + args.extend(['--font', font.font]) + if font.range: + args.extend(['--range', font.range]) + if font.symbols: + args.extend(['--symbols', font.symbols]) + + return args + +def main(): + ap = argparse.ArgumentParser(description='auto generate lvGL font files from fonts') + ap.add_argument('config', type=str, help='config file to use') + ap.add_argument('-e', '--enable', type=str, action='append', help='optional feature to enable in font generation', default=[], metavar='features', dest='features') + ap.add_argument('-f', '--font', type=str, action='append', help='Choose specific fonts to generate (default: all)', default=[]) + args = ap.parse_args() + + if not os.path.exists(args.config): + sys.exit(f'Error: the config file {args.config} does not exist.') + if not os.access(args.config, os.R_OK): + sys.exit(f'Error: the config file {args.config} is not accessable (permissions?).') + with open(args.config, 'r') as fd: + data = json.load(fd) + + for enabled_feature in args.features: + if enabled_feature not in data['features']: + sys.exit(f'Error: the requested feature {enabled_feature} does not exist in {args.config}.') + + for (name,font) in data['fonts'].items(): + if args.font and name not in args.font: + continue + sources = font.pop('sources') + if 'patches' in font: + patches = font.pop('patches') + else: + patches = None + for enabled_feature in args.features: + if name in data['features'][enabled_feature]: + sources.extend(data['features'][enabled_feature][name]) + font['fonts'] = [FontArg(thing) for thing in sources] + line = gen_lvconv_line(f'{name}.c', **font) + subprocess.check_call(line) + if patches: + for patch in patches: + subprocess.check_call(patch) + + + +if __name__ == '__main__': + main() |