Skip to content

1.4.0 — Recursive XMPValue, more RAW formats, C2PA thumbnails

Choose a tag to compare

@aagedal aagedal released this 29 Apr 20:40
· 137 commits to main since this release

Added

  • NRW, SRW, and generic .raw extension support — RawFormat now lists nrw (Nikon Coolpix), srw (Samsung), and raw alongside the existing TIFF-based RAWs. Read and write parity with NEF / ARW / ORF / PEF via the shared TIFFFileParser.
  • ImageMetadata.extractC2PAThumbnails() — convenience accessor returning every c2pa.thumbnail.claim.* / c2pa.thumbnail.ingredient.* assertion as a C2PAThumbnail (label, raw bytes, format suffix). Mirrors the existing extractThumbnail() pattern for EXIF IFD1 thumbnails.
  • Recursive XMPValue for nested structured schemas — Adobe Camera Raw's MaskGroupBasedCorrections (rdf:Bag of corrections, each holding its own rdf:Bag of mask sub-structs), face regions in mwg-rs, and other recursive XMP shapes now ride the generic API instead of being hand-rolled. Both writer and reader recurse.

Changed

  • Breaking — XMPValue.structure payload is now [String: XMPValue] (was [String: String]), and XMPValue.structuredArray is [[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: flatStructureValue and flatStructuredArrayValue return the legacy [String: String] shape by dropping any non-.simple entries — useful for IPTC / xmpDM timecode / stRef schemas. XMPData.flatten and XMPData.wrapSimple round-trip between the two forms.

  • Build script drops macOS Intel — Scripts/build-release.sh now 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).