1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use std;

const NUM_RGB_BYTES: usize = 3;

#[derive(Debug)]
pub struct OpcPixel<'a, T: AsRef<[u8]> + 'a> {
    x: T,
    pub phantom: std::marker::PhantomData<&'a [u8]>,
}

impl<'a, T: AsRef<[u8]> + 'a> OpcPixel<'a, T> {
    pub fn new(x: T) -> Self {
        OpcPixel {
            x: x,
            phantom: std::marker::PhantomData,
        }
    }
    pub fn r(&self) -> u8 {
        self.x.as_ref()[0]
    }
    pub fn g(&self) -> u8 {
        self.x.as_ref()[1]
    }
    pub fn b(&self) -> u8 {
        self.x.as_ref()[2]
    }
}

impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + 'a> OpcPixel<'a, T> {
    pub fn set_r(&mut self, v: u8) {
        self.x.as_mut()[0] = v;
    }
    pub fn set_g(&mut self, v: u8) {
        self.x.as_mut()[1] = v;
    }
    pub fn set_b(&mut self, v: u8) {
        self.x.as_mut()[2] = v;
    }
}

impl<'a, T: AsRef<[u8]> + 'a> std::convert::From<&'a OpcPixel<'a, T>> for (u8, u8, u8) {
    fn from(t: &'a OpcPixel<'a, T>) -> (u8, u8, u8) {
        (t.r(), t.g(), t.b())
    }
}

pub struct Pixels {
    pixels: Vec<u8>,
}

impl std::convert::From<Vec<u8>> for Pixels {
    fn from(t: Vec<u8>) -> Pixels {
        let mut t = t;
        let blen: usize = t.len() - (t.len() % NUM_RGB_BYTES);
        t.truncate(blen);
        Pixels { pixels: t }
    }
}

impl std::convert::From<Pixels> for Vec<u8> {
    fn from(t: Pixels) -> Vec<u8> {
        t.pixels
    }
}

impl Pixels {
    pub fn new(n: usize) -> Pixels {
        Pixels { pixels: vec![0;n*NUM_RGB_BYTES] }
    }

    pub fn iter(&self) -> PixelIterator {
        PixelIterator::new(self)
    }

    pub fn iter_mut(&mut self) -> PixelIteratorMut {
        PixelIteratorMut::new(self)
    }
}


pub struct PixelIterator<'a> {
    p: std::slice::Chunks<'a, u8>,
}

impl<'a> PixelIterator<'a> {
    fn new(p: &'a Pixels) -> Self {
        PixelIterator { p: p.pixels.chunks(NUM_RGB_BYTES) }
    }
}

impl<'a> std::iter::Iterator for PixelIterator<'a> {
    type Item = OpcPixel<'a, &'a [u8]>;

    fn next(&mut self) -> Option<Self::Item> {
        self.p.next().map(|x| OpcPixel::new(x))
    }
}

impl<'a> ExactSizeIterator for PixelIterator<'a> {
    fn len(&self) -> usize {
        self.p.len()
    }
}

pub struct PixelIteratorMut<'a> {
    p: std::slice::ChunksMut<'a, u8>,
}

impl<'a> PixelIteratorMut<'a> {
    fn new(p: &'a mut Pixels) -> Self {
        PixelIteratorMut { p: p.pixels.chunks_mut(NUM_RGB_BYTES) }
    }
}

impl<'a> std::iter::Iterator for PixelIteratorMut<'a> {
    type Item = OpcPixel<'a, &'a mut [u8]>;

    fn next(&mut self) -> Option<Self::Item> {
        self.p.next().map(|x| OpcPixel::new(x))
    }
}

impl<'a> ExactSizeIterator for PixelIteratorMut<'a> {
    fn len(&self) -> usize {
        self.p.len()
    }
}