From e3c742ff04a665c70c029f266aa0fe72e12ac72c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 6 Dec 2022 17:45:26 +0100 Subject: vec2 everywhere --- evc/src/view.rs | 142 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 103 insertions(+), 39 deletions(-) (limited to 'evc/src/view.rs') 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 { pub frame: T, - pub offset: (usize, usize), - pub size: (usize, usize), + pub offset: Vec2, + pub size: Vec2, } impl View { - 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 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 View { + 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> View<&T> { +impl> 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> View<&T> { } pub fn pixels(&self) -> Vec { 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> 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) { - 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> Index<(usize, usize)> for View<&T> { +impl> Index for View<&T> { + type Output = Pixel; + #[inline] + fn index(&self, p: Vec2) -> &Self::Output { + &self.frame[self.offset + p] + } +} +impl> Index for View<&mut T> { + type Output = Pixel; + #[inline] + fn index(&self, p: Vec2) -> &Self::Output { + &self.frame[self.offset + p] + } +} +impl> IndexMut for View<&mut T> { + #[inline] + fn index_mut(&mut self, p: Vec2) -> &mut Self::Output { + &mut self.frame[self.offset + p] + } +} + +impl> 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> Index<(usize, usize)> for View<&mut T> { +impl> 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> IndexMut<(usize, usize)> for View<&mut T> { +impl> 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 }] } } -- cgit v1.2.3-70-g09d2