Skip to main content

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}