luminance_webgl/webgl2/
array_buffer.rs1pub trait IntoArrayBuffer: Sized {
12 unsafe fn into_array_buffer(texels: &[Self]) -> js_sys::Object;
18}
19
20macro_rules! impl_IntoArrayBuffer {
21 ($t:ty, $buffer:ty) => {
22 impl IntoArrayBuffer for $t {
23 unsafe fn into_array_buffer(texels: &[Self]) -> js_sys::Object {
24 <$buffer>::view(texels).into()
25 }
26 }
27
28 impl_tuple_IntoArrayBuffer!($t, ($t, $t), 2, $buffer);
29 impl_tuple_IntoArrayBuffer!($t, ($t, $t, $t), 3, $buffer);
30 impl_tuple_IntoArrayBuffer!($t, ($t, $t, $t, $t), 4, $buffer);
31
32 impl_array_IntoArrayBuffer!($t, $buffer);
33 };
34}
35
36macro_rules! impl_tuple_IntoArrayBuffer {
37 ($t:ty, $tuple:ty, $n:literal, $buffer:ty) => {
38 const _: fn() = || {
41 let _ = std::mem::transmute::<[$t; $n], $tuple>;
42 };
43
44 impl IntoArrayBuffer for $tuple {
45 unsafe fn into_array_buffer(texels: &[Self]) -> js_sys::Object {
46 let slice: &[$t] =
47 std::slice::from_raw_parts(texels.as_ptr() as *const $t, texels.len() * $n);
48
49 <$buffer>::view(slice).into()
50 }
51 }
52 };
53}
54
55macro_rules! impl_array_IntoArrayBuffer {
56 ($t:ty, $buffer:ty) => {
57 impl<const N: usize> IntoArrayBuffer for [$t; N] {
58 unsafe fn into_array_buffer(texels: &[Self]) -> js_sys::Object {
59 let slice: &[$t] =
60 std::slice::from_raw_parts(texels.as_ptr() as *const $t, texels.len() * N);
61
62 <$buffer>::view(slice).into()
63 }
64 }
65 };
66}
67
68impl_IntoArrayBuffer!(u8, js_sys::Uint8Array);
69impl_IntoArrayBuffer!(i8, js_sys::Int8Array);
70impl_IntoArrayBuffer!(u16, js_sys::Uint16Array);
71impl_IntoArrayBuffer!(i16, js_sys::Int16Array);
72impl_IntoArrayBuffer!(u32, js_sys::Uint32Array);
73impl_IntoArrayBuffer!(i32, js_sys::Int32Array);
74
75impl_IntoArrayBuffer!(f32, js_sys::Float32Array);
76impl_IntoArrayBuffer!(f64, js_sys::Float64Array);