mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-13 13:43:20 +00:00
* raw: clean-room camera raw decoder and developer (photocraft-raw) A new standalone crate (no workspace deps, wasm-safe, no unsafe) written from TIFF 6.0, TIFF/EP, the DNG 1.7 spec, ITU-T T.81 Annex H and published demosaicing papers: - Lossless JPEG (LJ92) decoder: predictors 1-7, point transform, restart intervals, combined Huffman+extra-bits fast table. - DNG: uncompressed (8-16 bit, packed) and LJ92, strips and tiles, CFA and LinearRaw, linearization, black level (repeat, deltas), white level, active area, default crop, ColorMatrix/CameraCalibration/ForwardMatrix interpolation by CCT, AnalogBalance, AsShotNeutral/WhiteXY, BaselineExposure, orientation. - CR2 (LJ92 slices, SensorInfo borders, ColorData as-shot WB, measured black) and TIFF/EP raws (NEF/ARW/PEF uncompressed or LJ92, incl. Sony lossless ARW tiles, Nikon/Sony documented black and WB tags). - Develop: black/white scaling, WB with highlight clipping, bilinear / Malvar-He-Cutler / AHD demosaic (rayon bands, sequential on wasm), camera -> XYZ D50 -> ProPhoto, exposure, gamma 1.8, 16-bit, orientation. - Embedded JPEG preview finder; clear Unsupported errors for CR3, RAF, ORF, RW2, vendor-compressed NEF/ARW/PEF, lossy/JXL/float DNG, X-Trans. - Limits checked before every allocation; testgen feature with an LJ92 encoder and DNG/CR2/TIFF-EP writers; round-trip, colour-reference, truncation and corruption tests. Registered as a standalone crate in xtask layers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * io: open camera raws through photocraft-raw (16-bit ProPhoto), preview fallback Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * raw: DNG GainMap opcode, fuzz targets, stress tools; open raws from the apps - Apply DNG OpcodeList2 GainMap (lens shading, e.g. phone DNGs); report other opcodes. - cargo-fuzz targets (develop, ljpeg) and a mutation stress example. - Raw extensions in the desktop/web open dialogs and the batch folder list. - file.open returns the import notes (how a raw was developed, preview fallback). - codecs: the camera raw refusal points at photocraft-raw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * raw: clippy 1.99 (is_multiple_of, clamp) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
41 lines
1.2 KiB
Rust
41 lines
1.2 KiB
Rust
//! Error type.
|
|
|
|
use std::fmt;
|
|
|
|
/// Why a raw file could not be decoded.
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum RawError {
|
|
/// Not a camera raw file this crate recognizes.
|
|
NotRaw,
|
|
/// A raw file (or a variant of one) that is recognized but not decoded yet.
|
|
Unsupported(String),
|
|
/// The file is damaged or inconsistent.
|
|
Malformed(String),
|
|
/// Declared sizes exceed the [`crate::Limits`].
|
|
LimitExceeded(String),
|
|
}
|
|
|
|
impl RawError {
|
|
pub(crate) fn malformed(msg: impl Into<String>) -> Self {
|
|
RawError::Malformed(msg.into())
|
|
}
|
|
pub(crate) fn unsupported(msg: impl Into<String>) -> Self {
|
|
RawError::Unsupported(msg.into())
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for RawError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
RawError::NotRaw => write!(f, "not a camera raw file"),
|
|
RawError::Unsupported(m) => write!(f, "unsupported camera raw: {m}"),
|
|
RawError::Malformed(m) => write!(f, "malformed camera raw: {m}"),
|
|
RawError::LimitExceeded(m) => write!(f, "camera raw exceeds limits: {m}"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl std::error::Error for RawError {}
|
|
|
|
pub(crate) type Result<T> = std::result::Result<T, RawError>;
|