wasp: draw565: Refactor to allow apps to focus on the drawable.
This commit is contained in:
parent
5413d826d7
commit
031d139b7c
6 changed files with 67 additions and 55 deletions
|
@ -56,10 +56,10 @@ class ClockApp(object):
|
|||
|
||||
def draw(self, effect=None):
|
||||
"""Redraw the display from scratch."""
|
||||
display = watch.display
|
||||
draw = watch.drawable
|
||||
|
||||
display.fill(0)
|
||||
display.rleblit(digits.clock_colon, pos=(2*48, 80), fg=0xb5b6)
|
||||
draw.fill()
|
||||
draw.rleblit(digits.clock_colon, pos=(2*48, 80), fg=0xb5b6)
|
||||
self.on_screen = ( -1, -1, -1, -1, -1, -1 )
|
||||
self.update()
|
||||
self.meter.draw()
|
||||
|
@ -77,14 +77,13 @@ class ClockApp(object):
|
|||
self.on_screen = now
|
||||
return False
|
||||
|
||||
display = watch.display
|
||||
display.rleblit(DIGITS[now[4] % 10], pos=(4*48, 80))
|
||||
display.rleblit(DIGITS[now[4] // 10], pos=(3*48, 80), fg=0xbdb6)
|
||||
display.rleblit(DIGITS[now[3] % 10], pos=(1*48, 80))
|
||||
display.rleblit(DIGITS[now[3] // 10], pos=(0*48, 80), fg=0xbdb6)
|
||||
draw = watch.drawable
|
||||
draw.rleblit(DIGITS[now[4] % 10], pos=(4*48, 80))
|
||||
draw.rleblit(DIGITS[now[4] // 10], pos=(3*48, 80), fg=0xbdb6)
|
||||
draw.rleblit(DIGITS[now[3] % 10], pos=(1*48, 80))
|
||||
draw.rleblit(DIGITS[now[3] // 10], pos=(0*48, 80), fg=0xbdb6)
|
||||
self.on_screen = now
|
||||
|
||||
draw = watch.drawable
|
||||
month = now[1] - 1
|
||||
month = MONTH[month*3:(month+1)*3]
|
||||
draw.string('{} {} {}'.format(now[2], month, now[0]),
|
||||
|
|
|
@ -38,7 +38,7 @@ class TestApp():
|
|||
draw.string('({}, {})'.format(event[1], event[2]),
|
||||
0, 108, width=240)
|
||||
elif self.test == 'String':
|
||||
watch.display.fill(0, 0, 30, 240, 240-30)
|
||||
draw.fill(0, 0, 30, 240, 240-30)
|
||||
t = machine.Timer(id=1, period=8000000)
|
||||
t.start()
|
||||
draw.string("The quick brown", 12, 24+24)
|
||||
|
@ -56,7 +56,7 @@ class TestApp():
|
|||
def draw(self, effect=None):
|
||||
"""Redraw the display from scratch."""
|
||||
watch.display.mute(True)
|
||||
watch.display.fill(0)
|
||||
watch.drawable.fill()
|
||||
watch.drawable.string('{} test'.format(self.test),
|
||||
0, 6, width=240)
|
||||
watch.display.mute(False)
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# len(colors) is not a multiple of 5 ;-) ).
|
||||
#
|
||||
|
||||
import watch, logo, time, gc, draw565
|
||||
import watch, logo, time, gc
|
||||
|
||||
colors = (
|
||||
0xffff,
|
||||
|
@ -24,10 +24,9 @@ colors = (
|
|||
0xf81f, # magenta
|
||||
)
|
||||
|
||||
draw = draw565.Draw565(watch.display)
|
||||
|
||||
def textdemo():
|
||||
watch.display.fill(0)
|
||||
draw = watch.drawable
|
||||
draw.string("The quick brown", 12, 24)
|
||||
draw.string("fox jumped over", 12, 48)
|
||||
draw.string("the lazy dog.", 12, 72)
|
||||
|
@ -57,7 +56,7 @@ def run():
|
|||
l = logo.pine64
|
||||
watch.display.fill(0)
|
||||
|
||||
watch.display.rleblit(l, fg=c)
|
||||
watch.drawable.rleblit(l, fg=c)
|
||||
time.sleep(2)
|
||||
gc.collect()
|
||||
|
||||
|
|
|
@ -29,6 +29,16 @@ def _bitblit(bitbuf, pixels, bgfg: int, count: int):
|
|||
bitselect = 0x80
|
||||
pxp += 1
|
||||
|
||||
@micropython.viper
|
||||
def _fill(mv, color: int, count: int, offset: int):
|
||||
p = ptr8(mv)
|
||||
colorhi = color >> 8
|
||||
colorlo = color & 0xff
|
||||
|
||||
for x in range(count):
|
||||
p[2*(x+offset) ] = colorhi
|
||||
p[2*(x+offset) + 1] = colorlo
|
||||
|
||||
def _bounding_box(s, font):
|
||||
w = 0
|
||||
for ch in s:
|
||||
|
@ -66,6 +76,44 @@ class Draw565(object):
|
|||
self.set_color(0xffff)
|
||||
self.set_font(fonts.sans24)
|
||||
|
||||
def fill(self, bg=None, x=0, y=0, w=None, h=None):
|
||||
"""Draw a solid color rectangle.
|
||||
|
||||
If no arguments a provided the whole display will be filled with
|
||||
the background color.
|
||||
"""
|
||||
if bg is None:
|
||||
bg = self._bgfg >> 16
|
||||
self._display.fill(bg, x, y, w, h)
|
||||
|
||||
@micropython.native
|
||||
def rleblit(self, image, pos=(0, 0), fg=0xffff, bg=0):
|
||||
"""Decode and draw a 1-bit RLE image."""
|
||||
display = self._display
|
||||
(sx, sy, rle) = image
|
||||
|
||||
display.set_window(pos[0], pos[1], sx, sy)
|
||||
|
||||
buf = memoryview(display.linebuffer)[0:2*sx]
|
||||
bp = 0
|
||||
color = bg
|
||||
|
||||
for rl in rle:
|
||||
while rl:
|
||||
count = min(sx - bp, rl)
|
||||
_fill(buf, color, count, bp)
|
||||
bp += count
|
||||
rl -= count
|
||||
|
||||
if bp >= sx:
|
||||
display.write_data(buf)
|
||||
bp = 0
|
||||
|
||||
if color == bg:
|
||||
color = fg
|
||||
else:
|
||||
color = bg
|
||||
|
||||
def set_color(self, color, bg=0):
|
||||
"""Set the foreground (color) and background (bg) color.
|
||||
|
||||
|
|
|
@ -25,16 +25,6 @@ _RAMWR = const(0x2c)
|
|||
_COLMOD = const(0x3a)
|
||||
_MADCTL = const(0x36)
|
||||
|
||||
@micropython.viper
|
||||
def fastfill(mv, color: int, count: int, offset: int):
|
||||
p = ptr8(mv)
|
||||
colorhi = color >> 8
|
||||
colorlo = color & 0xff
|
||||
|
||||
for x in range(count):
|
||||
p[2*(x+offset) ] = colorhi
|
||||
p[2*(x+offset) + 1] = colorlo
|
||||
|
||||
class ST7789(object):
|
||||
def __init__(self, width, height):
|
||||
self.width = width
|
||||
|
@ -126,31 +116,6 @@ class ST7789(object):
|
|||
for yi in range(h):
|
||||
self.write_data(buf)
|
||||
|
||||
@micropython.native
|
||||
def rleblit(self, image, pos=(0, 0), fg=0xffff, bg=0):
|
||||
(sx, sy, rle) = image
|
||||
self.set_window(pos[0], pos[1], sx, sy)
|
||||
|
||||
buf = memoryview(self.linebuffer)[0:2*sx]
|
||||
bp = 0
|
||||
color = bg
|
||||
|
||||
for rl in rle:
|
||||
while rl:
|
||||
count = min(sx - bp, rl)
|
||||
fastfill(buf, color, count, bp)
|
||||
bp += count
|
||||
rl -= count
|
||||
|
||||
if bp >= sx:
|
||||
self.write_data(buf)
|
||||
bp = 0
|
||||
|
||||
if color == bg:
|
||||
color = fg
|
||||
else:
|
||||
color = bg
|
||||
|
||||
class ST7789_SPI(ST7789):
|
||||
def __init__(self, width, height, spi, cs, dc, res=None, rate=8000000):
|
||||
self.spi = spi
|
||||
|
|
|
@ -11,10 +11,11 @@ class BatteryMeter(object):
|
|||
|
||||
def update(self):
|
||||
icon = icons.battery
|
||||
draw = watch.drawable
|
||||
|
||||
if watch.battery.charging():
|
||||
if self.level != -1:
|
||||
watch.display.rleblit(icon, pos=(239-icon[0], 0), fg=0x7bef)
|
||||
draw.rleblit(icon, pos=(239-icon[0], 0), fg=0x7bef)
|
||||
self.level = -1
|
||||
else:
|
||||
level = watch.battery.level()
|
||||
|
@ -33,16 +34,16 @@ class BatteryMeter(object):
|
|||
|
||||
if (level > 5) ^ (self.level > 5):
|
||||
if level > 5:
|
||||
watch.display.rleblit(icon, pos=(239-icon[0], 0), fg=0x7bef)
|
||||
draw.rleblit(icon, pos=(239-icon[0], 0), fg=0x7bef)
|
||||
else:
|
||||
rgb = 0xf800
|
||||
watch.display.rleblit(icon, pos=(239-icon[0], 0), fg=0xf800)
|
||||
draw.rleblit(icon, pos=(239-icon[0], 0), fg=0xf800)
|
||||
|
||||
x = 239 - 30
|
||||
w = 16
|
||||
if 24 - h:
|
||||
watch.display.fill(0, x, 14, w, 24 - h)
|
||||
draw.fill(0, x, 14, w, 24 - h)
|
||||
if h:
|
||||
watch.display.fill(rgb, x, 38 - h, w, h)
|
||||
draw.fill(rgb, x, 38 - h, w, h)
|
||||
|
||||
self.level = level
|
||||
|
|
Loading…
Add table
Reference in a new issue