55 lines
1.5 KiB
Python
Executable File
55 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import itertools
|
|
import os
|
|
import struct
|
|
|
|
from PIL import Image
|
|
|
|
def rgb2h(r, g, b):
|
|
return (r >> 3) << 11 | (g >> 2) << 5 | (b >> 3)
|
|
|
|
def bytes_line(bs):
|
|
return ' ' + ' '.join(map(lambda i: f'{i:#x},', bs)) + '\n'
|
|
|
|
imgs = ['bg.png', 'moon.png', 'star.png', 'sleep.png']
|
|
for fname in imgs:
|
|
alpha = []
|
|
with Image.open(os.path.join('assets/', fname)) as img:
|
|
w = img.width
|
|
h = img.height
|
|
|
|
if img.has_transparency_data:
|
|
has_alpha = True
|
|
data = [rgb2h(r, g, b) for r, g, b, _ in img.getdata()]
|
|
alpha = [a for _, _, _, a in img.getdata()]
|
|
else:
|
|
data = [rgb2h(r, g, b) for r, g, b in img.getdata()]
|
|
|
|
basename = os.path.splitext(fname)[0]
|
|
with open(os.path.join('main/img/', basename + '.c'), 'w') as f:
|
|
f.write(
|
|
'#include <inttypes.h>\n\n'
|
|
'#include "lvgl.h"\n\n'
|
|
'static const uint8_t _data[] = {\n')
|
|
|
|
for group in itertools.batched(data, 10):
|
|
bs = bytearray()
|
|
for c in group:
|
|
bs += struct.pack('<H', c)
|
|
|
|
f.write(bytes_line(bs))
|
|
for group in itertools.batched(alpha, 20):
|
|
f.write(bytes_line(group))
|
|
|
|
f.write('};\n\n')
|
|
|
|
f.write(
|
|
f'const lv_image_dsc_t ui_img_{basename} = {{\n'
|
|
' .header.magic = LV_IMAGE_HEADER_MAGIC,\n'
|
|
f' .header.cf = LV_COLOR_FORMAT_RGB565{"A8" if alpha else ""},\n'
|
|
f' .header.w = {w},\n'
|
|
f' .header.h = {h},\n'
|
|
' .data_size = sizeof(_data),\n'
|
|
' .data = _data,\n'
|
|
'};\n')
|