1use std::ffi::CString;
2
3mod ext_traits;
4
5pub use ext_traits::CellOptionExt;
6
7pub type Palette = [[u8; 3]; 256];
8
9pub const QUAKE_PALETTE: Palette = include_palette();
10
11const fn include_palette() -> Palette {
12 let bytes = *include_bytes!("palette.lmp");
13 assert!(bytes.len() == std::mem::size_of::<Palette>());
14 unsafe { std::mem::transmute(bytes) }
15}
16
17#[derive(Clone, Copy)]
18pub struct Junk<T: Copy + Default + Sized> {
19 _value: T,
20}
21
22impl<T: Copy + Default> PartialEq<Junk<T>> for Junk<T> {
23 fn eq(&self, _: &Junk<T>) -> bool {
24 true
25 }
26}
27
28impl<T: Copy + Default> Eq for Junk<T> {}
29
30impl<T: Copy + Default> Default for Junk<T> {
31 fn default() -> Self {
32 Self {
33 _value: T::default(),
34 }
35 }
36}
37
38impl<T: Copy + Default> core::fmt::Debug for Junk<T> {
39 fn fmt(
40 &self,
41 _formatter: &mut core::fmt::Formatter,
42 ) -> Result<(), core::fmt::Error> {
43 Ok(())
44 }
45}
46
47pub fn slice_to_cstring(slice: &[u8]) -> std::ffi::CString {
48 let mut len = 0;
49
50 while len < slice.len() {
51 if slice[len] == 0u8 {
52 break;
53 }
54
55 len += 1;
56 }
57
58 CString::new(&slice[..len]).unwrap()
59}