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
22trait PixelExt: Copy {
24 const MAX_BRIGHTNESS: u32;
26
27 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}