summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thompson <daniel@redfelineninja.org.uk>2020-11-08 14:29:10 (GMT)
committerDaniel Thompson <daniel@redfelineninja.org.uk>2020-11-08 14:29:10 (GMT)
commit67d2ed83d292f01860b9f51122c3ccb2b1c7ee5b (patch)
treeebb278ee870a16d3d8aaff00389c90151eef1c64
parent06f1ed36b0996ccf48daff3e4bf2a55f308128d7 (diff)
tools: rle_encode: Add support for rendering 2-bit RLEs to C src
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
-rwxr-xr-xtools/rle_encode.py70
1 files changed, 40 insertions, 30 deletions
diff --git a/tools/rle_encode.py b/tools/rle_encode.py
index 6dccbd7..ed75342 100755
--- a/tools/rle_encode.py
+++ b/tools/rle_encode.py
@@ -268,21 +268,52 @@ def encode_8bit(im):
return (im.width, im.height, bytes(rle))
-def render_c(image, fname):
- print(f'// 1-bit RLE, generated from {fname}, {len(image[2])} bytes')
- print(f'static const uint8_t {varname(fname)}[] = {{')
- print(' ', end='')
+def render_c(image, fname, indent, depth):
+ extra_indent = ' ' * indent
+ if len(image) == 3:
+ print(f'{extra_indent}// {depth}-bit RLE, generated from {fname}, '
+ f'{len(image[2])} bytes')
+ (x, y, pixels) = image
+ else:
+ print(f'{extra_indent}// {depth}-bit RLE, generated from {fname}, '
+ f'{len(image)} bytes')
+ pixels = image
+
+ print(f'{extra_indent}static const uint8_t {varname(fname)}[] = {{')
+ print(f'{extra_indent} ', end='')
i = 0
- for rl in image[2]:
+ for rl in pixels:
print(f' {hex(rl)},', end='')
i += 1
if i == 12:
- print('\n ', end='')
+ print(f'\n{extra_indent} ', end='')
i = 0
-
print('\n};')
+def render_py(image, fname, indent, depth):
+ extra_indent = ' ' * indent
+ if len(image) == 3:
+ print(f'{extra_indent}# {depth}-bit RLE, generated from {fname}, '
+ f'{len(image[2])} bytes')
+ (x, y, pixels) = image
+ print(f'{extra_indent}{varname(fname)} = (')
+ print(f'{extra_indent} {x}, {y},')
+ else:
+ print(f'{extra_indent}# {depth}-bit RLE, generated from {fname}, '
+ f'{len(image)} bytes')
+ pixels = image[3:]
+ print(f'{extra_indent}{varname(fname)} = (')
+ print(f'{extra_indent} {image[0:1]}')
+ print(f'{extra_indent} {image[1:3]}')
+
+ # Split the bytestring to ensure each line is short enough to
+ # be absorbed on the target if needed.
+ for i in range(0, len(pixels), 16):
+ print(f'{extra_indent} {pixels[i:i+16]}')
+ print(f'{extra_indent})')
+
+
def decode_to_ascii(image):
(sx, sy, rle) = image
data = bytearray(2*sx)
@@ -310,8 +341,6 @@ def decode_to_ascii(image):
# Check the image is the correct length
assert(dp == 0)
-
-
parser = argparse.ArgumentParser(description='RLE encoder tool.')
parser.add_argument('files', nargs='+',
help='files to be encoded')
@@ -327,7 +356,6 @@ parser.add_argument('--8bit', action='store_true', dest='eightbit',
help='Generate 8-bit image')
args = parser.parse_args()
-extra_indent = ' ' * args.indent
if args.eightbit:
encoder = encode_8bit
depth = 8
@@ -342,27 +370,9 @@ for fname in args.files:
image = encoder(Image.open(fname))
if args.c:
- render_c(image, fname)
+ render_c(image, fname, args.indent, depth)
else:
- if len(image) == 3:
- print(f'{extra_indent}# {depth}-bit RLE, generated from {fname}, '
- f'{len(image[2])} bytes')
- (x, y, pixels) = image
- print(f'{extra_indent}{varname(fname)} = (')
- print(f'{extra_indent} {x}, {y},')
- else:
- print(f'{extra_indent}# {depth}-bit RLE, generated from {fname}, '
- f'{len(image)} bytes')
- pixels = image[3:]
- print(f'{extra_indent}{varname(fname)} = (')
- print(f'{extra_indent} {image[0:1]}')
- print(f'{extra_indent} {image[1:3]}')
-
- # Split the bytestring to ensure each line is short enough to
- # be absorbed on the target if needed.
- for i in range(0, len(pixels), 16):
- print(f'{extra_indent} {pixels[i:i+16]}')
- print(f'{extra_indent})')
+ render_py(image, fname, args.indent, depth)
if args.ascii:
print()