You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

117 lines
2.7 KiB

#!/usr/bin/env python3
#
# (c) Copyright 2018 by Coinkite Inc. This file is part of Coldcard <coldcardwallet.com>
# and is covered by GPLv3 license found in COPYING.
#
import os, sys, pdb
from PIL import Image, ImageOps
import zlib
def read_text(fname):
w = 0
rows = []
Z = b'\0'
F = b'\xff'
# do not trim whitespace; perhaps it is spacing data
for ln in open(fname, 'rt').readlines():
ln = ln.rstrip('\n')
r = b''.join(F if i != ' ' else Z for i in ln)
w = max(w, len(r))
rows.append(r)
assert 1 <= w < 220, w
raw = b''
for r in rows:
r += Z*(w - len(r))
raw += r
return Image.frombytes('L', (w, len(rows)), raw).convert('1')
def read_img(fn):
img = Image.open(fn)
w,h = img.size
assert 1 <= w < 220, w
img = img.convert('L')
# fix colour issues: assume minority colour is white (1)
histo = img.histogram()
assert len(histo) == 256, repr(histo)
assert len(set(histo)) == 3, "Too many colours: "+repr(histo)
# if histo[-1] > histo[0]:
img = ImageOps.invert(img)
return img.convert('1', dither=False)
def compress(n, wbits=-9):
z = zlib.compressobj(wbits=wbits)
rv = z.compress(n)
rv += z.flush(zlib.Z_FINISH)
return rv
def crunch(n):
# try them all... not finding any difference tho.
a = [(wb,compress(n, wb)) for wb in range(-9, -15, -1)]
a.sort(key=lambda i: (-len(i[1]), -i[0]))
#print(' / '.join("%d => %d" % (wb,len(d)) for wb,d in a))
return a[0]
def doit(outfname, fnames):
assert fnames, "need some files"
fp = open(outfname, 'wt')
fp.write("""\
# SPDX-FileCopyrightText: 2020 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2018 Coinkite, Inc. <coldcardwallet.com>
# SPDX-License-Identifier: GPL-3.0-only
#
# autogenerated; don't edit
#
class Graphics:
# (w,h, w_bytes, wbits, data)
""")
for fn in fnames:
if fn.endswith('.txt'):
img = read_text(fn)
else:
img = read_img(fn)
assert img.mode == '1'
#img.show()
varname = fn.split('.')[0].replace('-', '_')
w,h = img.size
raw = img.tobytes()
wbits, comp = crunch(raw)
if 0:
# is compression better?
is_comp = len(comp)+8 < len(raw)
else:
# disable; taking too much runtime memory
is_comp = False
print(" %s = (%d, %d, %d, %s, %r)\n" % (varname, w, h, ((w+7)//8),
wbits if is_comp else 0, raw if not is_comp else comp), file=fp)
print("done: '%s' (%d x %d)" % (varname, w, h))
fp.write("\n# EOF\n")
if 1:
doit('graphics.py', sys.argv[1:])