]> git.walde.dev - epaper_display/commitdiff
Generalize red/black rendering, add render rules
authorDustin Walde <redacted>
Mon, 6 Jan 2025 04:11:24 +0000 (20:11 -0800)
committerDustin Walde <redacted>
Mon, 6 Jan 2025 04:11:24 +0000 (20:11 -0800)
src/renderer.py

index 278ec89b582dabf22bbdd2894fc71fcd630ffa69..b4274dacbfbc271cb177588749d153923952f31b 100644 (file)
@@ -2,13 +2,28 @@ from PIL import Image
 
 import display
 
+from typing import List, Tuple, Callable
+
 class Renderer:
     def __init__(self) -> None:
         self.width = display.EPD_HEIGHT
         self.height = display.EPD_WIDTH
         self.display = display.Display()
+        self.rules: List[Tuple[Callable[[],bool],Callable[[int,int],Image]]] = [];
+        self._calibrate_before_next_render = False
+
+    def render(self):
+        # check for calibration first
+        if self._calibrate_before_next_render:
+            self._calibrate_before_next_render = False
+            self.display.calibrate()
 
-    def render(self, image: Image):
+        for rule in self.rules:
+            if rule[0]():
+                self.render_image(rule[1](self.width, self.height))
+                return
+
+    def render_image(self, image: Image):
         hsv_image = image.convert("HSV")
         hsv_pixels = hsv_image.load()
 
@@ -22,11 +37,15 @@ class Renderer:
                 h, s, v = hsv_pixels[x,y]
                 red_hue_val = max(0, 255 - h*6, (h-212)*6)
                 red_val = int(red_hue_val * s * v / 256 / 256)
+                black_val = int(255 * max(0, v - red_val) / max(1, 255 - red_val))
                 if red_val > 0:
-                    red_pixels[x, y] = 0 # 255 - red_val
-                    black_pixels[x, y] = (v, v, v)
+                    red_pixels[x, y] = 255 - red_val
+                    black_pixels[x, y] = 3*(black_val,)
 
         black_image = black_image.transpose(Image.Transpose.ROTATE_270)
         red_image = red_image.transpose(Image.Transpose.ROTATE_270)
         self.display.render(black_image, red_image)
 
+    def set_calibrate_next_render(self, calibrate: bool = True) -> None:
+        self._calibrate_before_next_render = calibrate
+