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}