diff options
Diffstat (limited to 'evc/src/view.rs')
-rw-r--r-- | evc/src/view.rs | 142 |
1 files changed, 103 insertions, 39 deletions
diff --git a/evc/src/view.rs b/evc/src/view.rs index 9c4778b..4cd4a45 100644 --- a/evc/src/view.rs +++ b/evc/src/view.rs @@ -1,89 +1,132 @@ -use crate::{frame::Frame, pixel::Pixel}; +use crate::{frame::Frame, pixel::Pixel, vec2::Vec2}; use std::ops::{Index, IndexMut}; pub struct View<T> { pub frame: T, - pub offset: (usize, usize), - pub size: (usize, usize), + pub offset: Vec2, + pub size: Vec2, } impl<T> View<T> { - pub fn new(frame: T, offset: (usize, usize), size: (usize, usize)) -> Self { + pub fn new(frame: T, offset: Vec2, size: Vec2) -> Self { Self { frame, offset, size, } } - pub fn area(&self) -> usize { - self.size.0 * self.size.1 + pub fn area(&self) -> isize { + self.size.x * self.size.y } } impl<T> View<&mut T> { pub fn split_mut_unsafe(&mut self) -> [Self; 2] { - let vert = self.size.0 > self.size.1; + let vert = self.size.x > self.size.y; [ Self { frame: unsafe { std::mem::transmute::<&mut T, &mut T>(&mut self.frame) }, offset: self.offset, size: if vert { - (self.size.0 / 2, self.size.1) + Vec2 { + x: self.size.x / 2, + y: self.size.y, + } } else { - (self.size.0, self.size.1 / 2) + Vec2 { + x: self.size.x, + y: self.size.y / 2, + } }, }, Self { frame: unsafe { std::mem::transmute::<&mut T, &mut T>(&mut self.frame) }, offset: if vert { - (self.offset.0 + self.size.0 / 2, self.offset.1) + Vec2 { + x: self.offset.x + self.size.x / 2, + y: self.offset.y, + } } else { - (self.offset.0, self.offset.1 + self.size.1 / 2) + Vec2 { + x: self.offset.x, + y: self.offset.y + self.size.y / 2, + } }, size: if vert { - (self.size.0 - self.size.0 / 2, self.size.1) + Vec2 { + x: self.size.x - self.size.x / 2, + y: self.size.y, + } } else { - (self.size.0, self.size.1 - self.size.1 / 2) + Vec2 { + x: self.size.x, + y: self.size.y - self.size.y / 2, + } }, }, ] } } impl<T: Copy> View<T> { + pub fn offset(&self, offset: Vec2) -> Self { + Self { + frame: self.frame, + offset: self.offset + offset, + size: self.size, + } + } pub fn split(&self) -> [Self; 2] { - let vert = self.size.0 > self.size.1; + let vert = self.size.x > self.size.y; [ Self { frame: self.frame, offset: self.offset, size: if vert { - (self.size.0 / 2, self.size.1) + Vec2 { + x: self.size.x / 2, + y: self.size.y, + } } else { - (self.size.0, self.size.1 / 2) + Vec2 { + x: self.size.x, + y: self.size.y / 2, + } }, }, Self { frame: self.frame, offset: if vert { - (self.offset.0 + self.size.0 / 2, self.offset.1) + Vec2 { + x: self.offset.x + self.size.x / 2, + y: self.offset.y, + } } else { - (self.offset.0, self.offset.1 + self.size.1 / 2) + Vec2 { + x: self.offset.x, + y: self.offset.y + self.size.y / 2, + } }, size: if vert { - (self.size.0 - self.size.0 / 2, self.size.1) + Vec2 { + x: self.size.x - self.size.x / 2, + y: self.size.y, + } } else { - (self.size.0, self.size.1 - self.size.1 / 2) + Vec2 { + x: self.size.x, + y: self.size.y - self.size.y / 2, + } }, }, ] } } -impl<T: Index<(usize, usize), Output = Pixel>> View<&T> { +impl<T: Index<Vec2, Output = Pixel>> View<&T> { pub fn diff(va: &Self, vb: &Self) -> f64 { assert_eq!(va.size, vb.size); let mut acc = 0.0; - for x in 0..va.size.0 { - for y in 0..va.size.1 { + for x in 0..va.size.x { + for y in 0..va.size.y { let a = va[(x, y)]; let b = vb[(x, y)]; acc += Pixel::distance(a, b); @@ -93,8 +136,8 @@ impl<T: Index<(usize, usize), Output = Pixel>> View<&T> { } pub fn pixels(&self) -> Vec<Pixel> { let mut v = vec![]; - for x in 0..self.size.0 { - for y in 0..self.size.1 { + for x in 0..self.size.x { + for y in 0..self.size.y { v.push(self[(x, y)]); } } @@ -103,38 +146,59 @@ impl<T: Index<(usize, usize), Output = Pixel>> View<&T> { } impl View<&mut Frame> { pub fn copy_from(&mut self, other: &View<&Frame>) { - for x in 0..self.size.0 { - for y in 0..self.size.1 { + for x in 0..self.size.x { + for y in 0..self.size.y { self[(x, y)] = other[(x, y)]; } } } pub fn set_pixels(&mut self, pixels: &Vec<Pixel>) { - for x in 0..self.size.0 { - for y in 0..self.size.1 { - self[(x, y)] = pixels[x * self.size.1 + y] + for x in 0..self.size.x { + for y in 0..self.size.y { + self[(x, y)] = pixels[(x * self.size.y + y) as usize] } } } } -impl<T: Index<(usize, usize), Output = Pixel>> Index<(usize, usize)> for View<&T> { +impl<T: Index<Vec2, Output = Pixel>> Index<Vec2> for View<&T> { + type Output = Pixel; + #[inline] + fn index(&self, p: Vec2) -> &Self::Output { + &self.frame[self.offset + p] + } +} +impl<T: Index<Vec2, Output = Pixel>> Index<Vec2> for View<&mut T> { + type Output = Pixel; + #[inline] + fn index(&self, p: Vec2) -> &Self::Output { + &self.frame[self.offset + p] + } +} +impl<T: IndexMut<Vec2, Output = Pixel>> IndexMut<Vec2> for View<&mut T> { + #[inline] + fn index_mut(&mut self, p: Vec2) -> &mut Self::Output { + &mut self.frame[self.offset + p] + } +} + +impl<T: Index<Vec2, Output = Pixel>> Index<(isize, isize)> for View<&T> { type Output = Pixel; #[inline] - fn index(&self, (x, y): (usize, usize)) -> &Self::Output { - &self.frame[(x + self.offset.0, y + self.offset.1)] + fn index(&self, (x, y): (isize, isize)) -> &Self::Output { + &self[Vec2 { x, y }] } } -impl<T: Index<(usize, usize), Output = Pixel>> Index<(usize, usize)> for View<&mut T> { +impl<T: Index<Vec2, Output = Pixel>> Index<(isize, isize)> for View<&mut T> { type Output = Pixel; #[inline] - fn index(&self, (x, y): (usize, usize)) -> &Self::Output { - &self.frame[(x + self.offset.0, y + self.offset.1)] + fn index(&self, (x, y): (isize, isize)) -> &Self::Output { + &self[Vec2 { x, y }] } } -impl<T: IndexMut<(usize, usize), Output = Pixel>> IndexMut<(usize, usize)> for View<&mut T> { +impl<T: IndexMut<Vec2, Output = Pixel>> IndexMut<(isize, isize)> for View<&mut T> { #[inline] - fn index_mut(&mut self, (x, y): (usize, usize)) -> &mut Self::Output { - &mut self.frame[(x + self.offset.0, y + self.offset.1)] + fn index_mut(&mut self, (x, y): (isize, isize)) -> &mut Self::Output { + &mut self[Vec2 { x, y }] } } |