Skip to content

chore: release v0.2.0 - #58

Open
github-actions[bot] wants to merge 1 commit into
masterfrom
release-plz-2026-07-19T02-01-39Z
Open

chore: release v0.2.0#58
github-actions[bot] wants to merge 1 commit into
masterfrom
release-plz-2026-07-19T02-01-39Z

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

🤖 New release

  • rawshift-core: 0.1.1 -> 0.2.0 (⚠ API breaking changes)
  • rawshift-hwdec: 0.1.1 -> 0.2.0
  • rawshift-image-core: 0.1.1 -> 0.2.0
  • rawshift-image-ifd: 0.1.1 -> 0.2.0
  • rawshift-image-ljpeg: 0.1.1 -> 0.2.0
  • rawshift-image-arw: 0.1.1 -> 0.2.0
  • rawshift-image-metadata: 0.1.1 -> 0.2.0
  • rawshift-image-avif: 0.1.1 -> 0.2.0
  • rawshift-image-cr2: 0.1.1 -> 0.2.0
  • rawshift-image-cr3: 0.1.1 -> 0.2.0
  • rawshift-image-crw: 0.1.1 -> 0.2.0
  • rawshift-image-dng: 0.1.1 -> 0.2.0
  • rawshift-image-gif: 0.1.1 -> 0.2.0
  • rawshift-image-heic: 0.1.1 -> 0.2.0
  • rawshift-image-jpeg: 0.1.1 -> 0.2.0
  • rawshift-image-jxl: 0.1.1 -> 0.2.0
  • rawshift-image-nef: 0.1.1 -> 0.2.0
  • rawshift-image-png: 0.1.1 -> 0.2.0
  • rawshift-image-ppm: 0.1.1 -> 0.2.0
  • rawshift-image-raf: 0.1.1 -> 0.2.0
  • rawshift-image-svg: 0.1.1 -> 0.2.0
  • rawshift-image-tiff: 0.1.1 -> 0.2.0
  • rawshift-image-webp: 0.1.1 -> 0.2.0
  • rawshift-image: 0.1.1 -> 0.2.0 (✓ API compatible changes)
  • rawshift: 0.1.1 -> 0.2.0 (✓ API compatible changes)

rawshift-core breaking changes

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/enum_missing.ron

Failed in:
  enum rawshift_core::color::ColorSpace, previously in file /tmp/.tmprRtljl/rawshift-core/src/color.rs:18
  enum rawshift_core::ColorSpace, previously in file /tmp/.tmprRtljl/rawshift-core/src/color.rs:18
  enum rawshift_core::color::BitDepth, previously in file /tmp/.tmprRtljl/rawshift-core/src/color.rs:63
  enum rawshift_core::BitDepth, previously in file /tmp/.tmprRtljl/rawshift-core/src/color.rs:63

--- failure enum_no_repr_variant_discriminant_changed: enum variant had its discriminant change value ---

Description:
The enum's variant had its discriminant value change. This breaks downstream code that used its value via a numeric cast like `as isize`.
        ref: https://doc.rust-lang.org/reference/items/enumerations.html#assigning-discriminant-values
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/enum_no_repr_variant_discriminant_changed.ron

Failed in:
  variant MetadataNamespace::Other 6 -> 7 in /tmp/.tmpyJtzdO/rawshift/crates/rawshift-core/src/metadata.rs:271
  variant MetadataNamespace::Other 6 -> 7 in /tmp/.tmpyJtzdO/rawshift/crates/rawshift-core/src/metadata.rs:271

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/enum_variant_added.ron

Failed in:
  variant MetadataNamespace:Avif in /tmp/.tmpyJtzdO/rawshift/crates/rawshift-core/src/metadata.rs:269
  variant MetadataNamespace:Avif in /tmp/.tmpyJtzdO/rawshift/crates/rawshift-core/src/metadata.rs:269

--- failure function_missing: pub fn removed or renamed ---

Description:
A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/function_missing.ron

Failed in:
  function rawshift_core::pixel::rgb16_from_interleaved, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:210
  function rawshift_core::pixel::rgb16_to_interleaved, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:218

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/module_missing.ron

Failed in:
  mod rawshift_core::pixel, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:1

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/struct_missing.ron

