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
mod rgb; mod rgba; mod grayscale; mod yuv; pub use self::rgb::*; pub use self::rgba::*; pub use self::grayscale::*; pub use self::yuv::*; // TODO(quadrupleslap): `AsBytes` for non-`u8`-backed pixel types. // TODO(quadrupleslap): Can't wait for constants in traits. /// Describes a kind of pixel that is made up of a fixed number of bytes. /// /// # Safety /// /// Perfectly safe to implement as long as the length of the byte array is /// always equal to `Self::width()`. When the bugs in associated constants are /// ironed out this will hopefully use them, and be safe to implement. pub unsafe trait AsBytes: Sized { /// The type that represents the collection of bytes. /// /// Unless you know better, this type should probably be `[u8; N]`, where /// `N` is the number of bytes in each pixel. type Bytes: AsRef<[u8]> + AsMut<[u8]> + Default + From<Self> + Into<Self>; /// The number of channels in each pixel. /// /// For example, `RGB` might have three bytes per pixel, and `RGBA` might /// have four channels per pixel. This should match the length of the /// `Bytes` type, unless you enjoy breaking perfectly good code. fn width() -> usize; }