aboutsummaryrefslogtreecommitdiff
path: root/evc/src/view.rs
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src/view.rs')
-rw-r--r--evc/src/view.rs142
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 }]
}
}