Failed in:
  struct rawshift_core::image::Size, previously in file /tmp/.tmprRtljl/rawshift-core/src/image.rs:25
  struct rawshift_core::pixel::Rgb, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:123
  struct rawshift_core::Rgb, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:123
  struct rawshift_core::pixel::Rgba, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:169
  struct rawshift_core::Rgba, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:169
  struct rawshift_core::image::RgbImage, previously in file /tmp/.tmprRtljl/rawshift-core/src/image.rs:432

--- failure trait_missing: pub trait removed or renamed ---

Description:
A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.47.0/src/lints/trait_missing.ron

Failed in:
  trait rawshift_core::metadata::MetadataExtractor, previously in file /tmp/.tmprRtljl/rawshift-core/src/metadata.rs:379
  trait rawshift_core::MetadataExtractor, previously in file /tmp/.tmprRtljl/rawshift-core/src/metadata.rs:379
  trait rawshift_core::pixel::FromF32, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:33
  trait rawshift_core::FromF32, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:33
  trait rawshift_core::pixel::Sample, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:10
  trait rawshift_core::Sample, previously in file /tmp/.tmprRtljl/rawshift-core/src/pixel.rs:10
Changelog

rawshift-image-core

0.2.0 - 2026-08-05

Fixed

  • (image) complete extracted feature boundaries

Other

  • merge origin/master into format crate refactor
  • (image) extract AVIF and HEIC crates
  • (image-core) add shared format contracts

rawshift-image-ifd

0.2.0 - 2026-08-05

Other

  • (image-core) add shared format contracts

rawshift-image-ljpeg

0.2.0 - 2026-08-05

Other

  • (image-core) add shared format contracts

rawshift-image-arw

0.2.0 - 2026-08-05

Other

  • (image) extract RAW format crates

rawshift-image-metadata

0.2.0 - 2026-08-05

Other

  • merge origin/master into format crate refactor
  • (image-core) add shared format contracts

rawshift-image-avif

0.2.0 - 2026-08-05

Added

  • (image) expose leaf encoder contracts

Other

  • merge origin/master into format crate refactor
  • (image) extract AVIF and HEIC crates

rawshift-image-cr2

0.2.0 - 2026-08-05

Other

  • (image) extract RAW format crates

rawshift-image-cr3

0.2.0 - 2026-08-05

Other

  • (image) extract RAW format crates

rawshift-image-crw

0.2.0 - 2026-08-05

Other

  • merge origin/master into format crate refactor
  • (image) extract RAW format crates

rawshift-image-dng

0.2.0 - 2026-08-05

Fixed

  • (image) complete extracted feature boundaries

Other

  • (image) extract RAW format crates

rawshift-image-gif

0.2.0 - 2026-08-05

Other

  • (image) extract standard decoder crates

rawshift-image-heic

0.2.0 - 2026-08-05

Other

  • merge origin/master into format crate refactor
  • (image) extract AVIF and HEIC crates

rawshift-image-jpeg

0.2.0 - 2026-08-05

Added

  • (image) expose leaf encoder contracts

Fixed

  • (image) keep empty leaf builds warning-free

Other

  • (image) extract standard decoder crates

rawshift-image-jxl

0.2.0 - 2026-08-05

Added

  • (image) expose leaf encoder contracts

Other

  • (image) extract standard decoder crates

rawshift-image-nef

0.2.0 - 2026-08-05

Other

  • (image) extract RAW format crates

rawshift-image-png

0.2.0 - 2026-08-05

Added

  • (image) expose leaf encoder contracts

Fixed

  • (image) keep empty leaf builds warning-free

Other

  • (image) extract standard decoder crates

rawshift-image-ppm

0.2.0 - 2026-08-05

Other

  • (image) extract standard decoder crates

rawshift-image-raf

0.2.0 - 2026-08-05

Other

  • (image) extract RAW format crates

rawshift-image-svg

0.2.0 - 2026-08-05

Other

  • (image) extract standard decoder crates

rawshift-image-tiff

0.2.0 - 2026-08-05

Other

  • (image) extract standard decoder crates

rawshift-image-webp

0.2.0 - 2026-08-05

Added

  • (image) expose leaf encoder contracts

Fixed

  • (image-webp) use target-native C char

Other

  • merge origin/master into format crate refactor
  • (image) extract standard decoder crates

