1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use alloc::boxed::Box;
use alloc::fmt;
use alloc::string::String;
use core::result;
use std::error::Error as StdError;
use std::io::Error as IoError;
use crate::ColorTransform;
pub type Result<T> = result::Result<T, Error>;
/// An enumeration over JPEG features (currently) unsupported by this library.
///
/// Support for features listed here may be included in future versions of this library.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum UnsupportedFeature {
/// Hierarchical JPEG.
Hierarchical,
/// JPEG using arithmetic entropy coding instead of Huffman coding.
ArithmeticEntropyCoding,
/// Sample precision in bits. 8 bit sample precision is what is currently supported in non-lossless coding process.
SamplePrecision(u8),
/// Number of components in an image. 1, 3 and 4 components are currently supported.
ComponentCount(u8),
/// An image can specify a zero height in the frame header and use the DNL (Define Number of
/// Lines) marker at the end of the first scan to define the number of lines in the frame.
DNL,
/// Subsampling ratio.
SubsamplingRatio,
/// A subsampling ratio not representable as an integer.
NonIntegerSubsamplingRatio,
/// Colour transform
ColorTransform(ColorTransform),
}
/// Errors that can occur while decoding a JPEG image.
#[derive(Debug)]
pub enum Error {
/// The image is not formatted properly. The string contains detailed information about the
/// error.
Format(String),
/// The image makes use of a JPEG feature not (currently) supported by this library.
Unsupported(UnsupportedFeature),
/// An I/O error occurred while decoding the image.
Io(IoError),
/// An internal error occurred while decoding the image.
Internal(Box<dyn StdError + Send + Sync + 'static>), //TODO: not used, can be removed with the next version bump
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::Format(ref desc) => write!(f, "invalid JPEG format: {}", desc),
Error::Unsupported(ref feat) => write!(f, "unsupported JPEG feature: {:?}", feat),
Error::Io(ref err) => err.fmt(f),
Error::Internal(ref err) => err.fmt(f),
}
}
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match *self {
Error::Io(ref err) => Some(err),
Error::Internal(ref err) => Some(&**err),
_ => None,
}
}
}
impl From<IoError> for Error {
fn from(err: IoError) -> Error {
Error::Io(err)
}
}