summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/clock_icon.pngbin965 -> 5599 bytes
-rw-r--r--res/settings_icon.pngbin1082 -> 7628 bytes
-rw-r--r--res/torch_icon.pngbin820 -> 5170 bytes
-rw-r--r--wasp/apps/launcher.py2
-rw-r--r--wasp/apps/testapp.py65
-rw-r--r--wasp/draw565.py19
-rw-r--r--wasp/icons.py120
7 files changed, 139 insertions, 67 deletions
diff --git a/res/clock_icon.png b/res/clock_icon.png
index 165bf51..b08bbfb 100644
--- a/res/clock_icon.png
+++ b/res/clock_icon.png
Binary files differ
diff --git a/res/settings_icon.png b/res/settings_icon.png
index d1141b0..c8e8019 100644
--- a/res/settings_icon.png
+++ b/res/settings_icon.png
Binary files differ
diff --git a/res/torch_icon.png b/res/torch_icon.png
index bbd4db3..aa5f514 100644
--- a/res/torch_icon.png
+++ b/res/torch_icon.png
Binary files differ
diff --git a/wasp/apps/launcher.py b/wasp/apps/launcher.py
index 274ea9c..4e76ab1 100644
--- a/wasp/apps/launcher.py
+++ b/wasp/apps/launcher.py
@@ -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)
diff --git a/wasp/apps/testapp.py b/wasp/apps/testapp.py
index eece822..789454f 100644
--- a/wasp/apps/testapp.py
+++ b/wasp/apps/testapp.py
@@ -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()
-
- def benchmark_rle_1bit(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)
+ elif self.test == 'RLE':
+ self.benchmark_rle()
- def benchmark_rle_2bit(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.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)
diff --git a/wasp/draw565.py b/wasp/draw565.py
index 9cc4adc..028b920 100644
--- a/wasp/draw565.py
+++ b/wasp/draw565.py
@@ -106,6 +106,15 @@ class Draw565(object):
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."""
display = self._display
@@ -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
diff --git a/wasp/icons.py b/wasp/icons.py
index 76b5ee7..02c1b91 100644
--- a/wasp/icons.py
+++ b/wasp/icons.py
@@ -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')
+