rawshift

0.2.0 - 2026-08-05

Added

  • (api) [breaking] finalize the v1 image API surface; consolidated CHANGELOG
  • (hwdec,heic) [breaking] create rawshift-hwdec; rebuild HEIC on gamut-heic; drop libheif-rs
  • (avif) [breaking] AVIF decode via gamut-avif container + hardware AV1; drop the image crate
  • (avif) [breaking] migrate AVIF encode to gamut-avif; delete libaom and ravif
  • (core) [breaking] replace generic primitives with gamut re-exports, keep sensor types
  • (image) add libaom as an optional AVIF encoder backend
  • (image) expose leaf encoder contracts
  • (png) [breaking] migrate PNG decode to gamut-png; drop zune-png
  • (jpeg) [breaking] migrate JPEG to gamut-jpeg; delete jpegli stack and img-parts
  • (hwdec) VAAPI backend — HEVC Main/Main10 + AV1 still decode over dlopen'd libva
  • (jxl) [breaking] migrate JXL to gamut-jxl; drop jxl-oxide, zune-jpegxl, and the libjxl glue
  • (png) [breaking] migrate PNG encode to gamut-png
  • (dng) [breaking] migrate DNG decode/encode to gamut-dng; delete the binrw TIFF layer
  • (formats) [breaking] migrate ARW/CR2/NEF/CR3 IFD walking to gamut-ifd
  • (metadata) [breaking] migrate metadata stack to gamut-exif/gamut-icc/gamut-xmp
  • (deps) add gamut as pinned git dependency and raise MSRV to 1.92

Fixed

  • (image) allow metadata shim in hw-only builds
  • (image) complete extracted feature boundaries

Other

  • merge origin/master into format crate refactor
  • (image) document format crate boundaries
  • Merge branch 'master' of github.com:justin13888/rawshift
  • migrate gamut dependencies from git pin to crates.io versions
  • (features,ci) [breaking] consolidate the post-migration feature tree; add compile-boundary CI
  • Merge pull request feat(deps): add gamut as pinned git dependency and raise MSRV to 1.92 #40 from justin13888/17-add-gamut-pinned-git-dependency
  • (video) park rawshift-video as an unpublished placeholder for v1
  • add v1 design doc, permanent support matrix, and gamut policy
  • Revise Scope section and add key priorities
  • Update README with project status and scope
  • update GitHub org references from justin13888 to visualcommons
  • (image) extract standard decoder crates
  • (image) extract AVIF and HEIC crates
  • (image) extract RAW format crates
  • (image-core) add shared format contracts
  • (tests,bench) fixtures and benchmark final pass for the gamut migration
  • Merge branch 'master' into avif-libaom-encoder

v1 is the gamut migration release: rawshift's generic ground — image
primitives, colour, containers, metadata, and the migrated codecs — now comes
from the published gamut crates.
Release shape: v1 is publishable to crates.io now that every direct gamut
dependency is a registry package. 0.x source compatibility is a non-goal (see
docs/V1_DESIGN.md).

Changed

All entries below are breaking, grouped by area.

Package boundaries

  • Image formats now live in 17 independently publishable
    rawshift-image-* leaf crates. rawshift-image remains a source-compatible
    feature facade and owns processing, transforms, and camera data.
  • rawshift-image-core provides the canonical image/error types and open
    format capability traits; metadata, TIFF/IFD helpers, and lossless JPEG are
    isolated in focused support crates.

