summaryrefslogtreecommitdiff
path: root/wasp/draw565.py
blob: 4c5f25faace9ca73de2e409b802bdd88ac53a570 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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)