blockhash/
img.rs

1use crate::Image;
2use image::{GenericImageView, Luma, LumaA, Rgb, Rgba};
3
4impl<T, P> Image for T
5where
6    T: GenericImageView<Pixel = P>,
7    P: PixelExt,
8{
9    const MAX_BRIGHTNESS: u32 = P::MAX_BRIGHTNESS;
10
11    #[inline]
12    fn dimensions(&self) -> (u32, u32) {
13        GenericImageView::dimensions(self)
14    }
15
16    #[inline]
17    fn brightness(&self, x: u32, y: u32) -> u32 {
18        PixelExt::brightness(self.get_pixel(x, y))
19    }
20}
21
22/// Extension trait for [`image`] pixel types.
23trait PixelExt: Copy {
24    /// The maximum possible brightness for a pixel.
25    const MAX_BRIGHTNESS: u32;
26
27    /// Returns the brightness of the pixel, in the range `0..=MAX_BRIGHTNESS`.
28    fn brightness(self) -> u32;
29}
30
31impl PixelExt for Luma<u8> {
32    const MAX_BRIGHTNESS: u32 = u8::MAX as u32;
33
34    #[inline]
35    fn brightness(self) -> u32 {
36        let Self([y]) = self;
37        u32::from(y)
38    }
39}
40
41impl PixelExt for Luma<u16> {
42    const MAX_BRIGHTNESS: u32 = u16::MAX as u32;
43
44    #[inline]
45    fn brightness(self) -> u32 {
46        let Self([y]) = self;
47        u32::from(y)
48    }
49}
50
51impl PixelExt for LumaA<u8> {
52    const MAX_BRIGHTNESS: u32 = u8::MAX as u32;
53
54    #[inline]
55    fn brightness(self) -> u32 {
56        let Self([y, a]) = self;
57        match a {
58            0 => Self::MAX_BRIGHTNESS,
59            _ => u32::from(y),
60        }
61    }
62}
63
64impl PixelExt for LumaA<u16> {
65    const MAX_BRIGHTNESS: u32 = u16::MAX as u32;
66
67    #[inline]
68    fn brightness(self) -> u32 {
69        let Self([y, a]) = self;
70        match a {
71            0 => Self::MAX_BRIGHTNESS,
72            _ => u32::from(y),
73        }
74    }
75}
76
77impl PixelExt for Rgb<u8> {
78    const MAX_BRIGHTNESS: u32 = u8::MAX as u32 * 3;
79
80    #[inline]
81    fn brightness(self) -> u32 {
82        let Self([r, g, b]) = self;
83        u32::from(r) + u32::from(g) + u32::from(b)
84    }
85}
86
87impl PixelExt for Rgb<u16> {
88    const MAX_BRIGHTNESS: u32 = u16::MAX as u32 * 3;
89
90    #[inline]
91    fn brightness(self) -> u32 {
92        let Self([r, g, b]) = self;
93        u32::from(r) + u32::from(g) + u32::from(b)
94    }
95}
96
97impl PixelExt for Rgba<u8> {
98    const MAX_BRIGHTNESS: u32 = u8::MAX as u32 * 3;
99
100    #[inline]
101    fn brightness(self) -> u32 {
102        let Self([r, g, b, a]) = self;
103        match a {
104            0 => Self::MAX_BRIGHTNESS,
105            _ => u32::from(r) + u32::from(g) + u32::from(b),
106        }
107    }
108}
109
110impl PixelExt for Rgba<u16> {
111    const MAX_BRIGHTNESS: u32 = u16::MAX as u32 * 3;
112
113    #[inline]
114    fn brightness(self) -> u32 {
115        let Self([r, g, b, a]) = self;
116        match a {
117            0 => Self::MAX_BRIGHTNESS,
118            _ => u32::from(r) + u32::from(g) + u32::from(b),
119        }
120    }
121}