Core types (rawshift-core)

  • Generic primitives are gamut re-exports; only the sensor domain stays
    rawshift-owned. Sizegamut_core::Dimensions; the local pixel module
    (Sample/FromF32/Rgb<S>/Rgba<S>) → gamut-core's sealed
    Pixel/Sample traits and marker types (Rgb16, Rgba8, …) plus
    ImageBuf/ImageRef; local BitDepthgamut_color::BitDepth
    (#[non_exhaustive], serde via the bit_depth_serde with-module);
    ColorSpaceColorDescription, a CICP (H.273) code-point pair with
    consts SRGB/LINEAR_SRGB/DISPLAY_P3/REC2020/UNSPECIFIED
    (ICC-authoritative spaces map to UNSPECIFIED; the preserved ICC profile
    is the authority); MetadataExtractorExtractMetadata (rename, same
    contract).
  • RgbImage moved from rawshift-core to rawshift-image as a validated
    wrapper over gamut_core::ImageBuf<Rgb16> carrying ColorDescription,
    baseline exposure, and default crop. The public data field becomes
    data()/data_mut(); construction is fallible (new/with_color enforce
    len == w*h*3); the mutate-then-set_size two-step is replaced by the
    atomic validated replace_data.
  • New error surface: RawError::Gamut { context, source: gamut_core::Error }
    names the rawshift operation that invoked gamut (structured upstream
    context is gamut#254), and RawError::HwDecoderUnavailable { codec, reason }
    reports missing hardware decode. Backend-specific error variants
    (EncodeError::Jpeg/Jpegli/Jxl) are gone.

Metadata stack

  • little_exif → gamut-exif/gamut-icc/gamut-xmp for all EXIF parse/build, ICC
    internals, and XMP validation, plus an ImageMetadata
    gamut_metadata::Metadata bridge (to_gamut/from_gamut).
    ExifParser's container-format parameter is now the ExifContainer enum;
    EXIF built for embedding widens ISO to LONG instead of truncating past
    u16; XMP appends validate packets and reject malformed input
    (XmpError::Invalid) instead of embedding garbage.
  • Codec-side metadata extraction: JPEG (APP1/APP2 via gamut_jpeg::metadata),
    PNG (eXIf/iCCP/iTXt via gamut_png), AVIF/HEIC (container items) now also
    surface ICC and XMP where the old paths read EXIF alone; the hand-rolled
    JPEG APP1 and PNG eXIf scanners and their ExifContainer variants are
    deleted. PNG metadata reads now require the png-decode/png-encode
    feature (previously the bare exif feature sufficed).

Per-codec migrations (rawshift-image)

  • JPEG → gamut-jpeg (pure Rust, baseline + progressive both ways).
    Decode replaces zune-jpeg (CMYK/YCCK conversion bit-identical); encode
    replaces jpeg-encoder and the vendored jpegli stack with one
    EncodeOptions::Jpeg(JpegEncodeConfig) (quality, subsampling, progressive,
    restart interval, JFIF density). Codec id jpeg/gamut. Quality 0 no
    longer remaps to 90; default subsampling is 4:2:0. jpegli perceptual
    parity is tracked upstream (gamut#19/Hardware decode: VAAPI backend (Linux, HEVC + AV1, dlopen) #29/Hardware decode: MediaCodec backend (Android, HEVC + AV1) #30).
  • PNG → gamut-png both directions. Decode: every colour type and bit
    depth incl. Adam7, 16-bit native; DecodeOptions::PngZune(ZunePngDecodeConfig)
    DecodeOptions::Png(PngDecodeConfig) exposing gamut's hostile-input
    resource guards; the confirm_crc/strict knobs are gone (critical-chunk
    CRCs always enforced). Encode: ZunePngEncodeConfigPngEncodeConfig
    (compression level, filter strategy, auto_reduce); output bytes change
    (properly compressed). Codec id png/gamut both ways.
  • WebP → gamut-webp 0.3.1 both directions, replacing the in-repo
    libwebp-sys FFI wrapper with pure-Rust VP8/VP8L and RIFF handling.
    WebpDecodeConfig and WebpEncodeConfig replace the libwebp-named config
    types; encode quality is now u8 (0..=100), and the libwebp-specific
    method/near_lossless knobs are removed. EncodeError::WebP is removed;
    codec id is webp/gamut and registry version is 0.3. EXIF/XMP/ICC now
    flow through gamut-webp and the gamut-metadata bridge, replacing the manual
    WebP EXIF scanner.
  • JPEG XL → gamut-jxl. Decode replaces jxl-oxide (pure Rust);
    decode_jxl_partial is removed until truncated-stream decode lands
    upstream (gamut#256); animated and premultiplied-alpha streams are now
    rejected. Encode collapses zune-jpegxl and the in-repo libjxl glue onto
    gamut-jxl's encode feature (libjxl vendored hermetically by gamut-jxl-sys);
    one JxlEncodeConfig (lossless default, distance, effort, container,
    coded bit depth) — the 16-bit default now encodes true 16-bit lossless.
    Codec id jxl/gamut.
  • AVIF encode → gamut-avif (pure Rust, lossless default + lossy).
    EncodeOptions::AvifRavif/AvifLibaom collapse to Avif(AvifEncodeConfig);
    10/12-bit encode is temporarily unavailable pending gamut#251
    (EncodeError::UnsupportedBitDepth). Codec id avif/gamut.
  • AVIF decode → gamut-avif container + rawshift-hwdec hardware AV1,
    replacing the image crate's dav1d-backed path.
    DecodeOptions::AvifImageAvif(AvifDecodeConfig) (codec id
    avif/gamut); new AvifFile API and avif_hw_decode_available().
    Container/metadata/auxiliary enumeration are backend-less; pixel decode
    needs a hardware AV1 decoder (hw/hw-*) and reports
    RawError::HwDecoderUnavailable without one (software fallback is post-v1,
    gamut#259; 10/12-bit RGBA presentation pending gamut#303).
  • HEIC → gamut-heic container + rawshift-hwdec hardware HEVC, replacing
    libheif. DecodeOptions::HeicLibheifHeic(HeicDecodeConfig) (codec id
    heic/gamut); new HeicFile API and heic_hw_decode_available(); same
    backend-less container/metadata contract and HwDecoderUnavailable
    behaviour as AVIF.
  • DNG → gamut-dng both directions: uncompressed, Deflate, lossless JPEG,
    and DNG 1.7 JPEG XL (iPhone ProRAW) raw data all decode through gamut;
    export rebuilt on gamut_dng::DngEncoder. DngExportConfig
    DngEncodeConfig. DNG 1.7 JXL raw data reports decoded bit depth 16
    (full-range, reference-SDK semantics).
  • ARW/CR2/NEF/CR3 IFD walking → gamut-ifd (CR3's ISOBMFF box walker stays
    in-repo pending gamut#301). New numeric ParseError::MissingTag(u16)
    replaces the TiffTag-typed variant; corrupt top-level value offsets now
    fail at parse instead of on first touch.
  • v1 API finalization (Finalize v1 high-level image API and release #37): the option enums are strictly format-keyed —
    DecodeOptions::WebpLibwebp/SvgResvg/PpmZune
    WebP/Svg/Ppm, and EncodeOptions::PngGamut/WebpLibwebp
    Png/WebP. Backend names survive only in the config struct names of the
    un-migrated/exception backends (TiffDecodeConfig, GifDecodeConfig,
    ResvgDecodeConfig, ZunePpmDecodeConfig). The never-wired "planned
    backend" config structs (LibjpegTurboEncodeConfig, MozjpegEncodeConfig,
    SvtAv1EncodeConfig) are deleted — alternative encoder backends contradict
    the upstream-first policy; encoder improvements go to gamut.

Features & infrastructure

  • MSRV raised to 1.92 (required by the gamut dependency pin).
  • The five-tier feature hierarchy is consolidated: gamut-backed direction
    features pull their gamut-* dependency directly, deleting the
    per-implementation flags of every migrated format. Deleted feature axes:
    container-embed, tiff-parser (replaced by ifd-parser over gamut-ifd),
    heic-vendored, and every *-vendored linking flag. Retained tier-4
    aliases: gif-decode-gif/svg-decode-resvg/ppm-decode-zune (permanent
    exceptions) and tiff-decode-tiff (blocked migration: gamut#299/#300 via
    rawshift#22). The migrated webp-decode-libwebp and
    webp-encode-libwebp aliases are removed.
  • --all-features is no longer a valid build invocation by design: the
    hardware backend pins (hw-videotoolbox/hw-vaapi/hw-mediacodec) are
    mutually exclusive verified feature flags. Use --features full.
  • rawshift-video is parked as an unpublished placeholder: no video
    feature on the facade until video has an implementation.
  • build.rs shrinks to cfg-alias machinery and feature/target verification
    only (no more bindgen/cc/cmake/pkg-config build-dependency slice).

Added

  • (hwdec) New rawshift-hwdec crate: the workspace's hardware still-frame
    decode boundary (HEVC + AV1) with a safe public API (HwCodec,
    HwBackend, CodecConfig/StillDecodeRequest, validated DecodedFrame,
    HwStillDecoder, decoder()/backend()/available_codecs()), verified
    feature flags (hw portable; videotoolbox/vaapi/mediacodec
    compile_error! on foreign targets), and all platform FFI confined to it.
  • (hwdec) VAAPI hardware decode backend (linux-gnu): HEVC Main/Main10 and
    AV1 Profile 0 still pictures to NV12/P010, libva dlopen'd at runtime —
    absence of libva or a render node degrades to decoder() == None, never a
    link failure. NVIDIA is covered via the nvidia-vaapi-driver translation
    layer (see docs/SUPPORT.md). HEIC and AVIF pixel decode in
    rawshift-image work end-to-end on hardware through this backend.
  • (image) RawFile::format() — the detected RawFormat of an opened RAW
    file (Finalize v1 high-level image API and release #37).
  • (image) AvifFile and HeicFile container APIs: open / metadata /
    thumbnail / auxiliary (alpha, depth, gain map) enumeration / decode, plus
    the avif_hw_decode_available() / heic_hw_decode_available() runtime
    probes and MetadataNamespace::Avif container facts.
  • (image) gamut consumed as versioned crates.io dependencies managed in the
    workspace Cargo.toml (see the upstream-first policy in AGENTS.md and the
    update procedure in the README).
  • (bench) First codec benches: JPEG and PNG encode+decode round-trips on
    the gamut backends, plus gated HEIC/AVIF hardware-decode benches that
    self-generate fixtures via heif-enc/avifenc and skip cleanly without the
    tools or a GPU (docs/BENCHMARKS.md records the post-migration baseline).
  • (examples) avif_inspect example; all examples verified against the
    migrated backends with --features full.
  • (ci) Compile-boundary jobs: invalid feature × target combinations must
    fail with the exact compile_error! text; --features full builds on the
    hosted tier-1 targets.

Removed

The migration dependency graveyard — all breaking where a public API
hung off them:

  • (deps, codecs) zune-jpeg, zune-png, zune-jpegxl, jxl-oxide,
    jpeg-encoder, ravif, libaom-sys, avif-serialize, libheif-rs,
    image (with its dav1d subtree leaving the lockfile), and the direct
    jpegxl-src dependency (it remains only as gamut-jxl-sys's own pinned
    build-dependency). zune-core/zune-ppm stay — PPM is a permanent
    exception; tiff stays pending its blocked upstream migration
    (rawshift#22); gif and resvg are permanent exceptions. libwebp-sys
    and the in-repo unsafe WebP wrapper are removed in favor of gamut-webp.
  • (deps, metadata/containers) little_exif, img-parts, binrw — with
    the whole in-repo binrw TIFF layer: the tiff/ module and its public
    TiffParser/TiffWriter/TiffValue/TiffTag API.
  • (build) The vendored google/jpegli submodule (and .gitmodules), the
    in-repo libjxl bindgen glue, and the bindgen/cc/cmake/pkg-config
    build-dependencies.
  • (image) decode_jxl_partial (until gamut#256); the hand-rolled JPEG
    APP1, PNG eXIf, and WebP RIFF EXIF scanners;
    ExifContainer::Jpeg/Png/WebP/Avif read paths;
    the never-implemented "planned backend" encode config structs.

Fixed

  • The synthesised sRGB ICC profile's desc element was a malformed
    textDescriptionType; the gamut-icc-built profile is spec-valid (pinned by
    a test parsing back colorants and TRC).
  • Serialising empty/degenerate EXIF metadata no longer panics: gamut-exif
    emits a valid empty-IFD TIFF stream where little_exif panicked on this
    input.
  • CFAPattern is now also accepted from UNDEFINED-typed IFD fields
    (previously BYTE only, silently defaulting to RGGB).


This PR was generated with release-plz.

@github-actions
github-actions Bot force-pushed the release-plz-2026-07-19T02-01-39Z branch 4 times, most recently from 82e5e03 to a8ffc2f Compare July 21, 2026 23:47
@github-actions
github-actions Bot force-pushed the release-plz-2026-07-19T02-01-39Z branch from a8ffc2f to 60528cb Compare August 5, 2026 20:23
@github-actions
github-actions Bot force-pushed the release-plz-2026-07-19T02-01-39Z branch from 60528cb to 3ba1202 Compare August 5, 2026 20:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants