Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
189 changes: 103 additions & 86 deletions Cargo.lock

Large diffs are not rendered by default.

54 changes: 27 additions & 27 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -121,46 +121,46 @@ proptest = { version = "1.11", default-features = false, features = ["std", "bit
# crates.io round-trip; `version` is the requirement recorded in the published manifest.
# Versions are independent per crate β€” release-plz rewrites these requirements automatically
# when a dependency's version bumps.
gamut-core = { path = "crates/gamut-core", version = "2.0.1" }
gamut-color = { path = "crates/gamut-color", version = "2.0.0" }
gamut-dsp = { path = "crates/gamut-dsp", version = "2.0.0" }
gamut-bitstream = { path = "crates/gamut-bitstream", version = "0.2.3" }
gamut-core = { path = "crates/gamut-core", version = "2.1.0" }
gamut-color = { path = "crates/gamut-color", version = "3.0.0" }
gamut-dsp = { path = "crates/gamut-dsp", version = "2.0.1" }
gamut-bitstream = { path = "crates/gamut-bitstream", version = "0.2.4" }
# The shared codestream-backend seam (issue #272): repr(C) vtables + object-safe Rust twins that
# let a foreign/alternate codec backend plug into any format crate. no_std, dependency-free.
gamut-codec-abi = { path = "crates/gamut-codec-abi", version = "0.1.1" }
gamut-deflate = { path = "crates/gamut-deflate", version = "0.1.0" }
gamut-png = { path = "crates/gamut-png", version = "0.1.0" }
gamut-codec-abi = { path = "crates/gamut-codec-abi", version = "0.1.2" }
gamut-deflate = { path = "crates/gamut-deflate", version = "0.1.1" }
gamut-png = { path = "crates/gamut-png", version = "0.1.1" }
# JPEG-1 (ISO/IEC 10918 / ITU-T T.81) codec (issue #28).
gamut-jpeg = { path = "crates/gamut-jpeg", version = "0.1.0" }
gamut-isobmff = { path = "crates/gamut-isobmff", version = "2.0.1" }
gamut-jpeg = { path = "crates/gamut-jpeg", version = "0.1.1" }
gamut-isobmff = { path = "crates/gamut-isobmff", version = "2.1.0" }
gamut-riff = { path = "crates/gamut-riff", version = "1.0.0" }
gamut-av1 = { path = "crates/gamut-av1", version = "0.4.1" }
gamut-av2 = { path = "crates/gamut-av2", version = "0.1.3" }
gamut-avif = { path = "crates/gamut-avif", version = "1.1.0" }
gamut-av1 = { path = "crates/gamut-av1", version = "0.5.0" }
gamut-av2 = { path = "crates/gamut-av2", version = "0.1.4" }
gamut-avif = { path = "crates/gamut-avif", version = "2.0.0" }
# `default-features = false` so consumers pick their halves: gamut-dng needs only the pure-Rust
# `decode`; the umbrella re-enables both.
gamut-jxl = { path = "crates/gamut-jxl", version = "0.4.0", default-features = false }
gamut-jxl = { path = "crates/gamut-jxl", version = "0.5.0", default-features = false }
# Static libjxl build + hand-written FFI for gamut-jxl's encoder. Unlike every other shipped crate,
# building this one runs cmake to compile libjxl (see its README); `links = "jxl"`.
gamut-jxl-sys = { path = "crates/gamut-jxl-sys", version = "0.1.0" }
gamut-webp = { path = "crates/gamut-webp", version = "0.3.1" }
gamut-heic = { path = "crates/gamut-heic", version = "0.2.2" }
gamut-vvc = { path = "crates/gamut-vvc", version = "0.2.1" }
gamut-tonemap = { path = "crates/gamut-tonemap", version = "1.0.0" }
gamut-jxl-sys = { path = "crates/gamut-jxl-sys", version = "0.1.1" }
gamut-webp = { path = "crates/gamut-webp", version = "0.4.0" }
gamut-heic = { path = "crates/gamut-heic", version = "0.2.3" }
gamut-vvc = { path = "crates/gamut-vvc", version = "0.2.2" }
gamut-tonemap = { path = "crates/gamut-tonemap", version = "1.1.0" }
# Image metadata primitives (issue #34): the shared TIFF/IFD core plus per-format crates.
gamut-ifd = { path = "crates/gamut-ifd", version = "2.0.1" }
gamut-icc = { path = "crates/gamut-icc", version = "1.0.0" }
gamut-ifd = { path = "crates/gamut-ifd", version = "3.0.0" }
gamut-icc = { path = "crates/gamut-icc", version = "1.0.1" }
# ICC colour management module β€” applies profiles parsed by gamut-icc (issue #323).
gamut-cmm = { path = "crates/gamut-cmm", version = "0.1.0" }
gamut-xmp = { path = "crates/gamut-xmp", version = "1.0.0" }
gamut-exif = { path = "crates/gamut-exif", version = "1.0.0" }
gamut-iptc = { path = "crates/gamut-iptc", version = "1.0.0" }
gamut-metadata = { path = "crates/gamut-metadata", version = "1.0.0" }
gamut-xmp = { path = "crates/gamut-xmp", version = "1.1.0" }
gamut-exif = { path = "crates/gamut-exif", version = "1.1.0" }
gamut-iptc = { path = "crates/gamut-iptc", version = "1.0.1" }
gamut-metadata = { path = "crates/gamut-metadata", version = "2.0.0" }
# Self-contained TIFF 6.0 codec (issue #107).
gamut-tiff = { path = "crates/gamut-tiff", version = "1.0.0" }
gamut-tiff = { path = "crates/gamut-tiff", version = "1.1.0" }
# DNG raw-image codec (issue #109): a TIFF/EP profile built on gamut-ifd.
gamut-dng = { path = "crates/gamut-dng", version = "1.0.0" }
gamut = { path = "crates/gamut", version = "0.3.2" }
gamut-dng = { path = "crates/gamut-dng", version = "2.0.0" }
gamut = { path = "crates/gamut", version = "0.3.3" }

[profile.release]
lto = "thin"
Expand Down
31 changes: 31 additions & 0 deletions crates/gamut-av1/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.5.0](https://github.com/visualcommons/gamut/compare/gamut-av1-v0.4.1...gamut-av1-v0.5.0) - 2026-09-03

### Added

- *(av1)* parse OBUs and the AV1 sequence and frame headers
- *(av1)* [**breaking**] give every coded plane its own sample geometry
- *(av1)* adapt CDFs while coding tiles
- *(core)* add structured error diagnostics

### Fixed

- *(av1)* name monochrome when the decoder refuses a monochrome stream
- *(av1)* check every OBU's trailing bits against its declared size

### Other

- *(av1)* separate CDF adaptation from context independence
- merge feat/397-avif-alpha-aux into feat/398-av1-high-bitdepth
- Merge pull request #403 from visualcommons/feat/391-avif-422-profile2
- Merge pull request #402 from visualcommons/feat/390-avif-420-profile0
- *(av1)* kill the mutants the header layer pulled into the diff
- *(av1)* supply the monochrome flag at the header parse call sites
- Merge remote-tracking branch 'origin/master' into feat/259-avif-decoder
- *(av1)* kill the surviving tile-spacing and lr_params mutants
- *(av1)* cover the header syntax the encoders never emit
- *(av1)* check the decoder's header layer against libaom
- Merge pull request #394 from visualcommons/feat/389-av1-per-plane-geometry
- *(av1)* kill the mutants the geometry refactor pulled into the diff
- Merge branch 'master' into feat/335-avif-ycbcr-matrix
- *(av1)* record CDF adaptation in STATUS and README

## [0.4.1](https://github.com/justin13888/gamut/compare/gamut-av1-v0.4.0...gamut-av1-v0.4.1) - 2026-07-20

### Other
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-av1/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-av1"
description = "AV1 still-image (intra-frame) encoder β€” the standalone codec layer beneath AVIF."
version = "0.4.1"
version = "0.5.0"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
6 changes: 6 additions & 0 deletions crates/gamut-av2/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.1.4](https://github.com/visualcommons/gamut/compare/gamut-av2-v0.1.3...gamut-av2-v0.1.4) - 2026-09-03

### Other

- updated the following local packages: gamut-core, gamut-bitstream, gamut-color, gamut-dsp

## [0.1.3](https://github.com/justin13888/gamut/compare/gamut-av2-v0.1.2...gamut-av2-v0.1.3) - 2026-07-20

### Other
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-av2/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-av2"
description = "AV2 image encoder and decoder (intra-frame still-image coding from AOMedia Video 2, AV1's successor)."
version = "0.1.3"
version = "0.1.4"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
40 changes: 40 additions & 0 deletions crates/gamut-avif/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.0.0](https://github.com/visualcommons/gamut/compare/gamut-avif-v1.1.0...gamut-avif-v2.0.0) - 2026-09-03

### Added

- *(avif)* lower high-bit-depth jobs across the codec-abi seam
- *(avif)* [**breaking**] honour with_chroma on the 16-bit input path
- *(avif)* [**breaking**] default lossy output to 4:2:0 and expose the chroma format
- *(gamut-avif)* add the high-bit-depth RGBA16 presentation surface
- *(core)* add structured error diagnostics
- *(gamut-isobmff)* parse large and uuid boxes

### Fixed

- *(avif)* send the backend the chroma the planes actually carry

### Other

- *(avif)* close the crate's first mutation survey
- *(isobmff)* drop imports the moved tests no longer use
- *(isobmff)* share the segment walk with avif and heic
- *(avif)* separate grid cropping from tile placement
- *(avif)* pin the sequence-header chroma derivation directly
- merge feat/398-av1-high-bitdepth into feat/399-avif-16bit-inputs
- merge feat/397-avif-alpha-aux into feat/398-av1-high-bitdepth
- merge origin/master into feat/397-avif-alpha-aux
- Merge pull request #403 from visualcommons/feat/391-avif-422-profile2
- Merge pull request #402 from visualcommons/feat/390-avif-420-profile0
- *(avif)* say precisely when with_chroma is ignored
- Merge remote-tracking branch 'origin/master' into feat/390-avif-420-profile0
- close the remaining chroma mutation gaps
- merge origin/master into feat/390-avif-420-profile0
- cover the chroma derivations directly, not through an encode
- Merge pull request #394 from visualcommons/feat/389-av1-per-plane-geometry
- derive chroma plane sizes from one shared rule
- adopt as_chunks for constant-size slice chunking
- Merge branch 'master' into feat/335-avif-ycbcr-matrix
- Merge pull request #360 from visualcommons/feat/303-high-bit-depth-presentation
- pin the blend rounding and the high-bit-depth paths mutation testing missed
- record the high-bit-depth presentation surface in STATUS and READMEs

## [1.1.0](https://github.com/justin13888/gamut/compare/gamut-avif-v1.0.0...gamut-avif-v1.1.0) - 2026-07-20

### Added
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-avif/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-avif"
description = "Pure-Rust AVIF still-image encoder and container decoder β€” lossless and lossy AV1 intra frames in an ISOBMFF/MIAF container, with a pluggable AV1 codestream-decoder hook."
version = "1.1.0"
version = "2.0.0"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
18 changes: 18 additions & 0 deletions crates/gamut-bitstream/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.2.4](https://github.com/visualcommons/gamut/compare/gamut-bitstream-v0.2.3...gamut-bitstream-v0.2.4) - 2026-09-03

### Added

- *(bitstream)* add the AV1 bit reader and symbol decoder

### Fixed

- *(bitstream)* compute ns(n) in u64 so n >= 2^31 does not overflow
- *(bitstream)* implement all three of exit_symbol's conformance checks
- *(bitstream)* bound the symbol search by the alphabet, not by the CDF

### Other

- *(bitstream)* pin read_f's zero padding and retire two hang mutants
- *(bitstream)* cover read_golomb, which nothing exercised
- *(bitstream)* separate the leb128 length rule from the round trip

## [0.2.3](https://github.com/justin13888/gamut/compare/gamut-bitstream-v0.2.2...gamut-bitstream-v0.2.3) - 2026-07-20

### Other
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-bitstream/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-bitstream"
description = "Low-level bit readers/writers and entropy coders (ANS, arithmetic, Huffman) shared by gamut codecs."
version = "0.2.3"
version = "0.2.4"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
13 changes: 13 additions & 0 deletions crates/gamut-cli/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.3.2](https://github.com/visualcommons/gamut/compare/gamut-cli-v0.3.1...gamut-cli-v0.3.2) - 2026-09-03

### Added

- *(cli)* decode PNG and JPEG through gamut's own decoders

### Other

- merge origin/master into feat/261-webp-encoder-knobs
- adopt as_chunks for constant-size slice chunking
- merge origin/master into feat/268-pixel-conversion
- merge origin/master into feat/268-pixel-conversion

## [0.3.1](https://github.com/visualcommons/gamut/compare/gamut-cli-v0.3.0...gamut-cli-v0.3.1) - 2026-07-30

### Other
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-cli"
description = "Sandbox CLI for the gamut codecs: decode PNG/JPEG/PPM/WebP/JXL and encode AVIF/WebP/TIFF/PNG/JXL/JPEG, plus inspection of the shared color/dsp/bitstream primitives (e.g. `gamut convert input.png output.avif`)."
version = "0.3.1"
version = "0.3.2"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
36 changes: 36 additions & 0 deletions crates/gamut-cmm/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,39 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.1.0](https://github.com/visualcommons/gamut/releases/tag/gamut-cmm-v0.1.0) - 2026-09-03

### Added

- *(cmm)* [**breaking**] take pipeline optimization on every transform constructor
- *(cmm)* collapse pipeline stages behind an opt-in optimization level
- *(gamut-cmm)* LUT pipelines and per-intent tag selection
- *(gamut-cmm)* matrix/TRC shaper pipelines and the chad convention
- *(gamut-cmm)* N-D multilinear and tetrahedral CLUT interpolation
- *(gamut-cmm)* tone-curve tables and monotonic inversion
- *(gamut-cmm)* new crate with the pipeline/stage model

### Fixed

- *(cmm)* sweep the full input domain and re-pin the conformance bounds

### Other

- deny unsafe in the hot-path crates instead of forbidding it
- *(cmm)* share one generator across the six oracle suites
- *(cmm)* drop the unreachable axis guard on CLUT resampling
- *(cmm)* record pipeline optimization in the README and status ledger
- *(cmm)* benchmark buffer throughput off, on, and against lcms2
- *(cmm)* gate the optimized paths against the lcms2 precision budget
- merge origin/master into feat/330-cmm-chaining-conformance
- merge origin/master into feat/329-cmm-intents-bpc
- merge origin/master into feat/328-cmm-lut-pipelines
- *(gamut-cmm)* record the LUT-phase settled decisions
- *(gamut-cmm)* pin LUT profiles and intent selection against Little-CMS
- *(gamut-cmm)* record the shaper and chad settled decisions
- *(gamut-cmm)* pin shaper profiles against Little-CMS
- *(gamut-cmm)* transcribe the tetrahedral decomposition
- *(gamut-cmm)* pin CLUT interpolation against Little-CMS
- *(gamut-cmm)* record the tone-curve phase decisions
- *(gamut-cmm)* pin tone curves against Little-CMS
7 changes: 7 additions & 0 deletions crates/gamut-codec-abi/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.1.2](https://github.com/visualcommons/gamut/compare/gamut-codec-abi-v0.1.1...gamut-codec-abi-v0.1.2) - 2026-09-03

### Other

- *(codec-abi)* cover the borrowed-backend blanket impls
- *(codec-abi)* split the seam's tests by the claim each one pins

## [0.1.1](https://github.com/justin13888/gamut/compare/gamut-codec-abi-v0.1.0...gamut-codec-abi-v0.1.1) - 2026-07-21

### Other
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-codec-abi/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-codec-abi"
description = "Shared codestream-backend ABI: repr(C) vtables + object-safe Rust twins for pluggable/FFI codec backends."
version = "0.1.1"
version = "0.1.2"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
31 changes: 31 additions & 0 deletions crates/gamut-color/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [3.0.0](https://github.com/visualcommons/gamut/compare/gamut-color-v2.0.0...gamut-color-v3.0.0) - 2026-09-03

### Added

- *(avif)* [**breaking**] honour with_chroma on the 16-bit input path
- *(color)* report the coded plane count of a chroma layout
- *(dng)* type AsShotWhiteXY and derive its camera neutral per DNG 1.7.1 Β§6
- *(color)* correlated colour temperature by Robertson's method
- *(gamut-color)* add CIELab, LCh, xyY, Ξ”Eβ‚€β‚€, and the ICC PCS encodings
- *(core)* add structured error diagnostics
- add optional serde support to public enums

### Other

- deny unsafe in the hot-path crates instead of forbidding it
- *(color)* pin each Lab encoding claim separately
- *(dsp)* share one deterministic generator across the transform sweeps
- *(color)* pin the 16-bit box average to its exact value
- merge feat/398-av1-high-bitdepth into feat/399-avif-16bit-inputs
- merge feat/397-avif-alpha-aux into feat/398-av1-high-bitdepth
- merge origin/master into feat/397-avif-alpha-aux
- Merge branch 'feat/390-avif-420-profile0' into feat/391-avif-422-profile2
- Merge remote-tracking branch 'origin/master' into feat/390-avif-420-profile0
- Merge pull request #394 from visualcommons/feat/389-av1-per-plane-geometry
- Merge pull request #392 from visualcommons/feat/349-dng-asshotwhitexy
- merge origin/master into feat/322-lcms2-oracle-transforms
- merge origin/master into feat/321-color-cielab-de2000
- *(gamut-color)* state the fast-floor gap instead of denying it
- *(gamut-color)* kill the surviving lab mutants
- *(color)* vendor the Sharma CIEDE2000 paper and Lab references

## [2.0.0](https://github.com/justin13888/gamut/compare/gamut-color-v1.1.0...gamut-color-v2.0.0) - 2026-07-20

### Added
Expand Down
2 changes: 1 addition & 1 deletion crates/gamut-color/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "gamut-color"
description = "Color primitives for gamut: CICP code points, coded-plane bit depth and chroma subsampling, identity and BT.601 YCbCr planar buffers, and f64 colour science (encoder-exact transfers, OKLab, gamut mapping)."
version = "2.0.0"
version = "3.0.0"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
Expand Down
18 changes: 18 additions & 0 deletions crates/gamut-core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.1.0](https://github.com/visualcommons/gamut/compare/gamut-core-v2.0.1...gamut-core-v2.1.0) - 2026-09-03

### Added

- *(core)* add format-agnostic pixel conversion
- *(core)* add full-range sample widening and narrowing
- *(core)* add fixed-point luma weights to luminance
- *(core)* add structured error diagnostics
- add optional serde support to public enums

### Other

- *(fuzz)* apply nightly rustfmt to the new targets
- *(fuzz)* drive the gamut-core and gamut-tonemap laws under libFuzzer
- *(core)* state the conversion engine's contract as executable laws
- close the mutation-testing gaps in the conversion paths
- *(core)* drive convert through the public API

## [2.0.1](https://github.com/justin13888/gamut/compare/gamut-core-v2.0.0...gamut-core-v2.0.1) - 2026-07-20

### Other
Expand Down
Loading