wasp: draw565: Automatic RLE format conversion

From here we can also bring colour to the launcher!
This commit is contained in:
Daniel Thompson 2020-04-10 20:22:51 +01:00
parent 906c313e49
commit 22ca8886c2
7 changed files with 139 additions and 67 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 B

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 820 B

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -66,7 +66,7 @@ class LauncherApp():
if not app:
return
draw.set_color(0xffff)
draw.rleblit(app.ICON, (x+13, y+12))
draw.blit(app.ICON, x+13, y+12)
draw.set_color(0xbdb6)
draw.string(app.NAME, x, y+120-30, 120)

View File

@ -11,42 +11,8 @@ class TestApp():
NAME = 'Self Test'
ICON = icons.app
# 2-bit RLE, generated from res/app_icon.png, 457 bytes
RLE_2BIT = (
96, 64,
b'\x1e@md<d<d;f?X\xec2\xf0/'
b'\xf2-\xf4,\xc3.\xc3,\xc3.\xc3,\xc3.\xc3,'
b'\xc3.\xc3,\xc3.\xc3,\xc3\x0c\x80\xfc\x83\x10\xc0]'
b'\xc3\x0c@\xffC,C\n\x87\x0c\xc7\nC,C\t'
b'\x83\x02\x84\n\xc4\x02\xc3\tC,C\x08\x82\x07\x82\x08'
b'\xc2\x07\xc2\x08C,C\x07\x82\t\x82\x06\xc2\t\xc2\x07'
b'C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x06'
b'\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x05\x82\x0c\x82\x04'
b'\xc2\x0c\xc2\x05C,C\x05\x82\x0c\x82\x04\xc2\x0c\xc2\x05'
b'C,C\x05\x83\x0b\x82\x04\xc2\x0b\xc3\x05C,C\x06'
b'\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x06\x82\x0b\x82\x04'
b'\xc2\x0b\xc1\x07C,C\x07\x82\n\x82\x04\xc2\n\xc2\x07'
b'C+D\x08\x82\t\x82\x04\xc2\t\xc2\x08C*E\t'
b'\x8c\x04\xcc\tC*E\n\x8b\x04\xcb\nC*E.'
b'C*E.C*E.C*E.C*E\n'
b'\x80\xe9\x8b\x04\xc0o\xcb\nC+D\t\x8c\x04\xcc\t'
b'C,C\x08\x82\t\x82\x04\xc2\t\xc2\x08C,C\x07'
b'\x82\n\x82\x04\xc2\n\xc2\x07C,C\x06\x82\x0b\x82\x04'
b'\xc2\x0b\xc1\x07C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06'
b'C,C\x05\x83\x0b\x82\x04\xc2\x0b\xc3\x05C,C\x05'
b'\x82\x0c\x82\x04\xc2\x0c\xc2\x05C,C\x05\x82\x0c\x82\x04'
b'\xc2\x0c\xc2\x05C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06'
b'C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x07'
b'\x82\t\x82\x06\xc2\t\xc2\x07C,C\x08\x82\x07\x82\x08'
b'\xc2\x07\xc2\x08C,C\t\x83\x02\x84\n\xc4\x02\xc3\t'
b'C,C\n\x86\x0e\xc6\nC,C\x0c\x83\x10\xc3\x0c'
b'C,C.C,C.C,C.C,C.'
b'C,C.C,t-r/p2l?X@'
b'mf;d<d<d\x1e'
)
def __init__(self):
self.tests = ('Touch', 'String', 'Button', 'Crash', '1-bit RLE', '2-bit RLE')
self.tests = ('Touch', 'String', 'Button', 'Crash', 'RLE')
self.test = self.tests[0]
self.scroll = wasp.widgets.ScrollIndicator()
@ -90,32 +56,17 @@ class TestApp():
event[1], event[2]), 0, 108, width=240)
elif self.test == 'String':
self.benchmark_string()
elif self.test == '1-bit RLE':
self.benchmark_rle_1bit()
elif self.test == '2-bit RLE':
self.benchmark_rle_2bit()
elif self.test == 'RLE':
self.benchmark_rle()
def benchmark_rle_1bit(self):
def benchmark_rle(self):
draw = wasp.watch.drawable
draw.fill(0, 0, 30, 240, 240-30)
self.scroll.draw()
t = machine.Timer(id=1, period=8000000)
t.start()
for i in range(0, 128, 16):
draw.rleblit(self.ICON, (i, 30 + i))
elapsed = t.time()
t.stop()
del t
draw.string('{}s'.format(elapsed / 1000000), 12, 24+192)
def benchmark_rle_2bit(self):
draw = wasp.watch.drawable
draw.fill(0, 0, 30, 240, 240-30)
self.scroll.draw()
t = machine.Timer(id=1, period=8000000)
t.start()
for i in range(0, 128, 16):
draw.rle2bit(self.RLE_2BIT, i, 30 + i)
draw.blit(self.ICON, i+16, i+32)
elapsed = t.time()
t.stop()
del t
@ -149,9 +100,7 @@ class TestApp():
if self.test == 'Crash':
draw.string("Press button to", 12, 24+24)
draw.string("throw exception.", 12, 24+48)
elif self.test == '1-bit RLE':
draw.rleblit(self.ICON, (120-48, 120-32))
elif self.test == '2-bit RLE':
draw.rle2bit(self.RLE_2BIT, 120-48, 120-32)
elif self.test == 'RLE':
draw.blit(self.ICON, 120-48, 120-32)
wasp.watch.display.mute(False)

