From 6001cdeff335e12583a398acbb5a8a42c01bc077 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 8 Dec 2022 09:13:17 +0100 Subject: fast mode --- evc/src/helpers/pixel.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'evc/src/helpers/pixel.rs') diff --git a/evc/src/helpers/pixel.rs b/evc/src/helpers/pixel.rs index 964040d..816d7dc 100644 --- a/evc/src/helpers/pixel.rs +++ b/evc/src/helpers/pixel.rs @@ -27,17 +27,16 @@ impl Pixel { a.r.abs_diff(b.r) as usize, a.r.abs_diff(b.r) as usize, ); + // fast_sqrt(rd * rd + gd * gd + bd * bd) SQRT[rd + gd + bd] } - + #[inline] pub fn average(a: Pixel, b: Pixel) -> Pixel { - //? this functions is broken - // TODO dont loose accuracy Pixel { - r: (a.r >> 1) + (b.r >> 1), - g: (a.g >> 1) + (b.g >> 1), - b: (a.b >> 1) + (b.b >> 1), + r: ((a.r as u16 + b.r as u16) >> 1) as u8, + g: ((a.g as u16 + b.g as u16) >> 1) as u8, + b: ((a.b as u16 + b.b as u16) >> 1) as u8, } } @@ -51,7 +50,7 @@ impl Pixel { } } -const SQRT: [usize; 256 * 3] = gen_sqrt_lookup(); +pub const SQRT: [usize; 256 * 3] = gen_sqrt_lookup(); const fn gen_sqrt_lookup() -> [usize; N] { let mut arr = [0; N]; @@ -70,3 +69,12 @@ const fn sqrt(x: f32) -> f32 { let a = (a + x / a) * 0.5; a } + +pub fn fast_sqrt(x: usize) -> usize { + let a = 1; + let a = (a + x / (a + 1)) / 2; + let a = (a + x / (a + 1)) / 2; + // let a = (a + x / (a + 1)) / 2; + // let a = (a + x / (a + 1)) / 2; + a +} -- cgit v1.2.3-70-g09d2