mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-12 10:03:51 +00:00
* craft-raw: the file-format layer of camera raw files, with DNG and CRW A new crate for #587 and #778: bytes in, the sensor data out as a neutral RawImage (samples, CFA, levels, active area, crop, orientation, colour tags, opcode lists, profile tables), and back for DNG. One Cargo feature per format: dng (read and write), jxl (JPEG XL DNG), crw (through craft-crw). The base is LightCraft's crates/raw at 5ff567a4: dng, dngwrite, tiffraw, unpack, ljpeg, jxl, semantic, preview, the parsing half of opcodes, profile and gaintable, the model and probe. Demosaicing and everything after it stay with the develop pipeline. Ported from PhotoCraft's and FilmCraft's DNG readers, each with a test: the default crop's per-tag defaults, an unusable crop falling back to the active area, non-finite white levels, the white default of a linearized image, the AsShotWhiteXY range, 8-bit-only lossy JPEG, lossy tiles that must cover their part of the image, and the CinemaDNG frame tags. * craft-raw: Hasselblad 3FR and FFF (feature hasselblad) RawFormat::CfaTiff decodes: the DNG-layout reader plus what these files add. Uncompressed data or Hasselblad's lossless JPEG (selection value 8), RGGB when no CFAPattern is stated, an FFF's colour matrix from the 3FR header it embeds, and the 8-bit RGB preview handed on as a baseline TIFF. Moved from LightCraft's vendor/hasselblad.rs at 5ff567a4 with its tests. Ported from PhotoCraft's reader: four BlackLevel values without a BlackLevelRepeatDim are one per CFA site in a file that is not a DNG. * craft-raw: Minolta MRW, Epson ERF, Mamiya MEF and Kodak DCS520C Four formats only LightCraft decodes, one feature each (mrw, erf, mef, kodak), moved from its vendor modules at 5ff567a4 with their tests; the MRW block container comes from lightcraft-meta. src/shared.rs holds the level helpers the maker decoders share. ERF and MEF state no white balance: the estimate LightCraft made from the preview is develop-side work, so wb_multipliers is None for them here. * craft-raw: shared scan budget for tagged previews, tile-sized lossy JPEG budget, bound on Deflate tile padding Ported from storytold/lightcraft#3695. Candidate preview ranges are deduplicated and charged to one byte budget and one header-walk budget; a lossy JPEG decoded for a tile may hold no more samples than the tile rounded up to whole MCUs (and never more than Limits::max_lossy_tile_samples); a Deflate chunk whose nominal size is mostly padding outside the image is refused before it is inflated. * craft-raw: lossless JPEG sample bound per referenced byte; previews larger than the file are passed over Ported from storytold/lightcraft#3910 (the parts whose code is in craft-raw today). check_image refuses a lossless JPEG image that declares more than 32 samples per referenced byte, counted once per chunk that points at the bytes so identical tiles stored once still decode. The Hasselblad RGB preview search passes over an image whose pixel bytes exceed the file and still takes a smaller complete one. * craft-raw: test for the Deflate padding bound * craft-raw: Pentax PEF and Samsung SRW Moved from LightCraft crates/raw (vendor/pef.rs, vendor/srw.rs) at 5ff567a4. The Huffman difference decoder and bit reader that PEF shares with the Nikon, Panasonic and Sony codings become the huffman module. * craft-raw: Canon CR2, with sRAW and mRAW Moved from LightCraft crates/raw (vendor/cr2.rs, vendor/cr2/sraw.rs) at 5ff567a4. The white-balance presets a CR2 lists come back as data in ColorData::kelvin_presets (the ordering from LightCraft's kelvin_presets.rs; the temperature and tint arithmetic stays with the developer). * craft-raw: an sRAW preview larger than the file is refused before its buffer is reserved Ported from storytold/lightcraft#3910 (cr2::sraw::read_preview). --------- Co-authored-by: radialmonster <radial@gmail.com>
60 lines
2.6 KiB
TOML
60 lines
2.6 KiB
TOML
[package]
|
|
name = "craft-raw"
|
|
description = "Camera raw files, the file-format layer: container parsing, decompression and the sensor data out as a neutral raw image with its levels, crop, orientation, colour tags and embedded previews. DNG (read and write), Hasselblad 3FR/FFF, MRW, ERF, MEF, Kodak DCS, Pentax PEF, Samsung SRW, Canon CR2 and Canon CRW so far."
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
repository.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[features]
|
|
default = ["dng", "jxl", "crw", "hasselblad", "mrw", "erf", "mef", "kodak", "pef", "srw", "cr2"]
|
|
## Adobe DNG, reading and writing: uncompressed, lossless JPEG, lossy JPEG, Deflate.
|
|
dng = ["dep:miniz_oxide", "dep:zune-jpeg", "dep:zune-core"]
|
|
## JPEG XL compressed DNGs (DNG 1.7, compression 52546) via jxl-oxide (pure Rust, MIT OR Apache-2.0).
|
|
jxl = ["dng", "dep:jxl-oxide"]
|
|
## Hasselblad 3FR / FFF: the DNG-layout reader plus the embedded 3FR header and the RGB preview.
|
|
hasselblad = ["dng"]
|
|
## Minolta / Konica Minolta MRW.
|
|
mrw = []
|
|
## Epson ERF.
|
|
erf = []
|
|
## Mamiya MEF.
|
|
mef = []
|
|
## Kodak DCS520C raw TIFF.
|
|
kodak = []
|
|
## Pentax PEF: uncompressed and Pentax's Huffman coding.
|
|
pef = []
|
|
## Samsung SRW: the uncompressed variants.
|
|
srw = []
|
|
## Canon CR2: sliced lossless JPEG, and sRAW / mRAW (subsampled YCbCr) as linear RGB.
|
|
cr2 = []
|
|
## Canon CRW (CIFF) through craft-crw, the one CRW decoder.
|
|
crw = ["dep:craft-crw", "dep:chrono"]
|
|
|
|
[dependencies]
|
|
craft-tiff = { workspace = true }
|
|
craft-crw = { workspace = true, optional = true }
|
|
serde = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
rayon = { workspace = true }
|
|
# The plausibility check of a CRW's capture time (AGENTS.md: time goes through chrono).
|
|
chrono = { workspace = true, optional = true }
|
|
# Deflate DNG tiles (Adobe compression 8).
|
|
miniz_oxide = { version = "0.9", optional = true }
|
|
# Lossy DNG tiles (compression 34892): 8-bit baseline JPEG. craft-jpeg covers the JPEG processes baseline
|
|
# decoders do not, and sends baseline frames to one; this is that one.
|
|
zune-jpeg = { version = "0.5", default-features = false, features = ["std", "x86", "neon"], optional = true }
|
|
zune-core = { version = "0.5", default-features = false, features = ["std"], optional = true }
|
|
jxl-oxide = { version = "0.12", default-features = false, optional = true }
|
|
|
|
[dev-dependencies]
|
|
proptest = { workspace = true }
|
|
# Encodes the lossy-JPEG tiles of the tests.
|
|
jpeg-encoder = { version = "0.7", default-features = false, features = ["std"] }
|
|
# Lossless JPEG XL encoder for the JPEG XL DNG tests.
|
|
zune-jpegxl = { version = "0.5", default-features = false, features = ["std"] }
|