aboutsummaryrefslogtreecommitdiff
path: root/old/bv1/codec/src/impls.rs
diff options
context:
space:
mode:
Diffstat (limited to 'old/bv1/codec/src/impls.rs')
-rw-r--r--old/bv1/codec/src/impls.rs165
1 files changed, 165 insertions, 0 deletions
diff --git a/old/bv1/codec/src/impls.rs b/old/bv1/codec/src/impls.rs
new file mode 100644
index 0000000..b4cc119
--- /dev/null
+++ b/old/bv1/codec/src/impls.rs
@@ -0,0 +1,165 @@
+use crate::{Frame, Pixel, Ref, View, P2};
+use std::ops::{Add, AddAssign, Index, IndexMut, Sub};
+
+#[cfg(feature = "parallel")]
+pub use rayon::join;
+#[cfg(not(feature = "parallel"))]
+pub fn join<A, B, RA, RB>(oper_a: A, oper_b: B) -> (RA, RB)
+where
+ A: FnOnce() -> RA + Send,
+ B: FnOnce() -> RB + Send,
+ RA: Send,
+ RB: Send,
+{
+ (oper_a(), oper_b())
+}
+
+impl Frame {
+ pub fn export(&self, view: View) -> Vec<Pixel> {
+ let mut o = vec![];
+ for y in view.a.y..view.b.y {
+ for x in view.a.x..view.b.x {
+ o.push(self[P2 { x, y }])
+ }
+ }
+ o
+ }
+ pub fn import(&mut self, view: View, mut source: &[Pixel]) {
+ for y in view.a.y..view.b.y {
+ for x in view.a.x..view.b.x {
+ self[P2 { x, y }] = source[0];
+ source = &source[1..];
+ }
+ }
+ assert_eq!(source.len(), 0)
+ }
+ pub fn new(size: P2) -> Self {
+ Self {
+ pixels: vec![Pixel::default(); size.area()],
+ size,
+ }
+ }
+}
+impl Ref {
+ #[inline]
+ pub fn apply<F: Fn(&mut Self)>(mut self, f: F) -> Self {
+ f(&mut self);
+ self
+ }
+}
+impl Pixel {
+ pub const BLACK: Pixel = Pixel { r: 0, g: 0, b: 0 };
+ pub const RED: Pixel = Pixel { r: 255, g: 0, b: 0 };
+ pub const GREEN: Pixel = Pixel { r: 0, g: 255, b: 0 };
+ pub const BLUE: Pixel = Pixel { r: 0, g: 0, b: 255 };
+}
+impl AddAssign for P2 {
+ fn add_assign(&mut self, rhs: Self) {
+ self.x += rhs.x;
+ self.y += rhs.y;
+ }
+}
+impl Add for Pixel {
+ type Output = Pixel;
+ #[inline]
+ fn add(self, rhs: Self) -> Self::Output {
+ Self {
+ r: self.r + rhs.r,
+ g: self.g + rhs.g,
+ b: self.b + rhs.b,
+ }
+ }
+}
+impl Sub for Pixel {
+ type Output = Pixel;
+ #[inline]
+ fn sub(self, rhs: Self) -> Self::Output {
+ Self {
+ r: self.r - rhs.r,
+ g: self.g - rhs.g,
+ b: self.b - rhs.b,
+ }
+ }
+}
+impl P2 {
+ pub const ZERO: P2 = P2 { x: 0, y: 0 };
+ pub const X: P2 = P2 { x: 1, y: 0 };
+ pub const Y: P2 = P2 { x: 0, y: 1 };
+
+ #[inline]
+ pub fn area(&self) -> usize {
+ (self.x * self.y) as usize
+ }
+}
+impl View {
+ #[inline]
+ pub fn all(b: P2) -> Self {
+ Self {
+ a: P2::default(),
+ b,
+ }
+ }
+ #[inline]
+ pub fn size(&self) -> P2 {
+ self.b - self.a
+ }
+}
+impl Add<P2> for View {
+ type Output = View;
+ #[inline]
+ fn add(self, rhs: P2) -> Self::Output {
+ View {
+ a: self.a + rhs,
+ b: self.b + rhs,
+ }
+ }
+}
+impl Add for P2 {
+ type Output = P2;
+ #[inline]
+ fn add(self, rhs: Self) -> Self::Output {
+ Self {
+ x: self.x + rhs.x,
+ y: self.y + rhs.y,
+ }
+ }
+}
+impl Sub for P2 {
+ type Output = P2;
+ #[inline]
+ fn sub(self, rhs: Self) -> Self::Output {
+ Self {
+ x: self.x - rhs.x,
+ y: self.y - rhs.y,
+ }
+ }
+}
+
+impl Index<P2> for Frame {
+ type Output = Pixel;
+ #[inline]
+ fn index(&self, P2 { x, y }: P2) -> &Self::Output {
+ &self
+ .pixels
+ .get(x as usize + (y as usize * self.size.x as usize))
+ .unwrap_or(&Pixel { r: 0, g: 0, b: 0 })
+ }
+}
+impl IndexMut<P2> for Frame {
+ #[inline]
+ fn index_mut(&mut self, P2 { x, y }: P2) -> &mut Self::Output {
+ &mut self.pixels[x as usize + (y as usize * self.size.x as usize)]
+ }
+}
+
+pub trait ToArray {
+ type Output;
+ fn to_array(self) -> [Self::Output; 2];
+}
+impl<A> ToArray for (A, A) {
+ type Output = A;
+ #[inline]
+ fn to_array(self) -> [A; 2] {
+ [self.0, self.1]
+ }
+}