1#[derive(Debug, Clone)]
13pub struct Bitmap<T, const N: usize> {
14 pub width: usize,
15 pub height: usize,
16 data: Vec<T>,
17}
18
19impl<T: Copy + Default, const N: usize> Bitmap<T, N> {
20 pub fn new(width: usize, height: usize) -> Self {
22 Bitmap {
23 width,
24 height,
25 data: vec![T::default(); width * height * N],
26 }
27 }
28}
29
30impl<T, const N: usize> Bitmap<T, N> {
31 #[inline]
32 fn offset(&self, x: usize, y: usize) -> usize {
33 N * (self.width * y + x)
34 }
35
36 #[inline]
38 pub fn pixel(&self, x: usize, y: usize) -> &[T] {
39 let o = self.offset(x, y);
40 &self.data[o..o + N]
41 }
42
43 #[inline]
45 pub fn pixel_mut(&mut self, x: usize, y: usize) -> &mut [T] {
46 let o = self.offset(x, y);
47 &mut self.data[o..o + N]
48 }
49
50 #[inline]
52 pub fn data(&self) -> &[T] {
53 &self.data
54 }
55
56 #[inline]
57 pub fn data_mut(&mut self) -> &mut [T] {
58 &mut self.data
59 }
60
61 pub fn rows_mut(&mut self) -> impl Iterator<Item = (usize, &mut [T])> {
63 let stride = self.width * N;
64 self.data.chunks_mut(stride).enumerate()
65 }
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn alloc_and_access() {
74 let mut b: Bitmap<f32, 3> = Bitmap::new(4, 2);
75 assert_eq!(b.data().len(), 4 * 2 * 3);
76 b.pixel_mut(1, 1).copy_from_slice(&[0.1, 0.2, 0.3]);
77 assert_eq!(b.pixel(1, 1), &[0.1, 0.2, 0.3]);
78 }
79}