p_chan/
unsigned.rs

1//! Unsigned channel newtypes
2
3use crate::ops::Conversion;
4
5macro_rules! midpoint {
6    () => {
7        /// Calculates the middle point of `self` and `rhs`.
8        ///
9        /// `midpoint(a, b)` is `(a + b) / 2` calculated without overflow,
10        /// rounded to zero.
11        pub const fn midpoint(self, rhs: Self) -> Self {
12            Self(self.0.midpoint(rhs.0))
13        }
14    };
15}
16
17ch_int!(
18    (Ch8, u8, u16, core::convert::identity, midpoint! {}),
19    doc = "8-bit (0 to 255) unsigned integer channel value",
20);
21
22ch_int!(
23    (Ch12, u16, u32, normalize_ch12, midpoint! {}),
24    doc = "12-bit unsigned integer (0 to 4\\_095) channel value",
25);
26
27ch_int!(
28    (Ch16, u16, u32, core::convert::identity, midpoint! {}),
29    doc = "16-bit unsigned integer (0 to 65\\_535) channel value",
30);
31
32ch_int!(
33    (Ch24, u32, u64, normalize_ch24, midpoint! {}),
34    doc = "24-bit unsigned integer (0 to 16\\_777\\_215) channel value",
35);
36
37ch_float!(
38    (Ch32, f32, crate::math::normalize_f32, 0.0, 0.5),
39    doc = "32-bit float (0 to 1) channel value",
40);
41
42ch_float!(
43    (Ch64, f64, crate::math::normalize_f64, 0.0, 0.5),
44    doc = "64-bit float (0 to 1) channel value",
45);
46
47const fn normalize_ch12(mut chan: u16) -> u16 {
48    if chan > 2_u16.pow(12) - 1 {
49        chan = 2_u16.pow(12) - 1;
50    }
51
52    chan
53}
54
55const fn normalize_ch24(mut chan: u32) -> u32 {
56    if chan > 2_u32.pow(24) - 1 {
57        chan = 2_u32.pow(24) - 1;
58    }
59
60    chan
61}
62
63conversion!(Ch8, Ch12);
64conversion!(Ch8, Ch16);
65conversion!(Ch8, Ch24);
66conversion!(Ch8, Ch32);
67conversion!(Ch8, Ch64);
68
69conversion!(Ch12, Ch8);
70conversion!(Ch12, Ch16);
71conversion!(Ch12, Ch24);
72conversion!(Ch12, Ch32);
73conversion!(Ch12, Ch64);
74
75conversion!(Ch16, Ch8);
76conversion!(Ch16, Ch12);
77conversion!(Ch16, Ch24);
78conversion!(Ch16, Ch32);
79conversion!(Ch16, Ch64);
80
81conversion!(Ch24, Ch8);
82conversion!(Ch24, Ch12);
83conversion!(Ch24, Ch16);
84conversion!(Ch24, Ch32);
85conversion!(Ch24, Ch64);
86
87conversion!(Ch32, Ch8);
88conversion!(Ch32, Ch12);
89conversion!(Ch32, Ch16);
90conversion!(Ch32, Ch24);
91conversion!(Ch32, Ch64);
92
93conversion!(Ch64, Ch8);
94conversion!(Ch64, Ch12);
95conversion!(Ch64, Ch16);
96conversion!(Ch64, Ch24);
97conversion!(Ch64, Ch32);
98
99#[cfg(feature = "signed")]
100mod signed {
101    use super::*;
102    use crate::signed;
103
104    conversion!(signed::Ch8, Ch12);
105    conversion!(signed::Ch8, Ch16);
106    conversion!(signed::Ch8, Ch24);
107    conversion!(signed::Ch8, Ch32);
108    conversion!(signed::Ch8, Ch64);
109
110    conversion!(signed::Ch12, Ch8);
111    conversion!(signed::Ch12, Ch16);
112    conversion!(signed::Ch12, Ch24);
113    conversion!(signed::Ch12, Ch32);
114    conversion!(signed::Ch12, Ch64);
115
116    conversion!(signed::Ch16, Ch8);
117    conversion!(signed::Ch16, Ch12);
118    conversion!(signed::Ch16, Ch24);
119    conversion!(signed::Ch16, Ch32);
120    conversion!(signed::Ch16, Ch64);
121
122    conversion!(signed::Ch24, Ch8);
123    conversion!(signed::Ch24, Ch12);
124    conversion!(signed::Ch24, Ch16);
125    conversion!(signed::Ch24, Ch32);
126    conversion!(signed::Ch24, Ch64);
127
128    conversion!(signed::Ch32, Ch8);
129    conversion!(signed::Ch32, Ch12);
130    conversion!(signed::Ch32, Ch16);
131    conversion!(signed::Ch32, Ch24);
132    conversion!(signed::Ch32, Ch64);
133
134    conversion!(signed::Ch64, Ch8);
135    conversion!(signed::Ch64, Ch12);
136    conversion!(signed::Ch64, Ch16);
137    conversion!(signed::Ch64, Ch24);
138    conversion!(signed::Ch64, Ch32);
139
140    conversion!(signed::Ch8, Ch8);
141    conversion!(signed::Ch12, Ch12);
142    conversion!(signed::Ch16, Ch16);
143    conversion!(signed::Ch24, Ch24);
144    conversion!(signed::Ch32, Ch32);
145    conversion!(signed::Ch64, Ch64);
146}