mirror of
https://github.com/storytold/craft-libs.git
synced 2026-10-31 07:39:23 +00:00
With a LUT destination, sRGB white came out as 0.3-0.5 % C/M/Y through Transform::eval and precise float conversions: the legacy Lab encoding puts L* 100 at 0.996 and a* = 0 at 0.50001, between the BToA grid nodes, and fix_white only patched the device-link node, so only the table paths were right. Transform: for every intent but absolute colorimetric (and proofs without paper simulation), a pixel equal to the source's device white gives exactly the destination's device white. fix_white still sets the device-link node; the paths that do not read that node exactly (the exact pipeline, float interpolation, and 8-bit lookups when white is no node) compare each pixel with white once. No other colour changes. device_white(Lab) had a* = b* = 0.5; Lab white is 128/255 in the v4 encoding, which is no node of the 33-point grid, so Lab sources take the per-pixel check there too. Profile: synth::CmykParams::white_on_node maps no ink to exactly L* 100, a* = b* = 0 in the AToB and gives the BToA tables input curves that put that white on a node holding no ink. The Coated FOGRA39 profile is regenerated with it and separates PCS white to 2e-5 ink (was 0.5 %), so the step into white is as smooth as its neighbours. The default parameters and the Photocraft profile are unchanged; its white still falls between nodes, so its last grey step into white is up to about 0.4 % C larger than the one before, as with lcms's white-node fix, and the test allows that for this profile. FOGRA39 accuracy against 16a66e1: AToB against the patches unchanged (mean 0.07, p95 0.18, max 0.53 ΔE00), reference sRGB values unchanged (max 0.76), Lab -> CMYK -> Lab p95 1.04 -> 1.07, max 2.54 -> 2.55 (mean 0.24).