aboutsummaryrefslogtreecommitdiff
path: root/evc/src/pixel.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-06 18:38:44 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-06 18:38:44 +0100
commitc5d4cb9602ed18907d321f2d61f30e1159f58dbf (patch)
tree7b1c58fbf4997f638f9a3b40ffc4a3fbf56e019b /evc/src/pixel.rs
parente3c742ff04a665c70c029f266aa0fe72e12ac72c (diff)
downloadvideo-codec-experiments-c5d4cb9602ed18907d321f2d61f30e1159f58dbf.tar
video-codec-experiments-c5d4cb9602ed18907d321f2d61f30e1159f58dbf.tar.bz2
video-codec-experiments-c5d4cb9602ed18907d321f2d61f30e1159f58dbf.tar.zst
sqrt lookup
Diffstat (limited to 'evc/src/pixel.rs')
-rw-r--r--evc/src/pixel.rs30
1 files changed, 25 insertions, 5 deletions
diff --git a/evc/src/pixel.rs b/evc/src/pixel.rs
index b3ef841..4fb6772 100644
--- a/evc/src/pixel.rs
+++ b/evc/src/pixel.rs
@@ -21,12 +21,32 @@ impl Ser for Pixel {
impl Pixel {
pub const BLACK: Pixel = Pixel { r: 0, g: 0, b: 0 };
#[inline]
- pub fn distance(a: Pixel, b: Pixel) -> f64 {
+ pub fn distance(a: Pixel, b: Pixel) -> usize {
let (rd, gd, bd) = (
- a.r.abs_diff(b.r) as f64,
- a.r.abs_diff(b.r) as f64,
- a.r.abs_diff(b.r) as f64,
+ a.r.abs_diff(b.r) as usize,
+ a.r.abs_diff(b.r) as usize,
+ a.r.abs_diff(b.r) as usize,
);
- (rd * rd + gd * gd + bd * bd).sqrt()
+ SQRT[rd + gd + bd]
}
}
+
+const SQRT: [usize; 256 * 3] = gen_sqrt_lookup();
+
+const fn gen_sqrt_lookup<const N: usize>() -> [usize; N] {
+ let mut arr = [0; N];
+ let mut i = 0;
+ while i < N {
+ arr[i] = sqrt(i as f32) as usize;
+ i += 1;
+ }
+ arr
+}
+
+const fn sqrt(x: f32) -> f32 {
+ let a = 1.0;
+ let a = (a + x / a) * 0.5;
+ let a = (a + x / a) * 0.5;
+ let a = (a + x / a) * 0.5;
+ a
+}