|  | 
|  | 1 | +use crate::error::XairoError; | 
|  | 2 | +use std::convert::From; | 
|  | 3 | + | 
|  | 4 | +#[derive(Copy, Clone, Debug, NifUnitEnum)] | 
|  | 5 | +pub enum Format { | 
|  | 6 | +    Invalid, | 
|  | 7 | +    Argb32, | 
|  | 8 | +    Rgb24, | 
|  | 9 | +    A8, | 
|  | 10 | +    A1, | 
|  | 11 | +    Rgb16_565, | 
|  | 12 | +    Rgb30, | 
|  | 13 | +} | 
|  | 14 | + | 
|  | 15 | +impl Format { | 
|  | 16 | +    fn stride_for_width(self, width: u32) -> Result<i32, XairoError> { | 
|  | 17 | +        match cairo::Format::from(self).stride_for_width(width) { | 
|  | 18 | +            Ok(stride) => Ok(stride), | 
|  | 19 | +            Err(err) => Err(err.into()), //Err(Error::Stride), | 
|  | 20 | +        } | 
|  | 21 | +    } | 
|  | 22 | +} | 
|  | 23 | + | 
|  | 24 | +#[rustler::nif] | 
|  | 25 | +fn stride_for_width(format: Format, width: u32) -> Result<i32, XairoError> { | 
|  | 26 | +    if width <= i32::MAX as u32 { | 
|  | 27 | +        format.stride_for_width(width) | 
|  | 28 | +    } else { | 
|  | 29 | +        Err(XairoError::InvalidStride) | 
|  | 30 | +    } | 
|  | 31 | +} | 
|  | 32 | + | 
|  | 33 | +impl From<Format> for cairo::Format { | 
|  | 34 | +    fn from(format: Format) -> Self { | 
|  | 35 | +        match format { | 
|  | 36 | +            Format::Invalid => cairo::Format::Invalid, | 
|  | 37 | +            Format::Argb32 => cairo::Format::ARgb32, | 
|  | 38 | +            Format::Rgb24 => cairo::Format::Rgb24, | 
|  | 39 | +            Format::A8 => cairo::Format::A8, | 
|  | 40 | +            Format::A1 => cairo::Format::A1, | 
|  | 41 | +            Format::Rgb16_565 => cairo::Format::Rgb16_565, | 
|  | 42 | +            Format::Rgb30 => cairo::Format::Rgb30, | 
|  | 43 | +        } | 
|  | 44 | +    } | 
|  | 45 | +} | 
|  | 46 | + | 
|  | 47 | +impl From<cairo::Format> for Format { | 
|  | 48 | +    fn from(format: cairo::Format) -> Self { | 
|  | 49 | +        match format { | 
|  | 50 | +            cairo::Format::ARgb32 => Format::Argb32, | 
|  | 51 | +            cairo::Format::Rgb24 => Format::Rgb24, | 
|  | 52 | +            cairo::Format::A8 => Format::A8, | 
|  | 53 | +            cairo::Format::A1 => Format::A1, | 
|  | 54 | +            cairo::Format::Rgb16_565 => Format::Rgb16_565, | 
|  | 55 | +            cairo::Format::Rgb30 => Format::Rgb30, | 
|  | 56 | +            _ => Format::Invalid, | 
|  | 57 | +        } | 
|  | 58 | +    } | 
|  | 59 | +} | 
0 commit comments