Skip to content

Commit cf8207f

Browse files
Remove L* tone reversal analysis (Analysis tab + iccviz)
Drops the L* tone-reversal analysis from the profiletool Analysis tab and the iccviz IccVizModel engine, at the user's request. The Analysis tab now hosts Profile Statistics and Neutral Axis Inking only. Frontend: - AnalysisPanel.jsx: remove the ReversalSection / ReversalGraphs / ReversalPlot and their helpers (decodeSegments, inkTransition, formatWarnings, VizWarnings, the reversal cache) and reversal state; drop the now-unused useRef import. - AnalysisPanel.module.css: prune the reversal-only styles (custom SVG plot, subplot grid, colour-filter chips, ranked-table cells, warnings). - i18n.jsx: remove the 12 reversal-only keys across all 12 locales; regenerate the translation xlsx (sync-translations.mjs) — 187 keys. - ProfileViewer.jsx: update the Analysis-tab comment. iccviz (C++ engine): - IccVizModel.hpp: retire Kind::InkReversalL = 7 (commented out, value reserved so the append-only enum keeps NeutralAxisInking = 8). - IccVizModel.cpp: remove the reversal algorithm section, its Enumerate() emission, and the RenderGraph() dispatch (308 lines). The shared helpers kMaxInkChannels / isPcsSpace / pcsToLstar are kept (used by the neutral-axis, gamut-volume, and round-trip paths). - Readme.md: update the enum doc. User guide: MANUAL.md gains a "3.4 Analysis" section documenting Profile Statistics + Neutral Axis Inking (the Analysis tab was previously undocumented); XML/JSON renumbered to 3.5/3.6; help.html regenerated. The WASM artifacts are intentionally NOT rebuilt here — mirroring the prior iccviz change (33e4aac), they are regenerated and committed at release time. A full clean rebuild against iccDEV origin/master was verified locally: the C++ compiles, iccplot.wasm shrinks ~24 KB, and all reversal strings are gone. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XTfq9wJh9ZWT1fTN62LkDN
1 parent 33e4aac commit cf8207f

18 files changed

Lines changed: 53 additions & 906 deletions

