1
0
Fork 0
jebbatime/wasp/draw565.py

92 lines
2.1 KiB
Python

import fonts.sans24
import micropython
@micropython.viper
def bitblit(bitbuf, pixels, bgfg: int, count: int):
mv = ptr8(bitbuf)
px = ptr8(pixels)
bghi = (bgfg >> 24) & 0xff
bglo = (bgfg >> 16) & 0xff
fghi = (bgfg >> 8) & 0xff
fglo = (bgfg ) & 0xff
bitselect = 0x80
pxp = 0
mvp = 0
for bit in range(count):
# Draw the pixel
active = px[pxp] & bitselect
mv[mvp] = fghi if active else bghi
mvp += 1
mv[mvp] = fglo if active else bglo
mvp += 1
# Advance to the next bit
bitselect >>= 1
if not bitselect:
bitselect = 0x80
pxp += 1
def bounding_box(s, font):
w = 0
for ch in s:
(_, h, wc) = font.get_ch(ch)
w += wc + 1
return (w, h)
def draw_glyph(display, glyph, x, y, bgfg):
(px, h, w) = glyph
buf = memoryview(display.linebuffer)[0:2*(w+1)]
bytes_per_row = (w + 7) // 8
for row in range(h):
bitblit(buf, px[row*bytes_per_row:], bgfg, w)
buf[2*w] = 0
buf[2*w + 1] = 0
display.rawblit(buf, x, y+row, w+1, 1)
class Draw565(object):
def __init__(self, display):
self._display = display
self.set_color(0xffff)
self.set_font(fonts.sans24)
def set_color(self, color, bg=0):
self._bgfg = (bg << 16) + color
def set_font(self, font):
self._font = font
def string(self, s, x, y, width=None):
display = self._display
bgfg = self._bgfg
font = self._font
if width:
(w, h) = bounding_box(s, font)
leftpad = (width - w) // 2
rightpad = width - w - leftpad
display.fill(0, x, y, leftpad, h)
x += leftpad
for ch in s:
glyph = font.get_ch(ch)
draw_glyph(display, glyph, x, y, bgfg)
x += glyph[2] + 1
if width:
display.fill(0, x, y, rightpad, h)
#import watch
#draw = Draw(watch.display)
#
#def test():
# watch.display.poweron()
# watch.backlight.set(2)
#
# draw.string('10-Jan-2020', 0, 24, width=240)