cvmath/packed.rs
1/*!
2Packs and unpacks unsigned integers.
3*/
4
5use super::*;
6
7//----------------------------------------------------------------
8// Packed integers
9
10impl Vec2<u32> {
11 /// Unpacks `u64` into `u32 u32`.
12 ///
13 /// ```
14 /// use cvmath::Vec2;
15 ///
16 /// assert_eq!(
17 /// Vec2 { x: 0x01010101, y: 0xFEFEFEFE },
18 /// Vec2::unpack32(0xFEFEFEFE_01010101)
19 /// );
20 /// ```
21 #[inline]
22 pub const fn unpack32(v: u64) -> Vec2<u32> {
23 Vec2 {
24 x: ((v & 0x00000000FFFFFFFF) >> 0) as u32,
25 y: ((v & 0xFFFFFFFF00000000) >> 32) as u32,
26 }
27 }
28 /// Packs into `u64`.
29 ///
30 /// ```
31 /// use cvmath::Vec2;
32 ///
33 /// let this: Vec2<u32> = Vec2 { x: 0x01010101, y: 0xFEFEFEFE };
34 /// assert_eq!(0xFEFEFEFE_01010101, this.pack());
35 /// ```
36 #[inline]
37 pub const fn pack(self) -> u64 {
38 (self.y as u64) << 32 | (self.x as u64)
39 }
40}
41impl Vec2<u16> {
42 /// Unpacks `u32` into `u16 u16`.
43 ///
44 /// ```
45 /// use cvmath::Vec2;
46 ///
47 /// assert_eq!(
48 /// Vec2 { x: 0x0101, y: 0xFEFE },
49 /// Vec2::unpack16(0xFEFE_0101)
50 /// );
51 /// ```
52 #[inline]
53 pub const fn unpack16(v: u32) -> Vec2<u16> {
54 Vec2 {
55 x: ((v & 0x0000FFFF) >> 0) as u16,
56 y: ((v & 0xFFFF0000) >> 16) as u16,
57 }
58 }
59 /// Packs into `u32`.
60 ///
61 /// ```
62 /// use cvmath::Vec2;
63 ///
64 /// let this: Vec2<u16> = Vec2 { x: 0x0101, y: 0xFEFE };
65 /// assert_eq!(0xFEFE_0101, this.pack());
66 /// ```
67 #[inline]
68 pub const fn pack(self) -> u32 {
69 (self.y as u32) << 16 | (self.x as u32)
70 }
71}
72impl Vec2<u8> {
73 /// Unpacks `u16` into `u8 u8`.
74 ///
75 /// ```
76 /// use cvmath::Vec2;
77 ///
78 /// assert_eq!(
79 /// Vec2 { x: 0x01, y: 0xFE },
80 /// Vec2::unpack8(0xFE_01)
81 /// );
82 /// ```
83 #[inline]
84 pub const fn unpack8(v: u16) -> Vec2<u8> {
85 Vec2 {
86 x: ((v as u32 & 0x000000FF) >> 0) as u8,
87 y: ((v as u32 & 0x0000FF00) >> 8) as u8,
88 }
89 }
90 /// Packs into `u16`.
91 ///
92 /// ```
93 /// use cvmath::Vec2;
94 ///
95 /// let this: Vec2<u8> = Vec2 { x: 0x01, y: 0xFE };
96 /// assert_eq!(0xFE_01, this.pack());
97 /// ```
98 #[inline]
99 pub const fn pack(self) -> u16 {
100 ((self.y as u32) << 8 | (self.x as u32)) as u16
101 }
102}
103impl Vec4<u16> {
104 /// Unpacks `u64` into `u16 u16 u16 u16`.
105 ///
106 /// ```
107 /// use cvmath::Vec4;
108 ///
109 /// assert_eq!(
110 /// Vec4 { x: 0x0101, y: 0x5656, z: 0x9A9A, w: 0xFEFE },
111 /// Vec4::unpack16(0xFEFE_9A9A_5656_0101)
112 /// );
113 /// ```
114 #[inline]
115 pub const fn unpack16(v: u64) -> Vec4<u16> {
116 Vec4 {
117 x: ((v & 0x000000000000FFFF) >> 0) as u16,
118 y: ((v & 0x00000000FFFF0000) >> 16) as u16,
119 z: ((v & 0x0000FFFF00000000) >> 32) as u16,
120 w: ((v & 0xFFFF000000000000) >> 48) as u16,
121 }
122 }
123 /// Packs into `u64`.
124 ///
125 /// ```
126 /// use cvmath::Vec4;
127 ///
128 /// let this: Vec4<u16> = Vec4 { x: 0x0101, y: 0x5656, z: 0x9A9A, w: 0xFEFE };
129 /// assert_eq!(0xFEFE_9A9A_5656_0101, this.pack());
130 /// ```
131 #[inline]
132 pub const fn pack(self) -> u64 {
133 (self.w as u64) << 48 | (self.z as u64) << 32 | (self.y as u64) << 16 | (self.x as u64)
134 }
135}
136impl Vec4<u8> {
137 /// Unpacks `u32` into `u8 u8 u8 u8`.
138 ///
139 /// ```
140 /// use cvmath::Vec4;
141 ///
142 /// assert_eq!(
143 /// Vec4 { x: 0x01, y: 0x56, z: 0x9A, w: 0xFE },
144 /// Vec4::unpack8(0xFE_9A_56_01)
145 /// );
146 /// ```
147 ///
148 /// Unpacks an RGBA color value into `Vec4<f32>` where `x`: red, `y`: green, `z`: blue and `w`: alpha.
149 ///
150 /// ```
151 /// use cvmath::Vec4;
152 ///
153 /// // 0xAABBGGRR in little endian results in RR GG BB AA bytes in memory.
154 /// let rgba = 0xFF_C0_80_40;
155 /// let color = Vec4::unpack8(rgba).cast::<f32>() / 255_f32;
156 /// assert_eq!(Vec4 { x: 64.0/255.0, y: 128.0/255.0, z: 192.0/255.0, w: 1.0 }, color);
157 /// ```
158 #[inline]
159 pub const fn unpack8(v: u32) -> Vec4<u8> {
160 Vec4 {
161 x: ((v & 0x000000FF) >> 0) as u8,
162 y: ((v & 0x0000FF00) >> 8) as u8,
163 z: ((v & 0x00FF0000) >> 16) as u8,
164 w: ((v & 0xFF000000) >> 24) as u8,
165 }
166 }
167 /// Packs into `u32`.
168 ///
169 /// ```
170 /// use cvmath::Vec4;
171 ///
172 /// let this: Vec4<u8> = Vec4 { x: 0x01, y: 0x56, z: 0x9A, w: 0xFE };
173 /// assert_eq!(0xFE_9A_56_01, this.pack());
174 /// ```
175 ///
176 /// Packs `Vec4<f32>` color components into an RGBA color value.
177 ///
178 /// ```
179 /// use cvmath::Vec4;
180 ///
181 /// let color = Vec4 { x: 64.0/255.0, y: 128.0/255.0, z: 192.0/255.0, w: 1.0 };
182 /// let rgba = (color * 255_f32).cast::<u8>().pack();
183 /// assert_eq!(0xFF_C0_80_40, rgba);
184 /// ```
185 #[inline]
186 pub const fn pack(self) -> u32 {
187 (self.w as u32) << 24 | (self.z as u32) << 16 | (self.y as u32) << 8 | (self.x as u32)
188 }
189}