1#[allow(deprecated)]
2use super::pixel::ComponentSlice;
3use super::pixel::{ComponentMap, ColorComponentMap};
4#[cfg(feature = "as-bytes")]
5use super::pixel::ComponentBytes;
6use crate::alt::{BGRA, ARGB, ABGR, BGR};
7use crate::{RGB, RGBA};
8use core::fmt;
9
10impl<T, A> RGBA<T, A> {
11 #[inline(always)]
12 pub const fn new_alpha(r: T, g: T, b: T, a: A) -> Self {
15 Self { r, g, b, a }
16 }
17}
18
19impl<T> BGRA<T> {
20 #[inline(always)]
21 #[deprecated(note = "This function has a misleading order of arguments. Use BGRA{} literal instead")]
24 pub const fn new(r: T, g: T, b: T, a: T) -> Self {
25 Self { b, g, r, a }
26 }
27}
28
29impl<T, A> BGRA<T, A> {
33 #[inline(always)]
34 #[deprecated(note = "This function has a misleading order of arguments. Use BGRA{} literal instead")]
37 pub const fn new_alpha(r: T, g: T, b: T, a: A) -> Self {
38 Self { b, g, r, a }
39 }
40}
41
42impl<T> ARGB<T> {
43 #[inline(always)]
44 #[deprecated(note = "This function has a misleading order of arguments. Use ARGB{} literal instead")]
47 pub const fn new(r: T, g: T, b: T, a: T) -> Self {
48 Self { a, r, g, b }
49 }
50}
51
52impl<T, A> ARGB<T, A> {
53 #[inline(always)]
54 #[deprecated(note = "This function has a misleading order of arguments. Use ARGB{} literal instead")]
57 pub const fn new_alpha(r: T, g: T, b: T, a: A) -> Self {
58 Self { a, r, g, b }
59 }
60}
61
62impl<T> ABGR<T> {
63 #[inline(always)]
64 #[deprecated(note = "This function has a misleading order of arguments. Use ABGR{} literal instead")]
67 pub const fn new(r: T, g: T, b: T, a: T) -> Self {
68 Self { a, b, g, r }
69 }
70}
71
72impl<T, A> ABGR<T, A> {
73 #[inline(always)]
74 #[deprecated(note = "This function has a misleading order of arguments. Use ABGR{} literal instead")]
77 pub const fn new_alpha(r: T, g: T, b: T, a: A) -> Self {
78 Self { a, b, g, r }
79 }
80}
81
82macro_rules! impl_rgba {
83 ($RGBA:ident) => {
84 impl<T: Clone> $RGBA<T> {
85 #[inline(always)]
87 pub fn iter(&self) -> core::iter::Cloned<core::slice::Iter<'_, T>> {
88 #[allow(deprecated)]
89 ComponentSlice::as_slice(self).iter().cloned()
90 }
91 }
92
93 impl<T: Clone, A> $RGBA<T, A> {
94 #[inline(always)]
98 pub fn bgr(&self) -> BGR<T> {
99 BGR {
100 r: self.r.clone(),
101 g: self.g.clone(),
102 b: self.b.clone(),
103 }
104 }
105 }
106
107 impl<T: Copy, A: Clone> $RGBA<T, A> {
108 #[deprecated(note = "Renamed to map_colors()")]
110 pub fn map_rgb<F, U, B>(&self, mut f: F) -> $RGBA<U, B>
111 where F: FnMut(T) -> U, U: Clone, B: From<A> + Clone
112 {
113 $RGBA {
114 r: f(self.r),
115 g: f(self.g),
116 b: f(self.b),
117 a: self.a.clone().into(),
118 }
119 }
120
121 #[doc(hidden)]
122 #[deprecated(note = "use .with_alpha(a) instead")]
123 pub fn alpha(&self, a: A) -> Self {
125 self.with_alpha(a)
126 }
127
128 #[inline(always)]
129 pub fn with_alpha(&self, a: A) -> Self {
131 Self { r: self.r, g: self.g, b: self.b, a }
132 }
133
134 #[inline]
137 pub fn map_alpha<F, B>(&self, f: F) -> $RGBA<T, B>
138 where F: FnOnce(A) -> B {
139 $RGBA {
140 r: self.r,
141 g: self.g,
142 b: self.b,
143 a: f(self.a.clone()),
144 }
145 }
146 }
147
148 impl<T: Copy, B> ComponentMap<$RGBA<B>, T, B> for $RGBA<T> {
149 #[inline(always)]
150 fn map<F>(&self, mut f: F) -> $RGBA<B>
151 where F: FnMut(T) -> B {
152 $RGBA {
153 r: f(self.r),
154 g: f(self.g),
155 b: f(self.b),
156 a: f(self.a),
157 }
158 }
159 }
160
161 impl<T: Copy, A: Copy, B> ColorComponentMap<$RGBA<B, A>, T, B> for $RGBA<T, A> {
162 #[inline(always)]
163 fn map_colors<F>(&self, mut f: F) -> $RGBA<B, A>
164 where F: FnMut(T) -> B {
165 $RGBA {
166 r: f(self.r),
167 g: f(self.g),
168 b: f(self.b),
169 a: self.a,
170 }
171 }
172 }
173
174 #[allow(deprecated)]
175 impl<T> ComponentSlice<T> for $RGBA<T> {
176 #[inline(always)]
177 fn as_slice(&self) -> &[T] {
178 unsafe {
179 core::slice::from_raw_parts(self as *const Self as *const T, 4)
180 }
181 }
182
183 #[inline(always)]
184 fn as_mut_slice(&mut self) -> &mut [T] {
185 unsafe {
186 core::slice::from_raw_parts_mut(self as *mut Self as *mut T, 4)
187 }
188 }
189 }
190
191 #[allow(deprecated)]
192 impl<T> ComponentSlice<T> for [$RGBA<T>] {
193 #[inline]
194 fn as_slice(&self) -> &[T] {
195 unsafe {
196 core::slice::from_raw_parts(self.as_ptr() as *const _, self.len() * 4)
197 }
198 }
199
200 #[inline]
201 fn as_mut_slice(&mut self) -> &mut [T] {
202 unsafe {
203 core::slice::from_raw_parts_mut(self.as_mut_ptr() as *mut _, self.len() * 4)
204 }
205 }
206 }
207
208 #[cfg(feature = "as-bytes")]
209 impl<T: crate::Pod> ComponentBytes<T> for [$RGBA<T>] {}
210 };
211}
212
213macro_rules! impl_alpha_conv {
214 ($RGB:ident, $RGBA:ident) => {
215 impl<T: Copy> From<$RGB<T>> for $RGBA<T, u8> {
217 #[inline(always)]
218 fn from(other: $RGB<T>) -> Self {
219 Self {
220 r: other.r,
221 g: other.g,
222 b: other.b,
223 a: 0xFF,
224 }
225 }
226 }
227
228 impl<T: Copy> From<$RGB<T>> for $RGBA<T, u16> {
230 #[inline(always)]
231 fn from(other: $RGB<T>) -> Self {
232 Self {
233 r: other.r,
234 g: other.g,
235 b: other.b,
236 a: 0xFFFF,
237 }
238 }
239 }
240 };
241}
242
243impl<T, A> RGBA<T, A> {
244 #[inline(always)]
247 pub fn rgb_mut(&mut self) -> &mut RGB<T> {
248 unsafe { &mut *(self as *mut Self).cast::<RGB<T>>() }
249 }
250}
251
252impl<T, A> BGRA<T, A> {
253 #[deprecated(note = "This function will change. Use bgr_mut()")]
256 pub fn rgb_mut(&mut self) -> &mut BGR<T> {
257 unsafe { &mut *(self as *mut Self).cast::<BGR<T>>() }
258 }
259
260 #[inline(always)]
263 pub fn bgr_mut(&mut self) -> &mut BGR<T> {
264 unsafe { &mut *(self as *mut Self).cast::<BGR<T>>() }
265 }
266}
267
268impl<T> core::iter::FromIterator<T> for RGBA<T> {
269 #[inline(always)]
270 fn from_iter<I: IntoIterator<Item = T>>(into_iter: I) -> Self {
273 let mut iter = into_iter.into_iter();
274 Self {
275 r: iter.next().unwrap(),
276 g: iter.next().unwrap(),
277 b: iter.next().unwrap(),
278 a: iter.next().unwrap(),
279 }
280 }
281}
282
283impl<T: Clone, A> RGBA<T, A> {
284 #[inline(always)]
288 pub fn rgb(&self) -> RGB<T> {
289 RGB {
290 r: self.r.clone(),
291 g: self.g.clone(),
292 b: self.b.clone(),
293 }
294 }
295}
296
297impl<T: Clone, A> ARGB<T, A> {
298 #[inline(always)]
302 pub fn rgb(&self) -> RGB<T> {
303 RGB {
304 r: self.r.clone(),
305 g: self.g.clone(),
306 b: self.b.clone(),
307 }
308 }
309}
310
311impl<T: Clone, A> BGRA<T, A> {
312 #[deprecated(note = "This function will change. Use bgr()")]
316 pub fn rgb(&self) -> BGR<T> {
317 BGR {
318 r: self.r.clone(),
319 g: self.g.clone(),
320 b: self.b.clone(),
321 }
322 }
323}
324
325impl_rgba! {RGBA}
326impl_rgba! {BGRA}
327impl_rgba! {ARGB}
328impl_rgba! {ABGR}
329
330impl_alpha_conv! {BGR, BGRA}
331impl_alpha_conv! {RGB, BGRA}
332impl_alpha_conv! {BGR, RGBA}
333impl_alpha_conv! {RGB, RGBA}
334impl_alpha_conv! {BGR, ABGR}
335impl_alpha_conv! {RGB, ABGR}
336impl_alpha_conv! {BGR, ARGB}
337impl_alpha_conv! {RGB, ARGB}
338
339impl<T: fmt::Display, A: fmt::Display> fmt::Display for RGBA<T, A> {
340 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
341 write!(f, "rgba({},{},{},{})", self.r, self.g, self.b, self.a)
342 }
343}
344
345impl<T: fmt::Display, A: fmt::Display> fmt::Display for BGRA<T, A> {
346 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
347 write!(f, "bgra({},{},{},{})", self.r, self.g, self.b, self.a)
348 }
349}
350