91 lines
2.1 KiB
Python
91 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)
|