fixed plot flicker, measurement cost and toolbar icons
The flicker ("no data" at no constant frequency, worse with the measurements
and cursors panes up) was a torn read of the window's first stamp: acquire()
pins the window to the ring's oldest slot, and reading it at paint time races
the producer lapping it, returning a stamp one ring span too new. x0() is the
origin every trace point is reconstructed from, so one torn read produced a
refused neighbours(), a filter that dropped three quarters of the points, and
a polyline shifted off its axis. It is cached by acquire() under the lock now.
EventSeries::neighbours() answered from the (x - x0)/dx grid, whose drift from
the real arrival stamps arrives as a constant offset in seconds -- a doubling
share of the screen per zoom step, which is the "zooming into a held event
clips it more from the left" report. Both series binary-search the stamps now.
The measurements pane went through the LOD pyramid rather than reading its
window raw (19.7 ms per recompute to 1.2 ms, 0.1% of a 2 M-sample window) and
recomputes on a cadence; the math engine lost a per-slot heap allocation, a
per-sample source lookup by name and a fetch_add that cost more than the
arithmetic it counted.
The cursors pane's mix mode drew a line per *named* slot, so a slot holding a
signal that can never produce a channel -- the stream's timestamp -- got a row
that could only read "--", and such names were re-saved every session. It
counts bound traces now and apply_layout() refuses them.
Four toolbar icons are drawn for this app and compiled in as a GResource: the
stock ones were a record dot for the trigger and three magnifiers for cursors,
measurements and math.
New probes and dump lines for all of it (trace ink, measure cost, math cost,
event zoom, toolbar icons); README and CLAUDE.md record what they cure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
714d042809
commit
a92a6b5bf0
20 files changed
+1945
-243
No files matched your search
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
|
||||
<!-- The two vertical markers: a solid cap you grab, over a dashed shaft. Both parts
|
||||
earn their place. A bare pair of lines does not say the markers are draggable,
|
||||
a cap over a *solid* shaft is an audio fader to anyone who has seen a mixer, and
|
||||
a tapered cap turns into a funnel at this size. -->
|
||||
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#2e3436" d="M2 1 H8 V4 H2 Z
|
||||
M4 5 H6 V7 H4 Z
|
||||
M4 8 H6 V10 H4 Z
|
||||
M4 11 H6 V13 H4 Z
|
||||
M4 14 H6 V16 H4 Z
|
||||
M9 1 H15 V4 H9 Z
|
||||
M11 5 H13 V7 H11 Z
|
||||
M11 8 H13 V10 H11 Z
|
||||
M11 11 H13 V13 H11 Z
|
||||
M11 14 H13 V16 H11 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 984 B |
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
|
||||
<!-- A sigma: the one pane that computes rather than reads. Four filled subpaths, all
|
||||
wound clockwise so the default nonzero rule unions them where they overlap; the
|
||||
diagonals run from the bars' left ends to a vertex right of centre, which is the
|
||||
way the glyph actually points. -->
|
||||
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#2e3436" d="M3 2 H13 V4 H3 Z
|
||||
M3 12 H13 V14 H3 Z
|
||||
M4.64 2.23 L10.64 7.23 L9.36 8.77 L3.36 3.77 Z
|
||||
M10.64 8.77 L4.64 13.77 L3.36 12.23 L9.36 7.23 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 762 B |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
|
||||
<!-- A ruler: the pane measures the waveform. The body is a hole punched out of the
|
||||
frame, so under `evenodd` the ticks inside it are an *odd* number of crossings
|
||||
deep (frame, hole, tick) and fill rather than cutting a second hole. -->
|
||||
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#2e3436" fill-rule="evenodd"
|
||||
d="M0 4 H16 V12 H0 Z
|
||||
M2 6 H14 V10 H2 Z
|
||||
M4 6 H5 V9 H4 Z
|
||||
M6 6 H7 V8 H6 Z
|
||||
M8 6 H9 V9 H8 Z
|
||||
M10 6 H11 V8 H10 Z
|
||||
M12 6 H13 V9 H12 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 717 B |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
|
||||
<!-- A rising edge crossing a dashed trigger level: what the trigger *is*. The dash
|
||||
rhythm is 2 on, 1 off (tight enough to read as one line rather than as a row of
|
||||
dots), with the one wide gap at x 5..9 that the edge rises through. Every
|
||||
coordinate is a whole pixel of the 16px cell so nothing blurs at 1x. -->
|
||||
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#2e3436" d="M0 11 H8 V13 H0 Z
|
||||
M6 3 H8 V13 H6 Z
|
||||
M6 3 H16 V5 H6 Z
|
||||
M0 7 H2 V9 H0 Z
|
||||
M3 7 H5 V9 H3 Z
|
||||
M9 7 H11 V9 H9 Z
|
||||
M12 7 H14 V9 H12 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 857 B |
Reference in new issue
Block a user