DEFAULT_PALETTE_RGB was a guessed approximation of the panel's ink colors (pure sRGB primaries); swap in epdoptimize's measured spectra6 palette instead, which is far more muted/darker, matching how these inks actually look. _quantize now matches against the palette in OKLab space (perceptual distance) instead of PIL's raw-RGB quantize(), with lightness weighted down relative to hue/chroma when selecting the nearest color -- this palette's inks are lit so differently from their sRGB namesakes (muted dark red, bright yellow) that unweighted distance let lightness dominate and mismatch hue (pure red nearest "yellow"). Dithering switched from Floyd-Steinberg error diffusion to a Bayer ordered dither: true error diffusion is an inherently serial per-pixel loop, and doing that in pure Python for a full 800x480 panel took ~1s, blowing past the render-latency budget the "render widgets concurrently" fix (previous commit) exists to protect. The ordered dither finds each pixel's true nearest and second-nearest palette color and mixes between them (via projection onto that segment, not distance ratio) using a tiled Bayer threshold -- fully vectorized, no Python-level pixel loop.
15 lines
251 B
Plaintext
15 lines
251 B
Plaintext
fastapi==0.115.6
|
|
starlette==0.41.3
|
|
uvicorn[standard]==0.34.0
|
|
httpx==0.28.1
|
|
pillow==12.3.0
|
|
numpy==2.5.1
|
|
python-multipart==0.0.20
|
|
jinja2==3.1.5
|
|
sqlalchemy==2.0.51
|
|
qrcode==8.2
|
|
icalendar==7.2.2
|
|
recurring-ical-events==3.8.2
|
|
caldav==3.2.1
|
|
pypdfium2==5.12.1
|