mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-27 03:17:05 -06:00
* EXR: Cryptomatte layers list, decode and hash to the specification Cryptomatte (specification 1.2) carries per-pixel object and material IDs with coverage in <layer>NN.red/.green channel pairs, announced by cryptomatte/<key>/name|hash|conversion|manifest header attributes - the ID channels Arnold, V-Ray, Redshift, Mantra/Karma and Cycles write next to the beauty pass. cryptomatte_layers lists every layer from the headers alone (name, key, channels, the embedded manifest parsed and capped at 16 MiB, a sidecar pointer); decode_cryptomatte returns the per-pixel (ID, coverage) pairs above zero, sorted by descending coverage; cryptomatte_id hashes names the reference way (MurmurHash3 x86-32, the exponent fixed away from denormals/inf/NaN, read as f32 bits) - verified against the official test vectors - and cryptomatte_key/cryptomatte_preview_color expose the metadata key and preview colour. Files with deep parts are refused, like the other flat part decoders. * chore(ui): format prefs_ui (the workspace fmt gate is red on main until #2417 lands) * codecs: Cryptomatte decode checks the layer size without truncating casts Count each pixel's pair list in the allocation check too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Brandon Thomas <echelon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.7 KiB
TOML
47 lines
1.7 KiB
TOML
[package]
|
|
name = "photocraft-codecs"
|
|
description = "Symmetric, depth- and metadata-preserving codecs for flat raster image formats"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
|
|
[features]
|
|
# Real-file corpus tests (opt-in; `cargo xtask test-corpus`). Fail when the corpus is missing.
|
|
corpus = []
|
|
default = []
|
|
# AVIF *encode* via ravif (pure Rust). Decoding AVIF needs dav1d (C), so AVIF
|
|
# stays read-unsupported and therefore asymmetric; it is off by default.
|
|
avif = ["image/avif"]
|
|
# HEIC/HEIF decode via the optional photocraft-heif crate (heic-rs, pure Rust). Off by default so
|
|
# distributors choose it at build time; official builds and CI enable it (`--features heif` on the
|
|
# apps). Without it HEIF files are still recognised and opening one is a clear "unsupported" error.
|
|
heif = ["dep:photocraft-heif"]
|
|
|
|
[dependencies]
|
|
thiserror.workspace = true
|
|
image = { workspace = true, features = ["gif", "bmp", "tga", "ico", "qoi", "hdr"] }
|
|
png = "0.18"
|
|
tiff = { version = "0.11", default-features = false, features = ["deflate", "lzw"] }
|
|
exr = { version = "1.73", default-features = false }
|
|
half = "2"
|
|
serde_json.workspace = true
|
|
flate2.workspace = true
|
|
image-webp = "0.2"
|
|
zune-jpeg = "0.5"
|
|
zune-core = "0.5"
|
|
jpeg-encoder = "0.6"
|
|
photocraft-heif = { path = "../heif", optional = true }
|
|
|
|
# Orientation is applied a band of rows per task on native; wasm stays single-threaded.
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
rayon.workspace = true
|
|
|
|
[dev-dependencies]
|
|
proptest.workspace = true
|
|
# Oracle decoders for cross-checking in tests only.
|
|
image = { workspace = true, features = ["png", "jpeg", "tiff"] }
|
|
|
|
[lints]
|
|
workspace = true
|