]> git.nega.tv - josh/narcissus/commitdiff
narcissus-core: Add FourCC wrapper
authorJosh Simmons <josh@nega.tv>
Mon, 13 May 2024 21:28:29 +0000 (23:28 +0200)
committerJosh Simmons <josh@nega.tv>
Mon, 13 May 2024 21:28:29 +0000 (23:28 +0200)
engine/narcissus-core/src/fourcc.rs [new file with mode: 0644]
engine/narcissus-core/src/lib.rs

diff --git a/engine/narcissus-core/src/fourcc.rs b/engine/narcissus-core/src/fourcc.rs
new file mode 100644 (file)
index 0000000..4b14671
--- /dev/null
@@ -0,0 +1,59 @@
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
+#[repr(transparent)]
+pub struct FourCC(u32);
+
+impl FourCC {
+    pub const fn from_raw(value: u32) -> Self {
+        Self(value)
+    }
+
+    pub const fn as_raw(self) -> u32 {
+        self.0
+    }
+}
+
+impl std::fmt::Debug for FourCC {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let bytes = self.0.to_le_bytes();
+        if let Ok(str) = std::str::from_utf8(&bytes) {
+            write!(f, "FourCC('{str}')",)
+        } else {
+            write!(f, "FourCC(0x{:08X})", self.0)
+        }
+    }
+}
+
+impl From<[u8; 4]> for FourCC {
+    fn from(value: [u8; 4]) -> Self {
+        FourCC::from_raw(u32::from_le_bytes(value))
+    }
+}
+
+#[macro_export]
+macro_rules! fourcc {
+    ($code:literal) => {
+        if $code.as_bytes().len() == 4 {
+            FourCC::from_raw(u32::from_le_bytes([
+                $code.as_bytes()[0],
+                $code.as_bytes()[1],
+                $code.as_bytes()[2],
+                $code.as_bytes()[3],
+            ]))
+        } else {
+            panic!("invalid fourcc code")
+        }
+    };
+}
+
+#[cfg(test)]
+mod tests {
+    use super::FourCC;
+
+    #[test]
+    fn basic() {
+        let magic = fourcc!("DDS ");
+        const MAGIC: FourCC = fourcc!("DDS ");
+        assert_eq!(magic.0, 0x20534444);
+        assert_eq!(MAGIC.0, 0x20534444);
+    }
+}
index 1bd371db79998d8f674c0bc4acf9de79111838cd..d351b9d617bf24ffddf21183cd366b130118c7cc 100644 (file)
@@ -3,6 +3,7 @@ mod bitset;
 mod directory;
 mod finite;
 mod fixed_vec;
+mod fourcc;
 mod libc;
 pub mod linear_log_binning;
 pub mod manual_arc;
@@ -25,6 +26,7 @@ pub use bitset::BitIter;
 pub use directory::{cache_dir, config_dir, data_dir, runtime_dir};
 pub use finite::{FiniteF32, FiniteF64, NotFiniteError};
 pub use fixed_vec::FixedVec;
+pub use fourcc::FourCC;
 pub use mutex::Mutex;
 pub use pool::{Handle, Pool};
 pub use ref_count::{Arc, Rc};