Skip to content

1.3.0: vectorscope, picture colour, graticule behind the trace, intensity to 1000 % - #12

Open
LeeO86 wants to merge 6 commits into
mainfrom
feat/1.3.0
Open

LeeO86 wants to merge 6 commits into
mainfrom
feat/1.3.0

Conversation

@LeeO86

@LeeO86 LeeO86 commented Nov 12, 2026

Copy link
Copy Markdown
Owner

Everything for 1.3.0 in one release (no 1.2.2). The version is not bumped yet; that is the release step.

Changes

  • Graticule behind the trace. The trace covers the graticule by its intensity. A black picture is now a green line on the 0 % line, not a grey one. The existing golden pictures changed for this commit only.
  • Vectorscope (SCOPES_MODE=vectorscope): Cb/Cr trace in a square plot, hue ring, rings, Cb/Cr axes, vectors to the six colours, BT.709 75 % and 100 % target boxes (a test checks the bars land in them), skin-tone line, R/Mg/B/Cy/G/Yl labels. Zoom SCOPES_VECTOR_ZOOM 1, 2 or 5 (live). Not included: the Lows/Mids/Highs split and HSL. No measurements in this mode.
  • Trace colour picture for luma and vectorscope: each trace point shows the mean colour of the samples that land in it. Luma is lifted to at least 25 %, so dark colours stay visible. The green, white and amber traces keep their code path and speed.
  • SCOPES_INTENSITY up to 1000 % (was 400).
  • Web UI: the new mode, picture colour and zoom. Docs: SPECIFICATION, README, CHANGELOG, plan deviations 27–29, docs/performance.md.

CPU (one core, Xeon Gold 6136, 1080p in, 1080p out, AVX2, ms per update)

Mode bars75 scene random
luma 2.36 4.17 9.08
luma + picture 3.95 11.5 32.8
vectorscope 4.11 4.39 7.43
vectorscope + picture 5.80 6.67 17.9

At 2160p (scene, line step 2 in brackets): luma 13.3 (8.5), luma + picture 28.1 (18.3), vectorscope 14.1 (9.1), vectorscope + picture 20.4 (11.5). Luma + picture at 4K fits 25 Hz updates, not every frame.

Tests

Unit tests pass in both builds (Blend2D on and off), with the scalar, AVX2 and AVX-512 paths byte-identical. Not run yet: tests/integration/scope.sh (it was edited), and the process CPU on a real MXL flow.

🤖 Generated with Claude Code

https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4

LeeO86 and others added 6 commits November 12, 2026 15:58
The graticule was blended over the trace, so a trace on a line (a
black picture on the 0 % line) turned grey and was hard to see. Now
the trace covers the graticule by its intensity; the graticule is
neutral like the background, so only the luma changes.

Golden PNGs regenerated with mxl-scopes-bench --golden docs/golden and
the hashes updated (both Blend2D builds): every picture with a trace on
a graticule line changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
A user asked for a brighter trace: the limit is 1000 % now (was 400 %),
in the config (78 above it), PATCH /api/v1/scope (400 above it) and the
Scope tab slider. The intensity table stays correct: a higher gain only
makes it shorter (it ends at the first count that reaches 1023), every
count >= 1 still at least SCOPES_TRACE_MIN (unit test at 1000 %).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
SCOPES_MODE=vectorscope ("Vectorscope"): a Cb/Cr 2D histogram in a square
plot in the middle of the raster, one cell per 2x2 pixels. At 1x the plot
spans 1200 chroma codes (600 from the centre to the edge), so the 100 %
targets (magenta and green 534 codes out in BT.709) and every code fit.
SCOPES_VECTOR_ZOOM (1, 2, 5; live, vector_zoom in PATCH /api/v1/scope)
zooms around the centre; samples outside the zoomed plot go to a trash
cell that is never drawn. Graticule behind the trace: a hue ring at the
edge (each angle in the hue of its direction), rings every 35 mV of
chroma, the Cb and Cr axes, vectors to the six colours, the skin-tone
line at 123 degrees, BT.709 target boxes at 75 % and 100 %, the colour
names, and the zoom ("2x") right of the plot. No measurements.

SCOPES_TRACE_COLOR=picture (luma and vectorscope): each cell in the
colour of its samples. Per cell 32-bit sums next to the count (luma: Cb
and Cr, packed in one 64-bit word; vectorscope: Y'), each code shifted
right when an update could pass 32 bits. Colour: the luma lifted to 25 %
(adding grey keeps the hue), brightened to the largest R'G'B' component
at 100 %, then scaled by the intensity curve. Float maths with two small
tables in the (shared, baseline) trace step. The other trace colours keep
their code path.

SIMD: the vectorscope analyses with the scalar step on every level, the
luma picture colour with an AVX2 step (AVX-512 uses it too). Golden PNGs
for the vectorscope (bars75, bars100, scene, picture scene) and the luma
picture colour (mxl-scopes-bench --golden docs/golden), hashes for both
builds; the existing goldens are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
The mode list (Scope tab and widget controls) has the vectorscope; the
trace colour has "picture colour" (luma and vectorscope); a zoom select
(1x, 2x, 5x) shows for the vectorscope. Settings help texts follow.
npm ci && npm run build pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
The colour of a group's six cells is computed in plain loops without
branches or tables (one division for the mean, one for the gain), which
the compiler partly vectorises with SSE; the vectorscope reads its
cells' sums through columnOf instead of copying a sampled row per plot
row. Smaller code, a little faster: trace step alone at 1080p 6.3 ->
5.9 ms (luma, camera pattern), 2.1 -> 1.8 ms (vectorscope, scene);
mxl-scopes-bench render about the same (7.0 ms luma, scene).

The gain is no longer rounded to a table step, so the two picture-colour
golden PNGs and hashes change (both builds); every other golden stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
SPECIFICATION: §4.4 the picture colour and its rule (luma lifted to 25 %,
brightened to the largest R'G'B' component at 100 %, then the intensity),
§4.7 no measurements in the vectorscope, §5.1 the mode in 1.3, §5.2 its
square layout, new §5.3 (cells, 1200-code scale, zoom, graticule, analyse
step), §7.1 the mode tag, §8.1 SCOPES_TRACE_COLOR picture and
SCOPES_VECTOR_ZOOM, §9.1 the controls, §13 a pointer to the numbers, §14.1
the vectorscope goldens. IMPLEMENTATION_PLAN: 1.3.0 status, deviations 27
(SIMD and threads of the new steps), 28 (float colour maths), 29 (no
vectorscope measurements). README modes and settings, CHANGELOG 1.3.0
lines, docs/performance.md "1.3.0" with the engine numbers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ybuzgBaGxuB5UiaE8dRa4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant