use std::{num::NonZeroU16, time::Duration};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct CanvasSize {
pub width: u32,
pub height: u32,
}
impl CanvasSize {
pub fn pixel_count(self) -> Option<u64> {
u64::from(self.width).checked_mul(u64::from(self.height))
}
pub fn rgba_bytes(self) -> Option<usize> {
self.pixel_count()
.and_then(|pixels| pixels.checked_mul(4))
.and_then(|bytes| usize::try_from(bytes).ok())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum LoopCount {
Infinite,
Finite(NonZeroU16),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct BackgroundColor {
pub raw: u32,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct AnimationInfo {
pub canvas: CanvasSize,
pub frame_count: u32,
pub loop_count: LoopCount,
pub background_color: BackgroundColor,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct StaticWebpInfo {
pub canvas: CanvasSize,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AnimationFrame {
pub rgba: Vec<u8>,
pub canvas: CanvasSize,
pub duration: Duration,
}