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
// format.rs     Pixel format.
//
// Copyright (c) 2018-2019  Douglas P Lau
//
use crate::{AlphaMode, Channel, GammaMode};

/// Pixel format determines [Channel](trait.Channel.html)s and bit depth.
///
/// * [Gray](struct.Gray.html): [Gray8](type.Gray8.html),
///   [Gray16](type.Gray16.html), [Gray32](type.Gray32.html),
///   [GrayAlpha8](type.GrayAlpha8.html), [GrayAlpha16](type.GrayAlpha16.html),
///   [GrayAlpha32](type.GrayAlpha32.html)
/// * [Mask](struct.Mask.html): [Mask8](type.Mask8.html),
///   [Mask16](type.Mask16.html), [Mask32](type.Mask32.html)
/// * [Rgb](struct.Rgb.html): [Rgb8](type.Rgb8.html), [Rgb16](type.Rgb16.html),
///   [Rgb32](type.Rgb32.html), [Rgba8](type.Rgba8.html),
///   [Rgba16](type.Rgba16.html), [Rgba32](type.Rgba32.html)
///
pub trait Format: Clone + Copy + Default + PartialEq {

    /// `Channel` type
    type Chan: Channel;

    /// Get *red*, *green*, *blue* and *alpha* `Channel`s
    fn rgba(self) -> [Self::Chan; 4];

    /// Make a pixel with given RGBA `Channel`s
    fn with_rgba(rgba: [Self::Chan; 4]) -> Self;

    /// Get channel-wise difference
    fn difference(self, rhs: Self) -> Self;

    /// Check if all `Channel`s are within threshold
    fn within_threshold(self, rhs: Self) -> bool;
}

/// Pixel modes are settings for [AlphaMode](enum.AlphaMode.html) and
/// [GammaMode](enum.GammaMode.html).
pub trait PixModes {

    /// Get the pixel format alpha mode
    fn alpha_mode(&self) -> Option<AlphaMode> { None }

    /// Get the pixel format gamma mode
    fn gamma_mode(&self) -> Option<GammaMode> { None }
}