The epd4in0e panel's palette has no gray at all (just black/white/
yellow/red/blue/green -- see epd4in0e.py's putpalette), so any gray
RGB fill gets Floyd-Steinberg dithered into a black/white checkerboard
across the whole glyph body. At the small font sizes most of these
screens use (Navidrome's artist/album/genre/source lines, Departures'
direction/platform columns, Weather's description/forecast labels,
Clock's date line, the placeholder messages), that reads as blurry,
half-rendered text -- same root cause already fixed in Journey.
Switched every gray fill/outline to solid black across navidrome.py,
weather.py, departures.py, clock.py, and picture.py. Left the
intentionally-faint row-divider hairlines (228,228,228) alone --
those are meant to almost disappear, not readable text. Removed
departures.py's now-unused MUTED constant.
positionMs changes every poll (~20s), so the old live progress bar/elapsed
time forced a full flash constantly, even mid-song -- this panel has no
partial refresh, so there's no way to show real progress without that.
Now it's an outline + total length only, driven by nothing that changes
while the same track keeps playing. Verified the rendered image is
byte-identical across different positionMs values for the same track.
Also dropped elapsed/elapsed_text/progress_pct from the track dict
entirely now that nothing renders them.
Two separate imbalances:
- Cover art was top-aligned when width-constrained (landscape, cover_size
capped by width*0.5), leaving dead space below it instead of centering
in the available height.
- The text column always started drawing at the very top and let the
source line's bottom-pin create a big empty gap for tracks with
short/sparse metadata -- looked top-heavy and unbalanced.
Text column is now built as (height, draw_fn) pairs first so the total
height is known before committing to a starting y, then centered in the
space above the reserved source-line area.