Not proposed for immediate action. Filing this as a datapoint, not as a work item. C5 is
one symptom of something broader, and the measurements below say it is very likely the tip of
the iceberg for iccMAX support in iccPawgReport. The right response is to gather a few more
of these and then plan iccMAX PAWG coverage at a level above individual defects — not to
knock off missing tags piecemeal. I would rather this sat open as evidence than got a
one-line PR.
The "tip of the iceberg" is measured, not assumed — see Evidence that C5 is not the only
check below. C5 is not even the worst affected: of 32 checks, seven show a large v5-vs-v2/v4
gap, and four of them are worse than C5.
Follow-up to #2001, which fixed one instance of this.
Summary
iccPawgReport check C5 ("Is the profile free of additional tags not required for profile
class, other than allowed optional tags") has no version dimension. Its class rule tables in
Tools/CmdLine/IccPawgReport/PawgReport.cpp are ICC.1 (v2/v4) shaped, so every iccMAX-only
tag falls through to a warning. #2001 added cicpTag, but cicp was a genuine single
omission of an ICC.1 v4.4 tag; the remaining offenders are all iccMAX tags, and adding them one
by one to kCommonOptional would be the wrong fix.
Measured on master with the #2001 fix already applied.
Evidence that C5 is not the only check
Every tracked .icc (git ls-files '*.icc') run through iccPawgReport, every check verdict
recorded, then split by profile version. "bad" = WARN or FAIL. Only checks with a >5 point gap
shown; v5 sample n=89 profiles, v2/v4 sample n=13.
| check |
title |
v5 bad |
v2/v4 bad |
gap |
| S4 |
Does illuminant correspond to D50? |
97% (86/89) |
0% (0/13) |
+97 |
| C1 |
Are tag types correctly encoded? |
92% (82/89) |
0% (0/13) |
+92 |
| C5 |
Free of additional tags not required for class? |
93% (83/89) |
8% (1/13) |
+86 |
| C10 |
Does header content conform with the specification? |
99% (88/89) |
15% (2/13) |
+83 |
| C3 |
Do tags only use tag types allowed for the tag? |
94% (84/89) |
23% (3/13) |
+71 |
| C4 |
Are all required tags for profile class present? |
100% (89/89) |
38% (5/13) |
+62 |
| S3 |
Do Platform/Creator/Manufacturer/CMM correspond to registered signatures? |
94% (84/89) |
46% (6/13) |
+48 |
| Q3 |
(small sample) |
33% (2/6) |
9% (1/11) |
+24 |
Representative details, all from iccMAX profiles:
- S4 →
PCS illuminant is not D50. For iccMAX a non-D50 PCS illuminant is the point of
Profile Connection Conditions and spectral viewing conditions, so this reads as an ICC.1
assumption applied to a spec that deliberately relaxed it.
- C10 →
warnings: PCS illuminant is not D50 — the same assumption surfacing again.
- C4 →
missing A2B0 or matrix/TRC transform, chad when PCS illuminant is not D50 — ICC.1
class rules applied to profiles that legitimately use MPE / D2B transforms.
- C1 / C3 → both surface the same library
Validate() opinion:
'svcn': spectralViewingConditionsTag::>illuminantXYZ - XYZNumber appears to be normalized!
That one may be a genuine question about the library's iccMAX validation rather than about
PawgReport's tables — which is itself an argument for looking at this whole area coherently.
So the same shape recurs across at least four independent checks: ICC.1 assumptions applied
to iccMAX profiles. Fixing C5's tag list alone would move one number in this table.
C5 specifically — 85 of 105 tracked profiles
|
count |
| profiles C5 actually assesses |
105 |
| C5 = WARN |
85 (81%) |
| C5 verdict |
version |
count |
| WARN |
v5 |
83 |
| WARN |
v4 |
1 |
| WARN |
v0 (malformed fuzz PoC) |
1 |
| OK |
v5 |
3 |
| OK |
v2 |
5 |
| OK |
v4 |
3 |
The three clean v5 profiles are simply the ones carrying none of the tags below.
The tags, and how often each is named
| sig |
tag |
profiles |
svcn |
spectralViewingConditionsTag |
81 |
s2cp |
standardToCustomPccTag |
81 |
c2sp |
customToStandardPccTag |
80 |
rfnm |
referenceNameTag |
3 |
cept |
colorEncodingParamsTag |
3 |
csnm |
colorSpaceNameTag |
2 |
gbd1 |
gamutBoundaryDescription1Tag |
1 |
ICC5 |
embeddedV5ProfileTag |
1 |
c2sp/s2cp/svcn are the Profile Connection Conditions trio — CIccProfile::ReadPccTags()
groups exactly those three, and iccDumpProfile prints them under its
"Version 5 / iccMAX Profile Summary" heading, along with gbd0/gbd1.
Mechanism — the same one as #2001
Not visible from the tables, so worth restating. IsSpecTag() (PawgReport.cpp:322) asks
CIccInfo::GetTagSigName, which resolves these signatures to real names through
CIccTagCreator (IccProfLib/IccTagFactory.cpp). The name does not begin with "Unknown", so
none of them is ever classified as a private tag — they fall straight through
IsAllowedForClass() to the C5 warning.
Why a piecemeal fix is the wrong move here
Every rule table in the file is ICC.1-era, and the newest entries anywhere in them are the v4
D2B0-2 / B2D0-2 set:
kCommonRequired, kMatrixTrcAlternative, kOutputRequired, kA2B0B2A0Required,
kLinkRequired, kA2B0Required, kNamedColorRequired, kCommonOptional
The rest of PawgReport.cpp does know about versions — it validates v2/v4/v5 major numbers
(~:1500) and has an explicit (raw.version >> 24) < 5 → "not an iccMAX profile" branch
(~:1004) — but none of that reaches the C5 class rules. Dropping iccMAX tags into the
common optional list would also assert they are acceptable in a v2 or v4 profile, which is a
different claim from the one C5 should be making.
One case that rules out a naive "v5 tags go in a v5 table" split
.github/ci/test-data/v5dspobs-lcddisplay.icc is a v4 profile carrying ICC5
(embeddedV5ProfileTag) — a v4 profile legitimately embedding a v5 profile. So the rule cannot
simply be keyed on the container's version: at least one v5-related tag is valid in a v4
profile. Whatever shape a fix eventually takes has to accommodate that.
(The other non-v5 warner, .github/ci/regression/poc-763-cenc-huaf.icc, is a malformed fuzz
PoC reporting version 0 and carrying rfnm/csnm/cept; listed only for completeness.)
What I am not proposing
I am deliberately not proposing an implementation. Given the table at the top, picking a shape
for C5 alone would prejudge the larger question of how PAWG assessment should treat iccMAX —
whether the class rule tables gain a version dimension, whether some checks should report
"not applicable" for v5 rather than WARN, and whether the svcn illuminant question belongs in
IccProfLib rather than here. That is worth a plan, not a patch.
Happy to keep gathering datapoints in this shape if that is useful.
Note on regression coverage, when the time comes
Any eventual fix wants the corpus sweep above as its test — assert C5 (and the other six) across
the tracked iccMAX profiles, rather than on a single fixture. The current
iccdev.pawg-c5-cicp-optional test from #2001 covers only the cicp case.
Follow-up to #2001, which fixed one instance of this.
Summary
iccPawgReportcheck C5 ("Is the profile free of additional tags not required for profileclass, other than allowed optional tags") has no version dimension. Its class rule tables in
Tools/CmdLine/IccPawgReport/PawgReport.cppare ICC.1 (v2/v4) shaped, so every iccMAX-onlytag falls through to a warning. #2001 added
cicpTag, butcicpwas a genuine singleomission of an ICC.1 v4.4 tag; the remaining offenders are all iccMAX tags, and adding them one
by one to
kCommonOptionalwould be the wrong fix.Measured on master with the #2001 fix already applied.
Evidence that C5 is not the only check
Every tracked
.icc(git ls-files '*.icc') run throughiccPawgReport, every check verdictrecorded, then split by profile version. "bad" = WARN or FAIL. Only checks with a >5 point gap
shown; v5 sample n=89 profiles, v2/v4 sample n=13.
Representative details, all from iccMAX profiles:
PCS illuminant is not D50. For iccMAX a non-D50 PCS illuminant is the point ofProfile Connection Conditions and spectral viewing conditions, so this reads as an ICC.1
assumption applied to a spec that deliberately relaxed it.
warnings: PCS illuminant is not D50— the same assumption surfacing again.missing A2B0 or matrix/TRC transform, chad when PCS illuminant is not D50— ICC.1class rules applied to profiles that legitimately use MPE / D2B transforms.
Validate()opinion:'svcn': spectralViewingConditionsTag::>illuminantXYZ - XYZNumber appears to be normalized!That one may be a genuine question about the library's iccMAX validation rather than about
PawgReport's tables — which is itself an argument for looking at this whole area coherently.
So the same shape recurs across at least four independent checks: ICC.1 assumptions applied
to iccMAX profiles. Fixing C5's tag list alone would move one number in this table.
C5 specifically — 85 of 105 tracked profiles
The three clean v5 profiles are simply the ones carrying none of the tags below.
The tags, and how often each is named
svcnspectralViewingConditionsTags2cpstandardToCustomPccTagc2spcustomToStandardPccTagrfnmreferenceNameTagceptcolorEncodingParamsTagcsnmcolorSpaceNameTaggbd1gamutBoundaryDescription1TagICC5embeddedV5ProfileTagc2sp/s2cp/svcnare the Profile Connection Conditions trio —CIccProfile::ReadPccTags()groups exactly those three, and
iccDumpProfileprints them under its"Version 5 / iccMAX Profile Summary"heading, along withgbd0/gbd1.Mechanism — the same one as #2001
Not visible from the tables, so worth restating.
IsSpecTag()(PawgReport.cpp:322) asksCIccInfo::GetTagSigName, which resolves these signatures to real names throughCIccTagCreator(IccProfLib/IccTagFactory.cpp). The name does not begin with"Unknown", sonone of them is ever classified as a private tag — they fall straight through
IsAllowedForClass()to the C5 warning.Why a piecemeal fix is the wrong move here
Every rule table in the file is ICC.1-era, and the newest entries anywhere in them are the v4
D2B0-2/B2D0-2set:The rest of
PawgReport.cppdoes know about versions — it validates v2/v4/v5 major numbers(
~:1500) and has an explicit(raw.version >> 24) < 5→"not an iccMAX profile"branch(
~:1004) — but none of that reaches the C5 class rules. Dropping iccMAX tags into thecommon optional list would also assert they are acceptable in a v2 or v4 profile, which is a
different claim from the one C5 should be making.
One case that rules out a naive "v5 tags go in a v5 table" split
.github/ci/test-data/v5dspobs-lcddisplay.iccis a v4 profile carryingICC5(
embeddedV5ProfileTag) — a v4 profile legitimately embedding a v5 profile. So the rule cannotsimply be keyed on the container's version: at least one v5-related tag is valid in a v4
profile. Whatever shape a fix eventually takes has to accommodate that.
(The other non-v5 warner,
.github/ci/regression/poc-763-cenc-huaf.icc, is a malformed fuzzPoC reporting version 0 and carrying
rfnm/csnm/cept; listed only for completeness.)What I am not proposing
I am deliberately not proposing an implementation. Given the table at the top, picking a shape
for C5 alone would prejudge the larger question of how PAWG assessment should treat iccMAX —
whether the class rule tables gain a version dimension, whether some checks should report
"not applicable" for v5 rather than WARN, and whether the
svcnilluminant question belongs inIccProfLib rather than here. That is worth a plan, not a patch.
Happy to keep gathering datapoints in this shape if that is useful.
Note on regression coverage, when the time comes
Any eventual fix wants the corpus sweep above as its test — assert C5 (and the other six) across
the tracked iccMAX profiles, rather than on a single fixture. The current
iccdev.pawg-c5-cicp-optionaltest from #2001 covers only thecicpcase.