fix(#2098): correct the LgoS and MCML CMM enum values to the registered signatures - #2102
Merged
Merged
Conversation
colourbill-ctrl
requested review from
ChrisCoxArt,
dwtza,
maxderhak and
xsscx
as code owners
August 11, 2026 05:00
…ed signatures icSigLogoSync was 0x44676F53 and icSigKonicaMinolta was 0x4D434D44 -- 'DgoS' and 'MCMD'. registry.color.org/cmm-signatures publishes 'LgoS' 0x4C676F53 (GretagMacbeth) and 'MCML' 0x4D434D4C (Konica Minolta), which is what both comments already claimed. Re-verified against the live registry on 2026-08-11. The values are not decorative. CIccProfile::CheckHeader allow-lists registered CMMs by enum name (IccProfile.cpp:1972,1978), and CIccInfo::GetCmmSigName names them from the same enum (IccUtil.cpp:2053,2071), so a wrong value is wrong in both directions at once: a profile whose preferred-CMM field held the correctly registered 'LgoS' was reported LgoS: Unregistered CMM signature. while a profile holding the unregistered 'DgoS' validated clean and was given LogoSync's name. Neither signature has ever appeared in a tracked fixture -- all 105 profiles under git were scanned and none carry any of the four values -- so no corpus output moves and nothing could have caught this by round-trip. This is the same defect and the same remedy as icSigRefIccMAX, which #1473 carried as 0x52494343 ('RICC') against a comment and registry saying 'RIMX', and corrected by changing the value rather than the comment (delta B3 in Tools/CmdLine/IccPawgReport/registry/PERMISSIVENESS_DELTAS.md). The registry string is authoritative; the hex is what drifted. The MCML line additionally carried an inline question -- "actually this is 'MCMD'- which is right? Sent email to Dr. Phil Green." The live registry answers it, so the comment is now the plain registered form like every other row. icSigVivo is a third instance found by the same check but needs no value change: 0x7669766F is correct and matches the registry, while its comment said 'VIVO'. The comment is corrected to 'vivo'. Note the manufacturer registry separately lists Vivo as 'VIVO' 0x5649564F -- a different registry and a different header field, so the two are not in conflict and only the CMM spelling applies here. That row is pinned too, in both directions, precisely because it is the likeliest of the three to be "corrected" the wrong way: reconciling the CMM enum against the manufacturer row would reintroduce the defect this change removes. These three were found by decoding every 0x-literal signature enum in icProfileHeader.h and comparing it with its own quoted comment: 437 enums, four disagreements. The fourth is icSigDigitalCinemaProjector = 0x64636A70 ('dcjp') against a comment of 'dcpj' (icProfileHeader.h:531). It is left alone here -- it is a technology signature, defined by ICC.1 Table 29 rather than by a published registry I can cite the way the CMM rows are cited, and it is consumed by a different allow-list (IccTagBasic.cpp:3040, which reports icValidateNonCompliant rather than a warning). Reported separately rather than folded in. Test: extends the existing iccdev.cmm-registry-allowlist rather than adding a CTest, so the CMake wiring is untouched. The #1724 checks already there could not catch this -- they reach the allow-list through the enum names, and `case icSigLogoSync:` accepts whatever number the header assigns, so they pass identically before and after. The new checks drive it with the literal registered hex and with the superseded values, plus static_asserts on the enum constants: * 0x4C676F53 / 0x4D434D4C must NOT warn -- red before this change. * 0x44676F53 / 0x4D434D44 must STILL warn -- catches a fix that added the registered value while leaving the typo accepted. * 0x7669766F must NOT warn and 0x5649564F must warn -- keeps the CMM and manufacturer registries distinguishable at the allow-list. Verified red/green: reverting only icProfileHeader.h fails the build on the static_asserts, and with those removed fails 4 of 12 runtime checks. With the change applied, 12/12 pass -- clang and gcc Release, zero warnings, and ctest 174/175 with the one failure being the local spectral-tiff-preview python imagecodecs gap, unrelated. PERMISSIVENESS_DELTAS.md gains a B5 section. That file states it flags every place the IccProfLib signature tables diverge from the public registries, and its section B already records this exact class as B3 (the icSigRefIccMAX correction); landing two more instances without a row would leave the governance record understating the delta history. Part of #2098
xsscx
force-pushed
the
issue-2098-cmm-registry-signatures
branch
from
August 11, 2026 10:02
df94cc4 to
e31e0ab
Compare
xsscx
enabled auto-merge (squash)
August 11, 2026 10:02
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Addresses the two enums reported in #2098, plus a third instance of the same
class found alongside them.
The defect
icSigLogoSync0x44676F530x4C676F53DgoS->LgoS(GretagMacbeth)icSigKonicaMinolta0x4D434D440x4D434D4CMCMD->MCML(Konica Minolta)Confirming @xsscx's RCA: both consumers key on the enum name -- the allow-list
in
CIccProfile::CheckHeader(IccProfile.cpp:1972,1978) and the name table inCIccInfo::GetCmmSigName(IccUtil.cpp:2053,2071) -- so a wrong value is wrongin both directions at once. A profile whose preferred-CMM field held the
correctly registered
LgoSwas reportedwhile a profile holding the unregistered
DgoSvalidated clean and was givenLogoSync's name. Re-verified against registry.color.org/cmm-signatures on
2026-08-11.
The
MCMLline also carried an inline question -- "actually this is 'MCMD' -which is right? Sent email to Dr. Phil Green." The live registry answers it, so
the comment is now the plain registered form like every other row.
Precedent for which side to fix
This is the same defect and the same remedy as
icSigRefIccMAX, which carried0x52494343(RICC) against a comment and registry sayingRIMXuntil #1473corrected the value and kept the comment. That is recorded as delta B3 in
Tools/CmdLine/IccPawgReport/registry/PERMISSIVENESS_DELTAS.md. The registrystring is authoritative; the hex is what drifted. This PR adds a B5 section
recording these two -- that file states it flags every place the IccProfLib
signature tables diverge from the public registries, so landing two more
instances of a class it already tracks without a row would leave the governance
record understating the delta history.
Third instance:
icSigVivoFound by the same sweep, needs no value change --
0x7669766Fis correct -- butits comment said
'VIVO', corrected to'vivo'. Pinned in both directionsanyway, because it is the likeliest of the three to be "corrected" the wrong way:
the manufacturer registry lists Vivo as
VIVO = 0x5649564F, and reconcilingthe CMM enum against that row would reintroduce exactly the defect this PR
removes. Different registry, different header field -- they do not conflict.
How these were found
Decoded every
0x-literal signature enum inicProfileHeader.hand compared itwith its own quoted comment: 437 enums, four disagreements. Three are fixed
here. The fourth,
icSigDigitalCinemaProjector(icProfileHeader.h:531), turnedout not to be an iccDEV defect and is deliberately excluded -- filed as
#2101. ICC.1-2022-05 itself gives that row as
'dcpj'with hex64636A70h,which decodes to
dcjp; iccDEV faithfully carries the spec's hex. Extracting all78 signature/hex pairs from the published ICC.1 PDF shows that row is the only
self-inconsistent one in the table (ICC.2-2023: 49 rows, 0 inconsistent), so it
needs an ICC editorial decision, not an implementation choosing a column.
Test
Extends the existing
iccdev.cmm-registry-allowlistrather than adding a CTest,so the CMake wiring is untouched (definition at
Build/Cmake/Testing/CMakeLists.txt:547,invoked from both call sites at
:4423and:4695).The checks already in that file cannot catch this class -- they reach the
allow-list through enum names, and
case icSigLogoSync:accepts whatever numberthe header assigns, so they pass identically before and after. The new checks
drive it with literal registered hex, plus
static_asserts on the constants:0x4C676F53/0x4D434D4Cmust NOT warn -- red before this change.0x44676F53/0x4D434D44must STILL warn -- catches a fix that adds theregistered value while leaving the typo accepted.
0x7669766Fmust NOT warn and0x5649564Fmust warn -- keeps the CMM andmanufacturer registries distinguishable at the allow-list.
Verification
icProfileHeader.hfailsthe build on the
static_asserts; with those removed it fails 4 of 12runtime checks. With the change applied, 12/12 pass.
ctest174/175; the single failure isiccdev.spectral-tiff-preview, theknown local python
imagecodecsgap, unrelated to this change..icc/.icmprofiles were scanned andnone carry any of the four values; no tracked XML or JSON references them
either. That is also why no round-trip could ever have caught this.
Part of #2098