Skip to content

iccPawgReport applies ICC.1 assumptions to iccMAX profiles: 7 of 32 checks affected (C5 is one symptom) #2005

Description

@colourbill-ctrl

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:

  • S4PCS 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.
  • C10warnings: PCS illuminant is not D50 — the same assumption surfacing again.
  • C4missing 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.

Metadata

Metadata

Labels

QAMaintainer indicates topic of Quality Assuranceneeds-triageMaintainer triage required

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions