use std::io::Error as IoError;
use std::num::ParseIntError;
use gif;
use piston_image;
use png;
use ImageFormat;
#[derive(Debug)]
pub enum RasterError {
Io(IoError),
PixelOutOfBounds(i32, i32),
InvalidStartIndex(i32),
InvalidHex,
HexParse(ParseIntError),
BlendingImageFallsOutsideCanvas,
InvalidGamma(f32),
Decode(ImageFormat, String),
Encode(ImageFormat, String),
UnsupportedFormat(String),
Unexpected,
}
impl From<IoError> for RasterError {
fn from(err: IoError) -> RasterError {
RasterError::Io(err)
}
}
impl From<gif::DecodingError> for RasterError {
fn from(err: gif::DecodingError) -> RasterError {
match err {
gif::DecodingError::Format(msg) => RasterError::Decode(ImageFormat::Gif, msg.to_string()),
gif::DecodingError::Internal(msg) => RasterError::Decode(ImageFormat::Gif, msg.to_string()),
gif::DecodingError::Io(io_err) => RasterError::Io(io_err),
}
}
}
impl From<piston_image::ImageError> for RasterError {
fn from(err: piston_image::ImageError) -> RasterError {
match err {
piston_image::ImageError::FormatError(msg) => RasterError::Decode(ImageFormat::Jpeg, msg),
piston_image::ImageError::DimensionError => RasterError::Decode(ImageFormat::Jpeg, "DimensionError".to_string()),
piston_image::ImageError::UnsupportedError(msg) => RasterError::Decode(ImageFormat::Jpeg,msg),
piston_image::ImageError::UnsupportedColor(_) => RasterError::Decode(ImageFormat::Jpeg, "UnsupportedColor".to_string()),
piston_image::ImageError::NotEnoughData => RasterError::Decode(ImageFormat::Jpeg, "NotEnoughData".to_string()),
piston_image::ImageError::IoError(io_err) => RasterError::Io(io_err),
piston_image::ImageError::ImageEnd => RasterError::Decode(ImageFormat::Jpeg, "ImageEnd".to_string()),
}
}
}
impl From<png::DecodingError> for RasterError {
fn from(err: png::DecodingError) -> RasterError {
match err {
png::DecodingError::IoError(io_err) => RasterError::Io(io_err),
png::DecodingError::Format(_) => RasterError::Decode(ImageFormat::Png, "Format".to_string()),
png::DecodingError::InvalidSignature => RasterError::Decode(ImageFormat::Png, "InvalidSignature".to_string()),
png::DecodingError::CrcMismatch {..} => RasterError::Decode(ImageFormat::Png, "CrcMismatch".to_string()),
png::DecodingError::Other(_) => RasterError::Decode(ImageFormat::Png, "Other".to_string()),
png::DecodingError::CorruptFlateStream => RasterError::Decode(ImageFormat::Png, "CorruptFlateStream".to_string()),
}
}
}
impl From<png::EncodingError> for RasterError {
fn from(err: png::EncodingError) -> RasterError {
match err {
png::EncodingError::IoError(io_err) => RasterError::Io(io_err),
png::EncodingError::Format(_) => RasterError::Encode(ImageFormat::Png, "Format".to_string()),
}
}
}
pub type RasterResult<T> = Result<T, RasterError>;