1 | use crate::legacy::internal::pixel::*; |
2 | use core::slice; |
3 | |
4 | pub use crate::formats::gray::Gray_v08 as Gray; |
5 | pub use crate::formats::gray_alpha::GrayAlpha_v08 as GrayAlpha; |
6 | |
7 | /// Renamed to `Bgra` |
8 | #[doc (hidden)] |
9 | pub use crate::formats::bgra::Bgra as BGRA; |
10 | |
11 | /// Renamed to `Bgr` |
12 | #[doc (hidden)] |
13 | pub use crate::formats::bgr::Bgr as BGR; |
14 | |
15 | /// Renamed to `Abgr` |
16 | #[doc (hidden)] |
17 | pub use crate::formats::abgr::Abgr as ABGR; |
18 | |
19 | /// Renamed to `Argb` |
20 | #[doc (hidden)] |
21 | pub use crate::formats::argb::Argb as ARGB; |
22 | |
23 | /// Renamed to `Grb` |
24 | #[doc (hidden)] |
25 | pub use crate::formats::grb::Grb as GRB; |
26 | |
27 | /// 8-bit BGR |
28 | pub type BGR8 = crate::formats::bgr::Bgr<u8>; |
29 | |
30 | /// 16-bit BGR in machine's native endian |
31 | pub type BGR16 = crate::formats::bgr::Bgr<u16>; |
32 | |
33 | /// 8-bit BGRA |
34 | pub type BGRA8 = crate::formats::bgra::Bgra<u8>; |
35 | |
36 | /// 8-bit ABGR, alpha is first. 0 = transparent, 255 = opaque. |
37 | pub type ABGR8 = crate::formats::abgr::Abgr<u8>; |
38 | |
39 | /// 8-bit ARGB, alpha is first. 0 = transparent, 255 = opaque. |
40 | pub type ARGB8 = crate::Argb<u8>; |
41 | |
42 | /// 16-bit BGR in machine's native endian |
43 | pub type BGRA16 = crate::formats::bgra::Bgra<u16>; |
44 | |
45 | /// 16-bit ABGR in machine's native endian. 0 = transparent, 65535 = opaque. |
46 | pub type ABGR16 = crate::formats::abgr::Abgr<u16>; |
47 | |
48 | /// 16-bit ARGB in machine's native endian. 0 = transparent, 65535 = opaque. |
49 | pub type ARGB16 = crate::Argb<u16>; |
50 | |
51 | /// 8-bit GRB |
52 | pub type GRB8 = crate::formats::grb::Grb<u8>; |
53 | |
54 | /// 8-bit gray |
55 | #[deprecated (note = "Refer to ::rgb::alt::Gray<u8> directly (this type alias will change in the next major version)" )] |
56 | pub type GRAY8 = Gray<u8>; |
57 | |
58 | /// 16-bit gray in machine's native endian |
59 | #[deprecated (note = "Refer to ::rgb::alt::Gray<u16> directly (this type alias will change in the next major version)" )] |
60 | pub type GRAY16 = Gray<u16>; |
61 | |
62 | /// 8-bit gray with alpha in machine's native endian |
63 | #[deprecated (note = "Refer to ::rgb::alt::GrayAlpha<u8> directly (this type alias will change in the next major version)" )] |
64 | pub type GRAYA8 = GrayAlpha<u8>; |
65 | |
66 | /// 16-bit gray with alpha in machine's native endian |
67 | #[deprecated (note = "Refer to ::rgb::alt::GrayAlpha<u16> directly (this type alias will change in the next major version)" )] |
68 | pub type GRAYA16 = GrayAlpha<u16>; |
69 | |
70 | |
71 | #[cfg (not(feature = "unstable-experimental" ))] |
72 | impl<T> core::ops::Deref for Gray<T> { |
73 | type Target = T; |
74 | |
75 | #[inline (always)] |
76 | fn deref(&self) -> &T { |
77 | &self.0 |
78 | } |
79 | } |
80 | |
81 | impl<T: Copy> From<T> for Gray<T> { |
82 | #[inline (always)] |
83 | fn from(component: T) -> Self { |
84 | Gray(component) |
85 | } |
86 | } |
87 | |
88 | impl<T: Clone, A> GrayAlpha<T, A> { |
89 | /// Copy `Gray` component out of the `GrayAlpha` struct |
90 | #[inline (always)] |
91 | pub fn gray(&self) -> Gray<T> { |
92 | Gray(self.0.clone()) |
93 | } |
94 | } |
95 | |
96 | impl<T, A> GrayAlpha<T, A> { |
97 | /// Provide a mutable view of only `Gray` component (leaving out alpha). |
98 | #[inline (always)] |
99 | pub fn gray_mut(&mut self) -> &mut Gray<T> { |
100 | unsafe { &mut *(self as *mut _ as *mut _) } |
101 | } |
102 | } |
103 | |
104 | impl<T: Copy, A: Clone> GrayAlpha<T, A> { |
105 | /// Create a new `GrayAlpha` with the new alpha value, but same gray value |
106 | #[doc (hidden)] |
107 | #[deprecated (note = "use .with_alpha(a) instead; this will become a getter in the future" )] |
108 | pub fn alpha(&self, a: A) -> Self { |
109 | self.with_alpha(a) |
110 | } |
111 | |
112 | /// Create a new `GrayAlpha` with the new alpha value, but same gray value |
113 | #[inline (always)] |
114 | pub fn with_alpha(&self, a: A) -> Self { |
115 | Self(self.0, a) |
116 | } |
117 | |
118 | /// Create a new `GrayAlpha` with a new alpha value created by the callback. |
119 | #[inline (always)] |
120 | pub fn map_alpha<F, B>(&self, f: F) -> GrayAlpha<T, B> |
121 | where F: FnOnce(A) -> B |
122 | { |
123 | GrayAlpha(self.0, f(self.1.clone())) |
124 | } |
125 | |
126 | /// Create new `GrayAlpha` with the same alpha value, but different `Gray` value |
127 | #[inline (always)] |
128 | pub fn map_gray<F, U, B>(&self, f: F) -> GrayAlpha<U, B> |
129 | where F: FnOnce(T) -> U, U: Clone, B: From<A> + Clone { |
130 | GrayAlpha(f(self.0), self.1.clone().into()) |
131 | } |
132 | } |
133 | |
134 | impl<T: Copy, B> ComponentMap<Gray<B>, T, B> for Gray<T> { |
135 | #[inline (always)] |
136 | fn map<F>(&self, mut f: F) -> Gray<B> where F: FnMut(T) -> B { |
137 | Gray(f(self.0)) |
138 | } |
139 | } |
140 | |
141 | impl<T: Copy, B> ColorComponentMap<Gray<B>, T, B> for Gray<T> { |
142 | #[inline (always)] |
143 | fn map_colors<F>(&self, mut f: F) -> Gray<B> where F: FnMut(T) -> B { |
144 | Gray(f(self.0)) |
145 | } |
146 | } |
147 | |
148 | impl<T: Copy, B> ComponentMap<GrayAlpha<B>, T, B> for GrayAlpha<T> { |
149 | #[inline (always)] |
150 | fn map<F>(&self, mut f: F) -> GrayAlpha<B> |
151 | where F: FnMut(T) -> B { |
152 | GrayAlpha(f(self.0), f(self.1)) |
153 | } |
154 | } |
155 | |
156 | impl<T: Copy, A: Copy, B> ColorComponentMap<GrayAlpha<B, A>, T, B> for GrayAlpha<T, A> { |
157 | #[inline (always)] |
158 | fn map_colors<F>(&self, mut f: F) -> GrayAlpha<B, A> |
159 | where F: FnMut(T) -> B { |
160 | GrayAlpha(f(self.0), self.1) |
161 | } |
162 | } |
163 | |
164 | impl<T> ComponentSlice<T> for GrayAlpha<T> { |
165 | #[inline (always)] |
166 | fn as_slice(&self) -> &[T] { |
167 | unsafe { |
168 | slice::from_raw_parts(self as *const Self as *const T, len:2) |
169 | } |
170 | } |
171 | |
172 | #[inline (always)] |
173 | fn as_mut_slice(&mut self) -> &mut [T] { |
174 | unsafe { |
175 | slice::from_raw_parts_mut(self as *mut Self as *mut T, len:2) |
176 | } |
177 | } |
178 | } |
179 | |
180 | impl<T> ComponentSlice<T> for [GrayAlpha<T>] { |
181 | #[inline ] |
182 | fn as_slice(&self) -> &[T] { |
183 | unsafe { |
184 | slice::from_raw_parts(self.as_ptr().cast(), self.len() * 2) |
185 | } |
186 | } |
187 | |
188 | #[inline ] |
189 | fn as_mut_slice(&mut self) -> &mut [T] { |
190 | unsafe { |
191 | slice::from_raw_parts_mut(self.as_ptr() as *mut _, self.len() * 2) |
192 | } |
193 | } |
194 | } |
195 | |
196 | impl<T> ComponentSlice<T> for Gray<T> { |
197 | #[inline (always)] |
198 | fn as_slice(&self) -> &[T] { |
199 | slice::from_ref(&self.0) |
200 | } |
201 | |
202 | #[inline (always)] |
203 | fn as_mut_slice(&mut self) -> &mut [T] { |
204 | slice::from_mut(&mut self.0) |
205 | } |
206 | } |
207 | |
208 | impl<T> ComponentSlice<T> for [Gray<T>] { |
209 | #[inline ] |
210 | fn as_slice(&self) -> &[T] { |
211 | unsafe { |
212 | slice::from_raw_parts(self.as_ptr().cast(), self.len()) |
213 | } |
214 | } |
215 | |
216 | #[inline ] |
217 | fn as_mut_slice(&mut self) -> &mut [T] { |
218 | unsafe { |
219 | slice::from_raw_parts_mut(self.as_ptr() as *mut _, self.len()) |
220 | } |
221 | } |
222 | } |
223 | |
224 | /// Assumes 255 is opaque |
225 | impl<T: Copy> From<Gray<T>> for GrayAlpha<T, u8> { |
226 | #[inline (always)] |
227 | fn from(other: Gray<T>) -> Self { |
228 | GrayAlpha(other.0, 0xFF) |
229 | } |
230 | } |
231 | |
232 | /// Assumes 65535 is opaque |
233 | impl<T: Copy> From<Gray<T>> for GrayAlpha<T, u16> { |
234 | #[inline (always)] |
235 | fn from(other: Gray<T>) -> Self { |
236 | GrayAlpha(other.0, 0xFFFF) |
237 | } |
238 | } |
239 | |
240 | #[test ] |
241 | #[allow (deprecated)] |
242 | fn gray() { |
243 | let rgb: crate::RGB<_> = Gray(1).into(); |
244 | assert_eq!(rgb.r, 1); |
245 | assert_eq!(rgb.g, 1); |
246 | assert_eq!(rgb.b, 1); |
247 | |
248 | let rgba: crate::RGBA<_> = Gray(1u8).into(); |
249 | assert_eq!(rgba.r, 1); |
250 | assert_eq!(rgba.g, 1); |
251 | assert_eq!(rgba.b, 1); |
252 | assert_eq!(rgba.a, 255); |
253 | |
254 | let g: GRAY8 = 200.into(); |
255 | let g = g.map(|c| c / 2); |
256 | #[cfg (not(feature = "unstable-experimental" ))] |
257 | assert_eq!(110, *g + 10); |
258 | #[cfg (not(feature = "unstable-experimental" ))] |
259 | assert_eq!(110, 10 + Gray(100).as_ref()); |
260 | |
261 | let ga: GRAYA8 = GrayAlpha(1, 2); |
262 | assert_eq!(ga.gray(), Gray::new(1)); |
263 | let mut g2 = ga.clone(); |
264 | *g2.gray_mut() = Gray(3); |
265 | assert_eq!(g2.map_gray(|g| g + 1), GRAYA8::new(4, 2)); |
266 | assert_eq!(g2.map(|g| g + 1), GrayAlpha(4, 3)); |
267 | assert_eq!(g2.0, 3); |
268 | assert_eq!(g2.as_slice(), &[3, 2]); |
269 | assert_eq!(g2.as_mut_slice(), &[3, 2]); |
270 | assert_eq!(g2.with_alpha(13), GrayAlpha(3, 13)); |
271 | assert_eq!(g2.map_alpha(|x| x + 3), GrayAlpha(3, 5)); |
272 | |
273 | assert_eq!((&[Gray(1u16), Gray(2)][..]).as_slice(), &[1, 2]); |
274 | assert_eq!((&[GrayAlpha(1u16, 2), GrayAlpha(3, 4)][..]).as_slice(), &[1, 2, 3, 4]); |
275 | |
276 | let rgba: crate::RGBA<_> = ga.into(); |
277 | assert_eq!(rgba.r, 1); |
278 | assert_eq!(rgba.g, 1); |
279 | assert_eq!(rgba.b, 1); |
280 | assert_eq!(rgba.a, 2); |
281 | |
282 | let ga: GRAYA16 = GrayAlpha(1, 2); |
283 | let rgba: crate::RGBA<u16, u16> = ga.into(); |
284 | assert_eq!(rgba.r, 1); |
285 | assert_eq!(rgba.g, 1); |
286 | assert_eq!(rgba.b, 1); |
287 | assert_eq!(rgba.a, 2); |
288 | } |
289 | |