pfv_rs/
plane.rs

1pub struct VideoPlane {
2    pub width: usize,
3    pub height: usize,
4    pub pixels: Vec<u8>
5}
6
7impl VideoPlane {
8    pub fn new(width: usize, height: usize) -> VideoPlane {
9        VideoPlane { width: width, height: height, pixels: vec![0;width * height] }
10    }
11
12    pub fn from_slice(width: usize, height: usize, buffer: &[u8]) -> VideoPlane {
13        assert!(buffer.len() == (width * height));
14        let mut slice = VideoPlane::new(width, height);
15        slice.pixels.copy_from_slice(buffer);
16
17        slice
18    }
19
20    pub fn blit(self: &mut VideoPlane, src: &VideoPlane, dx: usize, dy: usize, sx: usize, sy: usize, sw: usize, sh: usize) {
21        for row in 0..sh {
22            let src_row = row + sy;
23            let dest_row = row + dy;
24            let src_offset = (src_row * src.width) + sx;
25            let dst_offset = (dest_row * self.width) + dx;
26
27            self.pixels[dst_offset..(dst_offset + sw)].copy_from_slice(&src.pixels[src_offset..(src_offset + sw)]);
28        }
29    }
30
31    pub fn get_slice(self: &VideoPlane, sx: usize, sy: usize, sw: usize, sh: usize) -> VideoPlane {
32        let mut new_slice = VideoPlane::new(sw, sh);
33        new_slice.blit(self, 0, 0, sx, sy, sw, sh);
34
35        new_slice
36    }
37}