Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
212 commits
Select commit Hold shift + click to select a range
345b792
feat(color): embed built-in interop identities config
zachlewis Jul 12, 2026
8685595
feat(color): port ID grammar and sanitization rules to pvt::
zachlewis Jul 12, 2026
ce50636
feat(color): overlay OCIO >=2.5 studio config in interop identities r…
zachlewis Jul 12, 2026
20e1c9d
feat(color): add registry invariant and CIF ID round-trip tests
zachlewis Jul 12, 2026
c4f78af
style(color): neutral wording for registry-coverage test comment
zachlewis Jul 12, 2026
75043e4
feat(color): add color space classification flags and lazy analysis
zachlewis Jul 12, 2026
9aff0dd
feat(color): add color space fingerprint computation and matching
zachlewis Jul 12, 2026
3d6f35a
feat(color): add lazy config interoperability check and in-memory repair
zachlewis Jul 12, 2026
b7d8c34
feat(color): add process-global color space fingerprint cache
zachlewis Jul 12, 2026
79a3d93
test(color): add --bench mode for cold/warm interop engine timings
zachlewis Jul 12, 2026
7b06b3c
feat(color): enrich ColorConfig::resolve with interop ID syntactic tiers
zachlewis Jul 12, 2026
4fa1bdf
feat(color): add read-side registry-equivalence tier to ColorConfig::…
zachlewis Jul 12, 2026
c702904
test(color): cover ColorConfig::resolve's interop ID read tiers
zachlewis Jul 13, 2026
8ab7d14
style(color): neutral wording for resolver tier comment
zachlewis Jul 13, 2026
15be573
feat(color): derive interop IDs via the CIF four-step write cascade
zachlewis Jul 13, 2026
ad2cc72
test(color): cover the interop ID write cascade + python parity
zachlewis Jul 13, 2026
e4f47fe
style(color): neutral wording in derivation gate and test comments
zachlewis Jul 13, 2026
d60fc8d
fix(color): resolve data/bypass to a real "Raw" data space
zachlewis Jul 13, 2026
3b38fac
test(color): namespace-tolerant interop-id round-trip sweep
zachlewis Jul 13, 2026
b09175a
feat(color): add pvt cross-config processor chokepoint
zachlewis Jul 13, 2026
9b95a9e
feat(color): route cross-config conversions through interop bridge
zachlewis Jul 13, 2026
a51c413
feat(color): cross-config display transforms via interop bridge
zachlewis Jul 13, 2026
1f72f67
feat(color): once-per-config interoperability warning, debug-gated
zachlewis Jul 13, 2026
aaf530d
fix(color): preserve default view transform across config copies on o…
zachlewis Jul 13, 2026
0ba6ebc
test(color): cross-config conversion testsuite + docs
zachlewis Jul 13, 2026
f3954b1
fix(color): review cleanups — self-contained comments, tolerant tests…
zachlewis Jul 13, 2026
ce99c91
fix(color): lenient cross-config fallback keeps source colorspace tag
zachlewis Jul 14, 2026
917c2a8
fix(color): honest source tag on inverse ociodisplay lenient fallback
zachlewis Jul 14, 2026
9e33ba6
fix(color): preserve default view transform name when copying configs…
zachlewis Jul 14, 2026
686f674
fix(color): map CICP Rec.709+sRGB-transfer tuple to display-referred …
zachlewis Jul 14, 2026
e858794
test(color): independent cross-config value anchor; reliable per-conf…
zachlewis Jul 14, 2026
40f3e54
fix(color): preserve default view transform name when copying configs…
zachlewis Jul 14, 2026
0e017a3
test(color): add unit tests for the built-in color interop ID table
zachlewis Jul 14, 2026
12fe11d
docs: add colorinterop.rst documenting color interop ID and CICP support
zachlewis Jul 14, 2026
3fcf1ed
test(color): update testsuite refs + CHANGES for CICP display mapping
zachlewis Jul 15, 2026
7a2944d
feat(color): add pvt curve-family normalization helpers
zachlewis Jul 15, 2026
693e78b
feat(color): add pvt pure chromaticity math for characterization search
zachlewis Jul 15, 2026
d69c6b9
feat(color): add pvt transfer-signature axis for characterization search
zachlewis Jul 15, 2026
1bc8b3b
feat(color): add pvt term grammar and three-valued axis for character…
zachlewis Jul 15, 2026
bae23e0
feat(color): add pvt characterization search core
zachlewis Jul 15, 2026
40013b0
feat(color): add public find_color_spaces and its oiiotool consumer
zachlewis Jul 15, 2026
1c721bc
feat(python): bind ColorConfig::find_color_spaces
zachlewis Jul 15, 2026
e204ba1
feat(color): central read-side color-metadata reconciler + EXR wiring
zachlewis Jul 15, 2026
494e647
test(color): testsuite, docs, and changelog for characterization search
zachlewis Jul 15, 2026
50601dd
feat(color): central write-side color-metadata plan converter + EXR w…
zachlewis Jul 15, 2026
878698b
feat(png): wire PNG reader to central color-metadata reconciler
zachlewis Jul 15, 2026
049a3fa
feat(png): wire PNG writer to central color-metadata plan
zachlewis Jul 15, 2026
caa2bd6
feat(color): infer encoding from the interop-identity twin in find_co…
zachlewis Jul 15, 2026
39501d5
Merge branch 'zl-interop-search' into zl-interop-search-derive
zachlewis Jul 15, 2026
e023098
chore(color): merge interop ID resolution tiers (zl-interop-resolve)
zachlewis Jul 15, 2026
865b5d9
docs(color): present bypass as OIIO extension token
zachlewis Jul 15, 2026
853eddf
chore(color): merge cross-config conversion chokepoint (zl-interop-co…
zachlewis Jul 15, 2026
835f4a6
test(color): pin grammar fixtures strict; verify fingerprint-adopted …
zachlewis Jul 15, 2026
f1303a0
feat(color): spec-aware entry to the color-metadata resolver
zachlewis Jul 15, 2026
606ae55
perf(color): pass explicit interchange spaces to GetProcessorFromConfigs
zachlewis Jul 15, 2026
001624f
feat(color): infer IBA source color space from spec color hints
zachlewis Jul 15, 2026
9dfcd3e
feat(color): post-IBA color-attribute scrubber, proof-gated
zachlewis Jul 15, 2026
a559bc7
feat(color): deposit oiio:SourceFormat/SourcePath provenance attributes
zachlewis Jul 16, 2026
72e3580
test(color): update testsuite refs for new provenance attributes
zachlewis Jul 16, 2026
a4c0a90
feat(color): generated OIIO::ColorInteropIDs constants + Python str enum
zachlewis Jul 16, 2026
ae65f1a
refactor(color): spell the static CICP table's ids via ColorInteropIDs
zachlewis Jul 16, 2026
e3769af
Merge branch 'zl-colorinterop-docs' into zl-interop-dev
zachlewis Jul 17, 2026
06d9a22
Merge branch 'zl-png-cicp-display' into zl-interop-dev
zachlewis Jul 17, 2026
60f27a0
Merge branch 'zl-interop-search-derive' into zl-interop-dev
zachlewis Jul 17, 2026
ec1e21c
Merge branch 'zl-interop-spec-resolve' into zl-interop-dev
zachlewis Jul 17, 2026
4b76aa5
Merge branch 'zl-interop-resolve' into zl-interop-dev
zachlewis Jul 17, 2026
9596283
Merge branch 'zl-spec-provenance' into zl-interop-dev
zachlewis Jul 17, 2026
499fc47
Merge branch 'zl-interop-ciid-constants' into zl-interop-dev
zachlewis Jul 17, 2026
9c0a3b0
test(color): align resolver/spec-resolve tests with display-first CIC…
zachlewis Jul 17, 2026
688ff75
fix(color): flip metadata reconciler to CICP-before-ICC precedence
zachlewis Jul 17, 2026
b701a32
fix(color): remove duplicated processor_from_configs from keep-both m…
zachlewis Jul 17, 2026
c6ff3e8
chore(color): merge zl-interop-engine (OCIO<2.3.1 VT-copy fix) into i…
zachlewis Jul 17, 2026
57a09f6
merge: fold P6 (PNG-CICP display mapping) into arc1
zachlewis Jul 17, 2026
0d78eae
chore(color): merge zl-interop-resolve (bypass-token doc comment) int…
zachlewis Jul 17, 2026
664506a
chore(color): merge zl-interop-engine (OCIO<2.3.1 VT-copy fix)
zachlewis Jul 17, 2026
8ee3ce2
chore(color): merge zl-interop-resolve (VT-copy fix + bypass docs)
zachlewis Jul 17, 2026
808a806
chore(color): merge zl-interop-derive (resolve+engine reconciliation)
zachlewis Jul 17, 2026
4ef69c8
feat(color): ICC identification primitives (header gate, identifier, …
zachlewis Jul 17, 2026
daa4d0c
feat(color): identify embedded ICC profiles against the interop registry
zachlewis Jul 17, 2026
b765a7c
feat(color): derive SMPTE ST 2086 mastering display volume from (disp…
zachlewis Jul 17, 2026
c8649f4
merge: fold P6b (source provenance attributes) into arc1
zachlewis Jul 18, 2026
ee7248a
Merge branch 'zl-interop-arc1' into zl-interop-dev
zachlewis Jul 18, 2026
5b96572
Merge branch 'zl-interop-icc-mdcv' into zl-interop-dev
zachlewis Jul 18, 2026
5e56fd8
merge: fold P6 (PNG-CICP display mapping) into arc1
zachlewis Jul 18, 2026
645ff0d
merge: fold P6b (source provenance attributes) into arc1
zachlewis Jul 18, 2026
4948365
merge: fold P6c (OCIO vt-copy fix) into arc1
zachlewis Jul 18, 2026
3bb9f82
Merge branch 'zl-interop-arc1' into zl-interop-dev
zachlewis Jul 18, 2026
f5edb38
Merge branch 'zl-interop-derive' into zl-interop-dev
zachlewis Jul 18, 2026
857d027
Merge branch 'zl-interop-ciid-constants' into zl-interop-dev
zachlewis Jul 18, 2026
e1245da
docs(color): CHANGES entry for cross-config color conversion (P5)
zachlewis Jul 18, 2026
a949ce2
test(color): regression guard for copy_config default-VT preservation…
zachlewis Jul 18, 2026
2b51c0a
refactor(color): hide test-access friend decl behind OIIO_INTERNAL
zachlewis Jul 18, 2026
2c4137b
merge: zl-interop-engine friend-decl OIIO_INTERNAL gating
zachlewis Jul 18, 2026
a79cd3c
fix(color): never serialize an ambiguous config-local interop id
zachlewis Jul 19, 2026
e0873fd
fix(color): wire global oiio:colorpolicy:* storage into OIIO::attribu…
zachlewis Jul 19, 2026
982eec0
fix(color): plumb per-spec/per-open policy hints to every snapshot site
zachlewis Jul 19, 2026
0a0aa0c
fix(exr): enforce the plan's Suppress verdict at the writer boundary
zachlewis Jul 19, 2026
660fdf8
docs(color): scrub project-internal jargon from shipped comments
zachlewis Jul 19, 2026
0734a27
fix(color): lenient cross-config fallback outcome travels with the pr…
zachlewis Jul 19, 2026
486c857
fix(color): never fabricate AP0 from an unidentified scene reference
zachlewis Jul 19, 2026
971874a
fix(color): fingerprint probes run under the instance's own context
zachlewis Jul 19, 2026
c63ed75
fix(color): make lazy classification state atomic (data race)
zachlewis Jul 19, 2026
5e41605
fix(color): honor the explicit context in find_color_spaces probes
zachlewis Jul 19, 2026
254a6a1
merge: fix-wave core cluster (S1-S3,S5,S6)
zachlewis Jul 19, 2026
1378371
merge: fix-wave policy cluster (S4,G11,G15,S7,jargon-scrub)
zachlewis Jul 19, 2026
b5f0a09
fix(exr): wire color-metadata reconcile into OpenEXRCoreInput
zachlewis Jul 19, 2026
d33f39a
fix(color): key ICC processor cache by byte-exact hash, not embedded …
zachlewis Jul 19, 2026
48dd6a5
refactor(color): split cheap interop-id lookup from expensive derivation
zachlewis Jul 19, 2026
df1801e
refactor(color)!: find_color_spaces options struct + aligned CLI axes
zachlewis Jul 19, 2026
4daa156
fix(color): bound global config/fingerprint caches; context-key the c…
zachlewis Jul 19, 2026
3e0e888
refactor(color)!: replace known:unknown with marker-family semantics
zachlewis Jul 19, 2026
c121e02
test(color): adapt public find_color_spaces adapter test to options s…
zachlewis Jul 19, 2026
0e5e078
test(color): python-colorconfig testsuite reflects cheap get_color_in…
zachlewis Jul 19, 2026
b5be24a
refactor(color): split color_ocio.cpp into focused translation units
zachlewis Jul 19, 2026
4cc012c
refactor(color): move color-domain declarations to new color_pvt.h
zachlewis Jul 19, 2026
522f768
merge: upstream/main (43 commits, format-security wave)
zachlewis Jul 19, 2026
188c6e0
chore(python): regenerate stubs for color-interop API
zachlewis Jul 19, 2026
3d982cc
feat(oiiotool): --colorwriteplan preview of color-metadata write deci…
zachlewis Jul 20, 2026
200a4d9
fix(imageio): strip CICP on write for formats without a native slot
zachlewis Jul 20, 2026
8fedb2d
feat(oiiotool): --colorreadplan, read-side twin of --colorwriteplan
zachlewis Jul 20, 2026
cd467ba
test(color): add concurrent thread-stress for process-global color ca…
zachlewis Jul 20, 2026
9db1e52
feat(color): debug-log spec-impossible CICP tuples at reconcile (carv…
zachlewis Jul 20, 2026
4090273
feat(color): public ColorSpaceInfo characterization query + oiiotool …
zachlewis Jul 20, 2026
7282eb5
refactor(color)!: replace generated CIID constants with ColorInteropI…
zachlewis Jul 20, 2026
8118ea9
refactor(color): distinct plural name for the batch characterization …
zachlewis Jul 20, 2026
1a3f98c
feat(color): derive_color_space_info -- the explicit full-derivation …
zachlewis Jul 20, 2026
e7f4671
refactor(color): route search's per-candidate characterization throug…
zachlewis Jul 20, 2026
271201a
refactor(color): ColorReadCaps -- one spec->facts reader, per-format …
zachlewis Jul 20, 2026
e41e152
refactor(color): classify_interop_marker -- one classifier for the ma…
zachlewis Jul 20, 2026
9d00ebf
feat(color): ColorOperationHygiene -- automatic metadata hygiene arou…
zachlewis Jul 20, 2026
6289c35
test(color): per-class hygiene outcomes, failure split, disparity pin…
zachlewis Jul 20, 2026
1a59d01
docs(color): current-state descriptor attributes, IBA hygiene docs, C…
zachlewis Jul 20, 2026
acfbded
style(color): clang-format the hygiene diff
zachlewis Jul 20, 2026
71c591b
fix(color): materialize ociodisplay's target space before finish()
zachlewis Jul 20, 2026
f479e48
refactor(color): converge the write planner onto the shared character…
zachlewis Jul 20, 2026
30ce717
docs(colorinterop): make RST lint-clean (rstcheck + doc8)
zachlewis Jul 20, 2026
edeed5f
feat(color): set_colorspace routes through the shared color-metadata …
zachlewis Jul 20, 2026
a678729
fix(exr): scope colorInteropID to first part only (spec 07 B7)
zachlewis Jul 20, 2026
355d65a
fix(exr): drop chromaticities and validate outgoing id (spec 07 B5, B…
zachlewis Jul 20, 2026
70609c0
test(color): cover registry->local, both-registry, and local-equivale…
zachlewis Jul 21, 2026
bf535d2
feat(color): route display-referred CIID cross-config through the sce…
zachlewis Jul 21, 2026
1c640ce
feat(color): interopify synthesizes colorimetric display interchange;…
zachlewis Jul 21, 2026
ef85c45
feat(color): deferred, consume-once CICP resolution (spec 09)
zachlewis Jul 21, 2026
a2b1727
test(color): stress interopify/cross-config bridge under TSan
zachlewis Jul 21, 2026
61532d6
feat(color): read config-declared policy from OCIO FileRule custom ke…
zachlewis Jul 21, 2026
786093c
feat(color): extend config-declared policy to write side (spec 09 POC)
zachlewis Jul 21, 2026
92e5ae8
feat(color): ambient OCIO config drives read color-metadata policy (s…
zachlewis Jul 21, 2026
0e82d1f
feat(color): complete spec-09 read precedence ladder with layer 5 (ma…
zachlewis Jul 21, 2026
ea582b2
feat(color): ambient config drives write color-metadata policy end-to…
zachlewis Jul 21, 2026
1182a5f
test(color): per-format round-trip corpus + policy robustness/opt-out…
zachlewis Jul 21, 2026
f2ad284
docs(colorinterop): document config-declared color policy (spec 09)
zachlewis Jul 21, 2026
d4bc8e6
feat(color): force colorInteropID into slotless formats (spec 09 Feat…
zachlewis Jul 21, 2026
40e8762
feat(color): verbose/redundant metadata emission (spec 09 Feature 2)
zachlewis Jul 21, 2026
bf50c54
feat(color): composable +/- layer-3 profile selection (spec 09 Featur…
zachlewis Jul 21, 2026
42513c8
feat(color): g26_p3d65 write-canonical mapping in oiio:default (spec 09)
zachlewis Jul 21, 2026
e9c0c5c
feat(color): oiio:broadcast delivery profile for P3 content (spec 09)
zachlewis Jul 21, 2026
bcdd9b1
feat(png): write and read SMPTE ST 2086 mDCV mastering-display volume
zachlewis Jul 22, 2026
c3470c0
docs(color): note mDCV format applicability in write-caps
zachlewis Jul 22, 2026
88f0f69
refactor(color): consistency pass on write-policy mechanism + fix bro…
zachlewis Jul 22, 2026
dbd4fb2
feat(color): real g26_p3d65->g26_xyzd65 write conversion + dcdm_p3d65…
zachlewis Jul 22, 2026
6c3c7c3
build(color): register interop registry .ocio as a configure dependency
zachlewis Jul 23, 2026
54d0c79
fix(color): dcdm_p3d65_display is read-only -- never a write/derive t…
zachlewis Jul 24, 2026
31bc58a
fix(color): reserve the 'local' namespace from the interop-id attribu…
zachlewis Jul 27, 2026
ee6a4f2
refactor(color): freeze ColorConfig's OCIO configs as ConstConfigRcPtr
zachlewis Jul 27, 2026
2a68b18
fix(color): synthesize icc: ids with a guaranteed 64-bit hash
zachlewis Jul 27, 2026
67160e4
fix(color): locale-independent lowercasing for utility-token matching
zachlewis Jul 27, 2026
048a78f
feat(color): ColorConfig::serialize -- config text as evidence of memory
zachlewis Jul 27, 2026
526cd10
feat(color): ColorConfig::from_text -- construct a config from memory
zachlewis Jul 27, 2026
57f07b7
feat(color): ColorConfig::archive -- .ocioz config archiving
zachlewis Jul 27, 2026
c393af5
feat(color): ColorConfig::evolve -- copy-on-modify config derivation
zachlewis Jul 27, 2026
44c3e56
feat(color): ColorConfig::getDebugInfo -- one-call diagnostic snapshot
zachlewis Jul 27, 2026
b2f9a22
feat(color): ColorConfig::clear_caches -- drop per-config cached state
zachlewis Jul 27, 2026
de98371
test(color): pin sRGB-vs-gamma-2.2 transfer-curve discrimination
zachlewis Jul 28, 2026
365999d
fix(color): collapse derived unknown-markers at the writer boundary
zachlewis Jul 28, 2026
b2680ad
fix(color): honor write:interop_id at every slotless writer boundary
zachlewis Jul 28, 2026
0ba0386
fix(color): a marker derives to itself, never to another marker
zachlewis Jul 28, 2026
93975fe
style: clang-format the branch's C++ to the CI-pinned version
zachlewis Jul 28, 2026
c216154
build: require clang-format < 18 for the clang-format target
zachlewis Jul 28, 2026
7a316a1
style: clang-format the remaining 33 files flagged by CI
zachlewis Jul 28, 2026
f08271f
fix(jpegxl): declare supports("cicp") so authored tuples are not stri…
zachlewis Jul 28, 2026
a8a5ef8
test(png): refresh references for the source-provenance attributes
zachlewis Jul 28, 2026
58c80fe
test: silence OpenColorIO log output across the testsuite
zachlewis Jul 28, 2026
493f62a
test: gate cICP-dependent assertions on libpng capability
zachlewis Jul 28, 2026
8749cc7
feat(color): add ColorConfig::resolve(name, failover) overload
zachlewis Jul 28, 2026
de7f088
feat(color): reserve profile/policies fields on the color options str…
zachlewis Jul 28, 2026
27895fe
feat(color): replace getDebugInfo() with structured get_debug_info()
zachlewis Jul 28, 2026
cddbd54
feat(oiiotool): rename --colorspacesearch gamut= to chromaticities=
zachlewis Jul 28, 2026
b57b440
test(python): cover OpenImageIO.color_interop_ids()
zachlewis Jul 28, 2026
4a80e87
docs(color): note that DebugInfoOptions travels with get_debug_info()
zachlewis Jul 28, 2026
afd33c3
test(png): take the old-libpng reference from a real old-libpng run
zachlewis Jul 28, 2026
380412c
refactor(color)!: remove color_interop_ids.h and ColorInteropIDs::all()
zachlewis Jul 28, 2026
678d71b
feat(color): add ColorConfig::get_builtin_interop_ids()
zachlewis Jul 28, 2026
9952513
Merge branch 'zl-api-3.2-decisions' into zl-interop-dev
zachlewis Jul 29, 2026
5f91e84
docs(color): label the interop_id-attribute resolve tier an OIIO exte…
zachlewis Jul 29, 2026
90b4029
refactor(color): keep interop incubation private
zachlewis Aug 2, 2026
7b10772
refactor(color): keep 3.2 interop incubation private
zachlewis Aug 2, 2026
8fd7655
api(color): hide internal ColorConfig move support
zachlewis Aug 3, 2026
a8573c1
docs(color): sync colorinterop.rst planned section with implemented s…
zachlewis Aug 10, 2026
8d8bf40
build(cmake): block Homebrew config packages from local dep child builds
zachlewis Aug 10, 2026
7e7bfa8
fix(color): don't return a dangling pointer for shared-view color spa…
zachlewis Aug 10, 2026
82c3e43
test(color): account for OCIO < 2.5 dropping authored interop_id keys
zachlewis Aug 10, 2026
368b1b5
test: old-libpng references for colorpolicy-config and colorroundtrip
zachlewis Aug 10, 2026
69a56e0
Merge branch 'zl-fix-colorinterop-rst-stale' into zl-interop-dev-3.2
zachlewis Aug 10, 2026
df8fa99
fix(color): derive interop ids for names the active config cannot res…
zachlewis Aug 10, 2026
26f6f42
Merge branch 'zl-fix-ocio24-warnings' into zl-interop-dev-3.2
zachlewis Aug 10, 2026
8192d5e
build: fix declaration mismatch for unity builds on Windows (#5360)
lgritz Aug 3, 2026
1253bb0
test: silence debug-build DBG leakage; satisfy clang-format 17
zachlewis Aug 10, 2026
d133f81
Merge branch 'zl-fix-ocio24-warnings' into zl-interop-dev-3.2
zachlewis Aug 10, 2026
624b349
refactor: post-review cleanup of the OCIO-compat and metadata fixes
zachlewis Aug 10, 2026
809d1ce
Merge branch 'zl-fix-ocio24-warnings' into zl-interop-dev-3.2
zachlewis Aug 10, 2026
67633d9
test(cmake): skip shell-scripted color tests on Windows
zachlewis Aug 10, 2026
e2b8d7b
Merge branch 'zl-fix-ocio24-warnings' into zl-interop-dev-3.2
zachlewis Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ Release 3.2 (target: Sept 2026?) -- compared to 3.1
- *oiiotool*: New `--nchannels` flag to specify the number of output channels, for parity with maketx. [#5198](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5198) (by Danny Greenstein) (3.2.0.3, 3.1.14.0)
- *oiiotool*: Commands taking offsets or geometry arguments now accept commas as alternative separators (e.g., `X,Y` or `WxH,X,Y` in addition to the X11-style `+X+Y` form). This affects `--create`, `--crop`, `--cut`, `--fit`, `--fullsize`, `--origin`, `--originoffset`, `--paste`, `--pattern`, `--printstats`, `--resize`. [#5209](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5209) (3.2.0.3, 3.1.14.0)
- *oiiotool*: Be more cautious about implicit promotion to float when `--autocc` is used alongside explicit color space names. [#5192](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5192) (3.2.0.3, 3.1.14.0)
- *oiiotool*: New `--colorspacesearch` flag prints the color spaces in the active config whose derivable characteristics match a partial description, without needing to know the config's naming conventions. Each hint axis is a comma-separated list of terms via the modifiers `chromaticities=` (shorthand `chrm=`), `transfer_function=`, `encoding=`, `image_state=`, with inclusion toggles `include_inactive=`, `include_context_sensitive=`, `include_complex=`, `authored_encoding_only=`; colon-bearing terms may be passed as quoted modifier values. [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
- *oiiotool*: New `--colorwriteplan FORMAT` flag prints, without writing any file, the color metadata OIIO would write for the current top image to the named format -- per signal: the verdict (write/derive/suppress/omit), the value, and which policy layer decided it (builtin default, global attribute, per-spec attribute, explicit metadata, or format incapability). [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
- *oiiotool*: New `--colorinfo COLORSPACES` flag prints, for each color space in a comma-separated list (or for the current top image's color space if the list is empty), the characterization info available from the active config -- image state, color interop ID, encoding, range, and cached derived facts -- one row per field with an available/derived/unavailable/uncomputed marker. It is a tool-facing diagnostic and does no new probing or derivation. [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
* *Command line utilities*:
- *iv*: Flip, rotate and save image [#5003](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5003) (by Valery Angelique) (3.2.0.0, 3.1.11.0)
- *iconvert*: Allow `-o outfile` for output file designation, for parity with oiiotool syntax. [#5173](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5173) (3.2.0.3, 3.1.14.0)
Expand Down Expand Up @@ -54,6 +57,10 @@ Release 3.2 (target: Sept 2026?) -- compared to 3.1
- *jpeg-xl*: CICP read and write support for JPEG-XL [#4968](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4968) (by Brecht Van Lommel) (3.2.0.0, 3.1.9.0)
- *jpeg-xl*: ICC read and write for JPEG-XL files (issue 4649) [#4905](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4905) (by shanesmith-dwa) (3.0.14.0, 3.2.0.0)
- *color mgmt*: For OCIO built-in configs, replace the default file rules with more sensible ones that avoid spurious matches (e.g., no longer assumes all `.exr` files use ACES2065-1 primaries). [#5194](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5194) (3.2.0.3, 3.1.14.0)
- *color mgmt*: Map the CICP Rec.709 primaries + sRGB-transfer tuple to display-referred sRGB (`srgb_rec709_display`) rather than the scene-referred entry, so CICP-tagged reads resolve to the intended display encoding. [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
- *color mgmt*: `ColorConfig` color and display conversions now bridge across differing OCIO configs through the `aces_interchange` role, so a source space known only to a foreign config can be reconciled into the active config. When the two configs are not color-interoperable and OCIO strict parsing is off, the conversion falls back to a pass-through that leaves pixels untouched and keeps the honest source color-space tag instead of mistagging the result with the requested destination; a once-per-config interoperability warning is emitted (debug-gated). [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
- *ImageBufAlgo* **behavior change**: the color-aware operations (`colorconvert`, `ociolook`, `ociodisplay`, `ociofiletransform`) now automatically maintain the output's color metadata as a best-effort convenience. When the resulting space is known, the operation updates `oiio:ColorSpace`, maintains the new cheap current-state descriptor attributes `oiio:ColorSpace:state` / `:encoding` / `:range` / `:equality_id` (each present only when its value is actually known -- updated or erased, never guessed or derived), and removes stale file-provenance attributes (`colorInteropID`, `CICP`, `ICCProfile`, `chromaticities`, `oiio:Gamma`, `acesImageContainerFlag`) that described the pre-operation source. This scrub now applies uniformly whether the source space was named explicitly or inferred from metadata (previously only the inferred-source path scrubbed), so callers should set metadata overrides after the last color operation. `ociofiletransform` with an arbitrary LUT now erases the color-space verdict and related metadata entirely (the resulting space cannot be known and absence is the honest answer), unless the file's name identifies the result space via the config's file rules, which keeps its longstanding tagging behavior. `ociolook` and `ociodisplay` gain the same untagged-source inference `colorconvert` already had, and space-preserving no-ops (data spaces, cross-config pass-throughs) now leave still-true metadata untouched. The deliberate unknown-marker family (`ocio:unknown` / `oiio:unknown` / `error:unknown`) is always honored and never scrubbed. Automatic tracking is documented as a convenience, not a contract: tracking gaps are not errors, but under a strict resolution scope an operation whose source cannot be resolved now errors (via the usual `has_error()` convention) instead of silently guessing, honoring a config-declared `error:unknown` catch space when the config also enables strict parsing. [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
- *color mgmt* **behavior enrichment**: `ColorConfig::set_colorspace()` (and the `ImageSpec::set_colorspace()` / free-function conveniences that route through it) now applies the same two-bucket color-metadata hygiene as the color-aware `ImageBufAlgo` operations. Asserting a different color space than the spec already claims scrubs every now-contradicting file-provenance attribute (`colorInteropID`, `CICP`, `chromaticities`, `ICCProfile`, `oiio:Gamma`, `acesImageContainerFlag`, plus the longstanding `Exif:ColorSpace` / `tiff:*` invalidations), and maintains -- update-or-erase from the cheap characterization, never guessed or derived -- any `oiio:ColorSpace:state` / `:encoding` / `:range` / `:equality_id` current-state descriptors the spec carries. An empty name now erases all of it (verdict, facts, and descriptors: assume nothing). First tagging of an untagged spec and re-assertion of the current space keep their previous behavior exactly, so read paths that derive the tag from just-read metadata are unchanged. [#XXXX](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/XXXX) (3.2.0.4)
* Other notable new feature:
- *tiff*: Support for GPS metadata fields (latitude, longitude, altitude, timestamp, and related EXIF GPS fields) when using libTIFF 4.2+. [#5050](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5050) (3.2.0.1, 3.1.12.0)
- *heif*: Add IOProxy support for both input and output [#5017](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/5017) (by Brecht Van Lommel) (3.2.0.0, 3.1.10.0)
Expand Down
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,17 @@ if (IGNORE_HOMEBREWED_DEPS)
)
endforeach ()

# CMAKE_IGNORE_PATH only blocks exact directories; config packages
# (e.g. <prefix>/lib/cmake/Imath) are found by prefix search and slip
# through. CMAKE_IGNORE_PREFIX_PATH (CMake 3.23+) blocks the whole
# prefix, and dependency_utils forwards it to local dependency child
# builds so they cannot resolve a different Homebrew copy than the
# parent (e.g. Homebrew Imath 3.2 inside a local OpenEXR build while
# OIIO links the local-dist Imath -- a mangled-symbol link failure).
list (APPEND CMAKE_IGNORE_PREFIX_PATH ${HOMEBREW_PREFIXES})

message (STATUS "CMAKE_IGNORE_PATH: ${CMAKE_IGNORE_PATH}")
message (STATUS "CMAKE_IGNORE_PREFIX_PATH: ${CMAKE_IGNORE_PREFIX_PATH}")
endif ()


Expand Down
14 changes: 14 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,20 @@ clang-format is installed on your local machine, and just run

make clang-format

**clang-format must be older than version 18.** It is an optional dev
dependency, but a version-sensitive one: clang-format's output is not stable
across major releases, so a newer binary will reformat the entire tree in a
way the CI check then rejects. CI pins clang-format 17, and the build
configuration enforces the same bound — if the clang-format it finds is 18 or
newer, it prints a warning and disables the `clang-format` target rather than
let you reformat the tree incorrectly.

If your system clang-format is too new, either install a 17.x build and point
the configuration at it with `CLANG_FORMAT_EXE_HINT=/path/to/its/bin`, or run
the pinned version directly without installing anything:

uvx clang-format@17.0.6 --style=file -i <files>

and it will automatically reformat your code according to the configuration
file found in the `.clang-format` file at the root directory of the OIIO
source code checkout.
Expand Down
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ CXXFLAGS = "-Wno-error=stringop-overflow -Wno-pragmas"
SKBUILD_CMAKE_BUILD_TYPE = "MinSizeRel"
# FIXME: Getting build problems when using WebP 1.6.0, so hold it back
WebP_BUILD_VERSION = "1.5.0"
# The commit hash pin in src/cmake/build_WebP.cmake is for v1.6.0; override
# it to the v1.5.0 commit to match the held-back version above, else the
# tag-verification check fails the wheel build.
WebP_GIT_COMMIT = "a4d7a715337ded4451fec90ff8ce79728e04126c"

[tool.cibuildwheel.windows.environment]
SKBUILD_CMAKE_BUILD_TYPE = "MinSizeRel"
Expand Down
42 changes: 40 additions & 2 deletions src/cmake/compiler.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -630,8 +630,46 @@ if (PROJECT_IS_TOP_LEVEL)
NO_DEFAULT_PATH
DOC "Path to clang-format executable")
find_program (CLANG_FORMAT_EXE NAMES clang-format bin/clang-format)
# clang-format is an OPTIONAL dev dependency, but a version-sensitive one:
# its output is not stable across major releases, so a newer binary will
# happily reformat the whole tree in a way the CI check then rejects. The
# CI matrix pins clang-format-17 (see CLANG_FORMAT_EXE dance in ci.yml), so
# accept only < 18 and otherwise decline to wire the target -- reformatting
# with the wrong version is strictly worse than not reformatting at all.
set (CLANG_FORMAT_USABLE OFF)
if (CLANG_FORMAT_EXE)
message (STATUS "clang-format found: ${CLANG_FORMAT_EXE}")
set (CLANG_FORMAT_USABLE ON)
execute_process (COMMAND "${CLANG_FORMAT_EXE}" --version
OUTPUT_VARIABLE CLANG_FORMAT_VERSION_OUTPUT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _cf_result)
if (_cf_result EQUAL 0 AND
CLANG_FORMAT_VERSION_OUTPUT MATCHES "([0-9]+)\\.[0-9]+\\.[0-9]+")
set (CLANG_FORMAT_VERSION_MAJOR ${CMAKE_MATCH_1})
else ()
set (CLANG_FORMAT_VERSION_MAJOR "")
endif ()
if (NOT CLANG_FORMAT_VERSION_MAJOR)
message (STATUS "clang-format found (${CLANG_FORMAT_EXE}) but its "
"version could not be determined -- skipping the "
"clang-format target.")
set (CLANG_FORMAT_USABLE OFF)
elseif (CLANG_FORMAT_VERSION_MAJOR GREATER_EQUAL 18)
message (WARNING
"clang-format ${CLANG_FORMAT_VERSION_MAJOR} found at "
"${CLANG_FORMAT_EXE}, but this project requires "
"clang-format < 18 (CI pins 17). Its output differs from "
"17's, so 'make clang-format' would reformat the tree in "
"a way CI rejects. The 'clang-format' target is disabled. "
"Install a 17.x binary and point CLANG_FORMAT_EXE_HINT at "
"it, or run the pinned version directly with no install: "
"uvx clang-format@17.0.6 --style=file -i <files>")
set (CLANG_FORMAT_USABLE OFF)
endif ()
endif ()
if (CLANG_FORMAT_USABLE)
message (STATUS "clang-format found: ${CLANG_FORMAT_EXE} "
"(version ${CLANG_FORMAT_VERSION_MAJOR})")
# Start with the list of files to include when formatting...
file (GLOB_RECURSE FILES_TO_FORMAT ${CLANG_FORMAT_INCLUDES})
# ... then process any list of excludes we are given
Expand All @@ -644,7 +682,7 @@ if (PROJECT_IS_TOP_LEVEL)
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
add_custom_target (clang-format
COMMAND "${CLANG_FORMAT_EXE}" -i -style=file ${FILES_TO_FORMAT} )
else ()
elseif (NOT CLANG_FORMAT_EXE)
message (STATUS "clang-format not found.")
endif ()
endif ()
Expand Down
13 changes: 9 additions & 4 deletions src/cmake/dependency_utils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -727,10 +727,15 @@ macro (build_dependency_with_cmake pkgname)

# Make sure to inherit CMAKE_IGNORE_PATH
set(_pkg_CMAKE_ARGS ${_pkg_CMAKE_ARGS} ${_pkg_CMAKE_ARGS})
if (CMAKE_IGNORE_PATH)
string(REPLACE ";" "\\;" CMAKE_IGNORE_PATH_ESCAPED "${CMAKE_IGNORE_PATH}")
list(APPEND _pkg_CMAKE_ARGS "-DCMAKE_IGNORE_PATH=${CMAKE_IGNORE_PATH_ESCAPED}")
endif()
# CMAKE_IGNORE_PREFIX_PATH too: unlike CMAKE_IGNORE_PATH it also blocks
# config-package prefix search, so child builds cannot resolve a system
# (e.g. Homebrew) copy of a dependency the parent build is ignoring.
foreach (_ignore_var IN ITEMS CMAKE_IGNORE_PATH CMAKE_IGNORE_PREFIX_PATH)
if (${_ignore_var})
string(REPLACE ";" "\\;" _ignore_escaped "${${_ignore_var}}")
list(APPEND _pkg_CMAKE_ARGS "-D${_ignore_var}=${_ignore_escaped}")
endif()
endforeach()

# Pass along any CMAKE_MSVC_RUNTIME_LIBRARY
if (WIN32 AND CMAKE_MSVC_RUNTIME_LIBRARY)
Expand Down
18 changes: 18 additions & 0 deletions src/cmake/testing.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,8 @@ macro (oiio_add_all_tests)
set (nanobind_python_test_suffix ".nanobind")
if (OIIO_BUILD_PYTHON_PYBIND11)
oiio_add_tests (
colorinfo
colorspacesearch
docs-examples-python
python-colorconfig
python-deep
Expand All @@ -279,6 +281,8 @@ macro (oiio_add_all_tests)
python-roi
python-texturesys
python-typedesc
sourceprovenance
cicp-write-strip
filters
ENVIRONMENT "${_pybind_tests_pythonpath}"
)
Expand All @@ -302,8 +306,22 @@ macro (oiio_add_all_tests)
endif ()

oiio_add_tests (oiiotool-color
color-interop-convert
FOUNDVAR OpenColorIO_FOUND)

# These color tests drive oiiotool through POSIX-shell constructs
# (per-command `env VAR=` prefixes, single-quoted echo, grep pipelines)
# that cmd.exe cannot run; skip them on Windows until they are
# rewritten portably. The behavior they exercise is platform-neutral.
if (NOT WIN32)
oiio_add_tests (oiiotool-colorwriteplan)
oiio_add_tests (oiiotool-colorpolicy-config
oiiotool-colorroundtrip
oiiotool-colorverbose
oiiotool-colorprofile
FOUNDVAR OpenColorIO_FOUND)
endif ()

# Tests to run with HWY enabled.
# Remember to add tests here as hwy enabled IBA functions are added
oiio_add_tests ( oiiotool
Expand Down
Loading