diff --git a/Cargo.lock b/Cargo.lock index 77485dc1..539b63f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -90,9 +90,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" dependencies = [ "derive_arbitrary", ] @@ -166,9 +166,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "block-buffer" @@ -228,9 +228,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" dependencies = [ "find-msvc-tools", "jobserver", @@ -249,9 +249,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cipher" @@ -276,9 +276,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -286,9 +286,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.2" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -299,21 +299,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "cmake" @@ -368,18 +368,18 @@ checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crypto-common" @@ -414,13 +414,13 @@ checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "derive_arbitrary" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +checksum = "1b034bd7d5f032402a2479444dcc6f74e36a03f31854d41680fb240ef682a1ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] @@ -442,7 +442,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "either" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" [[package]] name = "equivalent" @@ -527,23 +527,24 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "flate2" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.9.1", + "zlib-rs", ] [[package]] name = "gamut" -version = "0.3.2" +version = "0.4.0" dependencies = [ "gamut-av1", "gamut-av2", @@ -575,7 +576,7 @@ dependencies = [ [[package]] name = "gamut-av1" -version = "0.4.1" +version = "0.5.0" dependencies = [ "aom-oracle", "dav1d-oracle", @@ -588,7 +589,7 @@ dependencies = [ [[package]] name = "gamut-av2" -version = "0.1.3" +version = "0.1.4" dependencies = [ "gamut-bitstream", "gamut-color", @@ -598,7 +599,7 @@ dependencies = [ [[package]] name = "gamut-avif" -version = "1.1.0" +version = "2.0.0" dependencies = [ "dav1d-oracle", "divan", @@ -612,7 +613,7 @@ dependencies = [ [[package]] name = "gamut-bitstream" -version = "0.2.3" +version = "0.2.4" dependencies = [ "divan", "gamut-core", @@ -620,7 +621,7 @@ dependencies = [ [[package]] name = "gamut-cli" -version = "0.3.1" +version = "0.3.2" dependencies = [ "clap", "gamut", @@ -644,11 +645,11 @@ dependencies = [ [[package]] name = "gamut-codec-abi" -version = "0.1.1" +version = "0.1.2" [[package]] name = "gamut-color" -version = "2.0.0" +version = "3.0.0" dependencies = [ "divan", "gamut-core", @@ -659,7 +660,7 @@ dependencies = [ [[package]] name = "gamut-core" -version = "2.0.1" +version = "2.1.0" dependencies = [ "proptest", "serde", @@ -669,17 +670,17 @@ dependencies = [ [[package]] name = "gamut-deflate" -version = "0.1.0" +version = "0.1.1" dependencies = [ "divan", - "miniz_oxide", + "miniz_oxide 0.8.9", "zlib-oracle", "zopfli", ] [[package]] name = "gamut-dng" -version = "1.0.0" +version = "2.0.0" dependencies = [ "divan", "gamut-bitstream", @@ -692,7 +693,7 @@ dependencies = [ "gamut-jxl", "gamut-metadata", "libtiff-oracle", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -707,14 +708,14 @@ dependencies = [ [[package]] name = "gamut-dsp" -version = "2.0.0" +version = "2.0.1" dependencies = [ "divan", ] [[package]] name = "gamut-exif" -version = "1.0.0" +version = "2.0.0" dependencies = [ "exiv2-oracle", "gamut-core", @@ -725,7 +726,7 @@ dependencies = [ [[package]] name = "gamut-ffi" -version = "0.1.3" +version = "0.1.4" dependencies = [ "gamut", "gamut-codec-abi", @@ -733,7 +734,7 @@ dependencies = [ [[package]] name = "gamut-heic" -version = "0.2.2" +version = "0.3.0" dependencies = [ "gamut-codec-abi", "gamut-color", @@ -745,7 +746,7 @@ dependencies = [ [[package]] name = "gamut-icc" -version = "1.0.0" +version = "2.0.0" dependencies = [ "gamut-color", "gamut-core", @@ -756,7 +757,7 @@ dependencies = [ [[package]] name = "gamut-ifd" -version = "2.0.1" +version = "3.0.0" dependencies = [ "divan", "gamut-core", @@ -765,7 +766,7 @@ dependencies = [ [[package]] name = "gamut-iptc" -version = "1.0.0" +version = "1.1.0" dependencies = [ "divan", "gamut-core", @@ -785,7 +786,7 @@ dependencies = [ [[package]] name = "gamut-isobmff" -version = "2.0.1" +version = "3.0.0" dependencies = [ "divan", "gamut-core", @@ -793,7 +794,7 @@ dependencies = [ [[package]] name = "gamut-jpeg" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gamut-codec-abi", "gamut-color", @@ -805,7 +806,7 @@ dependencies = [ [[package]] name = "gamut-jxl" -version = "0.4.0" +version = "0.5.0" dependencies = [ "gamut-codec-abi", "gamut-core", @@ -816,7 +817,7 @@ dependencies = [ [[package]] name = "gamut-jxl-sys" -version = "0.1.0" +version = "0.1.1" dependencies = [ "cmake", "jpegxl-src", @@ -824,7 +825,7 @@ dependencies = [ [[package]] name = "gamut-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ "gamut-exif", "gamut-icc", @@ -835,13 +836,13 @@ dependencies = [ [[package]] name = "gamut-png" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gamut-codec-abi", "gamut-core", "gamut-deflate", "libpng-oracle", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -855,7 +856,7 @@ dependencies = [ [[package]] name = "gamut-tiff" -version = "1.0.0" +version = "2.0.0" dependencies = [ "divan", "gamut-bitstream", @@ -863,12 +864,12 @@ dependencies = [ "gamut-deflate", "gamut-ifd", "libtiff-oracle", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] name = "gamut-tonemap" -version = "1.0.0" +version = "1.1.0" dependencies = [ "divan", "gamut-core", @@ -877,7 +878,7 @@ dependencies = [ [[package]] name = "gamut-vvc" -version = "0.2.1" +version = "0.2.2" dependencies = [ "gamut-bitstream", "gamut-color", @@ -887,7 +888,7 @@ dependencies = [ [[package]] name = "gamut-wasm" -version = "0.1.3" +version = "0.1.4" dependencies = [ "gamut", "wasm-bindgen", @@ -895,7 +896,7 @@ dependencies = [ [[package]] name = "gamut-webp" -version = "0.3.1" +version = "0.4.0" dependencies = [ "divan", "gamut-codec-abi", @@ -908,7 +909,7 @@ dependencies = [ [[package]] name = "gamut-xmp" -version = "1.0.0" +version = "2.0.0" dependencies = [ "exiv2-oracle", "gamut-core", @@ -928,9 +929,9 @@ dependencies = [ [[package]] name = "geocoordinates" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9c1922a103f7c4deca321fa0a4333b5025871905325fb4d18cd6a896ceccf28" +checksum = "c7cbb4470a3ec8b58cb7d46b087c46f9f38d5602125687944b86a398564d6d48" dependencies = [ "geographiclib-rs", "thiserror", @@ -1014,9 +1015,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown", @@ -1073,9 +1074,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "wasm-bindgen", @@ -1126,9 +1127,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "lcms2-oracle" @@ -1149,9 +1150,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.189" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libheif-oracle" @@ -1237,9 +1238,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lzma-rs" @@ -1303,6 +1304,16 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "moxcms" version = "0.8.1" @@ -1389,9 +1400,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "png" @@ -1403,14 +1414,14 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] name = "powerfmt" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" [[package]] name = "ppv-lite86" @@ -1567,9 +1578,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -1596,9 +1607,9 @@ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", @@ -1640,7 +1651,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -1730,9 +1741,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -1775,22 +1786,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -1804,9 +1815,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.54" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", "num-conv", @@ -1881,9 +1892,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "utf8parse" @@ -1914,9 +1925,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -1927,9 +1938,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1937,22 +1948,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] @@ -1999,18 +2010,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "86502bf56ac7c77571a32e2647bb2a15894565e981fb2a48d7bde2d91c965a9d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "5457206954b06561e2608c7e19cf58b1926586d999c246eebe4502f7e2039d1a" dependencies = [ "proc-macro2", "quote", @@ -2019,9 +2030,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" dependencies = [ "zeroize_derive", ] @@ -2075,6 +2086,12 @@ dependencies = [ "build-env", ] +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + [[package]] name = "zmij" version = "1.0.23" @@ -2104,18 +2121,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.1+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "aeec9eaf2dffbbd09201e23bd0ffcbaa33bb8e9266a10734fd7ed90a85eca078" dependencies = [ "cc", "pkg-config", @@ -2123,9 +2140,9 @@ dependencies = [ [[package]] name = "zune-core" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" [[package]] name = "zune-jpeg" diff --git a/Cargo.toml b/Cargo.toml index f9a209dd..15bb95a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -129,46 +129,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 = "3.0.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.3.0" } +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 = "2.0.0" } # 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 = "2.0.0" } +gamut-exif = { path = "crates/gamut-exif", version = "2.0.0" } +gamut-iptc = { path = "crates/gamut-iptc", version = "1.1.0" } +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 = "2.0.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.4.0" } # Debug info lives beside the artefacts instead of inside each one. A `cargo test --all-features` # build links 172 test binaries and packed DWARF is copied into every one of them: a sampled diff --git a/crates/gamut-av1/CHANGELOG.md b/crates/gamut-av1/CHANGELOG.md index e37ea07b..44c7da74 100644 --- a/crates/gamut-av1/CHANGELOG.md +++ b/crates/gamut-av1/CHANGELOG.md @@ -7,6 +7,67 @@ 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-10-09 + +### Added + +- *(av1)* encode 10- and 12-bit samples +- *(av1)* encode monochrome still pictures +- *(avif)* complete the 4:2:2 coding path +- *(avif)* [**breaking**] default lossy output to 4:2:0 and expose the chroma format +- *(av1)* encode 4:2:0 chroma +- *(av1)* parse OBUs and the AV1 sequence and frame headers +- *(av1)* add the 32-coefficient eob CDF and complete Max_Tx_Size_Rect +- *(av1)* [**breaking**] give every coded plane its own sample geometry +- *(av1)* adapt CDFs while coding tiles +- *(avif)* code the lossy path in YCbCr +- *(av1)* parameterise the still encoder's colour signalling +- *(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 +- *(av1)* close two conformance gaps the subsampled path opened +- *(av1)* step the deblock neighbour by the plane's subsampling + +### 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)* pin the vertical-split decision where it is observable +- Merge branch 'feat/390-avif-420-profile0' into feat/391-avif-422-profile2 +- *(av1)* drop the surface entries this slice implements +- Merge remote-tracking branch 'origin/master' into feat/390-avif-420-profile0 +- *(av1)* correct the sequence-header docs for the 10/12-bit profiles +- *(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 mutants the high-bit-depth slice pulled into the diff +- *(av1)* record the high-bit-depth sample path +- *(av1)* check the 10- and 12-bit path against libaom and dav1d +- merge feat/390-avif-420-profile0 into feat/391-avif-422-profile2 +- *(av1)* shape the CfL selection so its conditions are testable +- *(av1)* kill the surviving tile-spacing and lr_params mutants +- merge feat/390-avif-420-profile0 into feat/391-avif-422-profile2 +- make the last three chroma mutants observable +- merge feat/390-avif-420-profile0 into feat/391-avif-422-profile2 +- close the remaining chroma mutation gaps +- *(av1)* kill the mutants the monochrome slice pulled into the diff +- *(av1)* record monochrome encoding in the README and status ledger +- *(av1)* cover the header syntax the encoders never emit +- cover the chroma derivations directly, not through an encode +- *(av1)* check the decoder's header layer against libaom +- *(av1)* code the residual, contexts and CfL per plane +- Merge pull request #394 from visualcommons/feat/389-av1-per-plane-geometry +- *(av1)* kill the mutants the geometry refactor pulled into the diff +- mark the aom/dav1d submodules `update = none` +- Merge branch 'master' into feat/335-avif-ycbcr-matrix +- *(av1)* record CDF adaptation in STATUS and README +- *(avif)* record the YCbCr matrix surface + ## [0.4.1](https://github.com/justin13888/gamut/compare/gamut-av1-v0.4.0...gamut-av1-v0.4.1) - 2026-07-20 ### Other diff --git a/crates/gamut-av1/Cargo.toml b/crates/gamut-av1/Cargo.toml index fad085d7..ea5b6307 100644 --- a/crates/gamut-av1/Cargo.toml +++ b/crates/gamut-av1/Cargo.toml @@ -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 diff --git a/crates/gamut-av2/CHANGELOG.md b/crates/gamut-av2/CHANGELOG.md index eda63a7c..c1960da0 100644 --- a/crates/gamut-av2/CHANGELOG.md +++ b/crates/gamut-av2/CHANGELOG.md @@ -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-10-09 + +### 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 diff --git a/crates/gamut-av2/Cargo.toml b/crates/gamut-av2/Cargo.toml index 876aa34e..bfc2c083 100644 --- a/crates/gamut-av2/Cargo.toml +++ b/crates/gamut-av2/Cargo.toml @@ -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 diff --git a/crates/gamut-avif/CHANGELOG.md b/crates/gamut-avif/CHANGELOG.md index 46e11a5c..cc1cb922 100644 --- a/crates/gamut-avif/CHANGELOG.md +++ b/crates/gamut-avif/CHANGELOG.md @@ -7,6 +7,96 @@ 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-10-09 + +### Added + +- *(avif)* reserve, write and locate a C2PA manifest store +- *(avif)* lower high-bit-depth jobs across the codec-abi seam +- *(avif)* [**breaking**] honour with_chroma on the 16-bit input path +- *(avif)* encode Rgb16 and Rgba16 as 10- or 12-bit AVIF +- *(avif)* carry the coded bit depth across the AV1 encode seam +- *(avif)* encode Rgba8 with an alpha auxiliary item and Gray8 as monochrome +- *(avif)* complete the 4:2:2 coding path +- *(avif)* [**breaking**] default lossy output to 4:2:0 and expose the chroma format +- *(av1)* parse OBUs and the AV1 sequence and frame headers +- *(avif)* select CICP colour and write ICC, Exif and XMP +- *(av1)* adapt CDFs while coding tiles +- *(gamut-avif)* add the high-bit-depth RGBA16 presentation surface +- *(avif)* code the lossy path in YCbCr +- *(core)* add structured error diagnostics +- *(gamut-isobmff)* parse large and uuid boxes + +### Fixed + +- *(avif)* refuse a 4 GiB C2PA reservation before zero-filling it +- *(avif)* refuse a C2PA reservation that cannot be framed +- *(avif)* probe both update-store prefixes, as gamut-heic does +- *(avif)* send the backend the chroma the planes actually carry +- *(avif)* refuse a subsampled backend stream instead of stamping it 4:4:4 + +### Other + +- *(avif)* refuse loosened 4 GiB bounds before the one allocating call +- *(avif)* reflow the 64-bit ceiling qualification +- *(avif)* qualify the 4 GiB C2PA ceiling claims as 64-bit only +- *(avif)* pin the reserved-slot minimum with literal lengths +- *(avif)* say with_c2pa applies no minimum to a supplied store +- *(avif)* state the container writer's 4 GiB C2PA refusal +- *(avif)* ask for the store's room instead of adding it in +- *(avif)* say the encoder writes only box_purpose manifest +- *(avif)* share the dav1d bridge through tests/common +- *(avif)* write the reserved C2PA slot's zeros once +- *(avif)* name the C2PA read type for the slot it reports +- *(avif)* key the C2PA locator fixture on the box type, not the body +- *(avif)* record the C2PA carriage in STATUS and README +- *(avif)* append the C2PA uuid box with push_top_level_box +- *(avif)* keep the C2PA remux oracle test to one failure reason +- *(avif)* libavif decodes an AVIF carrying a C2PA uuid box unchanged +- *(avif)* build IsoBmffImage through its constructor +- *(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)* pin each branch of the backend subsampling derivation +- Merge branch 'feat/390-avif-420-profile0' into feat/391-avif-422-profile2 +- *(avif)* say precisely when with_chroma is ignored +- 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 +- *(color)* take the coded depth from the matrix, not beside it +- Merge remote-tracking branch 'origin/master' into feat/259-avif-decoder +- *(avif)* record the 10/12-bit input surface +- *(avif)* check the 10/12-bit inputs against libavif and dav1d +- *(av1)* record the high-bit-depth sample path +- *(avif)* kill the mutants the alpha slice pulled into the diff +- *(avif)* record the alpha and grayscale inputs in the status ledger +- *(avif)* check the alpha and grayscale surface against libavif +- merge feat/390-avif-420-profile0 into feat/391-avif-422-profile2 +- close the remaining chroma mutation gaps +- *(av1)* record monochrome encoding in the README and status ledger +- merge feat/390-avif-420-profile0 into feat/391-avif-422-profile2 +- merge origin/master into feat/390-avif-420-profile0 +- cover the chroma derivations directly, not through an encode +- *(avif)* use as_chunks in the metadata round-trip test +- *(avif)* record the colour and metadata rows as implemented +- Merge pull request #394 from visualcommons/feat/389-av1-per-plane-geometry +- derive chroma plane sizes from one shared rule +- mark the aom/dav1d submodules `update = none` +- 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 +- *(avif)* close the mutation gaps in the colour seam +- record the high-bit-depth presentation surface in STATUS and READMEs +- *(av1)* record CDF adaptation in STATUS and README +- *(avif)* record the YCbCr matrix surface + ## [1.1.0](https://github.com/justin13888/gamut/compare/gamut-avif-v1.0.0...gamut-avif-v1.1.0) - 2026-07-20 ### Added diff --git a/crates/gamut-avif/Cargo.toml b/crates/gamut-avif/Cargo.toml index 7dcb0916..38969eab 100644 --- a/crates/gamut-avif/Cargo.toml +++ b/crates/gamut-avif/Cargo.toml @@ -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 diff --git a/crates/gamut-bitstream/CHANGELOG.md b/crates/gamut-bitstream/CHANGELOG.md index f265b4bc..691ea55f 100644 --- a/crates/gamut-bitstream/CHANGELOG.md +++ b/crates/gamut-bitstream/CHANGELOG.md @@ -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-10-09 + +### 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 diff --git a/crates/gamut-bitstream/Cargo.toml b/crates/gamut-bitstream/Cargo.toml index 287a4da7..177cfc58 100644 --- a/crates/gamut-bitstream/Cargo.toml +++ b/crates/gamut-bitstream/Cargo.toml @@ -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 diff --git a/crates/gamut-cli/CHANGELOG.md b/crates/gamut-cli/CHANGELOG.md index 33053e13..d6d5444a 100644 --- a/crates/gamut-cli/CHANGELOG.md +++ b/crates/gamut-cli/CHANGELOG.md @@ -7,6 +7,28 @@ 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-10-09 + +### Added + +- *(cli)* add --webp-effort and --webp-near-lossless +- *(cli)* decode PNG and JPEG through gamut's own decoders +- *(cli)* add --png-effort to convert +- *(cli)* add --jxl-modular to gamut convert + +### Fixed + +- *(webp)* quantize near-lossless uniformly and never inflate + +### Other + +- *(cli)* build the isobmff demo image through the constructor +- merge origin/master into feat/261-webp-encoder-knobs +- adopt as_chunks for constant-size slice chunking +- merge origin/master into feat/261-webp-encoder-knobs +- 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 diff --git a/crates/gamut-cli/Cargo.toml b/crates/gamut-cli/Cargo.toml index 89c45870..6c07b904 100644 --- a/crates/gamut-cli/Cargo.toml +++ b/crates/gamut-cli/Cargo.toml @@ -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 diff --git a/crates/gamut-cmm/CHANGELOG.md b/crates/gamut-cmm/CHANGELOG.md index 11bddf32..5b233d7c 100644 --- a/crates/gamut-cmm/CHANGELOG.md +++ b/crates/gamut-cmm/CHANGELOG.md @@ -6,3 +6,48 @@ 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-10-09 + +### Added + +- *(cmm)* [**breaking**] take pipeline optimization on every transform constructor +- *(cmm)* collapse pipeline stages behind an opt-in optimization level +- *(gamut-cmm)* pixel-buffer application over gamut-core formats +- *(gamut-cmm)* transform chaining, device links, proofing, and gamut check +- *(gamut-cmm)* absolute colorimetric intent and black point compensation +- *(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 +- *(gamut-cmm)* guard the empty chain before indexing it +- *(gamut-cmm)* drive buffer chunking by iterator, not a mutable cursor + +### 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)* conformance thresholds and the v1 closing ledger +- *(gamut-cmm)* ΔE₀₀ conformance gate against Little-CMS +- vendor the black-point-compensation and rendering-intent references +- *(gamut-cmm)* pin intents and BPC against Little-CMS +- *(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 diff --git a/crates/gamut-codec-abi/CHANGELOG.md b/crates/gamut-codec-abi/CHANGELOG.md index d7894511..d8b92c63 100644 --- a/crates/gamut-codec-abi/CHANGELOG.md +++ b/crates/gamut-codec-abi/CHANGELOG.md @@ -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-10-09 + +### 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 diff --git a/crates/gamut-codec-abi/Cargo.toml b/crates/gamut-codec-abi/Cargo.toml index 1cb33885..8c692f21 100644 --- a/crates/gamut-codec-abi/Cargo.toml +++ b/crates/gamut-codec-abi/Cargo.toml @@ -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 diff --git a/crates/gamut-color/CHANGELOG.md b/crates/gamut-color/CHANGELOG.md index b8ab2fcf..913626bd 100644 --- a/crates/gamut-color/CHANGELOG.md +++ b/crates/gamut-color/CHANGELOG.md @@ -7,6 +7,63 @@ 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-10-09 + +### Added + +- *(avif)* [**breaking**] honour with_chroma on the 16-bit input path +- *(color)* narrow 16-bit RGB and RGBA onto high-bit-depth planes +- *(color)* add the high-bit-depth planar buffer +- *(color)* map RGBA colour, alpha, and grayscale onto planes +- *(color)* report the coded plane count of a chroma layout +- *(avif)* complete the 4:2:2 coding path +- *(avif)* [**breaking**] default lossy output to 4:2:0 and expose the chroma format +- *(av1)* encode 4:2:0 chroma +- *(color)* carry chroma subsampling geometry on Planar8 +- *(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 ColourPrimaries::chromaticities and transfer::oetf_for +- *(color)* add the XYB opsin colour space +- *(gamut-color)* add bit-depth- and matrix-generic YCbCr to RGB conversion +- *(gamut-color)* add the BT.470 System B,G matrix coefficients code point +- *(gamut-color)* add CIELab, LCh, xyY, ΔE₀₀, and the ICC PCS encodings +- *(color)* add the H.273 BT.601/709/2020 YCbCr matrices +- *(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 +- *(color)* take the coded depth from the matrix, not beside it +- *(color)* index the reference planes by iteration, not by range +- *(color)* kill the mutants the 16-bit matrix path pulled into the diff +- *(avif)* kill the mutants the alpha slice pulled into the diff +- cover the chroma derivations directly, not through an encode +- 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 +- merge origin/master into feat/268-pixel-conversion +- merge origin/master into feat/335-avif-ycbcr-matrix +- merge feat/333-jpeg-trellis-adaptive-quant into feat/334-jpeg-xyb-color +- Merge branch 'master' into feat/335-avif-ycbcr-matrix +- pin the blend rounding and the high-bit-depth paths mutation testing missed +- record the high-bit-depth presentation surface in STATUS and READMEs +- *(gamut-color)* pin Lab, PCS encodings, and ΔE₀₀ against Little-CMS +- *(gamut-color)* kill the surviving lab mutants +- *(avif)* record the YCbCr matrix surface +- *(color)* derive BT.601 luma weights from gamut-core +- *(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 diff --git a/crates/gamut-color/Cargo.toml b/crates/gamut-color/Cargo.toml index a72624ce..7a19d624 100644 --- a/crates/gamut-color/Cargo.toml +++ b/crates/gamut-color/Cargo.toml @@ -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 diff --git a/crates/gamut-core/CHANGELOG.md b/crates/gamut-core/CHANGELOG.md index 45ec7cb8..a4bdc7a2 100644 --- a/crates/gamut-core/CHANGELOG.md +++ b/crates/gamut-core/CHANGELOG.md @@ -7,6 +7,25 @@ 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-10-09 + +### 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 + +- *(core)* drop the redundant must_use on ImageView::rows +- *(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 diff --git a/crates/gamut-core/Cargo.toml b/crates/gamut-core/Cargo.toml index 1789b799..b93a44da 100644 --- a/crates/gamut-core/Cargo.toml +++ b/crates/gamut-core/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-core" description = "Core traits, image buffers, dimensions, and error types shared across the gamut image codecs." -version = "2.0.1" +version = "2.1.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-deflate/CHANGELOG.md b/crates/gamut-deflate/CHANGELOG.md index c001a2ae..f804a334 100644 --- a/crates/gamut-deflate/CHANGELOG.md +++ b/crates/gamut-deflate/CHANGELOG.md @@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.1](https://github.com/visualcommons/gamut/compare/gamut-deflate-v0.1.0...gamut-deflate-v0.1.1) - 2026-10-09 + +### Added + +- *(deflate)* span the optimal parse instead of disabling it above 1 MiB +- *(deflate)* expose optimal-parse effort via DeflateEncoder::with_effort + +### Other + +- *(deflate)* make the README ratio-table claim exact and name the shared walk +- *(deflate)* pin the README lz77.rs row and correct the ramp20k period +- *(deflate)* relax each match length at its own nearest distance +- *(deflate)* drop the always-true guard in front of the prune +- *(deflate)* compare eight bytes per step in the longest-match loop +- *(deflate)* remove five unkillable mutants from the bit packing +- deny unsafe in the hot-path crates instead of forbidding it +- *(deflate)* pin the encoder's output so a silent size regression fails +- *(mutants)* record the failure modes and the one way to run a survey +- *(deflate)* keep the 1 MiB boundary case fast under limit-check mutation +- *(deflate)* document the configurable optimal-parse effort budget +- *(deflate)* pin Level as repr(u8) with explicit discriminants +- *(dng)* record the Deflate codec split and its measurements + ## [0.1.0](https://github.com/justin13888/gamut/releases/tag/gamut-deflate-v0.1.0) - 2026-07-18 ### Added diff --git a/crates/gamut-deflate/Cargo.toml b/crates/gamut-deflate/Cargo.toml index 5feb1077..8cbd5cd5 100644 --- a/crates/gamut-deflate/Cargo.toml +++ b/crates/gamut-deflate/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-deflate" description = "Pure-Rust DEFLATE (RFC 1951) and zlib (RFC 1950) encoder, tuned for space efficiency." -version = "0.1.0" +version = "0.1.1" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-dng/CHANGELOG.md b/crates/gamut-dng/CHANGELOG.md index 1094db39..a1f77c93 100644 --- a/crates/gamut-dng/CHANGELOG.md +++ b/crates/gamut-dng/CHANGELOG.md @@ -7,6 +7,48 @@ 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-dng-v1.0.0...gamut-dng-v2.0.0) - 2026-10-09 + +### Added + +- *(dng)* [**breaking**] consume the metadata facade instead of restating it +- *(dng)* decode the untyped camera-profile colour tags +- *(dng)* keep a vendor preamble at its original offset through a rewrite +- *(dng)* type AsShotWhiteXY and derive its camera neutral per DNG 1.7.1 §6 +- *(deflate)* span the optimal parse instead of disabling it above 1 MiB +- *(dng)* [**breaking**] decode what real cameras actually write +- *(core)* add structured error diagnostics + +### Fixed + +- *(dng)* bound Deflate inflation to the expected chunk size +- *(tiff)* reject non-progressing CCITT runs + +### Other + +- *(dng)* find the maximum black per plane across the repeat pattern +- *(dng)* pin the exclusive upper bound of the RATIONAL black-level grid +- *(dng)* assert the archival verdict can also be false +- *(dng)* reject a malformed BlackLevelDeltaV +- *(dng)* find a NoiseProfile that a writer left in IFD 0 +- *(dng)* cover is_lossy, the LONG level type, and the repeat-dim guards +- *(dng)* pin both halves of the WhiteLevel guard and the repeat-dim count +- *(dng)* write MD5's F and G in their XOR forms +- *(dng)* reject a FLOAT tag that is present but empty +- *(dng)* reject a WhiteLevel count that is neither one nor per-plane +- *(dng)* name the two differential files for their oracles +- Merge pull request #411 from visualcommons/feat/353-dng-metadata-facade +- *(dng)* merge master into the colour-projection branch +- *(dng)* record the colour projection in the README and status ledger +- Merge remote-tracking branch 'origin/master' into feat/350-dng-preserve-offsets +- Merge pull request #392 from visualcommons/feat/349-dng-asshotwhitexy +- adopt as_chunks for constant-size slice chunking +- Merge pull request #348 from visualcommons/feat/174-dng-real-corpus +- *(dng)* record the real-camera tier and the v2 breaks +- *(dng)* record the Deflate codec split and its measurements +- *(dng)* benchmark DNG Deflate against miniz_oxide +- *(dng)* encode Deflate strips with gamut-deflate + ## [1.0.0](https://github.com/justin13888/gamut/releases/tag/gamut-dng-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-dng/Cargo.toml b/crates/gamut-dng/Cargo.toml index ceaabc9a..3b8e7dda 100644 --- a/crates/gamut-dng/Cargo.toml +++ b/crates/gamut-dng/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-dng" description = "DNG (Adobe Digital Negative) 1.7.1 raw-image encoder and decoder." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-dsp/CHANGELOG.md b/crates/gamut-dsp/CHANGELOG.md index 5649c4b4..952c6319 100644 --- a/crates/gamut-dsp/CHANGELOG.md +++ b/crates/gamut-dsp/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.0.1](https://github.com/visualcommons/gamut/compare/gamut-dsp-v2.0.0...gamut-dsp-v2.0.1) - 2026-10-09 + +### Other + +- deny unsafe in the hot-path crates instead of forbidding it +- *(dsp)* share one deterministic generator across the transform sweeps + ## [2.0.0](https://github.com/justin13888/gamut/compare/gamut-dsp-v1.0.0...gamut-dsp-v2.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-dsp/Cargo.toml b/crates/gamut-dsp/Cargo.toml index a96204fb..062b1423 100644 --- a/crates/gamut-dsp/Cargo.toml +++ b/crates/gamut-dsp/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-dsp" description = "Shared fixed-point DSP kernels for the gamut codecs: bit-exact AV1 transform kernels (DCT/ADST/identity/WHT), cross-codec integer rounding/clamp math, and µ-law companding." -version = "2.0.0" +version = "2.0.1" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-exif/CHANGELOG.md b/crates/gamut-exif/CHANGELOG.md index d440e53b..47aecdf0 100644 --- a/crates/gamut-exif/CHANGELOG.md +++ b/crates/gamut-exif/CHANGELOG.md @@ -7,6 +7,57 @@ 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-exif-v1.0.0...gamut-exif-v2.0.0) - 2026-10-09 + +### Added + +- *(exif)* type TagConstraintError::FieldType's expected and actual fields +- *(exif)* describe the enumerated tag values behind a describe feature +- *(exif)* reject a write that contradicts the tag's DC-008 value shape +- *(exif)* catalogue the seven Exif 3.0 authorship and software tags +- *(exif)* expose each tag's DC-008 field type and component count +- *(exif)* report what a lenient parse discarded +- *(exif)* read EXIF from any ReadAt byte source +- *(gamut-exif)* convert gps metadata to geocoordinates + +### Fixed + +- *(exif)* name the unreadable range instead of a mandatory sibling +- *(exif)* name a thumbnail offset that carries no length +- *(exif)* describe the nine GPS reference tags CIPA DC-008 enumerates +- *(exif)* propagate a failing source through the maker-note pin +- *(exif)* serialise this file's exiv2 calls +- *(exif)* read GainControl as SHORT, per its own section +- *(exif)* name trailing directories and propagate a failing source + +### Other + +- *(exif)* scope the per-tag type claim to DC-008's five tag tables +- Merge remote-tracking branch 'origin/master' into feat/417-exif-tag-breadth +- *(exif)* name Table 21's axis at the last two sites +- *(exif)* name Table 21's axis at every site and drop a release tense +- *(exif)* correct the offset-frame note and name Table 21's axis +- *(exif)* ground the strict thumbnail rule and ship the changed verdict +- *(exif)* scope the Table 21 grounding and the streaming offset frame +- *(exif)* name the thumbnail drop reason for its one site +- *(exif)* count the excluded tables as the five they are +- *(exif)* state the rule that selects the described tags +- Merge remote-tracking branch 'origin/feat/419-exif-streaming-reader' into feat/417-exif-tag-breadth +- *(exif)* correct the strict report, the offset frames and two doc links +- *(exif)* sweep the thumbnail and trailing-chain reads for a failing source +- *(exif)* state what the catalogue covers and which doors are lenient +- Merge remote-tracking branch 'origin/feat/419-exif-streaming-reader' into feat/417-exif-tag-breadth +- *(exif)* name the vendored source of each non-DC-008 tag +- *(exif)* drop an unreachable arm from the maker-note pin +- *(exif)* name the exact exiv2 version the divergence list came from +- Merge remote-tracking branch 'origin/feat/419-exif-streaming-reader' into feat/417-exif-tag-breadth +- *(exif)* point the crate docs at the checked setter and the describe feature +- *(exif)* pin which tags CIPA DC-008 enumerates +- *(exif)* record the completed DC-008 catalogue and its two features +- *(exif)* check every catalogued tag name against exiv2 +- *(exif)* close the survivors of this crate's first mutation survey +- *(exif)* separate what equality covers from what it ignores + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-exif-v0.1.1...gamut-exif-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-exif/Cargo.toml b/crates/gamut-exif/Cargo.toml index c12139b7..30e3f2e0 100644 --- a/crates/gamut-exif/Cargo.toml +++ b/crates/gamut-exif/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-exif" description = "EXIF (Exif 3.0 / CIPA DC-008) image metadata parser and serializer, built on the shared TIFF/IFD core." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-ffi/CHANGELOG.md b/crates/gamut-ffi/CHANGELOG.md index 60b511eb..5d886490 100644 --- a/crates/gamut-ffi/CHANGELOG.md +++ b/crates/gamut-ffi/CHANGELOG.md @@ -7,6 +7,13 @@ 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-ffi-v0.1.3...gamut-ffi-v0.1.4) - 2026-10-09 + +### Added + +- *(gamut-cmm)* new crate with the pipeline/stage model +- *(core)* add structured error diagnostics + ## [0.1.3](https://github.com/visualcommons/gamut/compare/gamut-ffi-v0.1.2...gamut-ffi-v0.1.3) - 2026-07-30 ### Other diff --git a/crates/gamut-ffi/Cargo.toml b/crates/gamut-ffi/Cargo.toml index 1672692a..f3d78c76 100644 --- a/crates/gamut-ffi/Cargo.toml +++ b/crates/gamut-ffi/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-ffi" description = "C-compatible FFI bindings for the gamut image codecs, for use from C, C++, Python, Go, and more." -version = "0.1.3" +version = "0.1.4" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-heic/CHANGELOG.md b/crates/gamut-heic/CHANGELOG.md index a19ef9f3..daf0bbd5 100644 --- a/crates/gamut-heic/CHANGELOG.md +++ b/crates/gamut-heic/CHANGELOG.md @@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0](https://github.com/visualcommons/gamut/compare/gamut-heic-v0.2.2...gamut-heic-v0.3.0) - 2026-10-09 + +### Added + +- *(heic)* wire the gamut-metadata facade behind a `metadata` feature +- *(heic)* locate the C2PA manifest store and report its byte range +- *(gamut-heic)* add the high-bit-depth RGBA16 presentation surface +- *(gamut-heic)* split annex-b export for platform decoders +- *(core)* add structured error diagnostics +- *(gamut-isobmff)* parse large and uuid boxes + +### Fixed + +- *(heic)* refuse a content-encoded XMP item as Unsupported in blocks() +- *(heic)* locate an update manifest store past the merkle offset +- *(gamut-heic)* prefer nclx for rgba presentation +- *(gamut-heic)* correct imir axis semantics + +### Other + +- *(heic)* build the test image through IsoBmffImage::new +- Merge remote-tracking branch 'origin/feat/449-xmp-dcterms-provenance' into feat/420-metadata-facade-wiring +- *(heic)* build IsoBmffImage through its constructor +- *(isobmff)* drop imports the moved tests no longer use +- *(isobmff)* share the segment walk with avif and heic +- *(heic)* separate per-item adaptation from backend ownership +- *(heic)* correct the JUMBF traceability claim and the probe's reach +- *(heic)* state the update probe's real strength, not a fail-safe one +- *(heic)* correct the JUMBF citation and narrow the scan-scope claim +- *(heic)* pin that only a `uuid` box carries a manifest store +- *(heic)* keep the umbrella-feature note in the usage section +- *(heic)* record the C2PA manifest-store locator in the ledger +- *(heic)* pin the C2PA locator's offsets and rejection branches +- derive chroma plane sizes from one shared rule +- adopt as_chunks for constant-size slice chunking +- 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 +- *(gamut-heic)* make the RGBA pipeline generic over sample width + ## [0.2.2](https://github.com/justin13888/gamut/compare/gamut-heic-v0.2.1...gamut-heic-v0.2.2) - 2026-07-21 ### Other diff --git a/crates/gamut-heic/Cargo.toml b/crates/gamut-heic/Cargo.toml index e03fed56..224671be 100644 --- a/crates/gamut-heic/Cargo.toml +++ b/crates/gamut-heic/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-heic" description = "HEIC/HEIF still-image container decoder (HEVC intra items in an ISOBMFF container) with a pluggable codestream-decoder hook." -version = "0.2.2" +version = "0.3.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-icc/CHANGELOG.md b/crates/gamut-icc/CHANGELOG.md index 510f3d49..b6c8e603 100644 --- a/crates/gamut-icc/CHANGELOG.md +++ b/crates/gamut-icc/CHANGELOG.md @@ -7,6 +7,55 @@ 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-icc-v1.0.0...gamut-icc-v2.0.0) - 2026-10-09 + +### Added + +- *(icc)* build ICC profiles from named colour spaces and CICP +- *(gamut-icc)* add ColorSpace::channel_count + +### Fixed + +- *(icc)* build narrow-range CICP signalling whose range is on Y/Cb/Cr +- *(icc)* describe a grey profile by the gamma its kTRC holds +- *(icc)* [**breaking**] decline a CICP triple that does not signal full range +- *(icc)* bound the grey gamma by what the kTRC actually encodes +- *(icc)* [**breaking**] build CICP profiles from the transfer H.273 defines +- *(icc)* adapt built-in colorants to the PCS D50 the profile declares + +### Other + +- *(icc)* format the lcms2 cicp synthesiser comparison +- *(icc)* say what actually declines a transfer code point +- *(icc)* have lcms2 check every built profile's white point, curves and cicp tag +- *(icc)* gate the SourceProfile divergence figures the docs quote +- *(icc)* gate the two cross-crate figures the docs still quoted +- *(icc)* list thiserror among the crate's dependencies +- *(icc)* disclose the rendering intent every constructor writes +- *(icc)* cite cicpTag's own clause for the rule that decides the flag +- *(icc)* name the colorimetry this crate does restate, and its gates +- *(icc)* say where a SourceProfile bundle and its profile diverge +- *(icc)* guard the sampled PQ curve at the quantum it claims +- *(icc)* correct the CIE D50 tristimulus this crate deliberately avoids +- *(icc)* check the transfer-axis claim about gamut-color in a doctest +- *(icc)* cite the clauses ICC.1:2022 gives the colorant and chad tags +- *(icc)* cite cicpType's own clause and quote the tag's mid-grey values +- *(icc)* write the saturation bound at its shortest exact decimal +- *(icc)* reformat the transfer code-point sweep assertion +- *(icc)* quantify the second sanctioned reading of the BT.709 curve +- *(icc)* stop calling the full-range flag a conformance requirement +- *(icc)* pin the complement of the encodable transfer code points +- *(icc)* state the grey gamma limit instead of linking a private const +- *(icc)* correct the transfer table, the fan-in figure and the PQ limit +- *(icc)* fold the curveless transfer arm into the wildcard +- *(icc)* record the built-in profile constructors and their curve choices +- *(icc)* split the fixed-point conversions by claim +- merge origin/master into feat/324-cmm-scaffold +- merge origin/master into feat/322-lcms2-oracle-transforms +- adopt as_chunks for constant-size slice chunking +- wire gamut-cmm into the workspace docs +- *(gamut-icc)* parse the transform-oracle synthesizer corpus + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-icc-v0.1.1...gamut-icc-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-icc/Cargo.toml b/crates/gamut-icc/Cargo.toml index a45e8bf4..a2b742fc 100644 --- a/crates/gamut-icc/Cargo.toml +++ b/crates/gamut-icc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-icc" description = "ICC color profile (ICC.1:2022) parser and serializer — header, tag table, and tag element types — for gamut image metadata." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-ifd/CHANGELOG.md b/crates/gamut-ifd/CHANGELOG.md index 5336c4f9..61ebd08b 100644 --- a/crates/gamut-ifd/CHANGELOG.md +++ b/crates/gamut-ifd/CHANGELOG.md @@ -7,6 +7,34 @@ 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-ifd-v2.0.1...gamut-ifd-v3.0.0) - 2026-10-09 + +### Added + +- *(ifd)* reserve a leading vendor preamble in the writer's layout +- *(ifd)* [**breaking**] name the bytes a file does not account for +- *(core)* add structured error diagnostics +- *(gamut-ifd)* add f64 value coercion + +### Fixed + +- *(ifd)* let the test suite compile under default features +- *(mutants)* retire an exclusion that was a coverage gap, not an equivalence +- *(ifd)* declare the preamble the way an audit reads it +- *(tiff)* reject non-progressing CCITT runs + +### Other + +- *(ifd)* say what a hand-advanced cursor's mutants actually do +- *(ifd)* bound the claim subtraction by the claims it walks +- *(ifd)* confine the claim skip whose mutant cannot terminate +- *(ifd)* bound the audit's cursor walks by the data they walk +- *(ifd)* close the mutation survivors the corpus pass left +- *(ifd)* pin where the pool resumes after jumping a pin +- *(ifd)* cover the pinned-span placement rules +- *(ifd)* state the read ledger's laws as executable invariants +- adopt as_chunks for constant-size slice chunking + ## [2.0.1](https://github.com/justin13888/gamut/compare/gamut-ifd-v2.0.0...gamut-ifd-v2.0.1) - 2026-07-20 ### Other diff --git a/crates/gamut-ifd/Cargo.toml b/crates/gamut-ifd/Cargo.toml index b83978a3..afb72c63 100644 --- a/crates/gamut-ifd/Cargo.toml +++ b/crates/gamut-ifd/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-ifd" description = "TIFF Image File Directory (IFD) container core — byte order, field types, and IFD read/write — shared by the TIFF codec and EXIF metadata." -version = "2.0.1" +version = "3.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-iptc/CHANGELOG.md b/crates/gamut-iptc/CHANGELOG.md index 04d0490d..64bbc26b 100644 --- a/crates/gamut-iptc/CHANGELOG.md +++ b/crates/gamut-iptc/CHANGELOG.md @@ -7,6 +7,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.0](https://github.com/visualcommons/gamut/compare/gamut-iptc-v1.0.0...gamut-iptc-v1.1.0) - 2026-10-09 + +### Added + +- *(iptc)* read a bare structure where a sequence is expected +- *(iptc)* name the one-octet 7:10 Size Mode dataset +- *(iptc)* model the four most-used IPTC structured properties +- *(iptc)* name every length-determinate IIM 4.2 dataset + +### Fixed + +- *(iptc)* replace every top-level copy of a property a typed setter writes +- *(iptc)* consume a coordinate only when its decimal value is re-emitted unchanged +- *(iptc)* keep a top-level property the setter cannot reproduce +- *(iptc)* keep every array member and the container kind on the way out +- *(iptc)* decide retention by what the writer can reproduce +- *(iptc)* read a language alternative by its x-default tag +- *(iptc)* retain an extension field the typed read cannot consume +- *(iptc)* drop an array member that carries no field at all +- *(iptc)* never write a value the declared type has no room for +- *(iptc)* keep the fields the extension structures do not model + +### Other + +- *(iptc)* wrap the round's doc comments to the line width +- *(iptc)* format the projection read +- *(iptc)* state the dataset-name guard's identical-typo residual in its comment +- *(iptc)* say that a setter handed values replaces the property outright +- *(iptc)* say what the name guard does not catch +- *(iptc)* cross every accessor pair with every shape a graph can carry +- *(iptc)* state each clause of the reproduction relation on its own +- *(iptc)* name the two shapes the fidelity list left out +- *(iptc)* list the reads the projection gives up as a deferral +- *(iptc)* record what the reproduction check costs +- *(iptc)* state the reproduction relation on its own +- *(iptc)* state the fidelity rule the code now follows +- *(iptc)* pin the dataset names to the standard's own name column +- *(iptc)* state what the guard compares and what retention covers +- *(iptc)* compare dataset names against exiv2's table too +- *(iptc)* pin the IIM tag table to exiv2's own dataset table +- *(iptc)* read an Entity back from a structure value +- *(iptc)* record the delivered breadth and the two remaining deferrals +- *(iptc)* derive the structured-property field sets from the tech reference +- *(iptc)* name the differential file for the convention its siblings use + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-iptc-v0.1.1...gamut-iptc-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-iptc/Cargo.toml b/crates/gamut-iptc/Cargo.toml index 2ee96a0d..fe62699c 100644 --- a/crates/gamut-iptc/Cargo.toml +++ b/crates/gamut-iptc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-iptc" description = "IPTC photo metadata: the legacy IIM/Photoshop-IRB codec, IPTC Core over XMP, and IIM-XMP reconciliation." -version = "1.0.0" +version = "1.1.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-isobmff/CHANGELOG.md b/crates/gamut-isobmff/CHANGELOG.md index 05f3074d..a47e6aa2 100644 --- a/crates/gamut-isobmff/CHANGELOG.md +++ b/crates/gamut-isobmff/CHANGELOG.md @@ -7,6 +7,31 @@ 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-isobmff-v2.0.1...gamut-isobmff-v3.0.0) - 2026-10-09 + +### Added + +- *(isobmff)* [**breaking**] model and write top-level boxes +- *(isobmff)* add an IsoBmffImage constructor and builders +- *(core)* add structured error diagnostics +- *(gamut-isobmff)* parse large and uuid boxes + +### Fixed + +- *(isobmff)* refuse interleaved top-level positions and add push_top_level_box +- *(isobmff)* bound a top-level box's complete size, not just its payload + +### Other + +- *(isobmff)* list every move the top-level box round-trip makes +- *(isobmff)* link read's top-level-box note to the public field +- *(isobmff)* reach push_top_level_box's last-AfterFtyp arm, order only +- *(isobmff)* round-trip a non-zero ftyp minor version through the builder +- *(isobmff)* make TopLevelBox and TopLevelPosition non-exhaustive +- *(isobmff)* satisfy clippy::redundant_guards in the accounting test +- *(isobmff)* share the segment walk with avif and heic +- *(isobmff)* separate the largesize body from the cursor advance + ## [2.0.1](https://github.com/justin13888/gamut/compare/gamut-isobmff-v2.0.0...gamut-isobmff-v2.0.1) - 2026-07-20 ### Other diff --git a/crates/gamut-isobmff/Cargo.toml b/crates/gamut-isobmff/Cargo.toml index b81ed1fc..f2a4fa45 100644 --- a/crates/gamut-isobmff/Cargo.toml +++ b/crates/gamut-isobmff/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-isobmff" description = "ISO Base Media File Format (ISOBMFF) still-image container: the typed box tree, with read/write, shared by the AVIF and HEIC codecs." -version = "2.0.1" +version = "3.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-jpeg/CHANGELOG.md b/crates/gamut-jpeg/CHANGELOG.md index aa52e740..24fb2daf 100644 --- a/crates/gamut-jpeg/CHANGELOG.md +++ b/crates/gamut-jpeg/CHANGELOG.md @@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.1](https://github.com/visualcommons/gamut/compare/gamut-jpeg-v0.1.0...gamut-jpeg-v0.1.1) - 2026-10-09 + +### Added + +- *(jpeg)* wire the gamut-metadata facade behind a `metadata` feature +- *(jpeg)* add the XYB colour encode path +- *(jpeg)* rate-distortion optimized coefficient selection +- *(jpeg)* route typed presentation through gamut-core convert +- *(jpeg)* accept caller-supplied quantization tables +- *(jpeg)* emit optimized baseline Huffman tables +- *(core)* add structured error diagnostics +- *(gamut-jpeg)* add decoder resource limits + +### Other + +- *(jpeg)* reformat the metadata wiring with the workspace rustfmt +- deny unsafe in the hot-path crates instead of forbidding it +- *(jpeg)* name the prefix-free check for the one claim it makes +- adopt as_chunks for constant-size slice chunking +- merge origin/master into feat/268-pixel-conversion +- *(jpeg)* pin the XYB byte count to the appended output +- merge feat/333-jpeg-trellis-adaptive-quant into feat/334-jpeg-xyb-color +- *(jpeg)* kill the RD trellis mutation survivors +- close the mutation-testing gaps in the conversion paths +- merge origin/master into feat/268-pixel-conversion +- *(jpeg)* ledger the RD-optimized coefficient selection +- *(jpeg)* ledger the caller-supplied quantization tables +- *(jpeg)* record the optimized baseline table surface + ## [0.1.0](https://github.com/justin13888/gamut/releases/tag/gamut-jpeg-v0.1.0) - 2026-07-18 ### Added diff --git a/crates/gamut-jpeg/Cargo.toml b/crates/gamut-jpeg/Cargo.toml index 8394ccad..87ec91b0 100644 --- a/crates/gamut-jpeg/Cargo.toml +++ b/crates/gamut-jpeg/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-jpeg" description = "Spec-compliant JPEG (ISO/IEC 10918 / ITU-T T.81) still-image codec." -version = "0.1.0" +version = "0.1.1" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-jxl-sys/CHANGELOG.md b/crates/gamut-jxl-sys/CHANGELOG.md index 7c206629..dd195739 100644 --- a/crates/gamut-jxl-sys/CHANGELOG.md +++ b/crates/gamut-jxl-sys/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.1](https://github.com/visualcommons/gamut/compare/gamut-jxl-sys-v0.1.0...gamut-jxl-sys-v0.1.1) - 2026-10-09 + +### Added + +- *(jxl-sys)* declare the MODULAR frame-setting id + +### Fixed + +- *(oracles)* bound every native build by the shared parallelism dial +- *(jxl-sys)* stop overriding the caller's cmake build parallelism + ## [0.1.0](https://github.com/justin13888/gamut/releases/tag/gamut-jxl-sys-v0.1.0) - 2026-07-18 ### Added diff --git a/crates/gamut-jxl-sys/Cargo.toml b/crates/gamut-jxl-sys/Cargo.toml index 41489eae..4f30c68d 100644 --- a/crates/gamut-jxl-sys/Cargo.toml +++ b/crates/gamut-jxl-sys/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-jxl-sys" description = "Static build of and hand-written FFI declarations for the reference libjxl, powering gamut-jxl's JPEG XL encoder." -version = "0.1.0" +version = "0.1.1" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-jxl/CHANGELOG.md b/crates/gamut-jxl/CHANGELOG.md index 0d12d33b..b63d2c15 100644 --- a/crates/gamut-jxl/CHANGELOG.md +++ b/crates/gamut-jxl/CHANGELOG.md @@ -7,6 +7,42 @@ 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-jxl-v0.4.0...gamut-jxl-v0.5.0) - 2026-10-09 + +### Added + +- *(jxl)* read metadata boxes back and wire the gamut-metadata facade +- *(jxl)* [**breaking**] require an explicit policy for lossy presentation +- *(jxl)* decode truncated codestreams best-effort behind DecodePartialImage +- *(jxl)* expose modular-mode control on the encoder +- *(core)* add structured error diagnostics + +### Fixed + +- *(jxl)* restore the crate-wide deny(unsafe_code) and its safety section + +### Other + +- Merge remote-tracking branch 'origin/master' into feat/420-metadata-facade-wiring +- *(jxl)* drop the chunks_exact_to_as_chunks expectation clippy no longer needs +- *(jxl)* pin with_metadata's serialize-failure path +- *(jxl)* document that a model's ICC replaces the encoder's colour spec +- *(jxl)* pin that an empty container box is walked over, not rejected +- *(jxl)* bound the container box walk's step inside the walk +- *(jxl)* reformat the metadata wiring with the workspace rustfmt +- *(jxl)* separate registry sharing from equality semantics +- adopt as_chunks for constant-size slice chunking +- merge origin/master into feat/268-pixel-conversion +- *(jxl)* pin that colour-as-grayscale is refused before the decode +- close the mutation-testing gaps in the conversion paths +- merge origin/master into feat/268-pixel-conversion +- *(jxl)* record partial decode and answer the encoder-knob question +- *(jxl)* sweep 16-bit-plus-alpha across the encoder-configuration grid +- *(jxl)* sweep truncated streams through the partial decode path +- *(jxl)* fold the raw-frame to ImageBuf tail into one helper +- *(jxl)* rejoin the orphaned decode-side clause in the README +- *(jxl)* record modular-mode control in STATUS and README + ## [0.4.0](https://github.com/justin13888/gamut/compare/gamut-jxl-v0.3.0...gamut-jxl-v0.4.0) - 2026-07-20 ### Added diff --git a/crates/gamut-jxl/Cargo.toml b/crates/gamut-jxl/Cargo.toml index 5b813ff0..1e0076d3 100644 --- a/crates/gamut-jxl/Cargo.toml +++ b/crates/gamut-jxl/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-jxl" description = "JPEG XL image encoder and decoder." -version = "0.4.0" +version = "0.5.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-metadata/CHANGELOG.md b/crates/gamut-metadata/CHANGELOG.md index 4e32f8af..cea2cc68 100644 --- a/crates/gamut-metadata/CHANGELOG.md +++ b/crates/gamut-metadata/CHANGELOG.md @@ -7,6 +7,36 @@ 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-metadata-v1.0.0...gamut-metadata-v2.0.0) - 2026-10-09 + +### Added + +- *(metadata)* add the per-format capability query +- *(metadata)* report provenance from the store and dcterms:provenance +- *(metadata)* add the C2PA manifest store as a fourth carrier +- *(metadata)* [**breaking**] carry downstream typed models in a namespaced extension table + +### Fixed + +- *(metadata)* trim dcterms:provenance and treat whitespace-only as absent + +### Other + +- Merge remote-tracking branch 'origin/feat/449-xmp-dcterms-provenance' into feat/420-metadata-facade-wiring +- *(metadata)* call dcterms:provenance a URI reference, not a URL +- Merge remote-tracking branch 'origin/feat/449-xmp-dcterms-provenance' into feat/420-metadata-facade-wiring +- *(metadata)* say provenance URL is trimmed and whitespace-only is absent +- *(metadata)* record the embedding precedence a present carrier has +- *(metadata)* make the capability ALL constants slices +- *(metadata)* correct two overclaims about the capability table +- *(metadata)* drop the repr and Default from ProvenanceState +- *(metadata)* pin that remove_extension matches on namespace AND key +- *(metadata)* pin each extension-removal claim separately +- *(metadata)* cite the clause that defines the C2PA manifest store +- *(metadata)* state what the C2PA carrier actually guarantees +- *(metadata)* explain the C2PA carrier and the keystone carve-out +- *(metadata)* cover the C2PA carrier and its no-copy-forward policy + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-metadata-v0.1.1...gamut-metadata-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-metadata/Cargo.toml b/crates/gamut-metadata/Cargo.toml index 468d5d9f..562cea3b 100644 --- a/crates/gamut-metadata/Cargo.toml +++ b/crates/gamut-metadata/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-metadata" description = "Unified image-metadata facade over gamut's EXIF, XMP, ICC, and IPTC crates — extract from and embed into container metadata blocks." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-png/CHANGELOG.md b/crates/gamut-png/CHANGELOG.md index 450195db..af04997f 100644 --- a/crates/gamut-png/CHANGELOG.md +++ b/crates/gamut-png/CHANGELOG.md @@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.1](https://github.com/visualcommons/gamut/compare/gamut-png-v0.1.0...gamut-png-v0.1.1) - 2026-10-09 + +### Added + +- *(gamut-png)* read metadata without decoding pixels +- *(png)* extend lossless auto-reduce to grey and 16-bit inputs +- *(png)* route typed presentation through gamut-core convert +- *(png)* plumb DEFLATE effort through PngEncoder::with_effort +- *(core)* add structured error diagnostics + +### Other + +- *(png)* pin the tRNS overhead term with a translucent palette +- Merge pull request #486 from visualcommons/chore/110-survey-tier1-rest +- *(png)* close the remaining survivors of the first survey +- *(png)* pin the encoding analyze8 chooses, not just that it reduces +- deny unsafe in the hot-path crates instead of forbidding it +- *(png)* pin each auto-reduce claim separately +- adopt as_chunks for constant-size slice chunking +- merge origin/master into feat/268-pixel-conversion +- close the mutation-testing gaps in the conversion paths +- *(png)* close the mutation gaps in the reduce/decoder extension + ## [0.1.0](https://github.com/justin13888/gamut/releases/tag/gamut-png-v0.1.0) - 2026-07-18 ### Added diff --git a/crates/gamut-png/Cargo.toml b/crates/gamut-png/Cargo.toml index 2abaa9d2..8000027a 100644 --- a/crates/gamut-png/Cargo.toml +++ b/crates/gamut-png/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-png" description = "Research-grade, space-efficient PNG (Portable Network Graphics) image encoder and spec-compliant decoder." -version = "0.1.0" +version = "0.1.1" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-riff/CHANGELOG.md b/crates/gamut-riff/CHANGELOG.md index 557a31f5..2de80c94 100644 --- a/crates/gamut-riff/CHANGELOG.md +++ b/crates/gamut-riff/CHANGELOG.md @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.0.0](https://github.com/visualcommons/gamut/compare/gamut-riff-v0.1.3...gamut-riff-v1.0.0) - 2026-10-09 + +### Added + +- *(riff)* [**breaking**] enforce reconstruction-chunk order and carry unknown chunks +- *(riff)* [**breaking**] validate the spec's size and canvas bounds +- *(core)* add structured error diagnostics + +### Other + +- *(ifd)* close the mutation survivors the corpus pass left +- *(riff)* release v1.0.0 +- *(riff)* ledger the v1 surface and correct the RFC citations +- *(riff)* spec fixtures, robustness sweep, and a libwebp demux oracle +- *(riff)* [**breaking**] narrow the frozen public surface +- *(riff)* drop the unused gamut-bitstream dependency + ## [0.1.3](https://github.com/visualcommons/gamut/compare/gamut-riff-v0.1.2...gamut-riff-v0.1.3) - 2026-07-30 ### Added diff --git a/crates/gamut-tiff/CHANGELOG.md b/crates/gamut-tiff/CHANGELOG.md index 2d6a9152..ad0af409 100644 --- a/crates/gamut-tiff/CHANGELOG.md +++ b/crates/gamut-tiff/CHANGELOG.md @@ -7,6 +7,48 @@ 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-tiff-v1.0.0...gamut-tiff-v2.0.0) - 2026-10-09 + +### Added + +- *(tiff)* add the TiffInfo pre-decode probe +- *(tiff)* encode 16-bit grayscale, RGB and RGBA +- *(tiff)* decode 16-bit grayscale, RGB, RGBA and CMYK samples +- *(tiff)* add the SampleFormat tag type and reject non-integer samples +- *(tiff)* [**breaking**] require an explicit policy for lossy presentation +- *(core)* add structured error diagnostics +- *(gamut-tiff)* support deflate compression + +### Fixed + +- *(tiff)* stop LZW decoding once the strip is satisfied +- *(tiff)* reject non-progressing CCITT runs + +### Other + +- *(tiff)* re-attach a #[test] this branch had split off +- *(tiff)* diagnose the audit's three sub-IFD findings +- *(tiff)* pin the LZW decoder's 12-bit code-width cap +- *(tiff)* assert the archival verdict through its public wrapper +- *(tiff)* the fifth and last shift-or equivalent +- *(tiff)* pin T.6's vertical code table and PackBits' two-run rule +- *(tiff)* pin the SHORT/LONG boundary, and a fourth shift-or equivalent +- *(tiff)* two more CCITT equivalents, removed rather than excluded +- *(tiff)* pin the 64 make-up boundary and the half-present tile pair +- *(tiff)* assert LZW compresses, the third encoder to hide behind a round trip +- *(tiff)* assert LZW's width bound at compile time instead of guarding it +- *(tiff)* pin that G4 chooses pass mode, which no oracle could see +- *(tiff)* make two G4 colour decisions falsifiable +- *(tiff)* assert PackBits actually compresses, not just that it round-trips +- *(tiff)* share the two patterns the libtiff cross-checks both use +- adopt as_chunks for constant-size slice chunking +- *(tiff)* pin the 16-bit CMYK narrowing to its depth policy +- merge origin/master into feat/268-pixel-conversion +- *(tiff)* pin which guard rejects a mismatched sample count +- *(tiff)* record 16-bit sample support in the scope ledger +- *(tiff)* extract page-header parsing from the decode funnel +- *(tiff)* scope the decode-size guard to a named helper + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-tiff-v0.2.0...gamut-tiff-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-tiff/Cargo.toml b/crates/gamut-tiff/Cargo.toml index 386402d1..770fa898 100644 --- a/crates/gamut-tiff/Cargo.toml +++ b/crates/gamut-tiff/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-tiff" description = "TIFF 6.0 (Tagged Image File Format) image encoder and decoder." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-tonemap/CHANGELOG.md b/crates/gamut-tonemap/CHANGELOG.md index 14a20bb7..9e6efca8 100644 --- a/crates/gamut-tonemap/CHANGELOG.md +++ b/crates/gamut-tonemap/CHANGELOG.md @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.0](https://github.com/visualcommons/gamut/compare/gamut-tonemap-v1.0.0...gamut-tonemap-v1.1.0) - 2026-10-09 + +### Added + +- *(tonemap)* state Drago's monotonicity condition instead of promising it +- *(core)* add structured error diagnostics + +### Fixed + +- *(tonemap)* divide the smaller numerator in ReinhardExtended +- *(tonemap)* reject a Hable white point whose divisor cancels to zero + +### Other + +- *(fuzz)* drive the gamut-core and gamut-tonemap laws under libFuzzer +- *(tonemap)* state the ToneCurve contract as executable laws + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-tonemap-v0.1.2...gamut-tonemap-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-tonemap/Cargo.toml b/crates/gamut-tonemap/Cargo.toml index 51189ed9..f0671ae3 100644 --- a/crates/gamut-tonemap/Cargo.toml +++ b/crates/gamut-tonemap/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-tonemap" description = "Tone-mapping math primitives: built-in tone curves plus an extensible trait for custom operators." -version = "1.0.0" +version = "1.1.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-vvc/CHANGELOG.md b/crates/gamut-vvc/CHANGELOG.md index df89db14..ec3a1475 100644 --- a/crates/gamut-vvc/CHANGELOG.md +++ b/crates/gamut-vvc/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.2](https://github.com/visualcommons/gamut/compare/gamut-vvc-v0.2.1...gamut-vvc-v0.2.2) - 2026-10-09 + +### Other + +- updated the following local packages: gamut-core, gamut-bitstream, gamut-color, gamut-dsp + ## [0.2.1](https://github.com/justin13888/gamut/compare/gamut-vvc-v0.2.0...gamut-vvc-v0.2.1) - 2026-07-18 ### Other diff --git a/crates/gamut-vvc/Cargo.toml b/crates/gamut-vvc/Cargo.toml index 381541ff..415031da 100644 --- a/crates/gamut-vvc/Cargo.toml +++ b/crates/gamut-vvc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-vvc" description = "VVC (H.266) image encoder and decoder (intra-frame still-image coding)." -version = "0.2.1" +version = "0.2.2" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-wasm/CHANGELOG.md b/crates/gamut-wasm/CHANGELOG.md index 0a0da6f5..0212548d 100644 --- a/crates/gamut-wasm/CHANGELOG.md +++ b/crates/gamut-wasm/CHANGELOG.md @@ -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-wasm-v0.1.3...gamut-wasm-v0.1.4) - 2026-10-09 + +### Other + +- updated the following local packages: gamut + ## [0.1.3](https://github.com/visualcommons/gamut/compare/gamut-wasm-v0.1.2...gamut-wasm-v0.1.3) - 2026-07-30 ### Other diff --git a/crates/gamut-wasm/Cargo.toml b/crates/gamut-wasm/Cargo.toml index 24b44122..c5eb2106 100644 --- a/crates/gamut-wasm/Cargo.toml +++ b/crates/gamut-wasm/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-wasm" description = "WebAssembly bindings for the gamut image codecs, for running encoders in the browser." -version = "0.1.3" +version = "0.1.4" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-webp/CHANGELOG.md b/crates/gamut-webp/CHANGELOG.md index 26acec32..155faa38 100644 --- a/crates/gamut-webp/CHANGELOG.md +++ b/crates/gamut-webp/CHANGELOG.md @@ -7,6 +7,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.4.0](https://github.com/visualcommons/gamut/compare/gamut-webp-v0.3.1...gamut-webp-v0.4.0) - 2026-10-09 + +### Added + +- *(cli)* add --webp-effort and --webp-near-lossless +- *(webp)* fill in the VP8 effort ladder +- *(webp)* add near-lossless preprocessing +- *(webp)* fill in the VP8L effort ladder +- *(webp)* [**breaking**] require an explicit policy for lossy presentation +- *(webp)* add the compression-effort knob +- *(riff)* [**breaking**] enforce reconstruction-chunk order and carry unknown chunks +- *(riff)* [**breaking**] validate the spec's size and canvas bounds +- *(core)* add structured error diagnostics + +### Fixed + +- *(webp)* guarantee the run-length loop advances +- *(webp)* discard a zero-length LZ77 match instead of looping on it +- *(webp)* [**breaking**] report an oversized VP8 control partition +- *(webp)* widen the probability-cost accumulator to u64 +- *(webp)* quantize near-lossless uniformly and never inflate +- *(webp)* make VP8L entropy-group assignment deterministic + +### Other + +- *(webp)* band the segmentation fixture across all four segments +- *(webp)* re-attach a #[test] and drop a one-element loop +- *(webp)* pin the entropy image's block-size field +- *(webp)* pin the degenerate histograms, and count used symbols with != +- *(webp)* mask the LZ77 extra bits instead of subtracting an offset +- *(webp)* write the partition size as little-endian bytes +- *(webp)* reconstruct a macroblock that is both B_PRED and skipped +- *(webp)* write the bool decoder's range doubling as a multiply +- *(webp)* read the partition size as one integer, and pin its high byte +- *(webp)* drop a cache-bits guard the constructor already makes +- *(webp)* size the prefix-code descriptions, and name the trim's floor +- *(webp)* pin the segmented stream, which nothing else could see +- *(webp)* pin the canonical code assignment for a sparse alphabet +- *(webp)* separate the decode and encode poisoning paths +- *(webp)* use is_multiple_of in the break-even search +- *(webp)* pin the deferral's strictness and exclude the equivalent mutants +- *(webp)* pin the deferred parse's tokens, not just that it differs +- *(webp)* drive the lazy parse and cache deltas directly +- *(webp)* add the tiled fixture for the VP8L parse plans +- *(webp)* add the smooth high-quality fixture to the effort pins +- *(webp)* give the effort pins fixtures the decisions are visible in +- *(webp)* pin the effort ladder's output and its boundary decisions +- merge origin/master into feat/261-webp-encoder-knobs +- adopt as_chunks for constant-size slice chunking +- merge origin/master into feat/261-webp-encoder-knobs +- *(webp)* repair two comments the effort work left behind +- close the mutation-testing gaps in the conversion paths +- merge origin/master into feat/268-pixel-conversion +- *(webp)* resolve VP8L distance codes from a table +- *(webp)* route VP8L encoding through a candidate-plan harness +- *(webp)* emit the smallest VP8L prefix-code description +- *(webp)* [**breaking**] future-proof the v1 public API +- *(riff)* ledger the v1 surface and correct the RFC citations + ## [0.3.1](https://github.com/visualcommons/gamut/compare/gamut-webp-v0.3.0...gamut-webp-v0.3.1) - 2026-07-30 ### Added diff --git a/crates/gamut-webp/Cargo.toml b/crates/gamut-webp/Cargo.toml index cc971642..b201ec37 100644 --- a/crates/gamut-webp/Cargo.toml +++ b/crates/gamut-webp/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-webp" description = "WebP image encoder and decoder (intra-frame VP8/VP8L still images in a RIFF container)." -version = "0.3.1" +version = "0.4.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut-xmp/CHANGELOG.md b/crates/gamut-xmp/CHANGELOG.md index 00a87660..34c46252 100644 --- a/crates/gamut-xmp/CHANGELOG.md +++ b/crates/gamut-xmp/CHANGELOG.md @@ -7,6 +7,30 @@ 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-xmp-v1.0.0...gamut-xmp-v2.0.0) - 2026-10-09 + +### Added + +- *(xmp)* accept on read the Darwin Core URI XMPCore emits +- *(xmp)* give a sidecar's missing wrapper its own error +- *(xmp)* read and write XMP sidecar files +- *(xmp)* register the twelve schemas exiv2 documents +- *(xmp)* [**breaking**] register the dcterms namespace and open WellKnownNs +- *(core)* add structured error diagnostics + +### Other + +- *(xmp)* attribute the Darwin Core trailing slash to exiv2, not XMPCore +- Merge remote-tracking branch 'origin/feat/449-xmp-dcterms-provenance' into feat/421-xmp-schemas-sidecars +- *(metadata)* call dcterms:provenance a URI reference, not a URL +- *(xmp)* narrow the registry claim to the issue #421 set of exiv2 schemas +- *(xmp)* record that a catenated sidecar keeps only its first packet +- *(xmp)* close from_uri over the alias family exiv2 generates +- *(xmp)* warn on the Darwin Core variant that XMPCore spells its URI differently +- *(xmp)* state where the sidecar rule and the dwc alias diverge +- *(xmp)* check end of input before matching sidecar prolog events +- *(xmp)* separate the set/get round trip from the replacement rule + ## [1.0.0](https://github.com/justin13888/gamut/compare/gamut-xmp-v0.1.1...gamut-xmp-v1.0.0) - 2026-07-18 ### Added diff --git a/crates/gamut-xmp/Cargo.toml b/crates/gamut-xmp/Cargo.toml index 56fd7ac9..180daa93 100644 --- a/crates/gamut-xmp/Cargo.toml +++ b/crates/gamut-xmp/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut-xmp" description = "XMP (Extensible Metadata Platform) RDF/XML metadata parser and serializer for gamut image metadata." -version = "1.0.0" +version = "2.0.0" edition.workspace = true rust-version.workspace = true authors.workspace = true diff --git a/crates/gamut/CHANGELOG.md b/crates/gamut/CHANGELOG.md index a6e1ee04..84356879 100644 --- a/crates/gamut/CHANGELOG.md +++ b/crates/gamut/CHANGELOG.md @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.4.0](https://github.com/visualcommons/gamut/compare/gamut-v0.3.2...gamut-v0.4.0) - 2026-10-09 + +### Added + +- *(gamut)* forward the format crates' `metadata` features from the umbrella +- *(gamut-cmm)* new crate with the pipeline/stage model +- *(metadata)* [**breaking**] carry downstream typed models in a namespaced extension table + +### Other + +- *(gamut)* scope the forward pin to the metadata feature's own entries +- *(gamut)* pin the umbrella's three metadata feature forwards +- *(gamut)* state what the umbrella tests cannot catch +- merge origin/master into feat/324-cmm-scaffold +- merge feat/333-jpeg-trellis-adaptive-quant into feat/334-jpeg-xyb-color +- *(gamut)* pin the XYB ICC profile at the umbrella +- wire gamut-cmm into the workspace docs + ## [0.3.2](https://github.com/visualcommons/gamut/compare/gamut-v0.3.1...gamut-v0.3.2) - 2026-07-30 ### Other diff --git a/crates/gamut/Cargo.toml b/crates/gamut/Cargo.toml index c83bb5ab..791bd89e 100644 --- a/crates/gamut/Cargo.toml +++ b/crates/gamut/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gamut" description = "Space-efficient image encoding libraries — a unified API over per-format codecs, selected via Cargo features." -version = "0.3.2" +version = "0.4.0" edition.workspace = true rust-version.workspace = true authors.workspace = true