From 85d20c4f4cf3656fbf7c27b6b8bbf9536e3ae04d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 7 Dec 2022 17:16:40 +0100 Subject: refactor, matrix math --- evc/src/frame.rs | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) (limited to 'evc/src/frame.rs') diff --git a/evc/src/frame.rs b/evc/src/frame.rs index 3c40a3d..024b240 100644 --- a/evc/src/frame.rs +++ b/evc/src/frame.rs @@ -1,25 +1,25 @@ use crate::{ + helpers::vector::Vec2, pixel::Pixel, ser::{Sink, Source}, - vec2::Vec2, view::View, }; use std::ops::{Index, IndexMut}; #[derive(Debug, Clone)] pub struct Frame { - pub size: Vec2, + pub size: Vec2, buffer: Vec, } impl Frame { - pub fn new(size: Vec2) -> Self { + pub fn new(size: Vec2) -> Self { Self { size, buffer: (0..size.x * size.y).map(|_| Pixel::default()).collect(), } } - pub fn read(source: &mut impl Source, size: Vec2) -> anyhow::Result { + pub fn read(source: &mut impl Source, size: Vec2) -> anyhow::Result { let mut frame = Frame::new(size); for y in 0..size.y { for x in 0..size.x { @@ -38,28 +38,32 @@ impl Frame { Ok(()) } pub fn view<'a>(&'a self) -> View<&'a Frame> { - View::new(self, Vec2::ZERO, self.size) + View::new(self, Vec2::::ZERO, self.size) } pub fn view_mut<'a>(&'a mut self) -> View<&'a mut Frame> { - View::new(self, Vec2::ZERO, self.size) + View::new(self, Vec2::::ZERO, self.size) } - pub fn view_area<'a>(&'a self, offset: Vec2, size: Vec2) -> View<&'a Frame> { + pub fn view_area<'a>(&'a self, offset: Vec2, size: Vec2) -> View<&'a Frame> { View::new(self, offset, size) } - pub fn view_area_mut<'a>(&'a mut self, offset: Vec2, size: Vec2) -> View<&'a mut Frame> { + pub fn view_area_mut<'a>( + &'a mut self, + offset: Vec2, + size: Vec2, + ) -> View<&'a mut Frame> { View::new(self, offset, size) } - pub fn set(&mut self, pos: Vec2, color: Pixel) { + pub fn set(&mut self, pos: Vec2, color: Pixel) { if pos.x >= 0 && pos.y >= 0 && pos.x < self.size.x && pos.y < self.size.y { self[pos] = color } } } -impl Index for Frame { +impl Index> for Frame { type Output = Pixel; #[inline] - fn index(&self, Vec2 { x, y }: Vec2) -> &Self::Output { + fn index(&self, Vec2 { x, y }: Vec2) -> &Self::Output { if x >= 0 && y >= 0 && x < self.size.x && y < self.size.y { &self.buffer[(x + y * self.size.x) as usize] } else { @@ -67,13 +71,29 @@ impl Index for Frame { } } } -impl IndexMut for Frame { +impl IndexMut> for Frame { #[inline] - fn index_mut(&mut self, Vec2 { x, y }: Vec2) -> &mut Self::Output { + fn index_mut(&mut self, Vec2 { x, y }: Vec2) -> &mut Self::Output { &mut self.buffer[(x + y * self.size.x) as usize] } } +impl Frame { + #[inline] + pub fn sample(&self, p: Vec2) -> Pixel { + let fx = p.x.floor() as isize; + let fy = p.y.floor() as isize; + let cx = p.x.ceil() as isize; + let cy = p.y.ceil() as isize; + + // TODO dont loose accuracy here + Pixel::average( + Pixel::average(self[Vec2 { x: fx, y: fy }], self[Vec2 { x: fx, y: cy }]), + Pixel::average(self[Vec2 { x: cx, y: fx }], self[Vec2 { x: cx, y: fy }]), + ) + } +} + impl Index<(isize, isize)> for Frame { type Output = Pixel; #[inline] -- cgit v1.2.3-70-g09d2