Repository navigation
1.4.0 — Recursive XMPValue, more RAW formats, C2PA thumbnails
Added
- NRW, SRW, and generic
.rawextension support —RawFormatnow listsnrw(Nikon Coolpix),srw(Samsung), andrawalongside the existing TIFF-based RAWs. Read and write parity with NEF / ARW / ORF / PEF via the sharedTIFFFileParser. ImageMetadata.extractC2PAThumbnails()— convenience accessor returning everyc2pa.thumbnail.claim.*/c2pa.thumbnail.ingredient.*assertion as aC2PAThumbnail(label, raw bytes, format suffix). Mirrors the existingextractThumbnail()pattern for EXIF IFD1 thumbnails.- Recursive
XMPValuefor nested structured schemas — Adobe Camera Raw'sMaskGroupBasedCorrections(rdf:Bag of corrections, each holding its own rdf:Bag of mask sub-structs), face regions inmwg-rs, and other recursive XMP shapes now ride the generic API instead of being hand-rolled. Both writer and reader recurse.
Changed
-
Breaking —
XMPValue.structurepayload is now[String: XMPValue](was[String: String]), andXMPValue.structuredArrayis[[String: XMPValue]](was[[String: String]]). Direct enum-pattern consumers must wrap field values as.simple(...)when constructing them, and unwrap when reading.Two new convenience accessors smooth the migration:
flatStructureValueandflatStructuredArrayValuereturn the legacy[String: String]shape by dropping any non-.simpleentries — useful for IPTC / xmpDM timecode / stRef schemas.XMPData.flattenandXMPData.wrapSimpleround-trip between the two forms. -
Build script drops macOS Intel —
Scripts/build-release.shnow ships macOS arm64 + Linux x86_64-musl + Linux aarch64-musl only.
Tests
1087 tests, 0 failures (14 new tests covering recursive XMP structures, C2PA thumbnail edge cases, and NRW write round-trip).