mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-24 18:18:12 -06:00
Export as JPEG XL from the dialog, CLI, MCP and control channel (format jxl): lossy with quality or lossless, 8/16-bit, effort fast/normal, progressive, EXIF/XMP boxes; HDR edits as 16-bit Rec. 2020 PQ. Encoder: jixel (pure Rust, BSD-3-Clause OR Apache-2.0, native only: it spawns its own threads), wrapped in catch_unwind. Lossy files declare an enum encoding (sRGB / P3 / Rec. 2020; Adobe RGB and ProPhoto written as Rec. 2020); lossless files embed the ICC profile. Decoder fix: jxl-oxide desaturated colours outside sRGB when rendering XYB images to wider primaries; lossy wide-gamut JXL now renders to linear sRGB primaries and is converted to Rec. 2020 here. jixel's slowest effort is left out: jxl-oxide misdecodes its (valid) files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
2.2 KiB
TOML
56 lines
2.2 KiB
TOML
[package]
|
|
name = "lightcraft-codecs"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
description = "LightCraft standard image codecs: sniffing, decode to linear light, ICC, encoders (L1)"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
lightcraft-geom = { workspace = true }
|
|
lightcraft-color = { workspace = true }
|
|
lightcraft-raster = { workspace = true }
|
|
lightcraft-heif = { workspace = true, optional = true }
|
|
serde = { workspace = true }
|
|
bytemuck = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
rayon = { workspace = true, optional = true }
|
|
image = { workspace = true, features = ["gif", "bmp"] }
|
|
zune-jpeg = { workspace = true }
|
|
zune-core = { workspace = true }
|
|
jpeg-decoder = { workspace = true }
|
|
jpeg-encoder = { workspace = true }
|
|
png = { workspace = true }
|
|
tiff = { workspace = true }
|
|
image-webp = { workspace = true }
|
|
moxcms = { workspace = true }
|
|
jxl-oxide = { workspace = true, optional = true }
|
|
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
ravif = { workspace = true, optional = true }
|
|
rav1e = { workspace = true, optional = true }
|
|
avif-serialize = { workspace = true, optional = true }
|
|
# spawns threads of its own (std::thread), which wasm32 has not got
|
|
jixel = { workspace = true, optional = true }
|
|
|
|
[features]
|
|
default = ["parallel", "jxl", "avif"]
|
|
parallel = ["dep:rayon", "lightcraft-raster/parallel", "jpeg-decoder/rayon"]
|
|
## JPEG XL decode (jxl-oxide) and, on native targets, encode (jixel); both pure Rust.
|
|
jxl = ["dep:jxl-oxide", "dep:jixel"]
|
|
# HEIC/HEIF decode via the optional lightcraft-heif crate (heic-rs, pure Rust). Off by default so
|
|
# distributors choose it at build time (HEVC patents are a distributor's call, same policy as
|
|
# PhotoCraft); `cargo xtask ci` clippies and tests it (`--features heif`), releases don't ship it yet.
|
|
heif = ["dep:lightcraft-heif"]
|
|
## AVIF encoding via ravif/rav1e (pure Rust, BSD). Native targets only; a no-op on wasm32.
|
|
avif = ["dep:ravif", "dep:rav1e", "dep:avif-serialize"]
|
|
|
|
[dev-dependencies]
|
|
# JPEG XL tests read encoded samples without our colour conversion
|
|
jxl-oxide = { workspace = true }
|
|
proptest = { workspace = true }
|
|
# Lossless synthetic HEIC files for the `heif` feature's tests.
|
|
lightcraft-heif = { workspace = true, features = ["testdata"] }
|