Commit 95e82f0a by PLN (Algolia)

midiviz: the wave is a watermark, not a backdrop

Behind the matrix it survived only in the margins — the cells' floor tints
are opaque on purpose, so 'behind' meant invisible. Painted over the
finished reading now, under the scanlines, brand magenta as atmosphere.
parent ec613576
...@@ -459,17 +459,23 @@ BASE_W, BASE_H = 420, 260 ...@@ -459,17 +459,23 @@ BASE_W, BASE_H = 420, 260
# ── the two backdrops that are pictures, not measurements ───────────────── # ── the two backdrops that are pictures, not measurements ─────────────────
# PLN, 2026-09-24: "can we do a test (option menu toggle) with ParVagues # PLN, 2026-09-24: "can we do a test (option menu toggle) with ParVagues
# imagery (transparent parvagues wave) behind the midimon to style it # imagery (transparent parvagues wave) behind the midimon to style it
# definitely ParVagues-y?" # definitely ParVagues-y?" — then, after the first cut painted it UNDER the
# matrix: "i dont even see the parvagues wave its behind a grid of grids
# somehow?" He was right, and it was structural, not a bug: the cells' floor
# tints are OPAQUE on purpose (readability first), so anything painted behind
# them survives only in the margins. A backdrop needs translucent layers
# under it; this window has none.
# #
# The wave is the brand mark itself — the Hokusai curl drawn in binary — and # So the wave is a WATERMARK: painted over the finished reading, under the
# brand magenta is a RESERVED colour in the Ship's Bridge design language, # scanline texture, faint enough to never compete with a digit. Brand magenta
# which is exactly why it works here: at a wash this faint it is an # is a RESERVED colour in the Ship's Bridge design language, which is exactly
# atmosphere, not a second reading competing with the cells. Vendored from # why it works as atmosphere — nothing else on this canvas may use it, so the
# the SSOT asset (Perso/www/public/images/parvagues/logo_transparent.png, # wash says ParVagues and nothing else. Vendored from the SSOT asset
# downscaled to 640px) because midiviz must run standalone from a checkout # (Perso/www/public/images/parvagues/logo_transparent.png, downscaled to
# with no www tree on the box at all. # 640px) because midiviz must run standalone from a checkout with no www
# tree on the box at all.
WAVE_PATH = Path(__file__).resolve().parent / "ui" / "parvagues_wave.png" WAVE_PATH = Path(__file__).resolve().parent / "ui" / "parvagues_wave.png"
WAVE_ALPHA = 0.13 WAVE_ALPHA = 0.12
# ── the HL feed ──────────────────────────────────────────────────────────── # ── the HL feed ────────────────────────────────────────────────────────────
# PLN, 2026-09-24: "please do indeed sub from the events, to indeed feed # PLN, 2026-09-24: "please do indeed sub from the events, to indeed feed
...@@ -1688,10 +1694,9 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0, ...@@ -1688,10 +1694,9 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0,
Qt.TransformationMode.SmoothTransformation) Qt.TransformationMode.SmoothTransformation)
p.setOpacity(WAVE_ALPHA) p.setOpacity(WAVE_ALPHA)
try: try:
# Bottom-right, under the matrix and out of the header's way: # Bottom-right, over the finished reading: the digits live
# the reading lives top-left, the brand lives where the eye # top-left, the brand lives where the eye rests. Under the
# rests. Painted between the background and everything else — # scanlines, so the texture stays the canvas's own.
# the ordering IS the feature, same as the spectrum's.
p.drawPixmap(w - scaled.width(), h - scaled.height(), scaled) p.drawPixmap(w - scaled.width(), h - scaled.height(), scaled)
finally: finally:
p.setOpacity(1.0) p.setOpacity(1.0)
...@@ -1841,8 +1846,6 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0, ...@@ -1841,8 +1846,6 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0,
# ordering IS the feature: PLN asked for it "behind". # ordering IS the feature: PLN asked for it "behind".
if self.spectro: if self.spectro:
self._paint_spectrum(p, w, h) self._paint_spectrum(p, w, h)
if self.wave:
self._paint_wave(p, w, h)
self._paint_chrome(p, w, h, pulse) self._paint_chrome(p, w, h, pulse)
self._paint_header(p, now, pulse) self._paint_header(p, now, pulse)
self._paint_controls(p) self._paint_controls(p)
...@@ -1850,6 +1853,11 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0, ...@@ -1850,6 +1853,11 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0,
self._paint_state(p) self._paint_state(p)
self._paint_gutter(p, now, pulse) self._paint_gutter(p, now, pulse)
self._paint_stream(p, now) self._paint_stream(p, now)
# The wave is a WATERMARK, not a backdrop: over the finished
# reading, under the texture. See the WAVE_PATH note — behind
# the opaque cells it survived only in the margins.
if self.wave:
self._paint_wave(p, w, h)
self._scanlines_blit(p) self._scanlines_blit(p)
self.painted += 1 self.painted += 1
finally: finally:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment