summaryrefslogtreecommitdiff
path: root/wasp
diff options
context:
space:
mode:
authorDaniel Thompson <daniel@redfelineninja.org.uk>2020-12-29 12:30:20 (GMT)
committerDaniel Thompson <daniel@redfelineninja.org.uk>2020-12-29 12:30:20 (GMT)
commitff76abfb8b9d2fe2fe19d353dee8df77c420344e (patch)
treef83f5f53663940f980e82ccd7cd690c5be3102f3 /wasp
parentbffd41ea44c9e71b94e45b845d4387d02d5d7def (diff)
draw565: Add lighten/darken functions
Add functions to generate shades from a single (usually theme provided) basic palette colour. Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Diffstat (limited to 'wasp')
-rw-r--r--wasp/boards/simulator/test_unit.py41
-rw-r--r--wasp/draw565.py51
2 files changed, 92 insertions, 0 deletions
diff --git a/wasp/boards/simulator/test_unit.py b/wasp/boards/simulator/test_unit.py
new file mode 100644
index 0000000..8e62ea3
--- /dev/null
+++ b/wasp/boards/simulator/test_unit.py
@@ -0,0 +1,41 @@
+import draw565
+import pytest
+
+@pytest.fixture
+def draw():
+ """Provide a RGB565 drawing surface.
+
+ Currently most of the draw565 functions will not work since we haven't
+ mocked up the display. This limits the testing that we can perform.
+ """
+ d = draw565.Draw565(None)
+
+ return d
+
+def test_lighten(draw):
+ assert draw.lighten(0b00000_000000_00000 ) == 0b00001_000010_00001
+ assert draw.lighten(0b00000_000000_00000, 0b00001) == 0b00001_000010_00001
+ assert draw.lighten(0b00000_000000_00000, 0b00100) == 0b00100_001000_00100
+
+ assert draw.lighten(0b10000_100000_10000, 0b10000) == 0b11111_111111_11111
+ assert draw.lighten(0b11110_111100_11110, 0b00001) == 0b11111_111110_11111
+ assert draw.lighten(0b11110_111101_11110, 0b00001) == 0b11111_111111_11111
+
+ assert draw.lighten(0b11111_111111_11111, 0b00001) == 0b11111_111111_11111
+
+ assert draw.lighten(0b10000_010000_01000, 0b10000) == 0b11111_110000_11000
+ assert draw.lighten(0b01000_100000_01000, 0b10000) == 0b11000_111111_11000
+ assert draw.lighten(0b01000_010000_10000, 0b10000) == 0b11000_110000_11111
+
+def test_darken(draw):
+ assert draw.darken(0b00001_000010_00001, 0b00001) == 0b00000_000000_00000
+ assert draw.darken(0b00010_000100_00010 ) == 0b00001_000010_00001
+ assert draw.darken(0b00010_000100_00010, 0b00001) == 0b00001_000010_00001
+ assert draw.darken(0b10000_010000_00100, 0b00001) == 0b01111_001110_00011
+
+ assert draw.darken(0b00000_000000_00000, 0b00001) == 0b00000_000000_00000
+ assert draw.darken(0b00001_000001_00001, 0b00001) == 0b00000_000000_00000
+ assert draw.darken(0b10000_100000_10000, 0b10001) == 0b00000_000000_00000
+ assert draw.darken(0b10000_100010_10010, 0b10001) == 0b00000_000000_00001
+ assert draw.darken(0b10000_100100_10010, 0b10001) == 0b00000_000010_00001
+
diff --git a/wasp/draw565.py b/wasp/draw565.py
index 111b2dc..72cda5b 100644
--- a/wasp/draw565.py
+++ b/wasp/draw565.py
@@ -10,6 +10,12 @@ import fonts.sans24
import math
import micropython
+from micropython import const
+
+R = const(0b11111_000000_00000)
+G = const(0b00000_111111_00000)
+B = const(0b00000_000000_11111)
+
@micropython.viper
def _bitblit(bitbuf, pixels, bgfg: int, count: int):
mv = ptr16(bitbuf)
@@ -454,3 +460,48 @@ class Draw565(object):
y1 = y - int(ydelta * r1)
self.line(x0, y0, x1, y1, width, color)
+
+ def lighten(self, color, step=1):
+ """Get a lighter shade from the same palette.
+
+ The approach is somewhat unsophisticated. It is essentially just a
+ saturating add for each of the RGB fields.
+
+ :param color: Shade to lighten
+ :returns: New colour
+ """
+ r = (color & R) + (step << 11)
+ if r > R:
+ r = R
+
+ g = (color & G) + (step << 6)
+ if g > G:
+ g = G
+
+ b = (color & B) + step
+ if b > B:
+ b = B
+
+ return (r | g | b)
+
+ def darken(self, color, step=1):
+ """Get a darker shade from the same palette.
+
+ The approach is somewhat unsophisticated. It is essentially just a
+ desaturating subtract for each of the RGB fields.
+
+ :param color: Shade to darken
+ :returns: New colour
+ """
+ rm = color & R
+ rs = step << 11
+ r = rm - rs if rm > rs else 0
+
+ gm = color & G
+ gs = step << 6
+ g = gm - gs if gm > gs else 0
+
+ bm = color & B
+ b = bm - step if bm > step else 0
+
+ return (r | g | b)