MANUAL.md

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ Everything runs client-side. Profile bytes never leave the browser tab.
2525
- [Header](#3-1-header)
2626
- [Tags](#3-2-tags)
2727
- [Validation](#3-3-validation)
28-
- [XML](#3-4-xml)
29-
- [JSON](#3-5-json)
28+
- [Analysis](#3-4-analysis)
29+
- [XML](#3-5-xml)
30+
- [JSON](#3-6-json)
3031
4. [Round-trip editing](#4-round-trip-editing)
3132
5. [Launching from chardata](#5-launching-from-chardata)
3233
6. [Launching with a URL](#6-launching-with-a-url)
@@ -135,13 +136,30 @@ Each check is grouped under **Security**, **Conformance**, or **Quality**, and c
135136

136137
The summary row at the top tallies each verdict as a coloured pill. **Click a pill to filter** the report below — a blue halo marks the categories currently shown, and pills with zero items are inactive. For example, switch off **Pass** and **N/A** to focus on just the Warns and Fails.
137138

138-
### 3.4 XML
139+
### 3.4 Analysis
140+
141+
Whole-profile quality analyses derived from the profile's colour transforms — computed by a dedicated WebAssembly module (the iccDEV visualization engine) that's fetched only when you first open this tab, and plotted in the app's own style. Each analysis is a collapsible section; one that doesn't apply to the loaded profile shows a short *not applicable* note instead (for example, a matrix/TRC display profile has no device↔PCS CLUTs to analyse).
142+
143+
#### Profile Statistics
144+
145+
Per rendering intent, two whole-profile metrics computed from the device↔PCS lookup tables:
146+
147+
- **Gamut volume** — the volume (in ΔE\*ab³) enclosed by the device → PCS (`A2B`) transform, measured by voxelising the gamut boundary and counting the enclosed cells. A robust estimate of how much colour the profile can reproduce.
148+
- **Round-trip ΔE** — how accurately the `B2A` (PCS → device) table inverts the `A2B`: in-gamut Lab values are pushed Lab → device → Lab and the error is reported as **mean**, **P90**, and **max** ΔE\*ab.
149+
150+
One row per intent (Perceptual, Relative Colorimetric, Saturation, Absolute Colorimetric); intents whose tags are absent are omitted.
151+
152+
#### Neutral Axis Inking
153+
154+
Sweeps the neutral axis (a\*=b\*=0) from white (L\*=100) down to black (L\*=0) through the profile's `B2A` (PCS → device) table and plots how much of each device colorant the profile lays down along the way — the classic GCR / neutral-build curve. One curve per device channel, colour-coded per colorant. **Output (printer) profiles only**; other profile classes show a note.
155+
156+
### 3.5 XML
139157

140158
Converts the profile to XML (via IccLibXML, the same writer the iccDEV `iccToXml` CLI uses) and shows it in a CodeMirror editor with syntax highlighting. Edit the XML and click **Convert to ICC** to round-trip back to binary; the viewer re-validates and the **Save ICC profile** button downloads the result.
141159

142160
A **dirty** indicator shows when the editor text differs from the last converter output, so you can tell at a glance whether your edits have been applied. If conversion fails, IccLibXML's parse error is shown above the editor with the offending line / column.
143161

144-
### 3.5 JSON
162+
### 3.6 JSON
145163

146164
Same idea as the XML tab but using a JSON representation of the profile produced by the validator wrapper (`json-wrapper.cpp`). Edit, click **Convert to ICC**, save. The JSON form is more compact and easier to script against; the XML form is more familiar if you've used the iccDEV CLI tools.
147165

frontend/public/help.html

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,21 @@ <h3 id="3-3-validation">3.3 Validation</h3>
266266
<tr><td><strong>Not Run</strong></td><td>The check was skipped</td></tr>
267267
</tbody></table>
268268
<p>The summary row at the top tallies each verdict as a coloured pill. <strong>Click a pill to filter</strong> the report below — a blue halo marks the categories currently shown, and pills with zero items are inactive. For example, switch off <strong>Pass</strong> and <strong>N/A</strong> to focus on just the Warns and Fails.</p>
269-
<h3 id="3-4-xml">3.4 XML</h3>
269+
<h3 id="3-4-analysis">3.4 Analysis</h3>
270+
<p>Whole-profile quality analyses derived from the profile's colour transforms — computed by a dedicated WebAssembly module (the iccDEV visualization engine) that's fetched only when you first open this tab, and plotted in the app's own style. Each analysis is a collapsible section; one that doesn't apply to the loaded profile shows a short <em>not applicable</em> note instead (for example, a matrix/TRC display profile has no device↔PCS CLUTs to analyse).</p>
271+
<h4>Profile Statistics</h4>
272+
<p>Per rendering intent, two whole-profile metrics computed from the device↔PCS lookup tables:</p>
273+
<ul>
274+
<li><strong>Gamut volume</strong> — the volume (in ΔE*ab³) enclosed by the device → PCS (<code>A2B</code>) transform, measured by voxelising the gamut boundary and counting the enclosed cells. A robust estimate of how much colour the profile can reproduce.</li>
275+
<li><strong>Round-trip ΔE</strong> — how accurately the <code>B2A</code> (PCS → device) table inverts the <code>A2B</code>: in-gamut Lab values are pushed Lab → device → Lab and the error is reported as <strong>mean</strong>, <strong>P90</strong>, and <strong>max</strong> ΔE*ab.</li>
276+
</ul>
277+
<p>One row per intent (Perceptual, Relative Colorimetric, Saturation, Absolute Colorimetric); intents whose tags are absent are omitted.</p>
278+
<h4>Neutral Axis Inking</h4>
279+
<p>Sweeps the neutral axis (a*=b*=0) from white (L*=100) down to black (L*=0) through the profile's <code>B2A</code> (PCS → device) table and plots how much of each device colorant the profile lays down along the way — the classic GCR / neutral-build curve. One curve per device channel, colour-coded per colorant. <strong>Output (printer) profiles only</strong>; other profile classes show a note.</p>
280+
<h3 id="3-5-xml">3.5 XML</h3>
270281
<p>Converts the profile to XML (via IccLibXML, the same writer the iccDEV <code>iccToXml</code> CLI uses) and shows it in a CodeMirror editor with syntax highlighting. Edit the XML and click <strong>Convert to ICC</strong> to round-trip back to binary; the viewer re-validates and the <strong>Save ICC profile</strong> button downloads the result.</p>
271282
<p>A <strong>dirty</strong> indicator shows when the editor text differs from the last converter output, so you can tell at a glance whether your edits have been applied. If conversion fails, IccLibXML's parse error is shown above the editor with the offending line / column.</p>
272-
<h3 id="3-5-json">3.5 JSON</h3>
283+
<h3 id="3-6-json">3.6 JSON</h3>
273284
<p>Same idea as the XML tab but using a JSON representation of the profile produced by the validator wrapper (<code>json-wrapper.cpp</code>). Edit, click <strong>Convert to ICC</strong>, save. The JSON form is more compact and easier to script against; the XML form is more familiar if you've used the iccDEV CLI tools.</p>
274285
<hr>
275286
<h2 id="4-round-trip-editing">4. Round-trip editing</h2>

0 commit comments

Comments
 (0)