View File

@ -105,6 +105,15 @@ class Draw565(object):
bg = self._bgfg >> 16
self._display.fill(bg, x, y, w, h)
@micropython.native
def blit(self, image, x, y):
if len(image) == 3:
# Legacy 1-bit image
self.rleblit(image, (x, y))
else: #elif image[0] == 2:
# 2-bit RLE image, (255x255, v1)
self._rle2bit(image, x, y)
@micropython.native
def rleblit(self, image, pos=(0, 0), fg=0xffff, bg=0):
"""Decode and draw a 1-bit RLE image."""
@ -135,14 +144,20 @@ class Draw565(object):
color = bg
@micropython.native
def rle2bit(self, image, x, y):
def _rle2bit(self, image, x, y):
"""Decode and draw a 2-bit RLE image."""
display = self._display
quick_write = display.quick_write
(sx, sy, rle) = image
sx = image[1]
sy = image[2]
rle = memoryview(image)[3:]
display.set_window(x, y, sx, sy)
if sx <= (len(display.linebuffer) / 2) and not bool(sy & 1):
sx *= 2
sy /= 2
palette = array.array('H', (0, 0xfffe, 0x7bef, 0xffff))
next_color = 1
rl = 0

View File

@ -4,17 +4,125 @@
# 1-bit RLE, generated from res/battery.png, 189 bytes
battery = (36, 48, b'\x97\x0e\x14\x12\x11\x14\x10\x14\x0c\x08\x0c\x08\x08\x08\x0c\x08\x08\x08\x0c\x08\x08\x08\x0c\x08\x08\x04\x14\x04\x08\x04\x14\x04\x08\x04\x0c\x04\x04\x04\x08\x04\x0b\x05\x04\x04\x08\x04\n\x06\x04\x04\x08\x04\t\x07\x04\x04\x08\x04\x08\x07\x05\x04\x08\x04\x07\x07\x06\x04\x08\x04\x06\x07\x07\x04\x08\x04\x05\x07\x08\x04\x08\x04\x04\x0e\x02\x04\x08\x04\x03\x0f\x02\x04\x08\x04\x02\x10\x02\x04\x08\x04\x02\x10\x02\x04\x08\x04\x02\x0f\x03\x04\x08\x04\x02\x0e\x04\x04\x08\x04\x08\x07\x05\x04\x08\x04\x07\x07\x06\x04\x08\x04\x06\x07\x07\x04\x08\x04\x05\x07\x08\x04\x08\x04\x04\x07\t\x04\x08\x04\x04\x06\n\x04\x08\x04\x04\x05\x0b\x04\x08\x04\x04\x04\x0c\x04\x08\x04\x14\x04\x08\x04\x14\x04\x08\x04\x14\x04\x08\x04\x14\x04\x08\x1c\x08\x1c\x08\x1c\x08\x1c\x98')
# 1-bit RLE, generated from res/app_icon.png, 441 bytes
app = (96, 64, b'\x1e$<$<$;&\x97,20/2-4,\x03.\x03,\x03.\x03,\x03.\x03,\x03.\x03,\x03.\x03,\x03\x0c\x03\x10\x03\x0c\x03,\x03\n\x07\x0c\x07\n\x03,\x03\t\x03\x02\x04\n\x04\x02\x03\t\x03,\x03\x08\x02\x07\x02\x08\x02\x07\x02\x08\x03,\x03\x07\x02\t\x02\x06\x02\t\x02\x07\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x05\x02\x0c\x02\x04\x02\x0c\x02\x05\x03,\x03\x05\x02\x0c\x02\x04\x02\x0c\x02\x05\x03,\x03\x05\x03\x0b\x02\x04\x02\x0b\x03\x05\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x01\x07\x03,\x03\x07\x02\n\x02\x04\x02\n\x02\x07\x03+\x04\x08\x02\t\x02\x04\x02\t\x02\x08\x03*\x05\t\x0c\x04\x0c\t\x03*\x05\n\x0b\x04\x0b\n\x03*\x05.\x03*\x05.\x03*\x05.\x03*\x05.\x03*\x05\n\x0b\x04\x0b\n\x03+\x04\t\x0c\x04\x0c\t\x03,\x03\x08\x02\t\x02\x04\x02\t\x02\x08\x03,\x03\x07\x02\n\x02\x04\x02\n\x02\x07\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x01\x07\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x05\x03\x0b\x02\x04\x02\x0b\x03\x05\x03,\x03\x05\x02\x0c\x02\x04\x02\x0c\x02\x05\x03,\x03\x05\x02\x0c\x02\x04\x02\x0c\x02\x05\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x06\x02\x0b\x02\x04\x02\x0b\x02\x06\x03,\x03\x07\x02\t\x02\x06\x02\t\x02\x07\x03,\x03\x08\x02\x07\x02\x08\x02\x07\x02\x08\x03,\x03\t\x03\x02\x04\n\x04\x02\x03\t\x03,\x03\n\x06\x0e\x06\n\x03,\x03\x0c\x03\x10\x03\x0c\x03,\x03.\x03,\x03.\x03,\x03.\x03,\x03.\x03,\x03.\x03,4-2/02,\x97&;$<$<$\x1e')
# 2-bit RLE, generated from res/app_icon.png, 460 bytes
app = (
b'\x02'
b'`@'
b'\x1e@md<d<d;f?X\xec2\xf0/'
b'\xf2-\xf4,\xc3.\xc3,\xc3.\xc3,\xc3.\xc3,'
b'\xc3.\xc3,\xc3.\xc3,\xc3\x0c\x80\xfc\x83\x10\xc0]'
b'\xc3\x0c@\xffC,C\n\x87\x0c\xc7\nC,C\t'
b'\x83\x02\x84\n\xc4\x02\xc3\tC,C\x08\x82\x07\x82\x08'
b'\xc2\x07\xc2\x08C,C\x07\x82\t\x82\x06\xc2\t\xc2\x07'
b'C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x06'
b'\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x05\x82\x0c\x82\x04'
b'\xc2\x0c\xc2\x05C,C\x05\x82\x0c\x82\x04\xc2\x0c\xc2\x05'
b'C,C\x05\x83\x0b\x82\x04\xc2\x0b\xc3\x05C,C\x06'
b'\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x06\x82\x0b\x82\x04'
b'\xc2\x0b\xc1\x07C,C\x07\x82\n\x82\x04\xc2\n\xc2\x07'
b'C+D\x08\x82\t\x82\x04\xc2\t\xc2\x08C*E\t'
b'\x8c\x04\xcc\tC*E\n\x8b\x04\xcb\nC*E.'
b'C*E.C*E.C*E.C*E\n'
b'\x80\xe9\x8b\x04\xc0o\xcb\nC+D\t\x8c\x04\xcc\t'
b'C,C\x08\x82\t\x82\x04\xc2\t\xc2\x08C,C\x07'
b'\x82\n\x82\x04\xc2\n\xc2\x07C,C\x06\x82\x0b\x82\x04'
b'\xc2\x0b\xc1\x07C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06'
b'C,C\x05\x83\x0b\x82\x04\xc2\x0b\xc3\x05C,C\x05'
b'\x82\x0c\x82\x04\xc2\x0c\xc2\x05C,C\x05\x82\x0c\x82\x04'
b'\xc2\x0c\xc2\x05C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06'
b'C,C\x06\x82\x0b\x82\x04\xc2\x0b\xc2\x06C,C\x07'
b'\x82\t\x82\x06\xc2\t\xc2\x07C,C\x08\x82\x07\x82\x08'
b'\xc2\x07\xc2\x08C,C\t\x83\x02\x84\n\xc4\x02\xc3\t'
b'C,C\n\x86\x0e\xc6\nC,C\x0c\x83\x10\xc3\x0c'
b'C,C.C,C.C,C.C,C.'
b'C,C.C,t-r/p2l?X@'
b'mf;d<d<d\x1e'
)
# 1-bit RLE, generated from res/clock_icon.png, 301 bytes
clock = (96, 64, b'\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xcd\x06\r\x06!\x05\x0b\x08\x0c\x08\x0b\n\x1d\t\x07\x0c\n\x08\n\x0c\x1b\x0b\x06\x0e\x08\x03\x02\x03\n\x04\x05\x04\x1a\x04\x03\x04\x06\x02\x08\x04\r\x03\t\x04\x07\x03\x19\x04\x05\x04\x10\x04\x0c\x03\t\x03\t\x02\x19\x03\x07\x03\x11\x03\x0c\x03\t\x03\t\x03\n\x04\t\x04\x07\x04\x10\x03\x0c\x03\t\x03\t\x03\n\x04\t\x03\t\x03\x10\x03\x0c\x03\t\x03\t\x03\n\x04\t\x03\t\x03\x10\x03\x0c\x03\t\x04\x07\x04\n\x04\t\x03\t\x03\x0f\x04\x0c\x03\n\x04\x05\x05\n\x04\t\x03\x03\x02\x04\x03\x0e\x04\r\x03\n\n\x01\x03\x17\x03\x02\x04\x03\x03\r\x05\r\x03\x0b\t\x01\x03\x17\x03\x02\x03\x04\x03\x0c\x05\x0e\x03\r\x05\x03\x03\x17\x03\t\x03\x0b\x05\x0f\x03\x15\x03\x17\x03\t\x03\n\x05\x10\x03\x14\x04\x17\x03\t\x03\t\x05\x11\x03\x14\x03\x18\x04\x07\x04\x08\x04\x13\x03\x14\x03\x19\x03\x07\x03\x08\x04\x14\x03\x13\x04\x0b\x04\n\x03\x06\x04\x07\x04\x15\x03\x0b\x01\x05\x05\x0c\x04\x0b\x04\x03\x04\x07\x03\x12\r\x06\n\r\x04\x0b\x0b\x06\x0f\x07\r\x06\t\x0e\x04\x0c\t\x07\x0f\x07\r\x07\x06\x10\x04\x0e\x05\t\x0f\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xaa')
# 2-bit RLE, generated from res/clock_icon.png, 288 bytes
clock = (
b'\x02'
b'`@'
b'?\xff\xff\xff\xff\xff\xff\x8e@\xb6F\r\xc6!E\x0b'
b'\xc8\x0cH\x0b\xca\x1dI\x07\xcc\nH\n\xcc\x1bK\x06'
b'\xce\x08C\x02C\n\xc4\x05\xc4\x1aD\x03D\x06\xc2\x08'
b'\xc4\rC\t\xc4\x07\xc3\x19D\x05D\x10\xc4\x0cC\t'
b'\xc3\t\xc2\x19C\x07C\x11\xc3\x0cC\t\xc3\t\xc3\n'
b'D\tD\x07D\x10\xc3\x0cC\t\xc3\t\xc3\nD\t'
b'C\tC\x10\xc3\x0cC\t\xc3\t\xc3\nD\tC\t'
b'C\x10\xc3\x0cC\t\xc4\x07\xc4\nD\tC\tC\x0f'
b'\xc4\x0cC\n\xc4\x05\xc5\nD\tC\tC\x0e\xc4\r'
b'C\n\xca\x01\xc3\x17C\tC\r\xc5\rC\x0b\xc9\x01'
b'\xc3\x17C\tC\x0c\xc5\x0eC\r\xc5\x03\xc3\x17C\t'
b'C\x0b\xc5\x0fC\x15\xc3\x17C\tC\n\xc5\x10C\x14'
b'\xc4\x17C\tC\t\xc5\x11C\x14\xc3\x18D\x07D\x08'
b'\xc4\x13C\x14\xc3\x19C\x07C\x08\xc4\x14C\x13\xc4\x0b'
b'D\nC\x06D\x07\xc4\x15C\x0b\xc1\x05\xc5\x0cD\x0b'
b'D\x03D\x07\xc3\x12M\x06\xca\rD\x0bK\x06\xcf\x07'
b'M\x06\xc9\x0eD\x0cI\x07\xcf\x07M\x07\xc6\x10D\x0e'
b'E\t\xcf?\xff\xff\xff\xff\xff\xff\xff\xffk'
)
# 1-bit RLE, generated from res/torch_icon.png, 283 bytes
torch = (96, 64, b'\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00e\x06W\nT\x04\x06\x02S\x03\x07\x02S\x02\n\x01\x0b\x029\x05\x08\x02\t\x02\x08\x03:\x07\x06\x02\x0b\x01\x06\x02$(\n\x02\x03\x03%(\x0c\x01+\x02%\x01\x0b\x02+\x02%\x01\x0c\x01+\x02\x05\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x05\x01\x0b\x02+\x02\x04\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x04\x01\x0c\x01+\x02%\x01\x0b\x02\x03\n\x1e\x02\x05\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x05\x01\x0c\x01+\x02\x04\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x04\x01\x0b\x02+\x02%\x01\x0c\x01+\x02%\x01\x0b\x02+(\x0c\x01,(\n\x02\x03\x03L\x02\x0b\x01\x06\x02K\x02\t\x02\x08\x03H\x02\n\x01\x0b\x02G\x03\x07\x02U\x04\x06\x02V\nY\x06\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xe2')
# 2-bit RLE, generated from res/settings_icon.png, 472 bytes
settings = (
b'\x02'
b'`@'
b'\x1e@md<d<d;f?X\xec2\xf0/'
b'\xf2-\xf4,\xc3.\xc3,\xc3.\xc3,\xc3.\xc3,'
b'\xc3\x14\x80\xb7\x86\x14\xc3,\xc3\x13\x88\x13\xc3,\xc3\x13'
b'\x88\x13\xc3,\xc3\x12\x83\x04\x83\x12\xc3,\xc3\n\x84\x04'
b'\x83\x04\x83\x04\x84\n\xc3,\xc3\t\x86\x01\x85\x04\x85\x01'
b'\x86\t\xc3,\xc3\x08\x8c\x05\x8d\x08\xc3,\xc3\x07\x84\x02'
b'\x86\x08\x86\x02\x84\x07\xc3,\xc3\x07\x83\x05\x81\x0e\x81\x05'
b'\x83\x07\xc3,\xc3\x07\x83\x1a\x83\x07\xc3,\xc3\x07\x84\x18'
b'\x84\x07\xc3,\xc3\x08\x83\n\xc0o\xc4\n\x83\x08@\xff'
b'C,C\t\x83\x06\xca\x06\x83\tC,C\x08\x83\x06'
b'\xcc\x06\x83\x08C,C\x08\x83\x05\xc4\x06\xc4\x05\x83\x08'
b'C+D\x06\x85\x04\xc4\x08\xc4\x04\x85\x06C*E\x04'
b'\x86\x05\xc3\n\xc3\x05\x86\x04C*E\x03\x87\x05\xc2\x0c'
b'\xc2\x05\x87\x03C*E\x03\x83\x08\xc3\x0c\xc3\x08\x83\x03'
b'C*E\x03\x83\x08\xc3\x0c\xc3\x08\x83\x03C*E\x03'
b'\x83\x08\xc3\x0c\xc3\x08\x83\x03C*E\x03\x83\x08\xc3\x0c'
b'\xc3\x08\x83\x03C*E\x03\x86\x06\xc2\x0c\xc2\x05\x87\x03'
b'C+D\x04\x86\x05\xc3\n\xc3\x05\x86\x04C,C\x05'
b'\x86\x04\xc4\x08\xc4\x04\x85\x06C,C\x08\x83\x05\xc4\x06'
b'\xc4\x05\x83\x08C,C\x08\x83\x06\xcc\x06\x83\x08C,'
b'C\t\x83\x06\xca\x06\x83\tC,C\x08\x83\n\xc4\n'
b'\x83\x08C,C\x07\x84\x18\x84\x07C,C\x07\x83\x1a'
b'\x83\x07C,C\x07\x83\x05\x81\x0e\x81\x05\x83\x07C,'
b'C\x07\x84\x03\x85\x08\x86\x02\x84\x07C,C\x08\x8d\x04'
b'\x8d\x08C,C\t\x86\x01\x85\x04\x85\x01\x86\tC,'
b'C\n\x84\x04\x83\x04\x83\x04\x84\nC,C\x12\x83\x04'
b'\x83\x12C,C\x13\x88\x13C,C\x13\x88\x13C,'
b'C\x14\x86\x14C,C.C,C.C,C.'
b'C,t-r/p2l?X\x80m\xa6;\xa4'
b'<\xa4<\xa4\x1e'
)
# 2-bit RLE, generated from res/torch_icon.png, 247 bytes
torch = (
b'\x02'
b'`@'
b'?\xff\xff\xff\xff\xff\xff\xff&\xc6\x0c@\xfdB?\n'
b'\xca\tD?\x08\xc4\x06\xc2\x07F?\x07\xc3\x07\xc2\x06'
b'H?\x06\xc2\n\xc1\x04G\xc2A8\xc5\x08\xc2\t\xc2'
b'\x02F\xc3C7\xc7\x06\xc2\x0b\xc1F\xc2F\x1e\xe8\n'
b'\xc2C\xc3H\x1d\xe8\x0c\xc1N\x1d\xc2%\xc1\x0b\xc2N'
b'\x1d\xc2%\xc1\x0c\xc1N\x1d\xc2\x04\x80m\x9d\x04\xc1\x0b'
b'\xc2N\x1d\xc2\x06\x81\x03\x81\x03\x81\x03\x81\x03\x81\x03\x81'
b'\x03\x81\x06\xc1\x0c\xc1N\x1d\xc2\x04\x9d\x04\xc1\x0b\xc2C'
b'\xcaA\x1d\xc2\x06\x81\x03\x81\x03\x81\x03\x81\x03\x81\x03\x81'
b'\x03\x81\x06\xc1\x0c\xc1N\x1d\xc2\x04\x9d\x04\xc1\x0b\xc2N'
b'\x1d\xc2%\xc1\x0c\xc1N\x1d\xc2%\xc1\x0b\xc2N\x1d\xe8'
b'\x0c\xc1N\x1e\xe8\n\xc2C\xc3H?\x05\xc2\x0b\xc1F'
b'\xc2F?\x06\xc2\t\xc2\x02F\xc3C?\x06\xc2\n\xc1'
b'\x04G\xc2A?\x07\xc3\x07\xc2\x06H?\x08\xc4\x06\xc2'
b'\x07F?\n\xca\tD?\r\xc6\x0cB?\xff\xff\xff'
b'\xff\xff\xff\x95'
)
# 1-bit RLE, generated from res/up_arrow.png, 16 bytes
up_arrow = (16, 9, b'\x07\x02\r\x04\x0b\x06\t\x08\x07\n\x05\x0c\x03\x0e\x01 ')
# 1-bit RLE, generated from res/down_arrow.png, 17 bytes
down_arrow = (16, 9, b'\x00 \x01\x0e\x03\x0c\x05\n\x07\x08\t\x06\x0b\x04\r\x02\x07')