Releases: colourbill-ctrl/chardata
1.10.0 — Resizable plots + Gamut Slice zoom
What's new in 1.10.0
Resizable plot height (aspect ratio)
Both the 3D Plot and Gamut Slice now have a draggable handle on the bottom edge of the graphing area — the same 3-dots grip (with hover/drag highlight) as the File Select pane. Drag it to make a plot taller or shorter to suit your screen and the data. The chosen height is sticky: it's remembered per plot across sessions.
Auto-scaling of the data is unchanged — only the canvas box resizes.
Gamut Slice scroll-wheel zoom
- Scroll to zoom the Gamut Slice in and out with the mouse wheel.
- A new Reset zoom button restores the default auto-scaled view.
Zooming rescales the auto-scaled range about its centre, so the data still drives the bounds — the wheel just lets you get closer.
Localization
The new Reset zoom label is translated across all 12 in-page languages and the translation spreadsheets.
1.9.2 — iccDEV memory-leak & hardening rebuild
Maintenance release — rebuilds the bundled ICC viewer WASM against a clean iccDEV master, picking up the upstream memory-leak and input-validation hardening fixes merged since 1.9.1. No app-facing behaviour change — the profile viewer parses and displays the same data on a hardened IccProfLib underneath.
Upstream IccProfLib fixes now included:
- CIccXform::Create overload leak / double-free via
bOwnsProfile(#1308 / #1347) - CIccCmm::CheckPCSConnections CIccPcsXform leak on Connect failure (#1337 / #1338)
- Spectral-profile transform-creation fixes (#1335)
- CIccCmmSearch::AddXform NamedColor profile leak (#1332 / #1333)
- AddXform ownership / delete-on-error contract (#1327)
- Decode
icStatusCMMnames in CMM error messages (#1322 / #1323 / #1324)
1.9.1 — CxF/X-4 spot ink characterisation support
CharData 1.9.1
CxF/X-4 spot ink characterisation files
CharData now ingests CxF/X-4 (ISO 17972-4) files — the spot-ink-characterisation variant of the Color Exchange Format. All three conformance levels are detected and labelled in the file panel:
- CxF/X-4 — full characterisation: a tint ramp printed on the substrate and a second ramp printed over black
- CxF/X-4a — single-background characterisation: one tint ramp on the substrate
- CxF/X-4b — single-patch characterisation: just the solid (100 %) and the substrate (0 %)
The file's tint levels load as a device colorant named after the spot ink, and full CxF/X-4 files get a second PROCESS_BLACK colorant (0 = substrate ramp, 100 = over-black ramp). The 3D point cloud, 2D slice, data table, Tone Value chart, Extract/Export, and Compare all work as for any characterisation dataset. Because one or two tint ramps can't support a polynomial gamut model, the gamut shell and Estimate are unavailable for these files — a notice in the file panel explains this, localized in all 12 languages.
Fixes & improvements
- Spectral data in CxF files that declare
StartWLonly on theColorSpecification'sWavelengthRange(rather than on eachReflectanceSpectrum) is now read correctly — CxF/X-4 files are commonly written this way. - The CxF type label and the file-panel notices now survive a live language switch.
- The ICC profile viewer's interface text — Tags-table column headers and the inline visualization section titles and evaluator labels — is now localized in all 12 languages.
- Manual and in-app help updated with a CxF/X-4 section.
1.9.0 — Inline ICC tag visualizations & hex/decimal tag numbers
CharData 1.9.0
Inline per-tag visualizations in the ICC profile viewer
Display File → Tags now draws the data behind each tag, inline above its text description — mirroring the arrangement in the companion profiletool:
- Tone curves — TRC tags and the A/B/M curves of LUT tags, colour-coded with a clickable legend to toggle individual channels.
- CIE 1931 chromaticity charts — the white point (
wtpt) and RGB colorants (rXYZ/gXYZ/bXYZ), with the relevant point highlighted against the spectral locus and Planckian curve. - CLUT lattice image and the colour-coded out-of-gamut map (
gamt), rendered from the profile's own samples. - Named-colour / colorant scatters on a*b* and xy.
- Single-point transform evaluator — for
A2B*/B2A*/previewtags, apply that tag's transform to one colour set with sliders (float or CLUT grid-node input) and read the result in both human and normalized units. Evaluated through IccProfLib directly.
Each visualization is a collapsible section that reflows for mobile. Graphs are inline SVG and images are drawn to a canvas — all rendered locally, nothing uploaded.
Number format setting
A new Number format control in the Settings panel switches the Tags-tab Offset / Size / Pad columns between Hexadecimal (default — ICC byte offsets are conventionally read in hex) and Decimal. The choice is remembered between sessions and localized across all 12 languages.
Under the hood
- The shared
IccVizModelvisualization engine is compiled into the existing ICC-viewer WebAssembly module (no separate download); profile-derived text is rendered safely as text, never markup. - Manual and in-app help updated.
1.8.3
2D gamut slice axis fixes + Tone Value default
2D gamut slice
Fixes axis presentation in the 2D gamut slice view for the a* and b* slice modes.
- Corrected swapped axis labels. In the a* and b* slice views the axis labels were transposed relative to the plotted data, so the L* and chroma axes appeared switched.
- L* is now vertical in both the a* and b* slice views, with the chroma axis (b* for the a*-slice, a* for the b*-slice) on the horizontal axis. The point cloud, gamut-boundary polygon, axis labels, and axis ranges were all aligned so they agree.
The L*-slice (a*–b* plane) is unchanged.
Tone Value
- The Tone Value section now starts collapsed when first created for a dataset (both explore and compare modes). The user's manual open/close is still preserved across result re-renders.
1.8.2 — Spectral→Lab via ICC weighting tables; A, LED-B1, F11 illuminants
CharData 1.8.2
Spectral → Lab: reference weighting tables + more illuminants
- Spectral-to-L*a*b* conversion now uses the authoritative ICC colorimetry-data illuminant × observer weighting tables instead of computing CMF × illuminant SPD on the fly. Each table spans 380–780 nm at 10 nm and is normalised so the perfect reflector has Y = 100, so results match the reference CMM. White-point chromaticities were verified against published values for every table.
- New illuminants: A, LED-B1, and F11, alongside the existing D50 and D65. The Standard Observer control selects the matching table (2° → CIE 1931, 10° → CIE 1964). M-condition behaviour is unchanged (M1 forces the D50 colorimetric illuminant; M2 zeroes the UV band ≤ 400 nm).
- Existing D50/D65 spectral Lab values shift very slightly — they are now more accurate (authoritative CMFs/SPDs with proper bandpass correction).
Docs
- In-app help and MANUAL updated with the expanded illuminant list and a note crediting the ICC colorimetry-data weighting tables.
- Added an architecture diagram (Mermaid + SVG) under
docs/.
1.8.1 — ColorSpace ICC profiles & data table for all device spaces
CharData 1.8.1
ColorSpace ICC profiles
- ICC profiles of the ColorSpace class (
spac) are now accepted, alongside the existing Output, Input, and Display classes. A ColorSpace profile carries the same A2B (device→colorimetry) transform as an output profile, so it is evaluated through the identical path — its gamut, slices, data table, Compare, and Estimate all work. Abstract, DeviceLink, and NamedColor profiles remain unsupported (none provide a device→Lab mapping).
Data table for every device space
- The Explore data table (generated device-colorant patches alongside their evaluated L*a*b*) previously appeared for CMYK ICC profiles only. It now renders for all device spaces — RGB, Gray, CMY, and N-colorant — using the same pattern: CMYK tabulates the IT8.7/5 patch set; every other space tabulates a generated set of paper white, single-channel ramps, and a two-channel overprint grid. The 3D "show data points" cloud for these profiles now reflects that same device patch set.
Other
- Removed the redundant Regenerate Shell button from the 3D gamut panel — the Density slider is the live resolution control, and every input change already rebuilds the shell automatically.
- Renamed the app title Chardata → CharData; the 3D canvas now slides when the File Select pane is toggled.
- New UI strings localised across all 12 languages (+ translation matrices). Manual and in-app help updated.
1.8.0 — CxF/X-3 support & measurement-only datasets
CharData 1.8.0
CxF/X-3 (Color Exchange Format, ISO 17972-3)
- Read CxF/X-3 as a third characterisation data format alongside CSV and CGATS/IT8. Prefix-agnostic XML parsing maps
Objectname → sample label,ColorCIELab→ L*a*b*,ReflectanceSpectrum→ spectral columns, andColorCMYK/ColorCMYKPlusN/ColorRGB→ device colorants. - Write/Export a full CxF/X-3 document (device colorants + CIELab + spectrum + a
ColorSpecificationderived from the current illuminant / observer / M-condition).
Measurement-only datasets
Datasets with L*a*b* and/or spectral data but no device colorants (common in CxF, also valid for CGATS/CSV) now load and support:
- the 3D L*a*b* point cloud (sample label on hover),
- the 2D gamut-slice point cloud (projected, no boundary — like image-derived clouds),
- the data table with a sample-label column,
- Compare matched by sample label.
Gamut shell, Extract, Tone Value, Estimate, and G7 validation are unavailable for these (no device→colour relationship to model).
Other
- New UI strings localised across all 12 languages (+ translation matrices); fixed the measurement-only notice so it re-localizes live on language change.
- Refreshed the APTEC_CMYKOGV_Coated_LinearCTV_2025_M1 standard dataset (corrected CGATS header field/set counts).
- Manual and in-app help updated.
1.7.3 — ICC-vs-ICC Compare for matching NCLR profiles
The ICC-vs-ICC branch of Compare was previously hardcoded to 4-channel
CMYK — two NCLR profiles refused with "ICC vs ICC comparison requires
CMYK profiles." That guard also masked a latent alignment bug
(#2): the
source-order remap used a fixed CMYK index, so any future NCLR support
would have silently mis-aligned non-CMYK inks.
This release lifts the restriction for the well-defined case, and
replaces the "CMYK only" error with a targeted message for the cases
that remain ill-defined.
What changed
In runCompareWithIcc, the both-ICC branch now:
- Requires both profiles to expose identical ordered colorant lists
(e.g. two CMYKOGV proofers). When they don't match, the comparison is
refused with a message that names both lists. - For 4-channel CMYK, continues to evaluate against the standard
IT8.7/5 patch set (unchanged). - For any other matching colorant list, evaluates against a generated
N-channel patch set: paper white, single-ink ramps, and a two-ink
overprint grid that thins with channel count to keep patch counts
bounded (N=5 → 591 patches, N=7 → 666, N=10 → 821, N=15 → 1831). - Drops the previously hardcoded
['CYAN','MAGENTA','YELLOW','BLACK']
source-order constant in favour of a single ICC-slot lookup — the
deep-equal guard makes that sufficient across every branch.
Wording
icc_vs_icc_cmyk_only→icc_vs_icc_colorant_mismatchwith{a}/
{b}placeholders for the two colorant lists.- Translations refreshed in all 12 supported UI languages (en, fr, de,
it, es, pt-PT, pt-BR, zh-CN, zh-TW, ja, ko, sv) and in the canonical
translations/Eng-*.xlsxspreadsheets.Eng-Pt.xlsxand
Eng-Zh.xlsxpick up the previously-empty pt-BR / zh-TW columns for
this row in passing.
Manual
MANUAL.md §5 (Compare mode) bullet for ICC vs ICC rewritten to
describe the colorant-list requirement and the CMYK / NCLR patch sets.
Closes #2.
1.7.2 — Image gamut in both modes, image-only plotting
The Image tab is now always visible — Explore as well as Compare — and the
3D plot and 2D slice can render the image trace on its own, with no
Dataset A loaded, whenever the image carries an embedded ICC profile or
is a Lab TIFF. Removing the image (or unloading the last dataset) hides
both plots again.
Bind dropdown
The dataset-binding dropdown now adapts to what is actually bindable:
- If the image has an embedded ICC profile, empty dataset slots are
omitted entirely — only the embedded entry and any loaded datasets
appear. - If the image has no embedded profile but at least one dataset is
loaded, empty slots still appear with a-placeholder so the slot
positions remain visible. - If the image has no embedded profile and no datasets are loaded,
the dropdown is empty and disabled.
Plot defaults
- 2D slicer Show data points now defaults to ON (the prior default
hid the patch cloud, which is the most common reason people open the
slicer in the first place).
Wording
- Bind-error message reworded for the new behaviour:
Dataset {slot} is not loaded.→No color dataset loaded. - Translations refreshed in all 12 supported UI languages
(en, fr, de, it, es, pt-PT, pt-BR, zh-CN, zh-TW, ja, ko, sv) and in
the canonicaltranslations/Eng-*.xlsxspreadsheets.
Manual
MANUAL.md §5.4 (Image gamut) updated to reflect the new always-visible
tab, the dropdown rules, and the image-only plotting case. The §4.4
slicer table notes the new Show data points default.
🤖 Generated with Claude Code