
Create a minimal python port of the node.js module `lv_img_conv`. Only the currently in use color formats `CF_INDEXED_1_BIT` and `CF_TRUE_COLOR_ALPHA` are implemented. Output only as binary with format `ARGB8565_RBSWAP`. This is enough to create the `resources-1.13.0.zip`. Python3 implements "propper" "banker's rounding" by rounding to the nearest even number. Javascript rounds to the nearest integer. To have the same output as the original JavaScript implementation add a custom rounding function, which does "school" rounding (to the nearest integer) Update CMake file in `resources` folder to call `lv_img_conf.py` instead of node module. For docker-files install `python3-pil` package for `lv_img_conv.py` script. And remove the `lv_img_conv` node installation. --- gen_img: special handling for python lv_img_conv script Not needed on Linux systems, as the shebang of the python script is read and used. But just to be sure use the python interpreter found by CMake. Also helps if tried to run on Windows host. --- doc: buildAndProgram: remove node script lv_img_conv mention Remove node script `lv_img_conv` mention and replace it for runtime-depency `python3-pil` of python script `lv_img_conv.py`.
60 lines
2.3 KiB
Python
Executable File
60 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import io
|
|
import sys
|
|
import json
|
|
import shutil
|
|
import typing
|
|
import os.path
|
|
import argparse
|
|
import subprocess
|
|
|
|
def gen_lvconv_line(lv_img_conv: str, dest: str, color_format: str, output_format: str, binary_format: str, sources: str):
|
|
args = [lv_img_conv, sources, '--force', '--output-file', dest, '--color-format', color_format, '--output-format', output_format, '--binary-format', binary_format]
|
|
if lv_img_conv.endswith(".py"):
|
|
# lv_img_conv is a python script, call with current python executable
|
|
args = [sys.executable] + args
|
|
|
|
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('-i', '--image', type=str, action='append', help='Choose specific images to generate (default: all)', default=[])
|
|
ap.add_argument('--lv-img-conv', type=str, help='Path to "lv_img_conf" executable', default="lv_img_conv")
|
|
args = ap.parse_args()
|
|
|
|
if not shutil.which(args.lv_img_conv):
|
|
sys.exit(f"Missing lv_img_conv. Make sure it's findable (in PATH) or specify it manually")
|
|
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 accessible (permissions?).')
|
|
with open(args.config, 'r') as fd:
|
|
data = json.load(fd)
|
|
|
|
images_to_run = set(data.keys())
|
|
|
|
if args.image:
|
|
enabled_images = set()
|
|
for image in args.image:
|
|
enabled_images.add(image[:-2] if image.endswith('.c') else image)
|
|
d = enabled_images.difference(images_to_run)
|
|
if d:
|
|
print(f'Warning: requested image{"s" if len(d)>1 else ""} missing: {" ".join(d)}')
|
|
images_to_run = images_to_run.intersection(enabled_images)
|
|
|
|
for name in images_to_run:
|
|
image = data[name]
|
|
if not os.path.exists(image['sources']):
|
|
image['sources'] = os.path.join(os.path.dirname(sys.argv[0]), image['sources'])
|
|
extension = 'bin'
|
|
image.pop('target_path')
|
|
line = gen_lvconv_line(args.lv_img_conv, f'{name}.{extension}', **image)
|
|
subprocess.check_call(line)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|