Commit 7acb792
2.1.0: print QC analysis — extrema colorimetry, shadow ink paths, tone response
Three additions to the Analysis tab, derived from the doQCpfA.m reference QC
harness and checked numerically against its published GRACoL2013_CRPC6 report.
Extrema Colorimetry (new section)
White/black point in relative AND absolute colorimetry, the inking the profile
chooses for black, and TAC; plus per-hue full-tone vs maximum-chroma
colorimetry. Black is derived per-intent (PCS black -> B2A -> inking -> A2B1),
because each B2A table picks its own black inking.
Two things established while building it, both worth keeping:
- A bare CIccXform DOES apply the absolute media-white adjustment; it is set up
in CIccXform::Begin() and applied by CheckDstAbs(), gated on m_bAdjustPCS &&
m_bInput. No CIccCmm needed (IccCmm.cpp:1568-1596).
- Absolute == relative is legitimate, not a bug: the adjustment only engages
when media white differs from the illuminant.
The CMYRGB corner map is CMYK/CMY only, deliberately. An nCLR space names its
channels through colorantTable in any order, so "channel 0 is cyan" would be a
guess that mislabels every row while looking plausible. Those profiles get an
explicit N/A.
Ink Usage in Shadows (new section)
Four constant-L* paths (0/45/90/135 deg) through the selected B2A table, with
an intent selector. BPC follows the reference exactly, including sourcing the
black point from B2A0 for all three intents so they stay comparable.
Neutral Axis Inking
Adds the tone response (L*-out vs L*-in). Its plateau at the darkest
reproducible lightness IS the media black point — and it agrees to the digit
with WhiteBlackPoints, which reaches the same number by an independent path.
A Delta-a*b* neutrality trace is computed but WITHDRAWN from the plot pending
review of its definition (SHOW_NEUTRALITY=false). It began as a full dE*ab;
probing GRACoL showed the reference curve peaks at ~0.28 just above the black
point and never blows up, matching chroma-only (0.283) rather than full dE
(10.8 at L*=0, purely because below the media black point the profile can only
clamp). That artefact would also have dominated the secondary axis.
Model / engine
New iccviz APIs: WhiteBlackPoints, HueExtrema, ShadowInkPaths. New
Series::useY2 + Graph::hasY2/y2Axis — a general "this series carries a
different physical quantity" concept, not a one-off. Shared inkColorHints()
replaces the inline hint block so the separation plots colour identically.
New WASM exports: whiteBlackPoints, hueExtrema, shadowInkPaths.
Fixed a latent bug found on the way: axisRange() accepted min == max and would
have collapsed any axis using the new "no hint / autorange" convention.
UI
Every Analysis section now starts collapsed — each costs a full transform pass,
so opening is an explicit choice rather than six analyses firing on tab switch.
The two new tables give every colorimetric axis its own column under a spanning
group header, and scroll in their own box (7-8 columns would otherwise push the
page sideways; this panel has no media queries).
Docs
Rewrote the guide's Analysis section, which had drifted independently of this
work: it described Profile Statistics and Round-Trip as separate sections after
they were merged, and never documented CLUT Image or Gamut Image. Adds
qc-analysis-gaps.md recording the full Q1-Q17 audit against the reference
harness and what remains (Q6-Q17).
i18n
34 new strings across all 12 locales; spreadsheets re-synced.
Verified
White/black points, TAC, black inking and all six hue corners match the
published GRACoL2013_CRPC6 figures to <=0.007. The shadow plane is an
independent check: the reference rule gives 38.335 from the published corner
values; the engine computed 38.33 from its own transforms.
All WASM modules rebuilt from a CLEAN iccDEV origin/master worktree (0550c344).
Note for the runbook: third_party/ is untracked vendored deps, so a clean
worktree needs it symlinked in before build-wasm.sh will configure.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JkxVtREhRmqbY71R5KnV7e1 parent dabb00a commit 7acb792
32 files changed
Lines changed: 2325 additions & 91 deletions
File tree
- frontend
- public
- wasm
- src
- components
- viz
- lib
- iccviz
- translations
- validator-wasm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
194 | 194 | | |
195 | 195 | | |
196 | 196 | | |
197 | | - | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
198 | 200 | | |
199 | 201 | | |
200 | 202 | | |
201 | | - | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
202 | 217 | | |
203 | | - | |
204 | | - | |
| 218 | + | |
205 | 219 | | |
206 | | - | |
| 220 | + | |
207 | 221 | | |
208 | | - | |
| 222 | + | |
209 | 223 | | |
210 | | - | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
211 | 228 | | |
212 | | - | |
213 | | - | |
214 | | - | |
| 229 | + | |
215 | 230 | | |
216 | | - | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
217 | 234 | | |
218 | 235 | | |
219 | 236 | | |
220 | | - | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
221 | 262 | | |
222 | 263 | | |
223 | 264 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
0 commit comments