Files
lightcraft/crates/heif
Andrew FrahnandClaude Opus 5.5 6cbc0eb5a9 Phase 0: configurable brand, MIT licence, plan/ and Immich tracker
- brand.toml is the only place the product name lives; every crate and app
  reads it through dac-brand (env vars with legacy fallback, settings folder
  with copy-only migration, default library, preset extensions, i18n {app})
- cargo xtask brand check|test, run|install|package, docs, rename-crates,
  deny and immich; packaging files are templates rendered from brand.toml
- icons regenerated from brand/icon.svg; upstream branding removed
- MIT licence (segment and fetch stay Apache-2.0); cargo deny licence policy
- clean-room rules in AGENTS.md/CLAUDE.md; docs/upstream-merge.md
- plan/ rebuilt and committed; parity tracker reopens Classic rows, adds
  PLAN.md section 2 rows and the IMM Immich section; plan/immich.md and a
  pinned Immich test server

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 10:30:06 +11:00
..

dac-heif

The optional HEIF / HEIC decoder of the app: iPhone and Mac photos. A thin, panic-guarded wrapper around heic-rs, a pure-Rust HEVC still-picture decoder (no unsafe, MIT OR Apache-2.0): single pictures and grid-tiled photos, 8- and 10-bit (10-bit decodes to 16-bit), alpha auxiliary images, the container's rotation/mirror/crop, ICC, EXIF and XMP. Read-only: writing would need an HEVC encoder.

let info = dac_heif::probe(&bytes)?;           // size, depth, alpha: check limits first
let img = dac_heif::decode(&bytes, &dac_heif::Options::default())?;
// img.width, img.height, img.has_alpha, img.sixteen_bit, img.data (RGB/RGBA), img.icc, img.exif, img.xmp

Errors are Error::Unsupported (image sequences, overlays, …), Error::Limit or Error::Malformed. It never panics: every call into heic-rs runs under catch_unwind, and a panic inside it (PhotoCraft's fuzzing found two in 0.1.1) becomes Error::Malformed. The crate is a port of PhotoCraft's photocraft-heif — the sibling apps deliberately share one decoder, one pin and one set of regression fixtures.

Why it is a separate, optional crate

  • A young decoder. heic-rs is new and has a single maintainer. It is pinned exactly (=0.1.1); moving the pin is a reviewed change (re-run the crate tests and cargo test -p dac-codecs --features heif).
  • HEVC patents are a distributor's call. HEVC is patent-encumbered in some jurisdictions, so whether a build includes an HEVC decoder is a build-time choice. dac-codecs uses this crate only behind its non-default heif feature; the apps forward it (cargo build -p dac-app --features heif). Without it, HEIC files are still recognised and opening one is a clear "HEIC/HEIF support isn't included in this build" error — the same policy as PhotoCraft.

The crate depends on no other workspace crate; codecs → heif is the only edge between them.