From: Dustin Walde Date: Mon, 6 Jan 2025 04:11:24 +0000 (-0800) Subject: Generalize red/black rendering, add render rules X-Git-Url: https://git.walde.dev/?a=commitdiff_plain;h=4f27aed0336c6c846f38dfe78e3119747bc22dda;p=epaper_display Generalize red/black rendering, add render rules --- diff --git a/src/renderer.py b/src/renderer.py index 278ec89..b4274da 100644 --- a/src/renderer.py +++ b/src/renderer.py @@ -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 +